markdown.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #ifndef _MARKDOWN_D
  2. #define _MARKDOWN_D
  3. #include "cstring.h"
  4. /* reference-style links (and images) are stored in an array
  5. * of footnotes.
  6. */
  7. typedef struct footnote {
  8. Cstring tag; /* the tag for the reference link */
  9. Cstring link; /* what this footnote points to */
  10. Cstring title; /* what it's called (TITLE= attribute) */
  11. int height, width; /* dimensions (for image link) */
  12. int dealloc; /* deallocation needed? */
  13. int refnumber;
  14. int flags;
  15. #define EXTRA_BOOKMARK 0x01
  16. #define REFERENCED 0x02
  17. } Footnote;
  18. /* each input line is read into a Line, which contains the line,
  19. * the offset of the first non-space character [this assumes
  20. * that all tabs will be expanded to spaces!], and a pointer to
  21. * the next line.
  22. */
  23. typedef enum { chk_text, chk_code,
  24. chk_hr, chk_dash,
  25. chk_tilde, chk_backtick,
  26. chk_equal } line_type;
  27. typedef struct line {
  28. Cstring text;
  29. struct line *next;
  30. int dle; /* leading indent on the line */
  31. int flags; /* special attributes for this line */
  32. #define PIPECHAR 0x01 /* line contains a | */
  33. #define CHECKED 0x02
  34. line_type kind;
  35. int count;
  36. } Line;
  37. /* a paragraph is a collection of Lines, with links to the next paragraph
  38. * and (if it's a QUOTE, UL, or OL) to the reparsed contents of this
  39. * paragraph.
  40. */
  41. typedef struct paragraph {
  42. struct paragraph *next; /* next paragraph */
  43. struct paragraph *down; /* recompiled contents of this paragraph */
  44. struct line *text; /* all the text in this paragraph */
  45. char *ident; /* %id% tag for QUOTE */
  46. char *lang; /* lang attribute for CODE */
  47. enum { WHITESPACE=0, CODE, QUOTE, MARKUP,
  48. HTML, STYLE, DL, UL, OL, AL, LISTITEM,
  49. HDR, HR, TABLE, SOURCE } typ;
  50. enum { IMPLICIT=0, PARA, CENTER} align;
  51. int hnumber; /* <Hn> for typ == HDR */
  52. } Paragraph;
  53. enum { ETX, SETEXT }; /* header types */
  54. typedef struct block {
  55. enum { bTEXT, bSTAR, bUNDER } b_type;
  56. int b_count;
  57. char b_char;
  58. Cstring b_text;
  59. Cstring b_post;
  60. } block;
  61. typedef STRING(block) Qblock;
  62. typedef char* (*mkd_callback_t)(const char*, const int, void*);
  63. typedef void (*mkd_free_t)(char*, void*);
  64. typedef struct callback_data {
  65. void *e_data; /* private data for callbacks */
  66. mkd_callback_t e_url; /* url edit callback */
  67. mkd_callback_t e_flags; /* extra href flags callback */
  68. mkd_free_t e_free; /* edit/flags callback memory deallocator */
  69. } Callback_data;
  70. struct escaped {
  71. char *text;
  72. struct escaped *up;
  73. } ;
  74. struct footnote_list {
  75. int reference;
  76. STRING(Footnote) note;
  77. } ;
  78. /* a magic markdown io thing holds all the data structures needed to
  79. * do the backend processing of a markdown document
  80. */
  81. typedef struct mmiot {
  82. Cstring out;
  83. Cstring in;
  84. Qblock Q;
  85. int isp;
  86. struct escaped *esc;
  87. char *ref_prefix;
  88. struct footnote_list *footnotes;
  89. DWORD flags;
  90. #define MKD_NOLINKS 0x00000001
  91. #define MKD_NOIMAGE 0x00000002
  92. #define MKD_NOPANTS 0x00000004
  93. #define MKD_NOHTML 0x00000008
  94. #define MKD_STRICT 0x00000010
  95. #define MKD_TAGTEXT 0x00000020
  96. #define MKD_NO_EXT 0x00000040
  97. #define MKD_CDATA 0x00000080
  98. #define MKD_NOSUPERSCRIPT 0x00000100
  99. #define MKD_NORELAXED 0x00000200
  100. #define MKD_NOTABLES 0x00000400
  101. #define MKD_NOSTRIKETHROUGH 0x00000800
  102. #define MKD_TOC 0x00001000
  103. #define MKD_1_COMPAT 0x00002000
  104. #define MKD_AUTOLINK 0x00004000
  105. #define MKD_SAFELINK 0x00008000
  106. #define MKD_NOHEADER 0x00010000
  107. #define MKD_TABSTOP 0x00020000
  108. #define MKD_NODIVQUOTE 0x00040000
  109. #define MKD_NOALPHALIST 0x00080000
  110. #define MKD_NODLIST 0x00100000
  111. #define MKD_EXTRA_FOOTNOTE 0x00200000
  112. #define MKD_NOSTYLE 0x00400000
  113. #define MKD_NODLDISCOUNT 0x00800000
  114. #define MKD_DLEXTRA 0x01000000
  115. #define MKD_FENCEDCODE 0x02000000
  116. #define MKD_IDANCHOR 0x04000000
  117. #define MKD_GITHUBTAGS 0x08000000
  118. #define MKD_URLENCODEDANCHOR 0x10000000
  119. #define IS_LABEL 0x20000000
  120. #define USER_FLAGS 0x3FFFFFFF
  121. #define INPUT_MASK (MKD_NOHEADER|MKD_TABSTOP)
  122. Callback_data *cb;
  123. } MMIOT;
  124. #define MKD_EOLN 3
  125. /*
  126. * the mkdio text input functions return a document structure,
  127. * which contains a header (retrieved from the document if
  128. * markdown was configured * with the * --enable-pandoc-header
  129. * and the document begins with a pandoc-style header) and the
  130. * root of the linked list of Lines.
  131. */
  132. typedef struct document {
  133. int magic; /* "I AM VALID" magic number */
  134. #define VALID_DOCUMENT 0x19600731
  135. Line *title;
  136. Line *author;
  137. Line *date;
  138. ANCHOR(Line) content; /* uncompiled text, not valid after compile() */
  139. Paragraph *code; /* intermediate code generated by compile() */
  140. int compiled; /* set after mkd_compile() */
  141. int html; /* set after (internal) htmlify() */
  142. int tabstop; /* for properly expanding tabs (ick) */
  143. char *ref_prefix;
  144. MMIOT *ctx; /* backend buffers, flags, and structures */
  145. Callback_data cb; /* callback functions & private data */
  146. } Document;
  147. /*
  148. * economy FILE-type structure for pulling characters out of a
  149. * fixed-length string.
  150. */
  151. struct string_stream {
  152. const char *data; /* the unread data */
  153. int size; /* and how much is there? */
  154. } ;
  155. extern int mkd_firstnonblank(Line *);
  156. extern int mkd_compile(Document *, DWORD);
  157. extern int mkd_document(Document *, char **);
  158. extern int mkd_generatehtml(Document *, FILE *);
  159. extern int mkd_css(Document *, char **);
  160. extern int mkd_generatecss(Document *, FILE *);
  161. #define mkd_style mkd_generatecss
  162. extern int mkd_xml(char *, int , char **);
  163. extern int mkd_generatexml(char *, int, FILE *);
  164. extern void mkd_cleanup(Document *);
  165. extern int mkd_line(char *, int, char **, DWORD);
  166. extern int mkd_generateline(char *, int, FILE*, DWORD);
  167. #define mkd_text mkd_generateline
  168. extern void mkd_basename(Document*, char *);
  169. typedef int (*mkd_sta_function_t)(const int,const void*);
  170. extern void mkd_string_to_anchor(char*,int, mkd_sta_function_t, void*, int, DWORD);
  171. extern Document *mkd_in(FILE *, DWORD);
  172. extern Document *mkd_string(const char*,int, DWORD);
  173. extern Document *gfm_in(FILE *, DWORD);
  174. extern Document *gfm_string(const char*,int, DWORD);
  175. extern void mkd_initialize();
  176. extern void mkd_shlib_destructor();
  177. extern void mkd_ref_prefix(Document*, char*);
  178. /* internal resource handling functions.
  179. */
  180. extern void ___mkd_freeLine(Line *);
  181. extern void ___mkd_freeLines(Line *);
  182. extern void ___mkd_freeParagraph(Paragraph *);
  183. extern void ___mkd_freefootnote(Footnote *);
  184. extern void ___mkd_freefootnotes(MMIOT *);
  185. extern void ___mkd_initmmiot(MMIOT *, void *);
  186. extern void ___mkd_freemmiot(MMIOT *, void *);
  187. extern void ___mkd_freeLineRange(Line *, Line *);
  188. extern void ___mkd_xml(char *, int, FILE *);
  189. extern void ___mkd_reparse(char *, int, int, MMIOT*, char*);
  190. extern void ___mkd_emblock(MMIOT*);
  191. extern void ___mkd_tidy(Cstring *);
  192. extern Document *__mkd_new_Document();
  193. extern void __mkd_enqueue(Document*, Cstring *);
  194. extern void __mkd_header_dle(Line *);
  195. extern int __mkd_io_strget(struct string_stream *);
  196. /* utility function to do some operation and exit the current function
  197. * if it fails
  198. */
  199. #define DO_OR_DIE(op) if ( (op) == EOF ) return EOF; else 1
  200. extern int mkd_generatehtml_str(Document *p,void *out,void (*mywrite)(char const *,int size,void*));
  201. extern int markdown_str(Document *document, void *out,void (*)(char const *,int size,void*), int flags);
  202. #endif/*_MARKDOWN_D*/