rpeg-multimarkdown2 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +96 -0
- data/README.markdown +52 -0
- data/Rakefile +167 -0
- data/bin/rpeg-multimarkdown2 +128 -0
- data/ext/extconf.h +3 -0
- data/ext/extconf.rb +15 -0
- data/ext/markdown.c +102 -0
- data/ext/markdown_lib.c +265 -0
- data/ext/markdown_lib.h +33 -0
- data/ext/markdown_output.c +2832 -0
- data/ext/markdown_parser.c +9091 -0
- data/ext/markdown_peg.h +144 -0
- data/ext/odf.c +183 -0
- data/ext/odf.h +3 -0
- data/ext/parsing_functions.c +199 -0
- data/ext/utility_functions.c +566 -0
- data/lib/multimarkdown2.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/CompatibilityTests/Automatic Labels.html +35 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Automatic Labels.text +45 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Base Header Level.html +14 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Base Header Level.text +16 -0
- data/test/MultiMarkdownTest/CompatibilityTests/BibTeX.html +9 -0
- data/test/MultiMarkdownTest/CompatibilityTests/BibTeX.text +10 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Citations.html +40 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Citations.text +42 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Definition Lists.html +40 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Definition Lists.text +39 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Dutch.html +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Dutch.text +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Email.html +40 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Email.text +31 -0
- data/test/MultiMarkdownTest/CompatibilityTests/English.html +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/English.text +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Errors.html +9 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Errors.text +11 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Footnotes.html +23 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Footnotes.text +25 -0
- data/test/MultiMarkdownTest/CompatibilityTests/French.html +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/French.text +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/German.html +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/German.text +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/GermanGuillemets.html +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/GermanGuillemets.text +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Glossary.html +29 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Glossary.text +28 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Headers.html +42 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Headers.text +51 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Line Breaks.html +13 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Line Breaks.text +15 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Link Attributes.html +35 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Link Attributes.text +51 -0
- data/test/MultiMarkdownTest/CompatibilityTests/List Parsing.html +13 -0
- data/test/MultiMarkdownTest/CompatibilityTests/List Parsing.text +11 -0
- data/test/MultiMarkdownTest/CompatibilityTests/MarkdownInHTML.html +13 -0
- data/test/MultiMarkdownTest/CompatibilityTests/MarkdownInHTML.text +19 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Math.html +14 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Math.text +15 -0
- data/test/MultiMarkdownTest/CompatibilityTests/MetaData.html +14 -0
- data/test/MultiMarkdownTest/CompatibilityTests/MetaData.text +14 -0
- data/test/MultiMarkdownTest/CompatibilityTests/NotMetaData.html +3 -0
- data/test/MultiMarkdownTest/CompatibilityTests/NotMetaData.text +4 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Sanity.html +77 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Sanity.text +77 -0
- data/test/MultiMarkdownTest/CompatibilityTests/SmartQuotes.html +22 -0
- data/test/MultiMarkdownTest/CompatibilityTests/SmartQuotes.text +22 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Swedish.html +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Swedish.text +17 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Tables.html +65 -0
- data/test/MultiMarkdownTest/CompatibilityTests/Tables.text +71 -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 +58 -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 +43 -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 +22 -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 +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/BibTeX.tex +11 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/BibTex.text +10 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Citations.html +64 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Citations.tex +47 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Citations.text +42 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Definition Lists.html +57 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Definition Lists.tex +57 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Definition Lists.text +39 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Dutch.html +25 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Dutch.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Dutch.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Email.html +49 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Email.tex +54 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Email.text +31 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/English.html +25 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/English.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/English.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Errors.html +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Errors.tex +11 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Errors.text +11 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Footnotes.html +48 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Footnotes.tex +24 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Footnotes.text +25 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/French.html +25 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/French.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/French.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/German.html +25 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/German.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/German.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/GermanGuillemets.html +25 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/GermanGuillemets.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/GermanGuillemets.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Glossary.html +48 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Glossary.tex +26 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Glossary.text +28 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Headers.html +50 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Headers.tex +54 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Headers.text +51 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Line Breaks.html +22 -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 +56 -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 +22 -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 +21 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MarkdownInHTML.tex +13 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MarkdownInHTML.text +19 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Math.html +23 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Math.tex +15 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Math.text +15 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MetaData.html +23 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MetaData.tex +13 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/MetaData.text +14 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/NotMetaData.html +3 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/NotMetaData.tex +3 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/NotMetaData.text +4 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Sanity.html +106 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Sanity.tex +100 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Sanity.text +77 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/SmartQuotes.html +31 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/SmartQuotes.tex +24 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/SmartQuotes.text +22 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Swedish.html +25 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Swedish.tex +18 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Swedish.text +17 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Tables.html +273 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Tables.tex +155 -0
- data/test/MultiMarkdownTest/MultiMarkdownTests/Tables.text +71 -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 +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, "’");
|
364
|
+
break;
|
365
|
+
case FRENCH:
|
366
|
+
g_string_append_printf(out,"'");
|
367
|
+
break;
|
368
|
+
case GERMAN:
|
369
|
+
g_string_append_printf(out,"‚");
|
370
|
+
break;
|
371
|
+
case GERMANGUILL:
|
372
|
+
g_string_append_printf(out,"›");
|
373
|
+
break;
|
374
|
+
default:
|
375
|
+
g_string_append_printf(out,"‘");
|
376
|
+
}
|
377
|
+
break;
|
378
|
+
case RSQUOTE:
|
379
|
+
switch (lang) {
|
380
|
+
case GERMAN:
|
381
|
+
g_string_append_printf(out,"‘");
|
382
|
+
break;
|
383
|
+
case GERMANGUILL:
|
384
|
+
g_string_append_printf(out,"‹");
|
385
|
+
break;
|
386
|
+
default:
|
387
|
+
g_string_append_printf(out,"’");
|
388
|
+
}
|
389
|
+
break;
|
390
|
+
case APOS:
|
391
|
+
g_string_append_printf(out,"’");
|
392
|
+
break;
|
393
|
+
case LDQUOTE:
|
394
|
+
switch (lang) {
|
395
|
+
case DUTCH:
|
396
|
+
case GERMAN:
|
397
|
+
g_string_append_printf(out,"„");
|
398
|
+
break;
|
399
|
+
case GERMANGUILL:
|
400
|
+
g_string_append_printf(out,"»");
|
401
|
+
break;
|
402
|
+
case FRENCH:
|
403
|
+
g_string_append_printf(out,"«");
|
404
|
+
break;
|
405
|
+
case SWEDISH:
|
406
|
+
g_string_append_printf(out, "”");
|
407
|
+
break;
|
408
|
+
default:
|
409
|
+
g_string_append_printf(out,"“");
|
410
|
+
}
|
411
|
+
break;
|
412
|
+
case RDQUOTE:
|
413
|
+
switch (lang) {
|
414
|
+
case SWEDISH:
|
415
|
+
case DUTCH:
|
416
|
+
g_string_append_printf(out,"”");
|
417
|
+
break;
|
418
|
+
case GERMAN:
|
419
|
+
g_string_append_printf(out,"“");
|
420
|
+
break;
|
421
|
+
case GERMANGUILL:
|
422
|
+
g_string_append_printf(out,"«");
|
423
|
+
break;
|
424
|
+
case FRENCH:
|
425
|
+
g_string_append_printf(out,"»");
|
426
|
+
break;
|
427
|
+
default:
|
428
|
+
g_string_append_printf(out,"”");
|
429
|
+
}
|
430
|
+
break;
|
431
|
+
case NDASH:
|
432
|
+
g_string_append_printf(out,"–");
|
433
|
+
break;
|
434
|
+
case MDASH:
|
435
|
+
g_string_append_printf(out,"—");
|
436
|
+
break;
|
437
|
+
case ELLIP:
|
438
|
+
g_string_append_printf(out,"…");
|
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
|