v2compat.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. /* markdown: a C implementation of John Gruber's Markdown markup language.
  2. *
  3. * Copyright (C) 2007-2011 David L Parsons.
  4. * The redistribution terms are provided in the COPYRIGHT file that must
  5. * be distributed with this source code.
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <limits.h>
  10. #include <errno.h>
  11. #include <string.h>
  12. #include <stdarg.h>
  13. #include "config.h"
  14. #include "markdown.h"
  15. #include "amalloc.h"
  16. #if HAVE_LIBGEN_H
  17. #include <libgen.h>
  18. #endif
  19. /*
  20. * discount2 shim layer
  21. */
  22. /* 2.2.6 flags */
  23. #define MKD2_NOLINKS 0x00000001
  24. #define MKD2_NOIMAGE 0x00000002
  25. #define MKD2_NOPANTS 0x00000004
  26. #define MKD2_NOHTML 0x00000008
  27. #define MKD2_STRICT 0x00000010
  28. #define MKD2_TAGTEXT 0x00000020
  29. #define MKD2_NO_EXT 0x00000040
  30. #define MKD2_CDATA 0x00000080
  31. #define MKD2_NOSUPERSCRIPT 0x00000100
  32. #define MKD2_NORELAXED 0x00000200
  33. #define MKD2_NOTABLES 0x00000400
  34. #define MKD2_NOSTRIKETHROUGH 0x00000800
  35. #define MKD2_TOC 0x00001000
  36. #define MKD2_1_COMPAT 0x00002000
  37. #define MKD2_AUTOLINK 0x00004000
  38. #define MKD2_SAFELINK 0x00008000
  39. #define MKD2_NOHEADER 0x00010000
  40. #define MKD2_TABSTOP 0x00020000
  41. #define MKD2_NODIVQUOTE 0x00040000
  42. #define MKD2_NOALPHALIST 0x00080000
  43. #define MKD2_NODLIST 0x00100000
  44. #define MKD2_EXTRA_FOOTNOTE 0x00200000
  45. #define MKD2_NOSTYLE 0x00400000
  46. #define MKD2_NODLDISCOUNT 0x00800000
  47. #define MKD2_DLEXTRA 0x01000000
  48. #define MKD2_FENCEDCODE 0x02000000
  49. #define MKD2_IDANCHOR 0x04000000
  50. #define MKD2_GITHUBTAGS 0x08000000
  51. #define MKD2_URLENCODEDANCHOR 0x10000000
  52. #define MKD2_LATEX 0x40000000
  53. #define MKD2_EXPLICITLIST 0x80000000
  54. void
  55. ___mkd_strict_mode(mkd_flag_t *flags, int enable)
  56. {
  57. if ( enable ) {
  58. clear_mkd_flag(flags, MKD_FENCEDCODE);
  59. clear_mkd_flag(flags, MKD_LATEX);
  60. clear_mkd_flag(flags, MKD_TABSTOP);
  61. clear_mkd_flag(flags, MKD_EXTRA_FOOTNOTE);
  62. clear_mkd_flag(flags, MKD_AUTOLINK);
  63. clear_mkd_flag(flags, MKD_SAFELINK);
  64. clear_mkd_flag(flags, MKD_TOC);
  65. clear_mkd_flag(flags, MKD_DLDISCOUNT);
  66. clear_mkd_flag(flags, MKD_DLEXTRA);
  67. set_mkd_flag(flags, MKD_NOSUPERSCRIPT);
  68. set_mkd_flag(flags, MKD_NORMAL_LISTITEM);
  69. set_mkd_flag(flags, MKD_NO_EXT);
  70. set_mkd_flag(flags, MKD_NOSUPERSCRIPT);
  71. set_mkd_flag(flags, MKD_NORELAXED);
  72. set_mkd_flag(flags, MKD_NOTABLES);
  73. set_mkd_flag(flags, MKD_NOSTRIKETHROUGH);
  74. set_mkd_flag(flags, MKD_NOHEADER);
  75. set_mkd_flag(flags, MKD_NODIVQUOTE);
  76. set_mkd_flag(flags, MKD_NOALPHALIST);
  77. set_mkd_flag(flags, MKD_NOSTYLE);
  78. }
  79. }
  80. /*
  81. * convert a discount2 bitmap flag into a discount3 flag blob
  82. */
  83. static void
  84. convert_v2flags(DWORD bitmask, mkd_flag_t *blob)
  85. {
  86. int i;
  87. DWORD bit;
  88. mkd_init_flags(blob);
  89. set_mkd_flag(blob, MKD_DLDISCOUNT); /* default for discount dls changed from on to off in v3 */
  90. for (i=0; i < sizeof(DWORD)*8; i++) {
  91. bit = 1L << i;
  92. switch ( bitmask & bit ) {
  93. case MKD2_STRICT: ___mkd_strict_mode(blob, 1);
  94. break;
  95. case MKD2_NOLINKS: set_mkd_flag(blob,MKD_NOLINKS);
  96. break;
  97. case MKD2_NOIMAGE: set_mkd_flag(blob,MKD_NOIMAGE);
  98. break;
  99. case MKD2_NOPANTS: set_mkd_flag(blob,MKD_NOPANTS);
  100. break;
  101. case MKD2_NOHTML: set_mkd_flag(blob,MKD_NOHTML);
  102. break;
  103. case MKD2_TAGTEXT: set_mkd_flag(blob,MKD_TAGTEXT);
  104. break;
  105. case MKD2_NO_EXT: set_mkd_flag(blob,MKD_NO_EXT);
  106. break;
  107. case MKD2_CDATA: set_mkd_flag(blob,MKD_CDATA);
  108. break;
  109. case MKD2_NOSUPERSCRIPT:set_mkd_flag(blob,MKD_NOSUPERSCRIPT);
  110. break;
  111. case MKD2_NORELAXED: set_mkd_flag(blob,MKD_NORELAXED);
  112. break;
  113. case MKD2_NOTABLES: set_mkd_flag(blob,MKD_NOTABLES);
  114. break;
  115. case MKD2_NOSTRIKETHROUGH: set_mkd_flag(blob,MKD_NOSTRIKETHROUGH);
  116. break;
  117. case MKD2_TOC: set_mkd_flag(blob,MKD_TOC);
  118. break;
  119. case MKD2_1_COMPAT: set_mkd_flag(blob,MKD_1_COMPAT);
  120. break;
  121. case MKD2_AUTOLINK: set_mkd_flag(blob,MKD_AUTOLINK);
  122. break;
  123. case MKD2_SAFELINK: set_mkd_flag(blob,MKD_SAFELINK);
  124. break;
  125. case MKD2_NOHEADER: set_mkd_flag(blob,MKD_NOHEADER);
  126. break;
  127. case MKD2_TABSTOP: set_mkd_flag(blob,MKD_TABSTOP);
  128. break;
  129. case MKD2_NODIVQUOTE: set_mkd_flag(blob,MKD_NODIVQUOTE);
  130. break;
  131. case MKD2_NOALPHALIST: set_mkd_flag(blob,MKD_NOALPHALIST);
  132. break;
  133. case MKD2_EXTRA_FOOTNOTE: set_mkd_flag(blob,MKD_EXTRA_FOOTNOTE);
  134. break;
  135. case MKD2_NOSTYLE: set_mkd_flag(blob,MKD_NOSTYLE);
  136. break;
  137. case MKD2_NODLDISCOUNT: clear_mkd_flag(blob,MKD_DLDISCOUNT);
  138. break;
  139. case MKD2_DLEXTRA: set_mkd_flag(blob,MKD_DLEXTRA);
  140. break;
  141. case MKD2_FENCEDCODE: set_mkd_flag(blob,MKD_FENCEDCODE);
  142. break;
  143. case MKD2_IDANCHOR: set_mkd_flag(blob,MKD_IDANCHOR);
  144. break;
  145. case MKD2_GITHUBTAGS: set_mkd_flag(blob,MKD_GITHUBTAGS);
  146. break;
  147. case MKD2_URLENCODEDANCHOR: set_mkd_flag(blob,MKD_URLENCODEDANCHOR);
  148. break;
  149. case MKD2_LATEX: set_mkd_flag(blob,MKD_LATEX);
  150. break;
  151. case MKD2_EXPLICITLIST: set_mkd_flag(blob,MKD_EXPLICITLIST);
  152. break;
  153. }
  154. }
  155. }
  156. #undef mkd_in
  157. MMIOT *mkd_in(FILE *input, DWORD v2flags)
  158. {
  159. mkd_flag_t v3flags;
  160. convert_v2flags(v2flags, &v3flags);
  161. return (MMIOT*)mkd3_in(input, &v3flags);
  162. }
  163. #if 0
  164. char *mkd3_set_flag_string(mkd_flag_t*, char*); /* set named flags */
  165. char *mkd_set_flag_string(mkd2_flag_t, char*); /* set named flags */
  166. #endif
  167. #undef mkd_string
  168. MMIOT *
  169. mkd_string(const char *text, int length, DWORD v2flags)
  170. {
  171. mkd_flag_t v3flags;
  172. convert_v2flags(v2flags, &v3flags);
  173. return (MMIOT*)mkd3_string(text,length, &v3flags);
  174. }
  175. #undef gfm_in
  176. MMIOT *
  177. gfm_in(FILE *input, DWORD v2flags)
  178. {
  179. mkd_flag_t v3flags;
  180. convert_v2flags(v2flags, &v3flags);
  181. return (MMIOT*)gfm3_in(input, &v3flags);
  182. }
  183. #undef gfm_string
  184. MMIOT *
  185. gfm_string(const char *text, int length, DWORD v2flags)
  186. {
  187. mkd_flag_t v3flags;
  188. convert_v2flags(v2flags, &v3flags);
  189. return (MMIOT*)gfm3_string(text, length, &v3flags);
  190. }
  191. #undef mkd_compile
  192. int
  193. mkd_compile(MMIOT *document, DWORD v2flags)
  194. {
  195. mkd_flag_t v3flags;
  196. convert_v2flags(v2flags, &v3flags);
  197. return mkd3_compile((Document*)document, &v3flags);
  198. }
  199. #undef mkd_dump
  200. int
  201. mkd_dump(MMIOT *document, FILE *output, DWORD v2flags, char *word)
  202. {
  203. extern int mkd3_dump(MMIOT*, FILE*, mkd_flag_t*, char*);
  204. mkd_flag_t v3flags;
  205. convert_v2flags(v2flags, &v3flags);
  206. return mkd3_dump(document, output, &v3flags, word);
  207. }
  208. #undef markdown
  209. int
  210. markdown(MMIOT *document, FILE *output, DWORD v2flags)
  211. {
  212. extern int markdown3(MMIOT*, FILE*, mkd_flag_t*);
  213. mkd_flag_t v3flags;
  214. convert_v2flags(v2flags, &v3flags);
  215. return markdown3(document, output, &v3flags);
  216. }
  217. #undef mkd_line
  218. int
  219. mkd_line(char *text, int size, char **ret, DWORD v2flags)
  220. {
  221. mkd_flag_t v3flags;
  222. convert_v2flags(v2flags, &v3flags);
  223. return mkd3_line(text, size, ret, &v3flags);
  224. }
  225. #undef mkd_xhtmlpage
  226. int
  227. mkd_xhtmlpage(MMIOT *document, DWORD v2flags,FILE *output)
  228. {
  229. extern int mkd3_xhtmlpage(MMIOT*, mkd_flag_t*, FILE*);
  230. mkd_flag_t v3flags;
  231. convert_v2flags(v2flags, &v3flags);
  232. return mkd3_xhtmlpage(document, &v3flags, output);
  233. }
  234. #undef mkd_generateline
  235. int
  236. mkd_generateline(char *text, int size, FILE *output, DWORD v2flags)
  237. {
  238. mkd_flag_t v3flags;
  239. convert_v2flags(v2flags, &v3flags);
  240. return mkd3_generateline(text, size, output, &v3flags);
  241. }
  242. #undef mkd_flags_are
  243. void
  244. mkd_flags_are(FILE *output, DWORD v2flags, int htmlplease)
  245. {
  246. extern void mkd3_flags_are(FILE *f, mkd_flag_t* flags, int htmlplease);
  247. mkd_flag_t v3flags;
  248. convert_v2flags(v2flags, &v3flags);
  249. mkd3_flags_are(output, &v3flags, htmlplease);
  250. }