md4c.h

  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