rpeg-multimarkdown2 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (269) hide show
  1. data/LICENSE +96 -0
  2. data/README.markdown +52 -0
  3. data/Rakefile +167 -0
  4. data/bin/rpeg-multimarkdown2 +128 -0
  5. data/ext/extconf.h +3 -0
  6. data/ext/extconf.rb +15 -0
  7. data/ext/markdown.c +102 -0
  8. data/ext/markdown_lib.c +265 -0
  9. data/ext/markdown_lib.h +33 -0
  10. data/ext/markdown_output.c +2832 -0
  11. data/ext/markdown_parser.c +9091 -0
  12. data/ext/markdown_peg.h +144 -0
  13. data/ext/odf.c +183 -0
  14. data/ext/odf.h +3 -0
  15. data/ext/parsing_functions.c +199 -0
  16. data/ext/utility_functions.c +566 -0
  17. data/lib/multimarkdown2.rb +1 -0
  18. data/lib/peg_multimarkdown.rb +74 -0
  19. data/test/MultiMarkdownTest/BeamerTests/Beamer-Tables.html +76 -0
  20. data/test/MultiMarkdownTest/BeamerTests/Beamer-Tables.tex +64 -0
  21. data/test/MultiMarkdownTest/BeamerTests/Beamer-Tables.text +38 -0
  22. data/test/MultiMarkdownTest/CompatibilityTests/Automatic Labels.html +35 -0
  23. data/test/MultiMarkdownTest/CompatibilityTests/Automatic Labels.text +45 -0
  24. data/test/MultiMarkdownTest/CompatibilityTests/Base Header Level.html +14 -0
  25. data/test/MultiMarkdownTest/CompatibilityTests/Base Header Level.text +16 -0
  26. data/test/MultiMarkdownTest/CompatibilityTests/BibTeX.html +9 -0
  27. data/test/MultiMarkdownTest/CompatibilityTests/BibTeX.text +10 -0
  28. data/test/MultiMarkdownTest/CompatibilityTests/Citations.html +40 -0
  29. data/test/MultiMarkdownTest/CompatibilityTests/Citations.text +42 -0
  30. data/test/MultiMarkdownTest/CompatibilityTests/Definition Lists.html +40 -0
  31. data/test/MultiMarkdownTest/CompatibilityTests/Definition Lists.text +39 -0
  32. data/test/MultiMarkdownTest/CompatibilityTests/Dutch.html +17 -0
  33. data/test/MultiMarkdownTest/CompatibilityTests/Dutch.text +17 -0
  34. data/test/MultiMarkdownTest/CompatibilityTests/Email.html +40 -0
  35. data/test/MultiMarkdownTest/CompatibilityTests/Email.text +31 -0
  36. data/test/MultiMarkdownTest/CompatibilityTests/English.html +17 -0
  37. data/test/MultiMarkdownTest/CompatibilityTests/English.text +17 -0
  38. data/test/MultiMarkdownTest/CompatibilityTests/Errors.html +9 -0
  39. data/test/MultiMarkdownTest/CompatibilityTests/Errors.text +11 -0
  40. data/test/MultiMarkdownTest/CompatibilityTests/Footnotes.html +23 -0
  41. data/test/MultiMarkdownTest/CompatibilityTests/Footnotes.text +25 -0
  42. data/test/MultiMarkdownTest/CompatibilityTests/French.html +17 -0
  43. data/test/MultiMarkdownTest/CompatibilityTests/French.text +17 -0
  44. data/test/MultiMarkdownTest/CompatibilityTests/German.html +17 -0
  45. data/test/MultiMarkdownTest/CompatibilityTests/German.text +17 -0
  46. data/test/MultiMarkdownTest/CompatibilityTests/GermanGuillemets.html +17 -0
  47. data/test/MultiMarkdownTest/CompatibilityTests/GermanGuillemets.text +17 -0
  48. data/test/MultiMarkdownTest/CompatibilityTests/Glossary.html +29 -0
  49. data/test/MultiMarkdownTest/CompatibilityTests/Glossary.text +28 -0
  50. data/test/MultiMarkdownTest/CompatibilityTests/Headers.html +42 -0
  51. data/test/MultiMarkdownTest/CompatibilityTests/Headers.text +51 -0
  52. data/test/MultiMarkdownTest/CompatibilityTests/Line Breaks.html +13 -0
  53. data/test/MultiMarkdownTest/CompatibilityTests/Line Breaks.text +15 -0
  54. data/test/MultiMarkdownTest/CompatibilityTests/Link Attributes.html +35 -0
  55. data/test/MultiMarkdownTest/CompatibilityTests/Link Attributes.text +51 -0
  56. data/test/MultiMarkdownTest/CompatibilityTests/List Parsing.html +13 -0
  57. data/test/MultiMarkdownTest/CompatibilityTests/List Parsing.text +11 -0
  58. data/test/MultiMarkdownTest/CompatibilityTests/MarkdownInHTML.html +13 -0
  59. data/test/MultiMarkdownTest/CompatibilityTests/MarkdownInHTML.text +19 -0
  60. data/test/MultiMarkdownTest/CompatibilityTests/Math.html +14 -0
  61. data/test/MultiMarkdownTest/CompatibilityTests/Math.text +15 -0
  62. data/test/MultiMarkdownTest/CompatibilityTests/MetaData.html +14 -0
  63. data/test/MultiMarkdownTest/CompatibilityTests/MetaData.text +14 -0
  64. data/test/MultiMarkdownTest/CompatibilityTests/NotMetaData.html +3 -0
  65. data/test/MultiMarkdownTest/CompatibilityTests/NotMetaData.text +4 -0
  66. data/test/MultiMarkdownTest/CompatibilityTests/Sanity.html +77 -0
  67. data/test/MultiMarkdownTest/CompatibilityTests/Sanity.text +77 -0
  68. data/test/MultiMarkdownTest/CompatibilityTests/SmartQuotes.html +22 -0
  69. data/test/MultiMarkdownTest/CompatibilityTests/SmartQuotes.text +22 -0
  70. data/test/MultiMarkdownTest/CompatibilityTests/Swedish.html +17 -0
  71. data/test/MultiMarkdownTest/CompatibilityTests/Swedish.text +17 -0
  72. data/test/MultiMarkdownTest/CompatibilityTests/Tables.html +65 -0
  73. data/test/MultiMarkdownTest/CompatibilityTests/Tables.text +71 -0
  74. data/test/MultiMarkdownTest/MarkdownTest.pl +182 -0
  75. data/test/MultiMarkdownTest/MemoirTests/Automatic Labels.html +42 -0
  76. data/test/MultiMarkdownTest/MemoirTests/Automatic Labels.tex +47 -0
  77. data/test/MultiMarkdownTest/MemoirTests/Automatic Labels.text +46 -0
  78. data/test/MultiMarkdownTest/MemoirTests/Base Header Level.html +20 -0
  79. data/test/MultiMarkdownTest/MemoirTests/Base Header Level.tex +19 -0
  80. data/test/MultiMarkdownTest/MemoirTests/Base Header Level.text +16 -0
  81. data/test/MultiMarkdownTest/MemoirTests/BibTeX.html +17 -0
  82. data/test/MultiMarkdownTest/MemoirTests/BibTeX.tex +12 -0
  83. data/test/MultiMarkdownTest/MemoirTests/BibTeX.text +11 -0
  84. data/test/MultiMarkdownTest/MemoirTests/Citations.html +63 -0
  85. data/test/MultiMarkdownTest/MemoirTests/Citations.tex +48 -0
  86. data/test/MultiMarkdownTest/MemoirTests/Citations.text +43 -0
  87. data/test/MultiMarkdownTest/MemoirTests/Definition Lists.html +61 -0
  88. data/test/MultiMarkdownTest/MemoirTests/Definition Lists.tex +58 -0
  89. data/test/MultiMarkdownTest/MemoirTests/Definition Lists.text +40 -0
  90. data/test/MultiMarkdownTest/MemoirTests/Dutch.html +23 -0
  91. data/test/MultiMarkdownTest/MemoirTests/Dutch.tex +18 -0
  92. data/test/MultiMarkdownTest/MemoirTests/Dutch.text +17 -0
  93. data/test/MultiMarkdownTest/MemoirTests/Email.html +48 -0
  94. data/test/MultiMarkdownTest/MemoirTests/Email.tex +61 -0
  95. data/test/MultiMarkdownTest/MemoirTests/Email.text +32 -0
  96. data/test/MultiMarkdownTest/MemoirTests/English.html +23 -0
  97. data/test/MultiMarkdownTest/MemoirTests/English.tex +18 -0
  98. data/test/MultiMarkdownTest/MemoirTests/English.text +17 -0
  99. data/test/MultiMarkdownTest/MemoirTests/Footnotes.html +47 -0
  100. data/test/MultiMarkdownTest/MemoirTests/Footnotes.tex +28 -0
  101. data/test/MultiMarkdownTest/MemoirTests/Footnotes.text +26 -0
  102. data/test/MultiMarkdownTest/MemoirTests/French.html +23 -0
  103. data/test/MultiMarkdownTest/MemoirTests/French.tex +18 -0
  104. data/test/MultiMarkdownTest/MemoirTests/French.text +17 -0
  105. data/test/MultiMarkdownTest/MemoirTests/German.html +23 -0
  106. data/test/MultiMarkdownTest/MemoirTests/German.tex +18 -0
  107. data/test/MultiMarkdownTest/MemoirTests/German.text +17 -0
  108. data/test/MultiMarkdownTest/MemoirTests/GermanGuillemets.html +23 -0
  109. data/test/MultiMarkdownTest/MemoirTests/GermanGuillemets.tex +18 -0
  110. data/test/MultiMarkdownTest/MemoirTests/GermanGuillemets.text +17 -0
  111. data/test/MultiMarkdownTest/MemoirTests/Glossary.html +47 -0
  112. data/test/MultiMarkdownTest/MemoirTests/Glossary.tex +30 -0
  113. data/test/MultiMarkdownTest/MemoirTests/Glossary.text +29 -0
  114. data/test/MultiMarkdownTest/MemoirTests/Line Breaks.html +21 -0
  115. data/test/MultiMarkdownTest/MemoirTests/Line Breaks.tex +16 -0
  116. data/test/MultiMarkdownTest/MemoirTests/Line Breaks.text +16 -0
  117. data/test/MultiMarkdownTest/MemoirTests/Link Attributes.html +40 -0
  118. data/test/MultiMarkdownTest/MemoirTests/Link Attributes.tex +61 -0
  119. data/test/MultiMarkdownTest/MemoirTests/Link Attributes.text +51 -0
  120. data/test/MultiMarkdownTest/MemoirTests/Math.html +22 -0
  121. data/test/MultiMarkdownTest/MemoirTests/Math.tex +16 -0
  122. data/test/MultiMarkdownTest/MemoirTests/Math.text +16 -0
  123. data/test/MultiMarkdownTest/MemoirTests/Memoir Mode.html +24 -0
  124. data/test/MultiMarkdownTest/MemoirTests/Memoir Mode.tex +23 -0
  125. data/test/MultiMarkdownTest/MemoirTests/Memoir Mode.text +20 -0
  126. data/test/MultiMarkdownTest/MemoirTests/MetaData.html +22 -0
  127. data/test/MultiMarkdownTest/MemoirTests/MetaData.tex +14 -0
  128. data/test/MultiMarkdownTest/MemoirTests/MetaData.text +15 -0
  129. data/test/MultiMarkdownTest/MemoirTests/Sanity.html +100 -0
  130. data/test/MultiMarkdownTest/MemoirTests/Sanity.tex +101 -0
  131. data/test/MultiMarkdownTest/MemoirTests/Sanity.text +78 -0
  132. data/test/MultiMarkdownTest/MemoirTests/SmartQuotes.html +26 -0
  133. data/test/MultiMarkdownTest/MemoirTests/SmartQuotes.tex +21 -0
  134. data/test/MultiMarkdownTest/MemoirTests/SmartQuotes.text +19 -0
  135. data/test/MultiMarkdownTest/MemoirTests/Swedish.html +23 -0
  136. data/test/MultiMarkdownTest/MemoirTests/Swedish.tex +18 -0
  137. data/test/MultiMarkdownTest/MemoirTests/Swedish.text +17 -0
  138. data/test/MultiMarkdownTest/MemoirTests/Tables.html +221 -0
  139. data/test/MultiMarkdownTest/MemoirTests/Tables.tex +134 -0
  140. data/test/MultiMarkdownTest/MemoirTests/Tables.text +64 -0
  141. data/test/MultiMarkdownTest/MultiMarkdownTests/Automatic Labels.html +43 -0
  142. data/test/MultiMarkdownTest/MultiMarkdownTests/Automatic Labels.tex +46 -0
  143. data/test/MultiMarkdownTest/MultiMarkdownTests/Automatic Labels.text +45 -0
  144. data/test/MultiMarkdownTest/MultiMarkdownTests/Base Header Level.html +22 -0
  145. data/test/MultiMarkdownTest/MultiMarkdownTests/Base Header Level.tex +19 -0
  146. data/test/MultiMarkdownTest/MultiMarkdownTests/Base Header Level.text +16 -0
  147. data/test/MultiMarkdownTest/MultiMarkdownTests/BibTeX.html +18 -0
  148. data/test/MultiMarkdownTest/MultiMarkdownTests/BibTeX.tex +11 -0
  149. data/test/MultiMarkdownTest/MultiMarkdownTests/BibTex.text +10 -0
  150. data/test/MultiMarkdownTest/MultiMarkdownTests/Citations.html +64 -0
  151. data/test/MultiMarkdownTest/MultiMarkdownTests/Citations.tex +47 -0
  152. data/test/MultiMarkdownTest/MultiMarkdownTests/Citations.text +42 -0
  153. data/test/MultiMarkdownTest/MultiMarkdownTests/Definition Lists.html +57 -0
  154. data/test/MultiMarkdownTest/MultiMarkdownTests/Definition Lists.tex +57 -0
  155. data/test/MultiMarkdownTest/MultiMarkdownTests/Definition Lists.text +39 -0
  156. data/test/MultiMarkdownTest/MultiMarkdownTests/Dutch.html +25 -0
  157. data/test/MultiMarkdownTest/MultiMarkdownTests/Dutch.tex +18 -0
  158. data/test/MultiMarkdownTest/MultiMarkdownTests/Dutch.text +17 -0
  159. data/test/MultiMarkdownTest/MultiMarkdownTests/Email.html +49 -0
  160. data/test/MultiMarkdownTest/MultiMarkdownTests/Email.tex +54 -0
  161. data/test/MultiMarkdownTest/MultiMarkdownTests/Email.text +31 -0
  162. data/test/MultiMarkdownTest/MultiMarkdownTests/English.html +25 -0
  163. data/test/MultiMarkdownTest/MultiMarkdownTests/English.tex +18 -0
  164. data/test/MultiMarkdownTest/MultiMarkdownTests/English.text +17 -0
  165. data/test/MultiMarkdownTest/MultiMarkdownTests/Errors.html +18 -0
  166. data/test/MultiMarkdownTest/MultiMarkdownTests/Errors.tex +11 -0
  167. data/test/MultiMarkdownTest/MultiMarkdownTests/Errors.text +11 -0
  168. data/test/MultiMarkdownTest/MultiMarkdownTests/Footnotes.html +48 -0
  169. data/test/MultiMarkdownTest/MultiMarkdownTests/Footnotes.tex +24 -0
  170. data/test/MultiMarkdownTest/MultiMarkdownTests/Footnotes.text +25 -0
  171. data/test/MultiMarkdownTest/MultiMarkdownTests/French.html +25 -0
  172. data/test/MultiMarkdownTest/MultiMarkdownTests/French.tex +18 -0
  173. data/test/MultiMarkdownTest/MultiMarkdownTests/French.text +17 -0
  174. data/test/MultiMarkdownTest/MultiMarkdownTests/German.html +25 -0
  175. data/test/MultiMarkdownTest/MultiMarkdownTests/German.tex +18 -0
  176. data/test/MultiMarkdownTest/MultiMarkdownTests/German.text +17 -0
  177. data/test/MultiMarkdownTest/MultiMarkdownTests/GermanGuillemets.html +25 -0
  178. data/test/MultiMarkdownTest/MultiMarkdownTests/GermanGuillemets.tex +18 -0
  179. data/test/MultiMarkdownTest/MultiMarkdownTests/GermanGuillemets.text +17 -0
  180. data/test/MultiMarkdownTest/MultiMarkdownTests/Glossary.html +48 -0
  181. data/test/MultiMarkdownTest/MultiMarkdownTests/Glossary.tex +26 -0
  182. data/test/MultiMarkdownTest/MultiMarkdownTests/Glossary.text +28 -0
  183. data/test/MultiMarkdownTest/MultiMarkdownTests/Headers.html +50 -0
  184. data/test/MultiMarkdownTest/MultiMarkdownTests/Headers.tex +54 -0
  185. data/test/MultiMarkdownTest/MultiMarkdownTests/Headers.text +51 -0
  186. data/test/MultiMarkdownTest/MultiMarkdownTests/Line Breaks.html +22 -0
  187. data/test/MultiMarkdownTest/MultiMarkdownTests/Line Breaks.tex +15 -0
  188. data/test/MultiMarkdownTest/MultiMarkdownTests/Line Breaks.text +15 -0
  189. data/test/MultiMarkdownTest/MultiMarkdownTests/Link Attributes.html +56 -0
  190. data/test/MultiMarkdownTest/MultiMarkdownTests/Link Attributes.tex +60 -0
  191. data/test/MultiMarkdownTest/MultiMarkdownTests/Link Attributes.text +50 -0
  192. data/test/MultiMarkdownTest/MultiMarkdownTests/List Parsing.html +22 -0
  193. data/test/MultiMarkdownTest/MultiMarkdownTests/List Parsing.tex +17 -0
  194. data/test/MultiMarkdownTest/MultiMarkdownTests/List Parsing.text +11 -0
  195. data/test/MultiMarkdownTest/MultiMarkdownTests/MarkdownInHTML.html +21 -0
  196. data/test/MultiMarkdownTest/MultiMarkdownTests/MarkdownInHTML.tex +13 -0
  197. data/test/MultiMarkdownTest/MultiMarkdownTests/MarkdownInHTML.text +19 -0
  198. data/test/MultiMarkdownTest/MultiMarkdownTests/Math.html +23 -0
  199. data/test/MultiMarkdownTest/MultiMarkdownTests/Math.tex +15 -0
  200. data/test/MultiMarkdownTest/MultiMarkdownTests/Math.text +15 -0
  201. data/test/MultiMarkdownTest/MultiMarkdownTests/MetaData.html +23 -0
  202. data/test/MultiMarkdownTest/MultiMarkdownTests/MetaData.tex +13 -0
  203. data/test/MultiMarkdownTest/MultiMarkdownTests/MetaData.text +14 -0
  204. data/test/MultiMarkdownTest/MultiMarkdownTests/NotMetaData.html +3 -0
  205. data/test/MultiMarkdownTest/MultiMarkdownTests/NotMetaData.tex +3 -0
  206. data/test/MultiMarkdownTest/MultiMarkdownTests/NotMetaData.text +4 -0
  207. data/test/MultiMarkdownTest/MultiMarkdownTests/Sanity.html +106 -0
  208. data/test/MultiMarkdownTest/MultiMarkdownTests/Sanity.tex +100 -0
  209. data/test/MultiMarkdownTest/MultiMarkdownTests/Sanity.text +77 -0
  210. data/test/MultiMarkdownTest/MultiMarkdownTests/SmartQuotes.html +31 -0
  211. data/test/MultiMarkdownTest/MultiMarkdownTests/SmartQuotes.tex +24 -0
  212. data/test/MultiMarkdownTest/MultiMarkdownTests/SmartQuotes.text +22 -0
  213. data/test/MultiMarkdownTest/MultiMarkdownTests/Swedish.html +25 -0
  214. data/test/MultiMarkdownTest/MultiMarkdownTests/Swedish.tex +18 -0
  215. data/test/MultiMarkdownTest/MultiMarkdownTests/Swedish.text +17 -0
  216. data/test/MultiMarkdownTest/MultiMarkdownTests/Tables.html +273 -0
  217. data/test/MultiMarkdownTest/MultiMarkdownTests/Tables.tex +155 -0
  218. data/test/MultiMarkdownTest/MultiMarkdownTests/Tables.text +71 -0
  219. data/test/MultiMarkdownTest/MultiMarkdownTests/bibtex.bib +119 -0
  220. data/test/MultiMarkdownTest/README.md +58 -0
  221. data/test/MultiMarkdownTest/Tests/Amps and angle encoding.html +17 -0
  222. data/test/MultiMarkdownTest/Tests/Amps and angle encoding.text +21 -0
  223. data/test/MultiMarkdownTest/Tests/Auto links.html +18 -0
  224. data/test/MultiMarkdownTest/Tests/Auto links.text +13 -0
  225. data/test/MultiMarkdownTest/Tests/Backslash escapes.html +118 -0
  226. data/test/MultiMarkdownTest/Tests/Backslash escapes.text +120 -0
  227. data/test/MultiMarkdownTest/Tests/Blockquotes with code blocks.html +15 -0
  228. data/test/MultiMarkdownTest/Tests/Blockquotes with code blocks.text +11 -0
  229. data/test/MultiMarkdownTest/Tests/Code Blocks.html +18 -0
  230. data/test/MultiMarkdownTest/Tests/Code Blocks.text +14 -0
  231. data/test/MultiMarkdownTest/Tests/Code Spans.html +6 -0
  232. data/test/MultiMarkdownTest/Tests/Code Spans.text +6 -0
  233. data/test/MultiMarkdownTest/Tests/Compatibility.html +5 -0
  234. data/test/MultiMarkdownTest/Tests/Compatibility.text +9 -0
  235. data/test/MultiMarkdownTest/Tests/Hard-wrapped paragraphs with list-like lines.html +8 -0
  236. data/test/MultiMarkdownTest/Tests/Hard-wrapped paragraphs with list-like lines.text +8 -0
  237. data/test/MultiMarkdownTest/Tests/Horizontal rules.html +71 -0
  238. data/test/MultiMarkdownTest/Tests/Horizontal rules.text +67 -0
  239. data/test/MultiMarkdownTest/Tests/Inline HTML (Advanced).html +15 -0
  240. data/test/MultiMarkdownTest/Tests/Inline HTML (Advanced).text +15 -0
  241. data/test/MultiMarkdownTest/Tests/Inline HTML (Simple).html +72 -0
  242. data/test/MultiMarkdownTest/Tests/Inline HTML (Simple).text +69 -0
  243. data/test/MultiMarkdownTest/Tests/Inline HTML comments.html +13 -0
  244. data/test/MultiMarkdownTest/Tests/Inline HTML comments.text +13 -0
  245. data/test/MultiMarkdownTest/Tests/Links, inline style.html +11 -0
  246. data/test/MultiMarkdownTest/Tests/Links, inline style.text +12 -0
  247. data/test/MultiMarkdownTest/Tests/Links, reference style.html +52 -0
  248. data/test/MultiMarkdownTest/Tests/Links, reference style.text +71 -0
  249. data/test/MultiMarkdownTest/Tests/Links, shortcut references.html +9 -0
  250. data/test/MultiMarkdownTest/Tests/Links, shortcut references.text +20 -0
  251. data/test/MultiMarkdownTest/Tests/Literal quotes in titles.html +3 -0
  252. data/test/MultiMarkdownTest/Tests/Literal quotes in titles.text +7 -0
  253. data/test/MultiMarkdownTest/Tests/Markdown Documentation - Basics.html +314 -0
  254. data/test/MultiMarkdownTest/Tests/Markdown Documentation - Basics.text +306 -0
  255. data/test/MultiMarkdownTest/Tests/Markdown Documentation - Syntax.html +942 -0
  256. data/test/MultiMarkdownTest/Tests/Markdown Documentation - Syntax.text +888 -0
  257. data/test/MultiMarkdownTest/Tests/Nested blockquotes.html +9 -0
  258. data/test/MultiMarkdownTest/Tests/Nested blockquotes.text +5 -0
  259. data/test/MultiMarkdownTest/Tests/Ordered and unordered lists.html +148 -0
  260. data/test/MultiMarkdownTest/Tests/Ordered and unordered lists.text +131 -0
  261. data/test/MultiMarkdownTest/Tests/Strong and em together.html +7 -0
  262. data/test/MultiMarkdownTest/Tests/Strong and em together.text +7 -0
  263. data/test/MultiMarkdownTest/Tests/Tabs.html +25 -0
  264. data/test/MultiMarkdownTest/Tests/Tabs.text +21 -0
  265. data/test/MultiMarkdownTest/Tests/Tidyness.html +8 -0
  266. data/test/MultiMarkdownTest/Tests/Tidyness.text +5 -0
  267. data/test/benchmark.rb +49 -0
  268. data/test/multimarkdown_test.rb +89 -0
  269. metadata +318 -0
@@ -0,0 +1,566 @@
1
+ /* utility_functions.c - List manipulation functions, element
2
+ * constructors, and macro definitions for leg markdown parser. */
3
+
4
+ #include <time.h>
5
+
6
+ extern int strcasecmp(const char *string1, const char *string2);
7
+
8
+ static char *label_from_string(char *str, bool obfuscate) ;
9
+ static void localize_typography(GString *out, int character, int language, int output);
10
+
11
+ static void print_raw_element_list(GString *out, element *list);
12
+
13
+ /**********************************************************************
14
+
15
+ List manipulation functions
16
+
17
+ ***********************************************************************/
18
+
19
+ /* cons - cons an element onto a list, returning pointer to new head */
20
+ static element * cons(element *new, element *list) {
21
+ assert(new != NULL);
22
+ new->next = list;
23
+ return new;
24
+ }
25
+
26
+ /* reverse - reverse a list, returning pointer to new list */
27
+ static element *reverse(element *list) {
28
+ element *new = NULL;
29
+ element *next = NULL;
30
+ while (list != NULL) {
31
+ next = list->next;
32
+ new = cons(list, new);
33
+ list = next;
34
+ }
35
+ return new;
36
+ }
37
+
38
+ /* append_list - add element to end of list */
39
+ static void append_list(element *new, element *list) {
40
+ assert(new != NULL);
41
+ element *step = list;
42
+
43
+ while (step->next != NULL) {
44
+ step = step->next;
45
+ }
46
+
47
+ new->next = NULL;
48
+ step->next = new;
49
+ }
50
+
51
+ /* concat_string_list - concatenates string contents of list of STR elements.
52
+ * Frees STR elements as they are added to the concatenation. */
53
+ static GString *concat_string_list(element *list) {
54
+ GString *result;
55
+ element *next;
56
+ result = g_string_new("");
57
+ while (list != NULL) {
58
+ assert(list->key == STR);
59
+ assert(list->contents.str != NULL);
60
+ g_string_append(result, list->contents.str);
61
+ next = list->next;
62
+ free_element(list);
63
+ list = next;
64
+ }
65
+ return result;
66
+ }
67
+
68
+ /**********************************************************************
69
+
70
+ Global variables used in parsing
71
+
72
+ ***********************************************************************/
73
+
74
+ static char *charbuf = ""; /* Buffer of characters to be parsed. */
75
+ static element *references = NULL; /* List of link references found. */
76
+ static element *notes = NULL; /* List of footnotes found. */
77
+ static element *parse_result; /* Results of parse. */
78
+ int syntax_extensions; /* Syntax extensions selected. */
79
+
80
+ static element *labels = NULL; /* List of labels found in document. */
81
+
82
+ static clock_t start_time = 0; /* Used for ensuring we're not stuck in a loop */
83
+ static bool parse_aborted = 0; /* flag indicating we ran out of time */
84
+
85
+ /**********************************************************************
86
+
87
+ Auxiliary functions for parsing actions.
88
+ These make it easier to build up data structures (including lists)
89
+ in the parsing actions.
90
+
91
+ ***********************************************************************/
92
+
93
+ /* mk_element - generic constructor for element */
94
+ static element * mk_element(int key) {
95
+ element *result = malloc(sizeof(element));
96
+ result->key = key;
97
+ result->children = NULL;
98
+ result->next = NULL;
99
+ result->contents.str = NULL;
100
+ return result;
101
+ }
102
+
103
+ /* mk_str - constructor for STR element */
104
+ static element * mk_str(char *string) {
105
+ element *result;
106
+ assert(string != NULL);
107
+ result = mk_element(STR);
108
+ result->contents.str = strdup(string);
109
+ return result;
110
+ }
111
+
112
+ /* mk_str_from_list - makes STR element by concatenating a
113
+ * reversed list of strings, adding optional extra newline */
114
+ static element * mk_str_from_list(element *list, bool extra_newline) {
115
+ element *result;
116
+ GString *c = concat_string_list(reverse(list));
117
+ if (extra_newline)
118
+ g_string_append(c, "\n");
119
+ result = mk_element(STR);
120
+ result->contents.str = c->str;
121
+ g_string_free(c, false);
122
+ return result;
123
+ }
124
+
125
+ /* mk_list - makes new list with key 'key' and children the reverse of 'lst'.
126
+ * This is designed to be used with cons to build lists in a parser action.
127
+ * The reversing is necessary because cons adds to the head of a list. */
128
+ static element * mk_list(int key, element *lst) {
129
+ element *result;
130
+ result = mk_element(key);
131
+ result->children = reverse(lst);
132
+ return result;
133
+ }
134
+
135
+ /* mk_link - constructor for LINK element */
136
+ static element * mk_link(element *label, char *url, char *title, element *attr, char *id) {
137
+ element *result;
138
+ result = mk_element(LINK);
139
+ result->contents.link = malloc(sizeof(link));
140
+ result->contents.link->label = label;
141
+ result->contents.link->url = strdup(url);
142
+ result->contents.link->title = strdup(title);
143
+ result->contents.link->attr = attr;
144
+ result->contents.link->identifier = strdup(id);
145
+ return result;
146
+ }
147
+
148
+ /* extension = returns true if extension is selected */
149
+ static bool extension(int ext) {
150
+ return (syntax_extensions & ext);
151
+ }
152
+
153
+ /* match_inlines - returns true if inline lists match (case-insensitive...) */
154
+ static bool match_inlines(element *l1, element *l2) {
155
+ while (l1 != NULL && l2 != NULL) {
156
+ if (l1->key != l2->key)
157
+ return false;
158
+ switch (l1->key) {
159
+ case SPACE:
160
+ case LINEBREAK:
161
+ case ELLIPSIS:
162
+ case EMDASH:
163
+ case ENDASH:
164
+ case APOSTROPHE:
165
+ break;
166
+ case CODE:
167
+ case STR:
168
+ case HTML:
169
+ if (strcasecmp(l1->contents.str, l2->contents.str) == 0)
170
+ break;
171
+ else
172
+ return false;
173
+ case EMPH:
174
+ case STRONG:
175
+ case LIST:
176
+ case SINGLEQUOTED:
177
+ case DOUBLEQUOTED:
178
+ if (match_inlines(l1->children, l2->children))
179
+ break;
180
+ else
181
+ return false;
182
+ case LINK:
183
+ case IMAGE:
184
+ return false; /* No links or images within links */
185
+ default:
186
+ fprintf(stderr, "match_inlines encountered unknown key = %d\n", l1->key);
187
+ exit(EXIT_FAILURE);
188
+ break;
189
+ }
190
+ l1 = l1->next;
191
+ l2 = l2->next;
192
+ }
193
+ return (l1 == NULL && l2 == NULL); /* return true if both lists exhausted */
194
+ }
195
+
196
+ /* find_reference - return true if link found in references matching label.
197
+ * 'link' is modified with the matching url and title. */
198
+ static bool find_reference(link *result, element *label) {
199
+ element *cur = references; /* pointer to walk up list of references */
200
+ link *curitem;
201
+ while (cur != NULL) {
202
+ curitem = cur->contents.link;
203
+ if (match_inlines(label, curitem->label)) {
204
+ *result = *curitem;
205
+ return true;
206
+ }
207
+ else
208
+ cur = cur->next;
209
+ }
210
+ return false;
211
+ }
212
+
213
+ /* find_note - return true if note found in notes matching label.
214
+ if found, 'result' is set to point to matched note. */
215
+
216
+ static bool find_note(element **result, char *label) {
217
+ element *cur = notes; /* pointer to walk up list of notes */
218
+ while (cur != NULL) {
219
+ if (strcmp(label, cur->contents.str) == 0) {
220
+ *result = cur;
221
+ return true;
222
+ }
223
+ else
224
+ cur = cur->next;
225
+ }
226
+ return false;
227
+ }
228
+
229
+
230
+
231
+ /**********************************************************************
232
+
233
+ Definitions for leg parser generator.
234
+ YY_INPUT is the function the parser calls to get new input.
235
+ We take all new input from (static) charbuf.
236
+
237
+ ***********************************************************************/
238
+
239
+ # define YYSTYPE element *
240
+ #ifdef __DEBUG__
241
+ # define YY_DEBUG 1
242
+ #endif
243
+
244
+ #define YY_INPUT(buf, result, max_size) \
245
+ { \
246
+ int yyc; \
247
+ if (charbuf && *charbuf != '\0') { \
248
+ yyc= *charbuf++; \
249
+ } else { \
250
+ yyc= EOF; \
251
+ } \
252
+ result= (EOF == yyc) ? 0 : (*(buf)= yyc, 1); \
253
+ }
254
+
255
+
256
+ /* peg-multimarkdown additions */
257
+
258
+ /* print_raw_element - print an element as original text */
259
+ static void print_raw_element(GString *out, element *elt) {
260
+ if (elt->key == LINK) {
261
+ print_raw_element_list(out,elt->contents.link->label);
262
+ } else {
263
+ if (elt->contents.str != NULL) {
264
+ g_string_append_printf(out, "%s", elt->contents.str);
265
+ } else {
266
+ print_raw_element_list(out, elt->children);
267
+ }
268
+ }
269
+ }
270
+
271
+ /* print_raw_element_list - print a list of elements as original text */
272
+ static void print_raw_element_list(GString *out, element *list) {
273
+ while (list != NULL) {
274
+ print_raw_element(out, list);
275
+ list = list->next;
276
+ }
277
+ }
278
+
279
+ /* label_from_element_list */
280
+ /* Returns a null-terminated string, which must be freed after use. */
281
+
282
+ static char *label_from_element_list(element *list, bool obfuscate) {
283
+ char *label;
284
+ char *label2;
285
+ GString *raw = g_string_new("");
286
+ print_raw_element_list(raw, list);
287
+ label = label_from_string(raw->str,obfuscate);
288
+ label2 = strdup(label);
289
+ free(label);
290
+ g_string_free(raw,true);
291
+ return label2;
292
+ }
293
+
294
+ /* label_from_string - strip spaces and illegal characters to generate valid
295
+ HTML id */
296
+ /* Returns a null-terminated string, which must be freed after use. */
297
+
298
+ static char *label_from_string(char *str, bool obfuscate) {
299
+ bool valid = FALSE;
300
+ GString *out = g_string_new("");
301
+ char *label;
302
+
303
+ while (*str != '\0') {
304
+ if (valid) {
305
+ /* can relax on following characters */
306
+ if ((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z')
307
+ || (*str >= 'a' && *str <= 'z') || (*str == '.') || (*str== '_')
308
+ || (*str== '-') || (*str== ':'))
309
+ {
310
+ g_string_append_c(out, tolower(*str));
311
+ }
312
+ } else {
313
+ /* need alpha as first character */
314
+ if ((*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z'))
315
+ {
316
+ g_string_append_c(out, tolower(*str));
317
+ valid = TRUE;
318
+ }
319
+ }
320
+ str++;
321
+ }
322
+ label = out->str;
323
+ g_string_free(out, false);
324
+ return label;
325
+ }
326
+
327
+ /* find_label - return true if header, table, etc is found matching label.
328
+ * 'link' is modified with the matching url and title. */
329
+ static bool find_label(link *result, element *label) {
330
+ char *lab;
331
+ element *cur = labels; /* pointer to walk up list of references */
332
+ GString *text = g_string_new("");
333
+ print_raw_element_list(text, label);
334
+ lab = label_from_string(text->str,0);
335
+ GString *query = g_string_new(lab);
336
+ free(lab);
337
+ g_string_free(text, true);
338
+
339
+ while (cur != NULL) {
340
+ if (strcmp(query->str,cur->contents.str) == 0) {
341
+ g_string_free(query, true);
342
+ return true;
343
+ }
344
+ else
345
+ cur = cur->next;
346
+ }
347
+ g_string_free(query, true);
348
+ return false;
349
+ }
350
+
351
+
352
+ /* localize_typography - return the proper string, based on language chosen */
353
+ /* Default action is English */
354
+
355
+ static void localize_typography(GString *out, int character, int lang, int output) {
356
+
357
+ switch (output) {
358
+ case HTMLOUT:
359
+ switch (character) {
360
+ case LSQUOTE:
361
+ switch (lang) {
362
+ case SWEDISH:
363
+ g_string_append_printf(out, "&#8217;");
364
+ break;
365
+ case FRENCH:
366
+ g_string_append_printf(out,"&#39;");
367
+ break;
368
+ case GERMAN:
369
+ g_string_append_printf(out,"&#8218;");
370
+ break;
371
+ case GERMANGUILL:
372
+ g_string_append_printf(out,"&#8250;");
373
+ break;
374
+ default:
375
+ g_string_append_printf(out,"&#8216;");
376
+ }
377
+ break;
378
+ case RSQUOTE:
379
+ switch (lang) {
380
+ case GERMAN:
381
+ g_string_append_printf(out,"&#8216;");
382
+ break;
383
+ case GERMANGUILL:
384
+ g_string_append_printf(out,"&#8249;");
385
+ break;
386
+ default:
387
+ g_string_append_printf(out,"&#8217;");
388
+ }
389
+ break;
390
+ case APOS:
391
+ g_string_append_printf(out,"&#8217;");
392
+ break;
393
+ case LDQUOTE:
394
+ switch (lang) {
395
+ case DUTCH:
396
+ case GERMAN:
397
+ g_string_append_printf(out,"&#8222;");
398
+ break;
399
+ case GERMANGUILL:
400
+ g_string_append_printf(out,"&#187;");
401
+ break;
402
+ case FRENCH:
403
+ g_string_append_printf(out,"&#171;");
404
+ break;
405
+ case SWEDISH:
406
+ g_string_append_printf(out, "&#8221;");
407
+ break;
408
+ default:
409
+ g_string_append_printf(out,"&#8220;");
410
+ }
411
+ break;
412
+ case RDQUOTE:
413
+ switch (lang) {
414
+ case SWEDISH:
415
+ case DUTCH:
416
+ g_string_append_printf(out,"&#8221;");
417
+ break;
418
+ case GERMAN:
419
+ g_string_append_printf(out,"&#8220;");
420
+ break;
421
+ case GERMANGUILL:
422
+ g_string_append_printf(out,"&#171;");
423
+ break;
424
+ case FRENCH:
425
+ g_string_append_printf(out,"&#187;");
426
+ break;
427
+ default:
428
+ g_string_append_printf(out,"&#8221;");
429
+ }
430
+ break;
431
+ case NDASH:
432
+ g_string_append_printf(out,"&#8211;");
433
+ break;
434
+ case MDASH:
435
+ g_string_append_printf(out,"&#8212;");
436
+ break;
437
+ case ELLIP:
438
+ g_string_append_printf(out,"&#8230;");
439
+ break;
440
+ default:;
441
+ }
442
+ break;
443
+ case LATEXOUT:
444
+ switch (character) {
445
+ case LSQUOTE:
446
+ switch (lang) {
447
+ case SWEDISH:
448
+ g_string_append_printf(out,"'");
449
+ break;
450
+ case FRENCH:
451
+ g_string_append_printf(out,"'");
452
+ break;
453
+ case GERMAN:
454
+ g_string_append_printf(out,"‚");
455
+ break;
456
+ case GERMANGUILL:
457
+ g_string_append_printf(out,"›");
458
+ break;
459
+ default:
460
+ g_string_append_printf(out,"`");
461
+ }
462
+ break;
463
+ case RSQUOTE:
464
+ switch (lang) {
465
+ case GERMAN:
466
+ g_string_append_printf(out,"`");
467
+ break;
468
+ case GERMANGUILL:
469
+ g_string_append_printf(out,"‹");
470
+ break;
471
+ default:
472
+ g_string_append_printf(out,"'");
473
+ }
474
+ break;
475
+ case APOS:
476
+ g_string_append_printf(out,"'");
477
+ break;
478
+ case LDQUOTE:
479
+ switch (lang) {
480
+ case DUTCH:
481
+ case GERMAN:
482
+ g_string_append_printf(out,"„");
483
+ break;
484
+ case GERMANGUILL:
485
+ g_string_append_printf(out,"»");
486
+ break;
487
+ case FRENCH:
488
+ g_string_append_printf(out,"«");
489
+ break;
490
+ case SWEDISH:
491
+ g_string_append_printf(out,"''");
492
+ break;
493
+ default:
494
+ g_string_append_printf(out,"``");
495
+ }
496
+ break;
497
+ case RDQUOTE:
498
+ switch (lang) {
499
+ case SWEDISH:
500
+ case DUTCH:
501
+ g_string_append_printf(out,"''");
502
+ break;
503
+ case GERMAN:
504
+ g_string_append_printf(out,"``");
505
+ break;
506
+ case GERMANGUILL:
507
+ g_string_append_printf(out,"«");
508
+ break;
509
+ case FRENCH:
510
+ g_string_append_printf(out,"»");
511
+ break;
512
+ default:
513
+ g_string_append_printf(out,"''");
514
+ }
515
+ break;
516
+ case NDASH:
517
+ g_string_append_printf(out,"--");
518
+ break;
519
+ case MDASH:
520
+ g_string_append_printf(out,"---");
521
+ break;
522
+ case ELLIP:
523
+ g_string_append_printf(out,"{\\ldots}");
524
+ break;
525
+ default:;
526
+ }
527
+ break;
528
+ default:;
529
+ }
530
+ }
531
+
532
+ /* Trim spaces at end of string */
533
+ static void trim_trailing_whitespace(char *str) {
534
+ while ( ( str[strlen(str)-1] == ' ' ) ||
535
+ ( str[strlen(str)-1] == '\n' ) ||
536
+ ( str[strlen(str)-1] == '\r' ) ||
537
+ ( str[strlen(str)-1] == '\t' ) ) {
538
+ str[strlen(str)-1] = '\0';
539
+ }
540
+ }
541
+
542
+ /* Don't let us get caught in "infinite" loop */
543
+ static bool check_timeout() {
544
+ /* Once we abort, keep aborting */
545
+ if (parse_aborted)
546
+ return 0;
547
+
548
+ /* We're not timing this run */
549
+ if (start_time == 0)
550
+ return 1;
551
+
552
+ clock_t end = clock();
553
+ double elapsed = ((double) (end - start_time)) / CLOCKS_PER_SEC;
554
+
555
+ /* fprintf(stderr,"%2.2f elapsed; (%4.2f CLOCKS_PER_SEC)\n",elapsed,CLOCKS_PER_SEC); */
556
+ /* fprintf(stderr,"%2.2f elapsed\n",elapsed); */
557
+
558
+
559
+ /* If > 3 clock seconds, then abort */
560
+ float max = 3;
561
+ if (elapsed > max) {
562
+ parse_aborted = 1;
563
+ return 0;
564
+ }
565
+ return 1;
566
+ }
@@ -0,0 +1 @@
1
+ require 'peg_multimarkdown'
@@ -0,0 +1,74 @@
1
+ require 'peg_multimarkdown.so'
2
+
3
+ # Front-end to fletcher penney's peg-multimarkdown implementation of MultiMarkdown
4
+ #
5
+ # A simple processor:
6
+ # >> puts MultiMarkdown.new("Hello, World.").to_html
7
+ # <p>Hello, World.</p>
8
+ #
9
+ # With other stuff:
10
+ # >> puts MultiMarkdown.new("_Hello World!_", :smart, :filter_html).to_html
11
+ # <p><em>Hello World!</em></p>
12
+ #
13
+ class PEGMultiMarkdown
14
+
15
+ # Original MultiMarkdown formatted text.
16
+ attr_reader :text
17
+
18
+ # Set `true` to have smarty-like quote translation performed.
19
+ attr_accessor :smart
20
+
21
+ # Set `true` to have footnotes processed.
22
+ attr_accessor :notes
23
+
24
+ # Do not output `<style>` tags included in the source text.
25
+ attr_accessor :filter_styles
26
+
27
+ # Do not output any raw HTML included in the source text.
28
+ attr_accessor :filter_html
29
+
30
+ # Process MultiMarkdown inside of raw HTML
31
+ attr_accessor :process_html
32
+
33
+ # Markdown compatibility mode
34
+ attr_accessor :compatibility
35
+
36
+ # Included for compatibility with RedCloth's interface.
37
+ attr_accessor :fold_lines
38
+
39
+ # Create a new MultiMarkdown processor. The `text` argument is a string
40
+ # containing MultiMarkdown text. Variable other arguments may be supplied to
41
+ # set various processing options:
42
+ #
43
+ # * `:smart` - Enable SmartyPants processing.
44
+ # * `:notes` - Enable footnotes.
45
+ # * `:filter_styles` - Do not output `<style>` tags included in the
46
+ # source text.
47
+ # * `:filter_html` - Do not output raw HTML included in the
48
+ # source text.
49
+ # * `:process_html` - Process MultiMarkdown code inside HTML tags.
50
+ # * `:compatibility` - Process MultiMarkdown code in Markdown
51
+ # compatibility mode (disables all other extensions)
52
+ # * `:fold_lines` - RedCloth compatible line folding (not used).
53
+ #
54
+ def initialize(text, *extensions)
55
+ @text = text
56
+ @smart = true
57
+ @notes = true
58
+ @filter_styles = false
59
+ @filter_html = false
60
+ @process_html = false
61
+ @compatibility = false
62
+ extensions.each { |e| send("#{e}=", true) }
63
+ if @compatibility
64
+ @smart = false
65
+ @notes = false
66
+ @process_html = false
67
+ end
68
+ end
69
+
70
+ alias to_s text
71
+
72
+ end
73
+
74
+ MultiMarkdown = PEGMultiMarkdown unless defined? MultiMarkdown