1#ifndef MD4C_H
2#define MD4C_H
3
4#ifdef __cplusplus
5 extern "C" {
6#endif
7
8#if defined MD4C_USE_UTF16
9
10 #ifdef _WIN32
11 #include <windows.h>
12 typedef WCHAR MD_CHAR;
13 #else
14 #error MD4C_USE_UTF16 is only supported on Windows.
15 #endif
16#else
17 typedef char MD_CHAR;
18#endif
19
20typedef unsigned MD_SIZE;
21typedef unsigned MD_OFFSET;
22
23typedef enum MD_BLOCKTYPE {
24
25 MD_BLOCK_DOC = 0,
26
27 MD_BLOCK_QUOTE,
28
29 MD_BLOCK_UL,
30
31 MD_BLOCK_OL,
32
33 MD_BLOCK_LI,
34
35 MD_BLOCK_HR,
36
37 MD_BLOCK_H,
38
39 MD_BLOCK_CODE,
40
41 MD_BLOCK_HTML,
42
43 MD_BLOCK_P,
44
45 MD_BLOCK_TABLE,
46 MD_BLOCK_THEAD,
47 MD_BLOCK_TBODY,
48 MD_BLOCK_TR,
49 MD_BLOCK_TH,
50 MD_BLOCK_TD
51} MD_BLOCKTYPE;
52
53typedef enum MD_SPANTYPE {
54
55 MD_SPAN_EM,
56
57 MD_SPAN_STRONG,
58
59 MD_SPAN_A,
60
61 MD_SPAN_IMG,
62
63 MD_SPAN_CODE,
64
65 MD_SPAN_DEL,
66
67 MD_SPAN_LATEXMATH,
68 MD_SPAN_LATEXMATH_DISPLAY,
69
70 MD_SPAN_WIKILINK,
71
72 MD_SPAN_U
73} MD_SPANTYPE;
74
75typedef enum MD_TEXTTYPE {
76
77 MD_TEXT_NORMAL = 0,
78
79 MD_TEXT_NULLCHAR,
80
81 MD_TEXT_BR,
82 MD_TEXT_SOFTBR,
83
84 MD_TEXT_ENTITY,
85
86 MD_TEXT_CODE,
87
88 MD_TEXT_HTML,
89
90 MD_TEXT_LATEXMATH
91} MD_TEXTTYPE;
92
93typedef enum MD_ALIGN {
94 MD_ALIGN_DEFAULT = 0,
95 MD_ALIGN_LEFT,
96 MD_ALIGN_CENTER,
97 MD_ALIGN_RIGHT
98} MD_ALIGN;
99
100typedef struct MD_ATTRIBUTE {
101 const MD_CHAR* text;
102 MD_SIZE size;
103 const MD_TEXTTYPE* substr_types;
104 const MD_OFFSET* substr_offsets;
105} MD_ATTRIBUTE;
106
107typedef struct MD_BLOCK_UL_DETAIL {
108 int is_tight;
109 MD_CHAR mark;
110} MD_BLOCK_UL_DETAIL;
111
112typedef struct MD_BLOCK_OL_DETAIL {
113 unsigned start;
114 int is_tight;
115 MD_CHAR mark_delimiter;
116} MD_BLOCK_OL_DETAIL;
117
118typedef struct MD_BLOCK_LI_DETAIL {
119 int is_task;
120 MD_CHAR task_mark;
121 MD_OFFSET task_mark_offset;
122} MD_BLOCK_LI_DETAIL;
123
124typedef struct MD_BLOCK_H_DETAIL {
125 unsigned level;
126} MD_BLOCK_H_DETAIL;
127
128typedef struct MD_BLOCK_CODE_DETAIL {
129 MD_ATTRIBUTE info;
130 MD_ATTRIBUTE lang;
131 MD_CHAR fence_char;
132} MD_BLOCK_CODE_DETAIL;
133
134typedef struct MD_BLOCK_TABLE_DETAIL {
135 unsigned col_count;
136 unsigned head_row_count;
137 unsigned body_row_count;
138} MD_BLOCK_TABLE_DETAIL;
139
140typedef struct MD_BLOCK_TD_DETAIL {
141 MD_ALIGN align;
142} MD_BLOCK_TD_DETAIL;
143
144typedef struct MD_SPAN_A_DETAIL {
145 MD_ATTRIBUTE href;
146 MD_ATTRIBUTE title;
147 int is_autolink;
148} MD_SPAN_A_DETAIL;
149
150typedef struct MD_SPAN_IMG_DETAIL {
151 MD_ATTRIBUTE src;
152 MD_ATTRIBUTE title;
153} MD_SPAN_IMG_DETAIL;
154
155typedef struct MD_SPAN_WIKILINK {
156 MD_ATTRIBUTE target;
157} MD_SPAN_WIKILINK_DETAIL;
158
159#define MD_FLAG_COLLAPSEWHITESPACE 0x0001
160#define MD_FLAG_PERMISSIVEATXHEADERS 0x0002
161#define MD_FLAG_PERMISSIVEURLAUTOLINKS 0x0004
162#define MD_FLAG_PERMISSIVEEMAILAUTOLINKS 0x0008
163#define MD_FLAG_NOINDENTEDCODEBLOCKS 0x0010
164#define MD_FLAG_NOHTMLBLOCKS 0x0020
165#define MD_FLAG_NOHTMLSPANS 0x0040
166#define MD_FLAG_TABLES 0x0100
167#define MD_FLAG_STRIKETHROUGH 0x0200
168#define MD_FLAG_PERMISSIVEWWWAUTOLINKS 0x0400
169#define MD_FLAG_TASKLISTS 0x0800
170#define MD_FLAG_LATEXMATHSPANS 0x1000
171#define MD_FLAG_WIKILINKS 0x2000
172#define MD_FLAG_UNDERLINE 0x4000
173#define MD_FLAG_HARD_SOFT_BREAKS 0x8000
174
175#define MD_FLAG_PERMISSIVEAUTOLINKS (MD_FLAG_PERMISSIVEEMAILAUTOLINKS | MD_FLAG_PERMISSIVEURLAUTOLINKS | MD_FLAG_PERMISSIVEWWWAUTOLINKS)
176#define MD_FLAG_NOHTML (MD_FLAG_NOHTMLBLOCKS | MD_FLAG_NOHTMLSPANS)
177
178#define MD_DIALECT_COMMONMARK 0
179#define MD_DIALECT_GITHUB (MD_FLAG_PERMISSIVEAUTOLINKS | MD_FLAG_TABLES | MD_FLAG_STRIKETHROUGH | MD_FLAG_TASKLISTS)
180
181typedef struct MD_PARSER {
182
183 unsigned abi_version;
184
185 unsigned flags;
186
187 int (*enter_block)(MD_BLOCKTYPE , void* , void* );
188 int (*leave_block)(MD_BLOCKTYPE , void* , void* );
189
190 int (*enter_span)(MD_SPANTYPE , void* , void* );
191 int (*leave_span)(MD_SPANTYPE , void* , void* );
192
193 int (*text)(MD_TEXTTYPE , const MD_CHAR* , MD_SIZE , void* );
194
195 void (*debug_log)(const char* , void* );
196
197 void (*syntax)(void);
198} MD_PARSER;
199
200typedef MD_PARSER MD_RENDERER;
201
202int md_parse(const MD_CHAR* text, MD_SIZE size, const MD_PARSER* parser, void* userdata);
203
204#ifdef __cplusplus
205 }
206#endif
207
208#endif