rpeg-multimarkdown 0.1.1

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