rmultimarkdown 4.7.1.1 → 6.2.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +2 -2
  3. data/README.md +7 -9
  4. data/Rakefile +33 -18
  5. data/ext/Makefile +261 -0
  6. data/ext/extconf.rb +23 -3
  7. data/ext/mmd/aho-corasick.c +596 -0
  8. data/ext/mmd/aho-corasick.h +120 -0
  9. data/ext/mmd/beamer.c +344 -0
  10. data/ext/mmd/beamer.h +72 -0
  11. data/ext/mmd/char.c +156 -0
  12. data/ext/mmd/char.h +111 -0
  13. data/ext/mmd/char_lookup.c +212 -0
  14. data/ext/mmd/critic_markup.c +330 -0
  15. data/ext/mmd/critic_markup.h +94 -0
  16. data/ext/mmd/d_string.c +402 -0
  17. data/ext/mmd/epub.c +563 -0
  18. data/ext/mmd/epub.h +69 -0
  19. data/ext/mmd/fodt.c +2288 -0
  20. data/ext/mmd/fodt.h +81 -0
  21. data/ext/mmd/html.c +2460 -0
  22. data/ext/mmd/html.h +81 -0
  23. data/ext/mmd/i18n.h +170 -0
  24. data/ext/mmd/include/d_string.h +182 -0
  25. data/ext/mmd/include/libMultiMarkdown.h +548 -0
  26. data/ext/mmd/include/token.h +233 -0
  27. data/ext/mmd/latex.c +2435 -0
  28. data/ext/mmd/latex.h +83 -0
  29. data/ext/mmd/lexer.c +3001 -0
  30. data/ext/mmd/lexer.h +75 -0
  31. data/ext/mmd/memoir.c +138 -0
  32. data/ext/mmd/memoir.h +67 -0
  33. data/ext/mmd/miniz.c +7557 -0
  34. data/ext/mmd/miniz.h +1328 -0
  35. data/ext/mmd/mmd.c +2798 -0
  36. data/ext/mmd/mmd.h +120 -0
  37. data/ext/mmd/object_pool.c +141 -0
  38. data/ext/mmd/object_pool.h +101 -0
  39. data/ext/mmd/opendocument-content.c +2071 -0
  40. data/ext/mmd/opendocument-content.h +135 -0
  41. data/ext/mmd/opendocument.c +981 -0
  42. data/ext/mmd/opendocument.h +118 -0
  43. data/ext/mmd/parser.c +1760 -0
  44. data/ext/mmd/parser.h +39 -0
  45. data/{MultiMarkdown-4 → ext/mmd}/rng.c +90 -49
  46. data/ext/mmd/scanners.c +77512 -0
  47. data/ext/mmd/scanners.h +101 -0
  48. data/ext/mmd/stack.c +142 -0
  49. data/ext/mmd/stack.h +113 -0
  50. data/ext/mmd/textbundle.c +455 -0
  51. data/ext/mmd/textbundle.h +115 -0
  52. data/ext/mmd/token.c +773 -0
  53. data/ext/mmd/token_pairs.c +263 -0
  54. data/ext/mmd/token_pairs.h +123 -0
  55. data/ext/mmd/transclude.c +549 -0
  56. data/ext/mmd/transclude.h +87 -0
  57. data/ext/mmd/uthash.h +1074 -0
  58. data/ext/mmd/uuid.c +154 -0
  59. data/ext/mmd/uuid.h +77 -0
  60. data/ext/mmd/version.h +111 -0
  61. data/ext/mmd/writer.c +2652 -0
  62. data/ext/mmd/writer.h +260 -0
  63. data/ext/mmd/zip.c +210 -0
  64. data/ext/mmd/zip.h +120 -0
  65. data/ext/{multi_markdown.c → ruby_multi_markdown.c} +87 -18
  66. data/lib/multi_markdown.bundle +0 -0
  67. data/lib/multi_markdown.rb +5 -8
  68. data/lib/multi_markdown/version.rb +1 -1
  69. data/rmultimarkdown.gemspec +2 -2
  70. data/test/{extensions_test.rb.rb → extensions_test.rb} +10 -54
  71. data/test/multi_markdown_test.rb +13 -0
  72. metadata +67 -47
  73. data/MultiMarkdown-4/GLibFacade.c +0 -310
  74. data/MultiMarkdown-4/GLibFacade.h +0 -100
  75. data/MultiMarkdown-4/beamer.c +0 -182
  76. data/MultiMarkdown-4/beamer.h +0 -11
  77. data/MultiMarkdown-4/critic.c +0 -111
  78. data/MultiMarkdown-4/critic.h +0 -15
  79. data/MultiMarkdown-4/glib.h +0 -11
  80. data/MultiMarkdown-4/html.c +0 -1117
  81. data/MultiMarkdown-4/html.h +0 -14
  82. data/MultiMarkdown-4/latex.c +0 -1217
  83. data/MultiMarkdown-4/latex.h +0 -16
  84. data/MultiMarkdown-4/libMultiMarkdown.h +0 -177
  85. data/MultiMarkdown-4/lyx.c +0 -2265
  86. data/MultiMarkdown-4/lyx.h +0 -37
  87. data/MultiMarkdown-4/lyxbeamer.c +0 -265
  88. data/MultiMarkdown-4/lyxbeamer.h +0 -11
  89. data/MultiMarkdown-4/memoir.c +0 -80
  90. data/MultiMarkdown-4/memoir.h +0 -10
  91. data/MultiMarkdown-4/multimarkdown.c +0 -518
  92. data/MultiMarkdown-4/odf.c +0 -1222
  93. data/MultiMarkdown-4/odf.h +0 -18
  94. data/MultiMarkdown-4/opml.c +0 -189
  95. data/MultiMarkdown-4/opml.h +0 -15
  96. data/MultiMarkdown-4/parse_utilities.c +0 -884
  97. data/MultiMarkdown-4/parser.c +0 -16656
  98. data/MultiMarkdown-4/parser.h +0 -188
  99. data/MultiMarkdown-4/rtf.c +0 -665
  100. data/MultiMarkdown-4/rtf.h +0 -17
  101. data/MultiMarkdown-4/strtok.c +0 -56
  102. data/MultiMarkdown-4/strtok.h +0 -9
  103. data/MultiMarkdown-4/text.c +0 -53
  104. data/MultiMarkdown-4/text.h +0 -11
  105. data/MultiMarkdown-4/toc.c +0 -142
  106. data/MultiMarkdown-4/toc.h +0 -15
  107. data/MultiMarkdown-4/transclude.c +0 -307
  108. data/MultiMarkdown-4/transclude.h +0 -28
  109. data/MultiMarkdown-4/writer.c +0 -731
  110. data/MultiMarkdown-4/writer.h +0 -38
data/ext/mmd/html.h ADDED
@@ -0,0 +1,81 @@
1
+ /**
2
+
3
+ MultiMarkdown 6 -- Lightweight markup processor to produce HTML, LaTeX, and more.
4
+
5
+ @file html.h
6
+
7
+ @brief Convert token tree to HTML output.
8
+
9
+
10
+ @author Fletcher T. Penney
11
+ @bug
12
+
13
+ **/
14
+
15
+ /*
16
+
17
+ Copyright © 2016 - 2017 Fletcher T. Penney.
18
+
19
+
20
+ The `MultiMarkdown 6` project is released under the MIT License..
21
+
22
+ GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project:
23
+
24
+ https://github.com/fletcher/MultiMarkdown-4/
25
+
26
+ MMD 4 is released under both the MIT License and GPL.
27
+
28
+
29
+ CuTest is released under the zlib/libpng license. See CuTest.c for the text
30
+ of the license.
31
+
32
+
33
+ ## The MIT License ##
34
+
35
+ Permission is hereby granted, free of charge, to any person obtaining a copy
36
+ of this software and associated documentation files (the "Software"), to deal
37
+ in the Software without restriction, including without limitation the rights
38
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
39
+ copies of the Software, and to permit persons to whom the Software is
40
+ furnished to do so, subject to the following conditions:
41
+
42
+ The above copyright notice and this permission notice shall be included in
43
+ all copies or substantial portions of the Software.
44
+
45
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
46
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
47
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
48
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
49
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
50
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
51
+ THE SOFTWARE.
52
+
53
+ */
54
+
55
+
56
+ #ifndef HTML_MULTIMARKDOWN_H
57
+ #define HTML_MULTIMARKDOWN_H
58
+
59
+ #include "d_string.h"
60
+ #include "token.h"
61
+ #include "writer.h"
62
+
63
+ void mmd_export_token_html(DString * out, const char * source, token * t, scratch_pad * scratch);
64
+ void mmd_export_token_tree_html(DString * out, const char * source, token * t, scratch_pad * scratch);
65
+
66
+
67
+ void mmd_export_token_html_raw(DString * out, const char * source, token * t, scratch_pad * scratch);
68
+ void mmd_export_token_tree_html_raw(DString * out, const char * source, token * t, scratch_pad * scratch);
69
+ void mmd_export_token_tree_html_math(DString * out, const char * source, token * t, scratch_pad * scratch);
70
+
71
+ void mmd_export_citation_list_html(DString * out, const char * source, scratch_pad * scratch);
72
+ void mmd_export_footnote_list_html(DString * out, const char * source, scratch_pad * scratch);
73
+ void mmd_export_glossary_list_html(DString * out, const char * source, scratch_pad * scratch);
74
+
75
+ void mmd_start_complete_html(DString * out, const char * source, scratch_pad * scratch);
76
+ void mmd_end_complete_html(DString * out, const char * source, scratch_pad * scratch);
77
+
78
+ void mmd_print_string_html(DString * out, const char * str, bool obfuscate);
79
+
80
+
81
+ #endif
data/ext/mmd/i18n.h ADDED
@@ -0,0 +1,170 @@
1
+ /**
2
+
3
+ MultiMarkdown 6 -- MultiMarkdown - lightweight markup processor.
4
+
5
+ @file i18n.h
6
+
7
+ @brief Provide rudimentary ability to provide translation string functionality.
8
+ This file enables calculating hash values of built in strings in order to allow
9
+ swapping out certain strings based on user-specified languages at runtime.
10
+
11
+ This does slow down compiling, as multiple hash strings are compiled (seemingly
12
+ quite slowly). But, to my understanding and testing, it does not affect the
13
+ speed when actually running MMD. This should allow translating an arbitrary
14
+ number of strings into an arbitrary number of languages without a performance
15
+ penalty.
16
+
17
+
18
+ @author Fletcher T. Penney
19
+ @bug
20
+
21
+ **/
22
+
23
+ /*
24
+
25
+ Copyright © 2016 - 2017 Fletcher T. Penney.
26
+
27
+ */
28
+
29
+
30
+ #ifndef I18N_MULTIMARKDOWN_6_H
31
+ #define I18N_MULTIMARKDOWN_6_H
32
+
33
+
34
+ #include <string.h>
35
+ #include <stdint.h>
36
+ #include <stdio.h>
37
+ #include <stdlib.h>
38
+
39
+
40
+ #define kNumberOfLanguages 7
41
+ #define kNumberOfStrings 4
42
+ #define kLanguage 0
43
+
44
+ //!< #define this in order to disable translations -- speeds up compiling
45
+ // #define I18N_DISABLED
46
+
47
+
48
+ // Hash function from http://lolengine.net/blog/2011/12/20/cpp-constant-string-hash
49
+ // via http://stackoverflow.com/questions/2826559/compile-time-preprocessor-hashing-of-string
50
+
51
+
52
+ #ifdef I18N_DISABLED
53
+ #define LC(x) x
54
+ #define LANG_FROM_STR(x) 0
55
+ #else
56
+ #define H1(s,i,x) (x*65599u+(uint8_t)s[(i)<strlen(s)?strlen(s)-1-(i):strlen(s)])
57
+ #define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x))))
58
+ #define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x))))
59
+ #define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x))))
60
+ #define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x))))
61
+
62
+ #define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16)))
63
+
64
+ #define LC(x) Translate(HASH(x), scratch->language)
65
+
66
+ //#define LC(x) TranslateTest(__COUNTER__, __FILE__, __LINE__, __FUNCTION__ , x)
67
+
68
+ #define LANG_FROM_STR(x) i18n_language_from_string(x)
69
+
70
+
71
+ // Create the dictionary array
72
+ static const char * lc_lookup[kNumberOfLanguages * kNumberOfStrings] = {
73
+ "return to body", // English
74
+ "Regresar al texto", // Español
75
+ "Zum Haupttext", // Deutsch
76
+ "Retour au texte principal", // Français
77
+ "Ga terug naar tekstlichaam", // Nederlands
78
+ "Återgå till textkroppen", // Svenska
79
+ "חזור/י לגוף הטקסט", // Hebrew - עברית
80
+
81
+ "see footnote", // English
82
+ "Ver nota a pie de página", // Español
83
+ "Siehe Fußnote", // Deutsch
84
+ "Voir note de bas de page", // Français
85
+ "Zie vootnot", // Nederlands
86
+ "Se fotnot", // Svenska
87
+ "ראה/י הערה", // Hebrew - עברית
88
+
89
+ "see citation", // English
90
+ "Ver referencia", // Español
91
+ "Siehe Zitat", // Deutsch
92
+ "Voir citation", // Français
93
+ "Zie citaat", // Nederlands
94
+ "Se citat", // Svenska
95
+ "ראה/י ציטוט", // Hebrew - עברית
96
+
97
+ "see glossary", // English
98
+ "Ver glosario", // Español
99
+ "Siehe Glossar", // Deutsch
100
+ "Voir glossaire", // Français
101
+ "Zie woordenlijst", // Nederlands
102
+ "Se ordlista", // Svenska
103
+ "ראה/י מילון מונחים", // Hebrew - עברית
104
+ };
105
+
106
+
107
+ // Used for development when a new string is added to the dictionary and
108
+ // we need to know the hash
109
+ static inline const char * TranslateTest(int c, char * file, int line, const char func[], char * x) {
110
+ fprintf(stderr, "%s: %d (%s) -> %d\n", file, line, func, c);
111
+ unsigned long h = HASH(x);
112
+ fprintf(stderr, "hash '%s' -> %lu\n", x, h);
113
+
114
+ return lc_lookup[(c * kNumberOfLanguages) + kLanguage];
115
+ }
116
+
117
+
118
+ // Given a hash and language, return the proper string
119
+ static inline const char * Translate(unsigned long x, int l) {
120
+ switch (x) {
121
+ case 3219553713:
122
+ return lc_lookup[0 * kNumberOfLanguages + l];
123
+ case 657226305:
124
+ return lc_lookup[1 * kNumberOfLanguages + l];
125
+ case 2977473004:
126
+ return lc_lookup[2 * kNumberOfLanguages + l];
127
+ case 3851221863:
128
+ return lc_lookup[3 * kNumberOfLanguages + l];
129
+ default:
130
+ return "localization error";
131
+ }
132
+ }
133
+
134
+
135
+ #endif
136
+
137
+
138
+ // Based on ISO 639-1 names
139
+ // https://en.wikipedia.org/wiki/ISO_639-1
140
+ enum lc_languages {
141
+ LC_EN = 0, //!< English is default
142
+ LC_ES, //!< Español
143
+ LC_DE, //!< Deutsch
144
+ LC_FR, //!< Français
145
+ LC_NL, //!< Nederlands
146
+ LC_SV, //!< Svenska
147
+ LC_HE, //!< Hebrew - עברית
148
+ };
149
+
150
+
151
+ // MMD expects a lower case 2 letter code in the metadata or command-line arguments
152
+ static inline short i18n_language_from_string(const char * l) {
153
+ if (strcmp(l, "es") == 0) {
154
+ return LC_ES;
155
+ } else if (strcmp(l, "de") == 0) {
156
+ return LC_DE;
157
+ } else if (strcmp(l, "fr") == 0) {
158
+ return LC_FR;
159
+ } else if (strcmp(l, "he") == 0) {
160
+ return LC_HE;
161
+ } else if (strcmp(l, "nl") == 0) {
162
+ return LC_NL;
163
+ } else if (strcmp(l, "sv") == 0) {
164
+ return LC_SV;
165
+ }
166
+
167
+ return 0;
168
+ }
169
+
170
+ #endif
@@ -0,0 +1,182 @@
1
+ /**
2
+
3
+ MultiMarkdown 6 -- Lightweight markup processor to produce HTML, LaTeX, and more.
4
+
5
+ @file d_string.h
6
+
7
+ @brief Dynamic string -- refactoring of old GLibFacade. Provides a string
8
+ "object" that can grow to accomodate any size content that is appended.
9
+
10
+
11
+ @author Daniel Jalkut, modified by Fletcher T. Penney and Dan Lowe
12
+
13
+ @bug
14
+
15
+ **/
16
+
17
+ /*
18
+
19
+ Copyright © 2011 Daniel Jalkut.
20
+ Modifications by Fletcher T. Penney, Copyright © 2011-2017 Fletcher T. Penney.
21
+ Modifications by Dan Lowe, Copyright © 2011 Dan Lowe.
22
+
23
+
24
+ The `MultiMarkdown 6` project is released under the MIT License..
25
+
26
+ GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project:
27
+
28
+ https://github.com/fletcher/MultiMarkdown-4/
29
+
30
+ MMD 4 is released under both the MIT License and GPL.
31
+
32
+
33
+ CuTest is released under the zlib/libpng license. See CuTest.c for the text
34
+ of the license.
35
+
36
+
37
+ ## The MIT License ##
38
+
39
+ Permission is hereby granted, free of charge, to any person obtaining a copy
40
+ of this software and associated documentation files (the "Software"), to deal
41
+ in the Software without restriction, including without limitation the rights
42
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
43
+ copies of the Software, and to permit persons to whom the Software is
44
+ furnished to do so, subject to the following conditions:
45
+
46
+ The above copyright notice and this permission notice shall be included in
47
+ all copies or substantial portions of the Software.
48
+
49
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
50
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
51
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
52
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
53
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
54
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
55
+ THE SOFTWARE.
56
+
57
+ */
58
+
59
+
60
+ #ifndef D_STRING_SMART_STRING_H
61
+ #define D_STRING_SMART_STRING_H
62
+
63
+ #include <stdbool.h>
64
+ #include <stdlib.h>
65
+
66
+ /* WE implement minimal mirror implementations of GLib's GString
67
+ * sufficient to cover the functionality required by MultiMarkdown.
68
+ *
69
+ * NOTE: THese are 100% clean, from-scratch implementations using only the
70
+ * GLib function prototype as guide for behavior.
71
+ */
72
+
73
+
74
+ /// Structure for dynamic string
75
+ typedef struct
76
+ {
77
+ char * str; //!< Pointer to UTF-8 byte stream for string
78
+ unsigned long currentStringBufferSize; //!< Size of buffer currently allocated
79
+ unsigned long currentStringLength; //!< Size of current string
80
+ } DString;
81
+
82
+
83
+ /// Create a new dynamic string
84
+ DString * d_string_new(
85
+ const char * startingString //!< Initial contents for string
86
+ );
87
+
88
+
89
+ /// Free dynamic string
90
+ char * d_string_free(
91
+ DString * ripString, //!< DString to be freed
92
+ bool freeCharacterData //!< Should the underlying str be freed as well?
93
+ );
94
+
95
+
96
+ /// Append null-terminated string to end of dynamic string
97
+ void d_string_append(
98
+ DString * baseString, //!< DString to be appended
99
+ const char * appendedString //!< String to be appended
100
+ );
101
+
102
+
103
+ /// Append single character to end of dynamic string
104
+ void d_string_append_c(
105
+ DString * baseString, //!< DString to be appended
106
+ char appendedCharacter //!< Character to append
107
+ );
108
+
109
+
110
+ /// Append array of characters to end of dynamic string
111
+ void d_string_append_c_array(
112
+ DString * baseString, //!< DString to be appended
113
+ const char * appendedChars, //!< String to be appended
114
+ size_t bytes //!< Number of bytes to append
115
+ );
116
+
117
+
118
+ /// Append to end of dynamic string using format specifier
119
+ void d_string_append_printf(
120
+ DString * baseString, //!< DString to be appended
121
+ const char * format, //!< Format specifier for appending
122
+ ... //!< Arguments for format specifier
123
+ );
124
+
125
+
126
+ /// Prepend null-terminated string to end of dynamic string
127
+ void d_string_prepend(
128
+ DString * baseString, //!< DString to be appended
129
+ const char * prependedString //!< String to be prepended
130
+ );
131
+
132
+
133
+ /// Insert null-terminated string inside dynamic string
134
+ void d_string_insert(
135
+ DString * baseString, //!< DString to be appended
136
+ size_t pos, //!< Offset at which to insert string
137
+ const char * insertedString //!< String to be inserted
138
+ );
139
+
140
+
141
+ /// Insert single character inside dynamic string
142
+ void d_string_insert_c(
143
+ DString * baseString, //!< DString to be appended
144
+ size_t pos, //!< Offset at which to insert string
145
+ char insertedCharacter //!< Character to insert
146
+ );
147
+
148
+
149
+ /// Insert inside dynamic string using format specifier
150
+ void d_string_insert_printf(
151
+ DString * baseString, //!< DString to be appended
152
+ size_t pos, //!< Offset at which to insert string
153
+ const char * format, //!< Format specifier for appending
154
+ ... //!< Arguments for format specifier
155
+ );
156
+
157
+
158
+ /// Erase portion of dynamic string
159
+ void d_string_erase(
160
+ DString * baseString, //!< DString to be appended
161
+ size_t pos, //!< Offset at which to erase portion of string
162
+ size_t len //!< Character to append
163
+ );
164
+
165
+ /// Copy a portion of dynamic string
166
+ char * d_string_copy_substring(
167
+ DString * d, //!< DString to copy
168
+ size_t start, //!< Start position for copy
169
+ size_t len //!< How many characters(bytes) to copy
170
+ );
171
+
172
+ /// Replace occurences of "original" with "replace" inside the specified range
173
+ /// Returns the change in overall length
174
+ long d_string_replace_text_in_range(
175
+ DString * d,
176
+ size_t pos,
177
+ size_t len,
178
+ const char * original,
179
+ const char * replace
180
+ );
181
+
182
+ #endif
@@ -0,0 +1,548 @@
1
+ /**
2
+
3
+ MultiMarkdown 6 -- Lightweight markup processor to produce HTML, LaTeX, and more.
4
+
5
+ @file mmd.h
6
+
7
+ @brief Header file for libMultiMarkdown.
8
+
9
+
10
+ @author Fletcher T. Penney
11
+ @bug
12
+
13
+
14
+ ******IMPORTANT******
15
+
16
+ If you are using libMultiMarkdown in your own project, you need to either:
17
+
18
+ 1. Disable kUseObjectPool in `token.h`
19
+
20
+ 2. Properly manage the `token_pool_init` and `token_pool_free` functions.
21
+
22
+
23
+ I recommend option #1, unless you absolutely need the best performance for
24
+ long documents. Doing #2 properly is tricky in any program that can handle
25
+ multiple MMD text strings at overlapping times.
26
+
27
+ **/
28
+
29
+ /*
30
+
31
+ Copyright © 2016 - 2017 Fletcher T. Penney.
32
+
33
+
34
+ The `MultiMarkdown 6` project is released under the MIT License..
35
+
36
+ GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project:
37
+
38
+ https://github.com/fletcher/MultiMarkdown-4/
39
+
40
+ MMD 4 is released under both the MIT License and GPL.
41
+
42
+
43
+ CuTest is released under the zlib/libpng license. See CuTest.c for the text
44
+ of the license.
45
+
46
+
47
+ ## The MIT License ##
48
+
49
+ Permission is hereby granted, free of charge, to any person obtaining a copy
50
+ of this software and associated documentation files (the "Software"), to deal
51
+ in the Software without restriction, including without limitation the rights
52
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
53
+ copies of the Software, and to permit persons to whom the Software is
54
+ furnished to do so, subject to the following conditions:
55
+
56
+ The above copyright notice and this permission notice shall be included in
57
+ all copies or substantial portions of the Software.
58
+
59
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
60
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
61
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
62
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
63
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
64
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
65
+ THE SOFTWARE.
66
+
67
+ */
68
+
69
+
70
+ #ifndef MMD6_H
71
+ #define MMD6_H
72
+
73
+ #include <stdbool.h>
74
+ #include <stdlib.h>
75
+
76
+
77
+ #include "d_string.h"
78
+ #include "token.h"
79
+
80
+
81
+ /// There are 3 main versions of the primary functions:
82
+ ///
83
+ /// * `mmd_string...` -- start from source text in c string
84
+ /// * `mmd_d_string...` -- start from a DString (Useful if you already use DString's for your text)
85
+ /// * `mmd_engine...` -- useful when you are processing the same source multiple times
86
+
87
+
88
+ /*
89
+ C string variants
90
+ */
91
+
92
+ /// Convert MMD text to specified format, with specified extensions, and language
93
+ /// Returned char * must be freed
94
+ char * mmd_string_convert(const char * source, unsigned long extensions, short format, short language);
95
+
96
+
97
+ /// Convert MMD text to specified format using DString as a container for block of data
98
+ /// and length of that block. Must be used for "complex" output formats such as EPUB.
99
+ /// Returned DString * must be freed
100
+ DString * mmd_string_convert_to_data(const char * source, unsigned long extensions, short format, short language, const char * directory);
101
+
102
+
103
+ /// Convert MMD text and write results to specified file -- used for "complex" output formats requiring
104
+ /// multiple documents (e.g. EPUB)
105
+ void mmd_string_convert_to_file(const char * source, unsigned long extensions, short format, short language, const char * directory, const char * filepath);
106
+
107
+
108
+ /// Does the text have metadata?
109
+ bool mmd_string_has_metadata(char * source, size_t * end);
110
+
111
+
112
+ /// Return metadata keys, one per line
113
+ /// Returned char * must be freed
114
+ char * mmd_string_metadata_keys(char * source);
115
+
116
+
117
+ /// Extract desired metadata as string value
118
+ /// Returned char * must be freed
119
+ char * mmd_string_metavalue_for_key(char * source, const char * key);
120
+
121
+
122
+ /// Insert/replace metadata in string, returning new string
123
+ char * mmd_string_update_metavalue_for_key(const char * source, const char * key, const char * value);
124
+
125
+
126
+ /// Grab list of all transcluded files, but we need to know directory to search,
127
+ /// as well as the path to the file
128
+ /// Returned stack needs to be freed
129
+ struct stack * mmd_string_transclusion_manifest(const char * source, const char * search_path, const char * source_path);
130
+
131
+
132
+
133
+
134
+ /*
135
+ DString variants - DString ("dynamic string") is a mutable string implementation used in this project
136
+ */
137
+
138
+ /// Convert MMD text to specified format, with specified extensions, and language
139
+ /// Returned char * must be freed
140
+ char * mmd_d_string_convert(DString * source, unsigned long extensions, short format, short language);
141
+
142
+
143
+ /// Convert MMD text to specified format using DString as a container for block of data
144
+ /// and length of that block. Must be used for "complex" output formats such as EPUB.
145
+ /// Returned DString * must be freed
146
+ DString * mmd_d_string_convert_to_data(DString * source, unsigned long extensions, short format, short language, const char * directory);
147
+
148
+
149
+ /// Convert MMD text and write results to specified file -- used for "complex" output formats requiring
150
+ /// multiple documents (e.g. EPUB)
151
+ void mmd_d_string_convert_to_file(DString * source, unsigned long extensions, short format, short language, const char * directory, const char * filepath);
152
+
153
+
154
+ /// Does the text have metadata?
155
+ bool mmd_d_string_has_metadata(DString * source, size_t * end);
156
+
157
+
158
+ /// Return metadata keys, one per line
159
+ /// Returned char * must be freed
160
+ char * mmd_d_string_metadata_keys(DString * source);
161
+
162
+
163
+ /// Extract desired metadata as string value
164
+ /// Returned char * must be freed
165
+ char * mmd_d_string_metavalue_for_key(DString * source, const char * key);
166
+
167
+
168
+ /// Insert/replace metadata value in DString
169
+ void mmd_d_string_update_metavalue_for_key(DString * source, const char * key, const char * value);
170
+
171
+
172
+ /// Grab list of all transcluded files, but we need to know directory to search,
173
+ /// as well as the path to the file
174
+ /// Returned stack needs to be freed
175
+ struct stack * mmd_d_string_transclusion_manifest(DString * source, const char * search_path, const char * source_path);
176
+
177
+
178
+
179
+
180
+ /*
181
+ MMD Engine variants
182
+ */
183
+
184
+ /// MMD Engine is used for storing configuration information for MMD parser
185
+ typedef struct mmd_engine mmd_engine;
186
+
187
+
188
+ /// Create MMD Engine using an existing DString (A new copy is *not* made)
189
+ mmd_engine * mmd_engine_create_with_dstring(
190
+ DString * d,
191
+ unsigned long extensions
192
+ );
193
+
194
+
195
+ /// Create MMD Engine using a C string (A private copy of the string will be
196
+ /// made. The one passed here can be freed by the calling function)
197
+ mmd_engine * mmd_engine_create_with_string(
198
+ const char * str,
199
+ unsigned long extensions
200
+ );
201
+
202
+
203
+ /// Reset engine when finished parsing. (Usually not necessary to use this.)
204
+ void mmd_engine_reset(mmd_engine * e);
205
+
206
+
207
+ /// Free an existing MMD Engine
208
+ void mmd_engine_free(
209
+ mmd_engine * e,
210
+ bool freeDString
211
+ );
212
+
213
+
214
+ /// Set language and smart quotes language
215
+ void mmd_engine_set_language(mmd_engine * e, short language);
216
+
217
+
218
+ /// Parse part of the string into a token tree
219
+ token * mmd_engine_parse_substring(mmd_engine * e, size_t byte_start, size_t byte_len);
220
+
221
+
222
+ /// Parse the entire string into a token tree
223
+ void mmd_engine_parse_string(mmd_engine * e);
224
+
225
+
226
+ /// Export parsed token tree to output format
227
+ void mmd_engine_export_token_tree(DString * out, mmd_engine * e, short format);
228
+
229
+
230
+ /// Convert MMD text to specified format, with specified extensions, and language
231
+ /// Returned char * must be freed
232
+ char * mmd_engine_convert(mmd_engine * e, short format);
233
+
234
+
235
+ /// Convert MMD text and write results to specified file -- used for "complex" output formats requiring
236
+ /// multiple documents (e.g. EPUB)
237
+ void mmd_engine_convert_to_file(mmd_engine * e, short format, const char * directory, const char * filepath);
238
+
239
+
240
+ /// Convert MMD text to specified format using DString as a container for block of data
241
+ /// and length of that block. Must be used for "complex" output formats such as EPUB.
242
+ /// Returned DString * must be freed
243
+ DString * mmd_engine_convert_to_data(mmd_engine * e, short format, const char * directory);
244
+
245
+
246
+ /// Does the text have metadata?
247
+ bool mmd_engine_has_metadata(mmd_engine * e, size_t * end);
248
+
249
+
250
+ /// Return metadata keys, one per line
251
+ /// Returned char * must be freed
252
+ char * mmd_engine_metadata_keys(mmd_engine * e);
253
+
254
+
255
+ /// Extract desired metadata as string value
256
+ char * mmd_engine_metavalue_for_key(mmd_engine * e, const char * key);
257
+
258
+
259
+ /// Insert/replace metadata value in mmd_engine
260
+ void mmd_engine_update_metavalue_for_key(mmd_engine * e, const char * key, const char * value);
261
+
262
+
263
+ /// Grab list of all transcluded files, but we need to know directory to search,
264
+ /// as well as the path to the file
265
+ /// Returned stack needs to be freed
266
+ struct stack * mmd_engine_transclusion_manifest(mmd_engine * e, const char * search_path, const char * source_path);
267
+
268
+
269
+
270
+
271
+ /*
272
+ Utility functions
273
+ */
274
+
275
+ /// Return the version string for this build of libMultiMarkdown
276
+ /// The returned `char *` will need to be freed after it is no longer needed.
277
+ char * mmd_version(void);
278
+
279
+
280
+ // Read file into memory
281
+ DString * scan_file(const char * fname);
282
+
283
+
284
+ /// MMD Engine is used for storing configuration information for MMD parser
285
+ typedef struct stack stack;
286
+
287
+
288
+ /// Recursively transclude source text, given a search directory.
289
+ /// Track files to prevent infinite recursive loops
290
+ void mmd_transclude_source(DString * source, const char * search_path, const char * source_path, short format, struct stack * parsed, struct stack * manifest);
291
+
292
+
293
+ /// If MMD Header metadata used, insert it into appropriate place
294
+ void mmd_prepend_mmd_header(DString * source);
295
+
296
+
297
+ /// If MMD Footer metadata used, insert it into appropriate place
298
+ void mmd_append_mmd_footer(DString * source);
299
+
300
+
301
+ /// Accept all CriticMarkup changes in the source string
302
+ void mmd_critic_markup_accept(DString * d);
303
+
304
+
305
+ /// Reject all CriticMarkup changes in the source string
306
+ void mmd_critic_markup_reject(DString * d);
307
+
308
+
309
+ /// Token types for parse tree
310
+ enum token_types {
311
+ DOC_START_TOKEN = 0, //!< DOC_START_TOKEN must be type 0
312
+
313
+ BLOCK_BLOCKQUOTE = 50, //!< This must start *after* the largest number in parser.h
314
+ BLOCK_CODE_FENCED,
315
+ BLOCK_CODE_INDENTED,
316
+ BLOCK_DEFLIST,
317
+ BLOCK_DEFINITION,
318
+ BLOCK_DEF_ABBREVIATION,
319
+ BLOCK_DEF_CITATION,
320
+ BLOCK_DEF_GLOSSARY,
321
+ BLOCK_DEF_FOOTNOTE,
322
+ BLOCK_DEF_LINK,
323
+ BLOCK_EMPTY,
324
+ BLOCK_HEADING, //!< Placeholder for theme cascading
325
+ BLOCK_H1, //!< Leave H1, H2, etc. in order
326
+ BLOCK_H2,
327
+ BLOCK_H3,
328
+ BLOCK_H4,
329
+ BLOCK_H5,
330
+ BLOCK_H6,
331
+ BLOCK_HR,
332
+ BLOCK_HTML,
333
+ BLOCK_LIST_BULLETED,
334
+ BLOCK_LIST_BULLETED_LOOSE,
335
+ BLOCK_LIST_ENUMERATED,
336
+ BLOCK_LIST_ENUMERATED_LOOSE,
337
+ BLOCK_LIST_ITEM,
338
+ BLOCK_LIST_ITEM_TIGHT,
339
+ BLOCK_META,
340
+ BLOCK_PARA,
341
+ BLOCK_SETEXT_1,
342
+ BLOCK_SETEXT_2,
343
+ BLOCK_TABLE,
344
+ BLOCK_TABLE_HEADER,
345
+ BLOCK_TABLE_SECTION,
346
+ BLOCK_TERM,
347
+ BLOCK_TOC,
348
+
349
+ CRITIC_ADD_OPEN,
350
+ CRITIC_ADD_CLOSE,
351
+ CRITIC_DEL_OPEN,
352
+ CRITIC_DEL_CLOSE,
353
+ CRITIC_COM_OPEN,
354
+ CRITIC_COM_CLOSE,
355
+ CRITIC_SUB_OPEN,
356
+ CRITIC_SUB_DIV,
357
+ CRITIC_SUB_DIV_A,
358
+ CRITIC_SUB_DIV_B,
359
+ CRITIC_SUB_CLOSE,
360
+ CRITIC_HI_OPEN,
361
+ CRITIC_HI_CLOSE,
362
+
363
+ PAIR_CRITIC_ADD,
364
+ PAIR_CRITIC_DEL,
365
+ PAIR_CRITIC_COM,
366
+ PAIR_CRITIC_SUB_ADD,
367
+ PAIR_CRITIC_SUB_DEL,
368
+ PAIR_CRITIC_HI,
369
+
370
+ PAIRS, //!< Placeholder for theme cascading
371
+ PAIR_ANGLE,
372
+ PAIR_BACKTICK,
373
+ PAIR_BRACKET,
374
+ PAIR_BRACKET_ABBREVIATION,
375
+ PAIR_BRACKET_FOOTNOTE,
376
+ PAIR_BRACKET_GLOSSARY,
377
+ PAIR_BRACKET_CITATION,
378
+ PAIR_BRACKET_IMAGE,
379
+ PAIR_BRACKET_VARIABLE,
380
+ PAIR_BRACE,
381
+ PAIR_EMPH,
382
+ PAIR_MATH,
383
+ PAIR_PAREN,
384
+ PAIR_QUOTE_SINGLE,
385
+ PAIR_QUOTE_DOUBLE,
386
+ PAIR_QUOTE_ALT,
387
+ PAIR_RAW_FILTER,
388
+ PAIR_SUBSCRIPT,
389
+ PAIR_SUPERSCRIPT,
390
+ PAIR_STAR,
391
+ PAIR_STRONG,
392
+ PAIR_UL,
393
+ PAIR_BRACES,
394
+
395
+ STAR,
396
+ UL,
397
+ EMPH_START,
398
+ EMPH_STOP,
399
+ STRONG_START,
400
+ STRONG_STOP,
401
+
402
+ BRACKET_LEFT,
403
+ BRACKET_RIGHT,
404
+ BRACKET_ABBREVIATION_LEFT,
405
+ BRACKET_FOOTNOTE_LEFT,
406
+ BRACKET_GLOSSARY_LEFT,
407
+ BRACKET_CITATION_LEFT,
408
+ BRACKET_IMAGE_LEFT,
409
+ BRACKET_VARIABLE_LEFT,
410
+
411
+ PAREN_LEFT,
412
+ PAREN_RIGHT,
413
+
414
+ ANGLE_LEFT,
415
+ ANGLE_RIGHT,
416
+
417
+ BRACE_DOUBLE_LEFT,
418
+ BRACE_DOUBLE_RIGHT,
419
+
420
+ AMPERSAND,
421
+ AMPERSAND_LONG,
422
+ APOSTROPHE,
423
+ BACKTICK,
424
+ CODE_FENCE,
425
+ COLON,
426
+ DASH_M,
427
+ DASH_N,
428
+ ELLIPSIS,
429
+ QUOTE_SINGLE,
430
+ QUOTE_DOUBLE,
431
+ QUOTE_LEFT_SINGLE,
432
+ QUOTE_RIGHT_SINGLE,
433
+ QUOTE_LEFT_DOUBLE,
434
+ QUOTE_RIGHT_DOUBLE,
435
+ QUOTE_RIGHT_ALT,
436
+
437
+ ESCAPED_CHARACTER,
438
+
439
+ HTML_ENTITY,
440
+ HTML_COMMENT_START,
441
+ HTML_COMMENT_STOP,
442
+ PAIR_HTML_COMMENT,
443
+
444
+ MATH_PAREN_OPEN,
445
+ MATH_PAREN_CLOSE,
446
+ MATH_BRACKET_OPEN,
447
+ MATH_BRACKET_CLOSE,
448
+ MATH_DOLLAR_SINGLE,
449
+ MATH_DOLLAR_DOUBLE,
450
+
451
+ EQUAL,
452
+ PIPE,
453
+ PLUS,
454
+ SLASH,
455
+
456
+ SUPERSCRIPT,
457
+ SUBSCRIPT,
458
+
459
+ INDENT_TAB,
460
+ INDENT_SPACE,
461
+ NON_INDENT_SPACE,
462
+
463
+ HASH1, //!< Leave HASH1, HASH2, etc. in order
464
+ HASH2,
465
+ HASH3,
466
+ HASH4,
467
+ HASH5,
468
+ HASH6,
469
+ MARKER_BLOCKQUOTE,
470
+ MARKER_H1, //!< Leave MARKER_H1, MARKER_H2, etc. in order
471
+ MARKER_H2,
472
+ MARKER_H3,
473
+ MARKER_H4,
474
+ MARKER_H5,
475
+ MARKER_H6,
476
+ MARKER_LIST_BULLET,
477
+ MARKER_LIST_ENUMERATOR,
478
+
479
+ TABLE_ROW,
480
+ TABLE_CELL,
481
+ TABLE_DIVIDER,
482
+
483
+ TOC,
484
+
485
+ TEXT_BACKSLASH,
486
+ RAW_FILTER_LEFT,
487
+ TEXT_BRACE_LEFT,
488
+ TEXT_BRACE_RIGHT,
489
+ TEXT_EMPTY,
490
+ TEXT_HASH,
491
+ TEXT_LINEBREAK,
492
+ TEXT_LINEBREAK_SP,
493
+ TEXT_NL,
494
+ TEXT_NL_SP,
495
+ TEXT_NUMBER_POSS_LIST,
496
+ TEXT_PERCENT,
497
+ TEXT_PERIOD,
498
+ TEXT_PLAIN,
499
+
500
+ MANUAL_LABEL,
501
+ };
502
+
503
+
504
+ /// Define smart typography languages -- first in list is default
505
+ enum smart_quotes_language {
506
+ ENGLISH = 0,
507
+ DUTCH,
508
+ FRENCH,
509
+ GERMAN,
510
+ GERMANGUILL,
511
+ SWEDISH,
512
+ };
513
+
514
+
515
+ enum output_format {
516
+ FORMAT_HTML,
517
+ FORMAT_EPUB,
518
+ FORMAT_LATEX,
519
+ FORMAT_BEAMER,
520
+ FORMAT_MEMOIR,
521
+ FORMAT_FODT,
522
+ FORMAT_ODT,
523
+ FORMAT_TEXTBUNDLE,
524
+ FORMAT_TEXTBUNDLE_COMPRESSED,
525
+ FORMAT_MMD,
526
+ };
527
+
528
+
529
+ enum parser_extensions {
530
+ EXT_COMPATIBILITY = 1 << 0, //!< Markdown compatibility mode
531
+ EXT_COMPLETE = 1 << 1, //!< Create complete document
532
+ EXT_SNIPPET = 1 << 2, //!< Create snippet only
533
+ EXT_SMART = 1 << 3, //!< Enable Smart quotes
534
+ EXT_NOTES = 1 << 4, //!< Enable Footnotes
535
+ EXT_NO_LABELS = 1 << 5, //!< Don't add anchors to headers, etc.
536
+ EXT_PROCESS_HTML = 1 << 6, //!< Process Markdown inside HTML
537
+ EXT_NO_METADATA = 1 << 7, //!< Don't parse Metadata
538
+ EXT_OBFUSCATE = 1 << 8, //!< Mask email addresses
539
+ EXT_CRITIC = 1 << 9, //!< Critic Markup Support
540
+ EXT_CRITIC_ACCEPT = 1 << 10, //!< Accept all proposed changes
541
+ EXT_CRITIC_REJECT = 1 << 11, //!< Reject all proposed changes
542
+ EXT_RANDOM_FOOT = 1 << 12, //!< Use random numbers for footnote links
543
+ EXT_TRANSCLUDE = 1 << 13, //!< Perform transclusion(s)
544
+ EXT_FAKE = 1 << 31, //!< 31 is highest number allowed
545
+ };
546
+
547
+
548
+ #endif