Text::Markdown::Discount
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
6.6 KiB

  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. /* a magic markdown io thing holds all the data structures needed to
  75. * do the backend processing of a markdown document
  76. */
  77. typedef struct mmiot {
  78. Cstring out;
  79. Cstring in;
  80. Qblock Q;
  81. int isp;
  82. int reference;
  83. struct escaped *esc;
  84. char *ref_prefix;
  85. STRING(Footnote) *footnotes;
  86. DWORD flags;
  87. #define MKD_NOLINKS 0x00000001
  88. #define MKD_NOIMAGE 0x00000002
  89. #define MKD_NOPANTS 0x00000004
  90. #define MKD_NOHTML 0x00000008
  91. #define MKD_STRICT 0x00000010
  92. #define MKD_TAGTEXT 0x00000020
  93. #define MKD_NO_EXT 0x00000040
  94. #define MKD_CDATA 0x00000080
  95. #define MKD_NOSUPERSCRIPT 0x00000100
  96. #define MKD_NORELAXED 0x00000200
  97. #define MKD_NOTABLES 0x00000400
  98. #define MKD_NOSTRIKETHROUGH 0x00000800
  99. #define MKD_TOC 0x00001000
  100. #define MKD_1_COMPAT 0x00002000
  101. #define MKD_AUTOLINK 0x00004000
  102. #define MKD_SAFELINK 0x00008000
  103. #define MKD_NOHEADER 0x00010000
  104. #define MKD_TABSTOP 0x00020000
  105. #define MKD_NODIVQUOTE 0x00040000
  106. #define MKD_NOALPHALIST 0x00080000
  107. #define MKD_NODLIST 0x00100000
  108. #define MKD_EXTRA_FOOTNOTE 0x00200000
  109. #define MKD_NOSTYLE 0x00400000
  110. #define IS_LABEL 0x08000000
  111. #define USER_FLAGS 0x0FFFFFFF
  112. #define INPUT_MASK (MKD_NOHEADER|MKD_TABSTOP)
  113. Callback_data *cb;
  114. } MMIOT;
  115. /*
  116. * the mkdio text input functions return a document structure,
  117. * which contains a header (retrieved from the document if
  118. * markdown was configured * with the * --enable-pandoc-header
  119. * and the document begins with a pandoc-style header) and the
  120. * root of the linked list of Lines.
  121. */
  122. typedef struct document {
  123. int magic; /* "I AM VALID" magic number */
  124. #define VALID_DOCUMENT 0x19600731
  125. Line *title;
  126. Line *author;
  127. Line *date;
  128. ANCHOR(Line) content; /* uncompiled text, not valid after compile() */
  129. Paragraph *code; /* intermediate code generated by compile() */
  130. int compiled; /* set after mkd_compile() */
  131. int html; /* set after (internal) htmlify() */
  132. int tabstop; /* for properly expanding tabs (ick) */
  133. char *ref_prefix;
  134. MMIOT *ctx; /* backend buffers, flags, and structures */
  135. Callback_data cb; /* callback functions & private data */
  136. } Document;
  137. /*
  138. * economy FILE-type structure for pulling characters out of a
  139. * fixed-length string.
  140. */
  141. struct string_stream {
  142. const char *data; /* the unread data */
  143. int size; /* and how much is there? */
  144. } ;
  145. extern int mkd_firstnonblank(Line *);
  146. extern int mkd_compile(Document *, DWORD);
  147. extern int mkd_document(Document *, char **);
  148. extern int mkd_generatehtml(Document *, FILE *);
  149. extern int mkd_css(Document *, char **);
  150. extern int mkd_generatecss(Document *, FILE *);
  151. #define mkd_style mkd_generatecss
  152. extern int mkd_xml(char *, int , char **);
  153. extern int mkd_generatexml(char *, int, FILE *);
  154. extern void mkd_cleanup(Document *);
  155. extern int mkd_line(char *, int, char **, DWORD);
  156. extern int mkd_generateline(char *, int, FILE*, DWORD);
  157. #define mkd_text mkd_generateline
  158. extern void mkd_basename(Document*, char *);
  159. typedef int (*mkd_sta_function_t)(const int,const void*);
  160. extern void mkd_string_to_anchor(char*,int, mkd_sta_function_t, void*, int);
  161. extern Document *mkd_in(FILE *, DWORD);
  162. extern Document *mkd_string(const char*,int, DWORD);
  163. extern Document *gfm_in(FILE *, DWORD);
  164. extern Document *gfm_string(const char*,int, DWORD);
  165. extern void mkd_initialize();
  166. extern void mkd_shlib_destructor();
  167. extern void mkd_ref_prefix(Document*, char*);
  168. /* internal resource handling functions.
  169. */
  170. extern void ___mkd_freeLine(Line *);
  171. extern void ___mkd_freeLines(Line *);
  172. extern void ___mkd_freeParagraph(Paragraph *);
  173. extern void ___mkd_freefootnote(Footnote *);
  174. extern void ___mkd_freefootnotes(MMIOT *);
  175. extern void ___mkd_initmmiot(MMIOT *, void *);
  176. extern void ___mkd_freemmiot(MMIOT *, void *);
  177. extern void ___mkd_freeLineRange(Line *, Line *);
  178. extern void ___mkd_xml(char *, int, FILE *);
  179. extern void ___mkd_reparse(char *, int, int, MMIOT*, char*);
  180. extern void ___mkd_emblock(MMIOT*);
  181. extern void ___mkd_tidy(Cstring *);
  182. extern Document *__mkd_new_Document();
  183. extern void __mkd_enqueue(Document*, Cstring *);
  184. extern void __mkd_header_dle(Line *);
  185. extern int __mkd_io_strget(struct string_stream *);
  186. #endif/*_MARKDOWN_D*/