multimarkdown 4.5.0.r1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/LICENSE +75 -0
  2. data/MultiMarkdown-4/GLibFacade.c +294 -0
  3. data/MultiMarkdown-4/GLibFacade.h +95 -0
  4. data/MultiMarkdown-4/beamer.c +179 -0
  5. data/MultiMarkdown-4/beamer.h +11 -0
  6. data/MultiMarkdown-4/critic.c +111 -0
  7. data/MultiMarkdown-4/critic.h +15 -0
  8. data/MultiMarkdown-4/glib.h +11 -0
  9. data/MultiMarkdown-4/html.c +1060 -0
  10. data/MultiMarkdown-4/html.h +14 -0
  11. data/MultiMarkdown-4/latex.c +1137 -0
  12. data/MultiMarkdown-4/latex.h +16 -0
  13. data/MultiMarkdown-4/libMultiMarkdown.h +156 -0
  14. data/MultiMarkdown-4/lyx.c +2163 -0
  15. data/MultiMarkdown-4/lyx.h +36 -0
  16. data/MultiMarkdown-4/lyxbeamer.c +267 -0
  17. data/MultiMarkdown-4/lyxbeamer.h +11 -0
  18. data/MultiMarkdown-4/memoir.c +79 -0
  19. data/MultiMarkdown-4/memoir.h +10 -0
  20. data/MultiMarkdown-4/multimarkdown.c +483 -0
  21. data/MultiMarkdown-4/odf.c +1201 -0
  22. data/MultiMarkdown-4/odf.h +18 -0
  23. data/MultiMarkdown-4/opml.c +188 -0
  24. data/MultiMarkdown-4/opml.h +15 -0
  25. data/MultiMarkdown-4/parse_utilities.c +752 -0
  26. data/MultiMarkdown-4/parser.c +15582 -0
  27. data/MultiMarkdown-4/parser.h +186 -0
  28. data/MultiMarkdown-4/rng.c +117 -0
  29. data/MultiMarkdown-4/rtf.c +648 -0
  30. data/MultiMarkdown-4/rtf.h +17 -0
  31. data/MultiMarkdown-4/strtok.c +56 -0
  32. data/MultiMarkdown-4/strtok.h +9 -0
  33. data/MultiMarkdown-4/text.c +53 -0
  34. data/MultiMarkdown-4/text.h +11 -0
  35. data/MultiMarkdown-4/transclude.c +213 -0
  36. data/MultiMarkdown-4/transclude.h +26 -0
  37. data/MultiMarkdown-4/writer.c +576 -0
  38. data/MultiMarkdown-4/writer.h +34 -0
  39. data/README.md +70 -0
  40. data/Rakefile +85 -0
  41. data/bin/ruby_multi_markdown +128 -0
  42. data/ext/extconf.h +3 -0
  43. data/ext/extconf.rb +17 -0
  44. data/ext/multi_markdown.c +100 -0
  45. data/lib/multi_markdown.bundle +0 -0
  46. data/lib/multi_markdown.rb +88 -0
  47. data/lib/multi_markdown/version.rb +6 -0
  48. data/lib/multimarkdown.rb +1 -0
  49. data/multi_markdown.gemspec +37 -0
  50. data/test/multi_markdown_test.rb +64 -0
  51. metadata +119 -0
data/LICENSE ADDED
@@ -0,0 +1,75 @@
1
+ MultiMarkdown-4 in C
2
+ Copyright (c) 2010-2013 Fletcher T. Penney
3
+ Ruby Markdown Extension (rpeg-markdown) used as template for this gem
4
+ Copyright (c) 2008 Ryan Tomayko
5
+ Ruby MultiMarkdown Extension (rpeg-multimarkdown) used as another template
6
+ Copyright (c) 2009 Oliver ? (https://github.com/djungelvral)
7
+ Micro-optparse (included in bin/ruby_multi_markdown)
8
+ Copyright (c) 2011 Florian Pilz
9
+
10
+ Both multi_markdown and MultiMarkdown-4 are released under both the GPL
11
+ and MIT licenses. You may pick the license that best fits your needs.
12
+
13
+ Micro-optparse is released under the MIT license.
14
+
15
+ The GPL
16
+
17
+ This program is free software; you can redistribute it and/or modify
18
+ it under the terms of the GNU General Public License as published by
19
+ the Free Software Foundation; either version 2 of the License, or
20
+ (at your option) any later version.
21
+
22
+ This program is distributed in the hope that it will be useful,
23
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
24
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25
+ GNU General Public License for more details.
26
+
27
+ You should have received a copy of the GNU General Public License
28
+ along with this program; if not, write to the Free Software
29
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
30
+
31
+ The MIT License
32
+
33
+ Permission is hereby granted, free of charge, to any person obtaining a copy
34
+ of this software and associated documentation files (the "Software"), to deal
35
+ in the Software without restriction, including without limitation the rights
36
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
37
+ copies of the Software, and to permit persons to whom the Software is
38
+ furnished to do so, subject to the following conditions:
39
+
40
+ The above copyright notice and this permission notice shall be included in
41
+ all copies or substantial portions of the Software.
42
+
43
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
46
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
48
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
49
+ THE SOFTWARE.
50
+
51
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
52
+
53
+ my_getopt (included for convenience - http://www.geocities.com/bsittler/)
54
+
55
+ Copyright 1997, 2000, 2001, 2002, 2006, Benjamin Sittler
56
+
57
+ Permission is hereby granted, free of charge, to any person
58
+ obtaining a copy of this software and associated documentation
59
+ files (the "Software"), to deal in the Software without
60
+ restriction, including without limitation the rights to use, copy,
61
+ modify, merge, publish, distribute, sublicense, and/or sell copies
62
+ of the Software, and to permit persons to whom the Software is
63
+ furnished to do so, subject to the following conditions:
64
+
65
+ The above copyright notice and this permission notice shall be
66
+ included in all copies or substantial portions of the Software.
67
+
68
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
69
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
70
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
71
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
72
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
73
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
74
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
75
+ DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,294 @@
1
+ /*
2
+ * GLibFacade.c
3
+ * MultiMarkdown
4
+ *
5
+ * Created by Daniel Jalkut on 7/26/11.
6
+ * Modified by Fletcher T. Penney on 9/15/11 and 12/3/13.
7
+ * Modified by Dan Lowe on 1/3/12.
8
+ *
9
+ * License for original code by Daniel Jalkut:
10
+ *
11
+ * Copyright 2011 Daniel Jalkut. All rights reserved.
12
+ *
13
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
14
+ * this software and associated documentation files (the “Software”), to deal in
15
+ * the Software without restriction, including without limitation the rights to
16
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
17
+ * of the Software, and to permit persons to whom the Software is furnished to do
18
+ * so, subject to the following conditions:
19
+ *
20
+ * The above copyright notice and this permission notice shall be included in all
21
+ * copies or substantial portions of the Software.
22
+ *
23
+ * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ * SOFTWARE.
30
+ */
31
+
32
+ #include "GLibFacade.h"
33
+
34
+ #include <stdio.h>
35
+ #include <stdlib.h>
36
+ #include <string.h>
37
+ #include <stdarg.h>
38
+
39
+ /*
40
+ * The following section came from:
41
+ *
42
+ * http://lists-archives.org/mingw-users/12649-asprintf-missing-vsnprintf-
43
+ * behaving-differently-and-_vsncprintf-undefined.html
44
+ *
45
+ * and
46
+ *
47
+ * http://groups.google.com/group/jansson-users/browse_thread/thread/
48
+ * 76a88d63d9519978/041a7d0570de2d48?lnk=raot
49
+ */
50
+
51
+ /* Solaris and Windows do not provide vasprintf() or asprintf(). */
52
+ #if defined(__WIN32) || (defined(__SVR4) && defined(__sun))
53
+ int vasprintf( char **sptr, char *fmt, va_list argv )
54
+ {
55
+ int wanted = vsnprintf( *sptr = NULL, 0, fmt, argv );
56
+ if( (wanted > 0) && ((*sptr = malloc( 1 + wanted )) != NULL) )
57
+ return vsprintf( *sptr, fmt, argv );
58
+
59
+ return wanted;
60
+ }
61
+
62
+ int asprintf( char **sptr, char *fmt, ... )
63
+ {
64
+ int retval;
65
+ va_list argv;
66
+ va_start( argv, fmt );
67
+ retval = vasprintf( sptr, fmt, argv );
68
+ va_end( argv );
69
+ return retval;
70
+ }
71
+ #endif
72
+
73
+
74
+ /* GString */
75
+
76
+ #define kStringBufferStartingSize 1024
77
+ #define kStringBufferGrowthMultiplier 2
78
+
79
+ GString* g_string_new(char *startingString)
80
+ {
81
+ GString* newString = malloc(sizeof(GString));
82
+
83
+ if (startingString == NULL) startingString = "";
84
+
85
+ size_t startingBufferSize = kStringBufferStartingSize;
86
+ size_t startingStringSize = strlen(startingString);
87
+ while (startingBufferSize < (startingStringSize + 1))
88
+ {
89
+ startingBufferSize *= kStringBufferGrowthMultiplier;
90
+ }
91
+
92
+ newString->str = malloc(startingBufferSize);
93
+ newString->currentStringBufferSize = startingBufferSize;
94
+ strncpy(newString->str, startingString, startingStringSize);
95
+ newString->str[startingStringSize] = '\0';
96
+ newString->currentStringLength = startingStringSize;
97
+
98
+ return newString;
99
+ }
100
+
101
+ char* g_string_free(GString* ripString, bool freeCharacterData)
102
+ {
103
+ if (ripString == NULL)
104
+ return NULL;
105
+
106
+ char* returnedString = ripString->str;
107
+ if (freeCharacterData)
108
+ {
109
+ if (ripString->str != NULL)
110
+ {
111
+ free(ripString->str);
112
+ }
113
+ returnedString = NULL;
114
+ }
115
+
116
+ free(ripString);
117
+
118
+ return returnedString;
119
+ }
120
+
121
+ static void ensureStringBufferCanHold(GString* baseString, size_t newStringSize)
122
+ {
123
+ size_t newBufferSizeNeeded = newStringSize + 1;
124
+ if (newBufferSizeNeeded > baseString->currentStringBufferSize)
125
+ {
126
+ size_t newBufferSize = baseString->currentStringBufferSize;
127
+
128
+ while (newBufferSizeNeeded > newBufferSize)
129
+ {
130
+ newBufferSize *= kStringBufferGrowthMultiplier;
131
+ }
132
+
133
+ char *temp;
134
+ temp = realloc(baseString->str, newBufferSize);
135
+
136
+ if (temp == NULL) {
137
+ /* realloc failed */
138
+ fprintf(stderr, "error reallocating memory\n");
139
+
140
+ exit(1);
141
+ }
142
+ baseString->str = temp;
143
+ baseString->currentStringBufferSize = newBufferSize;
144
+ }
145
+ }
146
+
147
+ void g_string_append(GString* baseString, char* appendedString)
148
+ {
149
+ if ((appendedString != NULL) && (strlen(appendedString) > 0))
150
+ {
151
+ size_t appendedStringLength = strlen(appendedString);
152
+ size_t newStringLength = baseString->currentStringLength + appendedStringLength;
153
+ ensureStringBufferCanHold(baseString, newStringLength);
154
+
155
+ /* We already know where the current string ends, so pass that as the starting address for strncat */
156
+ strncat(baseString->str + baseString->currentStringLength, appendedString, appendedStringLength);
157
+ baseString->currentStringLength = newStringLength;
158
+ }
159
+ }
160
+
161
+ void g_string_append_c(GString* baseString, char appendedCharacter)
162
+ {
163
+ size_t newSizeNeeded = baseString->currentStringLength + 1;
164
+ ensureStringBufferCanHold(baseString, newSizeNeeded);
165
+
166
+ baseString->str[baseString->currentStringLength] = appendedCharacter;
167
+ baseString->currentStringLength++;
168
+ baseString->str[baseString->currentStringLength] = '\0';
169
+ }
170
+
171
+ void g_string_append_printf(GString* baseString, char* format, ...)
172
+ {
173
+ va_list args;
174
+ va_start(args, format);
175
+
176
+ char* formattedString = NULL;
177
+ vasprintf(&formattedString, format, args);
178
+ if (formattedString != NULL)
179
+ {
180
+ g_string_append(baseString, formattedString);
181
+ free(formattedString);
182
+ }
183
+ va_end(args);
184
+ }
185
+
186
+ void g_string_prepend(GString* baseString, char* prependedString)
187
+ {
188
+ if ((prependedString != NULL) && (strlen(prependedString) > 0))
189
+ {
190
+ size_t prependedStringLength = strlen(prependedString);
191
+ size_t newStringLength = baseString->currentStringLength + prependedStringLength;
192
+ ensureStringBufferCanHold(baseString, newStringLength);
193
+
194
+ memmove(baseString->str + prependedStringLength, baseString->str, baseString->currentStringLength);
195
+ strncpy(baseString->str, prependedString, prependedStringLength);
196
+ baseString->currentStringLength = newStringLength;
197
+ baseString->str[baseString->currentStringLength] = '\0';
198
+ }
199
+ }
200
+
201
+ void g_string_insert(GString* baseString, size_t pos, char * insertedString)
202
+ {
203
+ if ((insertedString != NULL) && (strlen(insertedString) > 0))
204
+ {
205
+ if (pos > baseString->currentStringLength)
206
+ pos = baseString->currentStringLength;
207
+
208
+ size_t insertedStringLength = strlen(insertedString);
209
+ size_t newStringLength = baseString->currentStringLength + insertedStringLength;
210
+ ensureStringBufferCanHold(baseString, newStringLength);
211
+
212
+ /* Shift following string to 'right' */
213
+ memmove(baseString->str + pos + insertedStringLength, baseString->str + pos, baseString->currentStringLength - pos);
214
+ strncpy(baseString->str + pos, insertedString, insertedStringLength);
215
+ baseString->currentStringLength = newStringLength;
216
+ baseString->str[baseString->currentStringLength] = '\0';
217
+ }
218
+ }
219
+
220
+ void g_string_insert_c(GString* baseString, size_t pos, char insertedCharacter)
221
+ {
222
+ if (pos > baseString->currentStringLength)
223
+ pos = baseString->currentStringLength;
224
+
225
+ size_t newSizeNeeded = baseString->currentStringLength + 1;
226
+ ensureStringBufferCanHold(baseString, newSizeNeeded);
227
+
228
+ /* Shift following string to 'right' */
229
+ memmove(baseString->str + pos + 1, baseString->str + pos, baseString->currentStringLength - pos);
230
+
231
+ baseString->str[pos] = insertedCharacter;
232
+ baseString->currentStringLength++;
233
+ baseString->str[baseString->currentStringLength] = '\0';
234
+ }
235
+
236
+ void g_string_erase(GString* baseString, size_t pos, size_t len)
237
+ {
238
+ if ((pos > baseString->currentStringLength) || (len <= 0))
239
+ return;
240
+
241
+ if ((pos + len) >= baseString->currentStringLength)
242
+ len = -1;
243
+
244
+ if (len == -1) {
245
+ baseString->currentStringLength = pos;
246
+ } else {
247
+ memmove(baseString->str + pos, baseString->str + pos + len, baseString->currentStringLength - pos - len);
248
+ baseString->currentStringLength -= len;
249
+ }
250
+ baseString->str[baseString->currentStringLength] = '\0';
251
+ }
252
+
253
+ /* GSList */
254
+
255
+ void g_slist_free(GSList* ripList)
256
+ {
257
+ GSList* thisListItem = ripList;
258
+ while (thisListItem != NULL)
259
+ {
260
+ GSList* nextItem = thisListItem->next;
261
+
262
+ /* I guess we don't release the data? Non-retained memory management is hard... let's figure it out later. */
263
+ free(thisListItem);
264
+
265
+ thisListItem = nextItem;
266
+ }
267
+ }
268
+
269
+ /* Currently only used for markdown_output.c endnotes printing */
270
+ GSList* g_slist_reverse(GSList* theList)
271
+ {
272
+ GSList* lastNodeSeen = NULL;
273
+
274
+ /* Iterate the list items, tacking them on to our new reversed List as we find them */
275
+ GSList* listWalker = theList;
276
+ while (listWalker != NULL)
277
+ {
278
+ GSList* nextNode = listWalker->next;
279
+ listWalker->next = lastNodeSeen;
280
+ lastNodeSeen = listWalker;
281
+ listWalker = nextNode;
282
+ }
283
+
284
+ return lastNodeSeen;
285
+ }
286
+
287
+ GSList* g_slist_prepend(GSList* targetElement, void* newElementData)
288
+ {
289
+ GSList* newElement = malloc(sizeof(GSList));
290
+ newElement->data = newElementData;
291
+ newElement->next = targetElement;
292
+ return newElement;
293
+ }
294
+
@@ -0,0 +1,95 @@
1
+ /*
2
+ * GLibFacade.h
3
+ * MultiMarkdown
4
+ *
5
+ * Created by Daniel Jalkut on 7/26/11.
6
+ * Modified by Fletcher T. Penney on 9/15/11 and 12/3/13.
7
+ * Modified by Dan Lowe on 1/3/12.
8
+ *
9
+ * License for original code by Daniel Jalkut:
10
+ *
11
+ * Copyright 2011 Daniel Jalkut. All rights reserved.
12
+ *
13
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
14
+ * this software and associated documentation files (the “Software”), to deal in
15
+ * the Software without restriction, including without limitation the rights to
16
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
17
+ * of the Software, and to permit persons to whom the Software is furnished to do
18
+ * so, subject to the following conditions:
19
+ *
20
+ * The above copyright notice and this permission notice shall be included in all
21
+ * copies or substantial portions of the Software.
22
+ *
23
+ * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ * SOFTWARE.
30
+ */
31
+
32
+ #ifndef __MARKDOWN_GLIB_FACADE__
33
+ #define __MARKDOWN_GLIB_FACADE__
34
+
35
+ /* peg_markdown uses the link symbol for its own purposes */
36
+ #define link MARKDOWN_LINK_IGNORED
37
+ #include <unistd.h>
38
+ #undef link
39
+
40
+ #include <stdbool.h>
41
+ #include <ctype.h>
42
+
43
+ typedef int gboolean;
44
+ typedef char gchar;
45
+
46
+ /* This style of bool is used in shared source code */
47
+ #define FALSE false
48
+ #define TRUE true
49
+
50
+ /* WE implement minimal mirror implementations of GLib's GString and GSList
51
+ * sufficient to cover the functionality required by MultiMarkdown.
52
+ *
53
+ * NOTE: THese are 100% clean, from-scratch implementations using only the
54
+ * GLib function prototype as guide for behavior.
55
+ */
56
+
57
+ typedef struct
58
+ {
59
+ /* Current UTF8 byte stream this string represents */
60
+ char* str;
61
+
62
+ /* Where in the str buffer will we add new characters */
63
+ /* or append new strings? */
64
+ unsigned long currentStringBufferSize;
65
+ unsigned long currentStringLength;
66
+ } GString;
67
+
68
+ GString* g_string_new(char *startingString);
69
+ char* g_string_free(GString* ripString, bool freeCharacterData);
70
+
71
+ void g_string_append_c(GString* baseString, char appendedCharacter);
72
+ void g_string_append(GString* baseString, char *appendedString);
73
+
74
+ void g_string_prepend(GString* baseString, char* prependedString);
75
+
76
+ void g_string_append_printf(GString* baseString, char* format, ...);
77
+
78
+ void g_string_insert(GString* baseString, size_t pos, char * insertedString);
79
+ void g_string_insert_c(GString* baseString, size_t pos, char insertedCharacter);
80
+
81
+ void g_string_erase(GString* baseString, size_t pos, size_t len);
82
+
83
+ /* Just implement a very simple singly linked list. */
84
+
85
+ typedef struct _GSList
86
+ {
87
+ void* data;
88
+ struct _GSList* next;
89
+ } GSList;
90
+
91
+ void g_slist_free(GSList* ripList);
92
+ GSList* g_slist_prepend(GSList* targetElement, void* newElementData);
93
+ GSList* g_slist_reverse(GSList* theList);
94
+
95
+ #endif