rpeg-multimarkdown 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +94 -0
- data/README.markdown +58 -0
- data/Rakefile +171 -0
- data/bin/rpeg-multimarkdown +128 -0
- data/ext/extconf.h +3 -0
- data/ext/extconf.rb +15 -0
- data/ext/markdown.c +88 -0
- data/ext/markdown_lib.c +211 -0
- data/ext/markdown_lib.h +28 -0
- data/ext/markdown_output.c +2704 -0
- data/ext/markdown_parser.c +8275 -0
- data/ext/markdown_peg.h +142 -0
- data/ext/odf.c +179 -0
- data/ext/odf.h +3 -0
- data/ext/parsing_functions.c +182 -0
- data/ext/utility_functions.c +535 -0
- data/lib/multimarkdown.rb +1 -0
- data/lib/peg_multimarkdown.rb +74 -0
- data/test/MultiMarkdownTest/BeamerTests/Beamer-Tables.html +76 -0
- data/test/MultiMarkdownTest/BeamerTests/Beamer-Tables.tex +64 -0
- data/test/MultiMarkdownTest/BeamerTests/Beamer-Tables.text +38 -0
- data/test/MultiMarkdownTest/MarkdownTest.pl +182 -0
- data/test/MultiMarkdownTest/MemoirTests/Automatic Labels.html +42 -0
- data/test/MultiMarkdownTest/MemoirTests/Automatic Labels.tex +47 -0
- data/test/MultiMarkdownTest/MemoirTests/Automatic Labels.text +46 -0
- data/test/MultiMarkdownTest/MemoirTests/Base Header Level.html +20 -0
- data/test/MultiMarkdownTest/MemoirTests/Base Header Level.tex +19 -0
- data/test/MultiMarkdownTest/MemoirTests/Base Header Level.text +16 -0
- data/test/MultiMarkdownTest/MemoirTests/BibTeX.html +17 -0
- data/test/MultiMarkdownTest/MemoirTests/BibTeX.tex +12 -0
- data/test/MultiMarkdownTest/MemoirTests/BibTeX.text +11 -0
- data/test/MultiMarkdownTest/MemoirTests/Citations.html +63 -0
- data/test/MultiMarkdownTest/MemoirTests/Citations.tex +48 -0
- data/test/MultiMarkdownTest/MemoirTests/Citations.text +43 -0
- data/test/MultiMarkdownTest/MemoirTests/Definition Lists.html +61 -0
- data/test/MultiMarkdownTest/MemoirTests/Definition Lists.tex +63 -0
- data/test/MultiMarkdownTest/MemoirTests/Definition Lists.text +40 -0
- data/test/MultiMarkdownTest/MemoirTests/Dutch.html +23 -0
- data/test/MultiMarkdownTest/MemoirTests/Dutch.tex +18 -0
- data/test/MultiMarkdownTest/MemoirTests/Dutch.text +17 -0
- data/test/MultiMarkdownTest/MemoirTests/Email.html +48 -0
- data/test/MultiMarkdownTest/MemoirTests/Email.tex +61 -0
- data/test/MultiMarkdownTest/MemoirTests/Email.text +32 -0
- data/test/MultiMarkdownTest/MemoirTests/English.html +23 -0
- data/test/MultiMarkdownTest/MemoirTests/English.tex +18 -0
- data/test/MultiMarkdownTest/MemoirTests/English.text +17 -0
- data/test/MultiMarkdownTest/MemoirTests/Footnotes.html +47 -0
- data/test/MultiMarkdownTest/MemoirTests/Footnotes.tex +28 -0
- data/test/MultiMarkdownTest/MemoirTests/Footnotes.text +26 -0
- data/test/MultiMarkdownTest/MemoirTests/French.html +23 -0
- data/test/MultiMarkdownTest/MemoirTests/French.tex +18 -0
- data/test/MultiMarkdownTest/MemoirTests/French.text +17 -0
- data/test/MultiMarkdownTest/MemoirTests/German.html +23 -0
- data/test/MultiMarkdownTest/MemoirTests/German.tex +18 -0
- data/test/MultiMarkdownTest/MemoirTests/German.text +17 -0
- data/test/MultiMarkdownTest/MemoirTests/GermanGuillemets.html +23 -0
- data/test/MultiMarkdownTest/MemoirTests/GermanGuillemets.tex +18 -0
- data/test/MultiMarkdownTest/MemoirTests/GermanGuillemets.text +17 -0
- data/test/MultiMarkdownTest/MemoirTests/Glossary.html +47 -0
- data/test/MultiMarkdownTest/MemoirTests/Glossary.tex +30 -0
- data/test/MultiMarkdownTest/MemoirTests/Glossary.text +29 -0
- data/test/MultiMarkdownTest/MemoirTests/Line Breaks.html +21 -0
- data/test/MultiMarkdownTest/MemoirTests/Line Breaks.tex +16 -0
- data/test/MultiMarkdownTest/MemoirTests/Line Breaks.text +16 -0
- data/test/MultiMarkdownTest/MemoirTests/Link Attributes.html +40 -0
- data/test/MultiMarkdownTest/MemoirTests/Link Attributes.tex +61 -0
- data/test/MultiMarkdownTest/MemoirTests/Link Attributes.text +51 -0
- data/test/MultiMarkdownTest/MemoirTests/Math.html +22 -0
- data/test/MultiMarkdownTest/MemoirTests/Math.tex +16 -0
- data/test/MultiMarkdownTest/MemoirTests/Math.text +16 -0
- data/test/MultiMarkdownTest/MemoirTests/Memoir Mode.html +24 -0
- data/test/MultiMarkdownTest/MemoirTests/Memoir Mode.tex +23 -0
- data/test/MultiMarkdownTest/MemoirTests/Memoir Mode.text +20 -0
- data/test/MultiMarkdownTest/MemoirTests/MetaData.html +22 -0
- data/test/MultiMarkdownTest/MemoirTests/MetaData.tex +14 -0
- data/test/MultiMarkdownTest/MemoirTests/MetaData.text +15 -0
- data/test/MultiMarkdownTest/MemoirTests/Sanity.html +100 -0
- data/test/MultiMarkdownTest/MemoirTests/Sanity.tex +101 -0
- data/test/MultiMarkdownTest/MemoirTests/Sanity.text +78 -0
- data/test/MultiMarkdownTest/MemoirTests/SmartQuotes.html +26 -0
- data/test/MultiMarkdownTest/MemoirTests/SmartQuotes.tex +21 -0
- data/test/MultiMarkdownTest/MemoirTests/SmartQuotes.text +19 -0
- data/test/MultiMarkdownTest/MemoirTests/Swedish.html +23 -0
- data/test/MultiMarkdownTest/MemoirTests/Swedish.tex +18 -0
- data/test/MultiMarkdownTest/MemoirTests/Swedish.text +17 -0
- data/test/MultiMarkdownTest/MemoirTests/Tables.html +221 -0
- data/test/MultiMarkdownTest/MemoirTests/Tables.tex +134 -0
- data/test/MultiMarkdownTest/MemoirTests/Tables.text +64 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Automatic Labels.html +41 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Automatic Labels.tex +46 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Automatic Labels.text +45 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Base Header Level.html +20 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Base Header Level.tex +19 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Base Header Level.text +16 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/BibTeX.html +16 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/BibTeX.tex +11 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/BibTex.text +10 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Citations.html +62 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Citations.tex +47 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Citations.text +42 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Definition Lists.html +60 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Definition Lists.tex +62 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Definition Lists.text +39 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Dutch.html +23 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Dutch.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Dutch.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Email.html +47 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Email.tex +54 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Email.text +31 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/English.html +23 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/English.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/English.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Errors.html +16 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Errors.tex +11 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Errors.text +11 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Footnotes.html +46 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Footnotes.tex +24 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Footnotes.text +25 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/French.html +23 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/French.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/French.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/German.html +23 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/German.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/German.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/GermanGuillemets.html +23 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/GermanGuillemets.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/GermanGuillemets.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Glossary.html +46 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Glossary.tex +26 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Glossary.text +28 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Headers.html +46 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Headers.tex +52 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Headers.text +49 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Line Breaks.html +20 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Line Breaks.tex +15 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Line Breaks.text +15 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Link Attributes.html +54 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Link Attributes.tex +60 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Link Attributes.text +50 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/List Parsing.html +20 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/List Parsing.tex +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/List Parsing.text +11 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MarkdownInHTML.html +19 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MarkdownInHTML.tex +13 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MarkdownInHTML.text +19 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Math.html +21 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Math.tex +15 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Math.text +15 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MetaData.html +21 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MetaData.tex +13 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MetaData.text +14 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Sanity.html +104 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Sanity.tex +100 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Sanity.text +77 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/SmartQuotes.html +29 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/SmartQuotes.tex +24 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/SmartQuotes.text +22 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Swedish.html +23 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Swedish.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Swedish.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Tables.html +230 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Tables.tex +133 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Tables.text +63 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/bibtex.bib +119 -0
- data/test/MultiMarkdownTest/README.md +58 -0
- data/test/MultiMarkdownTest/Tests/Amps and angle encoding.html +17 -0
- data/test/MultiMarkdownTest/Tests/Amps and angle encoding.text +21 -0
- data/test/MultiMarkdownTest/Tests/Auto links.html +18 -0
- data/test/MultiMarkdownTest/Tests/Auto links.text +13 -0
- data/test/MultiMarkdownTest/Tests/Backslash escapes.html +118 -0
- data/test/MultiMarkdownTest/Tests/Backslash escapes.text +120 -0
- data/test/MultiMarkdownTest/Tests/Blockquotes with code blocks.html +15 -0
- data/test/MultiMarkdownTest/Tests/Blockquotes with code blocks.text +11 -0
- data/test/MultiMarkdownTest/Tests/Code Blocks.html +18 -0
- data/test/MultiMarkdownTest/Tests/Code Blocks.text +14 -0
- data/test/MultiMarkdownTest/Tests/Code Spans.html +6 -0
- data/test/MultiMarkdownTest/Tests/Code Spans.text +6 -0
- data/test/MultiMarkdownTest/Tests/Compatibility.html +5 -0
- data/test/MultiMarkdownTest/Tests/Compatibility.text +9 -0
- data/test/MultiMarkdownTest/Tests/Hard-wrapped paragraphs with list-like lines.html +8 -0
- data/test/MultiMarkdownTest/Tests/Hard-wrapped paragraphs with list-like lines.text +8 -0
- data/test/MultiMarkdownTest/Tests/Horizontal rules.html +71 -0
- data/test/MultiMarkdownTest/Tests/Horizontal rules.text +67 -0
- data/test/MultiMarkdownTest/Tests/Inline HTML (Advanced).html +15 -0
- data/test/MultiMarkdownTest/Tests/Inline HTML (Advanced).text +15 -0
- data/test/MultiMarkdownTest/Tests/Inline HTML (Simple).html +72 -0
- data/test/MultiMarkdownTest/Tests/Inline HTML (Simple).text +69 -0
- data/test/MultiMarkdownTest/Tests/Inline HTML comments.html +13 -0
- data/test/MultiMarkdownTest/Tests/Inline HTML comments.text +13 -0
- data/test/MultiMarkdownTest/Tests/Links, inline style.html +11 -0
- data/test/MultiMarkdownTest/Tests/Links, inline style.text +12 -0
- data/test/MultiMarkdownTest/Tests/Links, reference style.html +52 -0
- data/test/MultiMarkdownTest/Tests/Links, reference style.text +71 -0
- data/test/MultiMarkdownTest/Tests/Links, shortcut references.html +9 -0
- data/test/MultiMarkdownTest/Tests/Links, shortcut references.text +20 -0
- data/test/MultiMarkdownTest/Tests/Literal quotes in titles.html +3 -0
- data/test/MultiMarkdownTest/Tests/Literal quotes in titles.text +7 -0
- data/test/MultiMarkdownTest/Tests/Markdown Documentation - Basics.html +314 -0
- data/test/MultiMarkdownTest/Tests/Markdown Documentation - Basics.text +306 -0
- data/test/MultiMarkdownTest/Tests/Markdown Documentation - Syntax.html +942 -0
- data/test/MultiMarkdownTest/Tests/Markdown Documentation - Syntax.text +888 -0
- data/test/MultiMarkdownTest/Tests/Nested blockquotes.html +9 -0
- data/test/MultiMarkdownTest/Tests/Nested blockquotes.text +5 -0
- data/test/MultiMarkdownTest/Tests/Ordered and unordered lists.html +148 -0
- data/test/MultiMarkdownTest/Tests/Ordered and unordered lists.text +131 -0
- data/test/MultiMarkdownTest/Tests/Strong and em together.html +7 -0
- data/test/MultiMarkdownTest/Tests/Strong and em together.text +7 -0
- data/test/MultiMarkdownTest/Tests/Tabs.html +25 -0
- data/test/MultiMarkdownTest/Tests/Tabs.text +21 -0
- data/test/MultiMarkdownTest/Tests/Tidyness.html +8 -0
- data/test/MultiMarkdownTest/Tests/Tidyness.text +5 -0
- data/test/benchmark.rb +49 -0
- data/test/multimarkdown_test.rb +89 -0
- 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, "’");
|
359
|
+
break;
|
360
|
+
case FRENCH:
|
361
|
+
g_string_append_printf(out,"'");
|
362
|
+
break;
|
363
|
+
case GERMAN:
|
364
|
+
g_string_append_printf(out,"‚");
|
365
|
+
break;
|
366
|
+
case GERMANGUILL:
|
367
|
+
g_string_append_printf(out,"›");
|
368
|
+
break;
|
369
|
+
default:
|
370
|
+
g_string_append_printf(out,"‘");
|
371
|
+
}
|
372
|
+
break;
|
373
|
+
case RSQUOTE:
|
374
|
+
switch (lang) {
|
375
|
+
case GERMAN:
|
376
|
+
g_string_append_printf(out,"‘");
|
377
|
+
break;
|
378
|
+
case GERMANGUILL:
|
379
|
+
g_string_append_printf(out,"‹");
|
380
|
+
break;
|
381
|
+
default:
|
382
|
+
g_string_append_printf(out,"’");
|
383
|
+
}
|
384
|
+
break;
|
385
|
+
case APOS:
|
386
|
+
g_string_append_printf(out,"’");
|
387
|
+
break;
|
388
|
+
case LDQUOTE:
|
389
|
+
switch (lang) {
|
390
|
+
case DUTCH:
|
391
|
+
case GERMAN:
|
392
|
+
g_string_append_printf(out,"„");
|
393
|
+
break;
|
394
|
+
case GERMANGUILL:
|
395
|
+
g_string_append_printf(out,"»");
|
396
|
+
break;
|
397
|
+
case FRENCH:
|
398
|
+
g_string_append_printf(out,"«");
|
399
|
+
break;
|
400
|
+
case SWEDISH:
|
401
|
+
g_string_append_printf(out, "”");
|
402
|
+
break;
|
403
|
+
default:
|
404
|
+
g_string_append_printf(out,"“");
|
405
|
+
}
|
406
|
+
break;
|
407
|
+
case RDQUOTE:
|
408
|
+
switch (lang) {
|
409
|
+
case SWEDISH:
|
410
|
+
case DUTCH:
|
411
|
+
g_string_append_printf(out,"”");
|
412
|
+
break;
|
413
|
+
case GERMAN:
|
414
|
+
g_string_append_printf(out,"“");
|
415
|
+
break;
|
416
|
+
case GERMANGUILL:
|
417
|
+
g_string_append_printf(out,"«");
|
418
|
+
break;
|
419
|
+
case FRENCH:
|
420
|
+
g_string_append_printf(out,"»");
|
421
|
+
break;
|
422
|
+
default:
|
423
|
+
g_string_append_printf(out,"”");
|
424
|
+
}
|
425
|
+
break;
|
426
|
+
case NDASH:
|
427
|
+
g_string_append_printf(out,"–");
|
428
|
+
break;
|
429
|
+
case MDASH:
|
430
|
+
g_string_append_printf(out,"—");
|
431
|
+
break;
|
432
|
+
case ELLIP:
|
433
|
+
g_string_append_printf(out,"…");
|
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
|
+
}
|