rmultimarkdown 6.2.2.1 → 6.4.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Makefile +2 -2
  3. data/ext/mmd/aho-corasick.c +12 -8
  4. data/ext/mmd/beamer.c +29 -0
  5. data/ext/mmd/critic_markup.c +100 -4
  6. data/ext/mmd/critic_markup.h +7 -0
  7. data/ext/mmd/d_string.c +502 -119
  8. data/ext/mmd/epub.c +2 -4
  9. data/ext/mmd/file.c +436 -0
  10. data/ext/mmd/file.h +153 -0
  11. data/ext/mmd/html.c +130 -37
  12. data/ext/mmd/include/d_string.h +20 -19
  13. data/ext/mmd/include/libMultiMarkdown.h +42 -27
  14. data/ext/mmd/include/token.h +15 -15
  15. data/ext/mmd/latex.c +107 -30
  16. data/ext/mmd/lexer.c +19 -7
  17. data/ext/mmd/lexer.h +2 -2
  18. data/ext/mmd/memoir.c +29 -0
  19. data/ext/mmd/mmd.c +65 -39
  20. data/ext/mmd/object_pool.h +4 -4
  21. data/ext/mmd/opendocument-content.c +95 -13
  22. data/ext/mmd/opendocument.c +315 -313
  23. data/ext/mmd/opml-lexer.c +2183 -0
  24. data/ext/mmd/opml-lexer.h +157 -0
  25. data/ext/mmd/opml-parser.c +1193 -0
  26. data/ext/mmd/opml-parser.h +15 -0
  27. data/ext/mmd/opml-reader.c +435 -0
  28. data/ext/mmd/opml-reader.h +111 -0
  29. data/ext/mmd/opml.c +511 -0
  30. data/ext/mmd/opml.h +115 -0
  31. data/ext/mmd/parser.c +2 -0
  32. data/ext/mmd/rng.c +1 -1
  33. data/ext/mmd/scanners.c +51663 -24824
  34. data/ext/mmd/stack.c +4 -2
  35. data/ext/mmd/stack.h +8 -8
  36. data/ext/mmd/textbundle.c +2 -4
  37. data/ext/mmd/token.c +24 -12
  38. data/ext/mmd/token_pairs.c +2 -2
  39. data/ext/mmd/token_pairs.h +10 -10
  40. data/ext/mmd/transclude.c +1 -226
  41. data/ext/mmd/transclude.h +0 -8
  42. data/ext/mmd/uuid.c +3 -3
  43. data/ext/mmd/version.h +3 -3
  44. data/ext/mmd/writer.c +99 -30
  45. data/ext/mmd/writer.h +11 -0
  46. data/lib/multi_markdown.bundle +0 -0
  47. data/lib/multi_markdown/version.rb +1 -1
  48. metadata +13 -5
  49. data/ext/mmd/fodt.c +0 -2288
  50. data/ext/mmd/fodt.h +0 -81
@@ -10,42 +10,42 @@
10
10
 
11
11
  @author Daniel Jalkut, modified by Fletcher T. Penney and Dan Lowe
12
12
 
13
- @bug
13
+ @bug
14
14
 
15
15
  **/
16
16
 
17
17
  /*
18
18
 
19
19
  Copyright © 2011 Daniel Jalkut.
20
- Modifications by Fletcher T. Penney, Copyright © 2011-2017 Fletcher T. Penney.
20
+ Modifications by Fletcher T. Penney, Copyright © 2011-2018 Fletcher T. Penney.
21
21
  Modifications by Dan Lowe, Copyright © 2011 Dan Lowe.
22
22
 
23
23
 
24
24
  The `MultiMarkdown 6` project is released under the MIT License..
25
-
25
+
26
26
  GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project:
27
-
27
+
28
28
  https://github.com/fletcher/MultiMarkdown-4/
29
-
29
+
30
30
  MMD 4 is released under both the MIT License and GPL.
31
-
32
-
31
+
32
+
33
33
  CuTest is released under the zlib/libpng license. See CuTest.c for the text
34
34
  of the license.
35
-
36
-
35
+
36
+
37
37
  ## The MIT License ##
38
-
38
+
39
39
  Permission is hereby granted, free of charge, to any person obtaining a copy
40
40
  of this software and associated documentation files (the "Software"), to deal
41
41
  in the Software without restriction, including without limitation the rights
42
42
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
43
43
  copies of the Software, and to permit persons to whom the Software is
44
44
  furnished to do so, subject to the following conditions:
45
-
45
+
46
46
  The above copyright notice and this permission notice shall be included in
47
47
  all copies or substantial portions of the Software.
48
-
48
+
49
49
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
50
50
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
51
51
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -63,26 +63,27 @@
63
63
  #include <stdbool.h>
64
64
  #include <stdlib.h>
65
65
 
66
- /* WE implement minimal mirror implementations of GLib's GString
66
+ /* WE implement minimal mirror implementations of GLib's GString
67
67
  * sufficient to cover the functionality required by MultiMarkdown.
68
68
  *
69
- * NOTE: THese are 100% clean, from-scratch implementations using only the
69
+ * NOTE: THese are 100% clean, from-scratch implementations using only the
70
70
  * GLib function prototype as guide for behavior.
71
71
  */
72
72
 
73
73
 
74
74
  /// Structure for dynamic string
75
- typedef struct
76
- {
75
+ struct DString {
77
76
  char * str; //!< Pointer to UTF-8 byte stream for string
78
77
  unsigned long currentStringBufferSize; //!< Size of buffer currently allocated
79
78
  unsigned long currentStringLength; //!< Size of current string
80
- } DString;
79
+ };
80
+
81
+ typedef struct DString DString;
81
82
 
82
83
 
83
84
  /// Create a new dynamic string
84
85
  DString * d_string_new(
85
- const char * startingString //!< Initial contents for string
86
+ const char * startingString //!< Initial contents for string
86
87
  );
87
88
 
88
89
 
@@ -159,7 +160,7 @@ void d_string_insert_printf(
159
160
  void d_string_erase(
160
161
  DString * baseString, //!< DString to be appended
161
162
  size_t pos, //!< Offset at which to erase portion of string
162
- size_t len //!< Character to append
163
+ size_t len //!< How many characters(bytes) to remove
163
164
  );
164
165
 
165
166
  /// Copy a portion of dynamic string
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
  @author Fletcher T. Penney
11
- @bug
11
+ @bug
12
12
 
13
13
 
14
14
  ******IMPORTANT******
@@ -20,7 +20,7 @@
20
20
  2. Properly manage the `token_pool_init` and `token_pool_free` functions.
21
21
 
22
22
 
23
- I recommend option #1, unless you absolutely need the best performance for
23
+ I recommend option #1, unless you absolutely need the best performance for
24
24
  long documents. Doing #2 properly is tricky in any program that can handle
25
25
  multiple MMD text strings at overlapping times.
26
26
 
@@ -32,30 +32,30 @@
32
32
 
33
33
 
34
34
  The `MultiMarkdown 6` project is released under the MIT License..
35
-
35
+
36
36
  GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project:
37
-
37
+
38
38
  https://github.com/fletcher/MultiMarkdown-4/
39
-
39
+
40
40
  MMD 4 is released under both the MIT License and GPL.
41
-
42
-
41
+
42
+
43
43
  CuTest is released under the zlib/libpng license. See CuTest.c for the text
44
44
  of the license.
45
-
46
-
45
+
46
+
47
47
  ## The MIT License ##
48
-
48
+
49
49
  Permission is hereby granted, free of charge, to any person obtaining a copy
50
50
  of this software and associated documentation files (the "Software"), to deal
51
51
  in the Software without restriction, including without limitation the rights
52
52
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
53
53
  copies of the Software, and to permit persons to whom the Software is
54
54
  furnished to do so, subject to the following conditions:
55
-
55
+
56
56
  The above copyright notice and this permission notice shall be included in
57
57
  all copies or substantial portions of the Software.
58
-
58
+
59
59
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
60
60
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
61
61
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -74,8 +74,20 @@
74
74
  #include <stdlib.h>
75
75
 
76
76
 
77
- #include "d_string.h"
78
- #include "token.h"
77
+ /// typedefs for internal data structures. If you intend to work with these structures
78
+ /// in your own code, you may need to import additional header files.
79
+
80
+ /// From token.h:
81
+ typedef struct token token;
82
+
83
+ /// From d_string.h:
84
+ typedef struct DString DString;
85
+
86
+ /// From mmd.h
87
+ typedef struct mmd_engine mmd_engine;
88
+
89
+ /// From stack.h
90
+ typedef struct stack stack;
79
91
 
80
92
 
81
93
  /// There are 3 main versions of the primary functions:
@@ -181,10 +193,6 @@ struct stack * mmd_d_string_transclusion_manifest(DString * source, const char *
181
193
  MMD Engine variants
182
194
  */
183
195
 
184
- /// MMD Engine is used for storing configuration information for MMD parser
185
- typedef struct mmd_engine mmd_engine;
186
-
187
-
188
196
  /// Create MMD Engine using an existing DString (A new copy is *not* made)
189
197
  mmd_engine * mmd_engine_create_with_dstring(
190
198
  DString * d,
@@ -206,8 +214,8 @@ void mmd_engine_reset(mmd_engine * e);
206
214
 
207
215
  /// Free an existing MMD Engine
208
216
  void mmd_engine_free(
209
- mmd_engine * e,
210
- bool freeDString
217
+ mmd_engine * e,
218
+ bool freeDString
211
219
  );
212
220
 
213
221
 
@@ -281,10 +289,6 @@ char * mmd_version(void);
281
289
  DString * scan_file(const char * fname);
282
290
 
283
291
 
284
- /// MMD Engine is used for storing configuration information for MMD parser
285
- typedef struct stack stack;
286
-
287
-
288
292
  /// Recursively transclude source text, given a search directory.
289
293
  /// Track files to prevent infinite recursive loops
290
294
  void mmd_transclude_source(DString * source, const char * search_path, const char * source_path, short format, struct stack * parsed, struct stack * manifest);
@@ -302,10 +306,18 @@ void mmd_append_mmd_footer(DString * source);
302
306
  void mmd_critic_markup_accept(DString * d);
303
307
 
304
308
 
309
+ /// Accept all CriticMarkup changes in the specified range
310
+ void mmd_critic_markup_accept_range(DString * d, size_t start, size_t len);
311
+
312
+
305
313
  /// Reject all CriticMarkup changes in the source string
306
314
  void mmd_critic_markup_reject(DString * d);
307
315
 
308
316
 
317
+ /// Reject all CriticMarkup changes in the specified range
318
+ void mmd_critic_markup_reject_range(DString * d, size_t start, size_t len);
319
+
320
+
309
321
  /// Token types for parse tree
310
322
  enum token_types {
311
323
  DOC_START_TOKEN = 0, //!< DOC_START_TOKEN must be type 0
@@ -440,7 +452,7 @@ enum token_types {
440
452
  HTML_COMMENT_START,
441
453
  HTML_COMMENT_STOP,
442
454
  PAIR_HTML_COMMENT,
443
-
455
+
444
456
  MATH_PAREN_OPEN,
445
457
  MATH_PAREN_CLOSE,
446
458
  MATH_BRACKET_OPEN,
@@ -452,7 +464,7 @@ enum token_types {
452
464
  PIPE,
453
465
  PLUS,
454
466
  SLASH,
455
-
467
+
456
468
  SUPERSCRIPT,
457
469
  SUBSCRIPT,
458
470
 
@@ -481,7 +493,7 @@ enum token_types {
481
493
  TABLE_DIVIDER,
482
494
 
483
495
  TOC,
484
-
496
+
485
497
  TEXT_BACKSLASH,
486
498
  RAW_FILTER_LEFT,
487
499
  TEXT_BRACE_LEFT,
@@ -508,6 +520,7 @@ enum smart_quotes_language {
508
520
  FRENCH,
509
521
  GERMAN,
510
522
  GERMANGUILL,
523
+ SPANISH,
511
524
  SWEDISH,
512
525
  };
513
526
 
@@ -522,6 +535,7 @@ enum output_format {
522
535
  FORMAT_ODT,
523
536
  FORMAT_TEXTBUNDLE,
524
537
  FORMAT_TEXTBUNDLE_COMPRESSED,
538
+ FORMAT_OPML,
525
539
  FORMAT_MMD,
526
540
  };
527
541
 
@@ -541,6 +555,7 @@ enum parser_extensions {
541
555
  EXT_CRITIC_REJECT = 1 << 11, //!< Reject all proposed changes
542
556
  EXT_RANDOM_FOOT = 1 << 12, //!< Use random numbers for footnote links
543
557
  EXT_TRANSCLUDE = 1 << 13, //!< Perform transclusion(s)
558
+ EXT_PARSE_OPML = 1 << 14, //!< Convert from OPML before processing source text
544
559
  EXT_FAKE = 1 << 31, //!< 31 is highest number allowed
545
560
  };
546
561
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  @author Fletcher T. Penney
12
12
 
13
- @bug
13
+ @bug
14
14
 
15
15
  **/
16
16
 
@@ -20,27 +20,27 @@
20
20
 
21
21
 
22
22
  The `MultiMarkdown 6` project is released under the MIT License..
23
-
23
+
24
24
  GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project:
25
-
25
+
26
26
  https://github.com/fletcher/MultiMarkdown-4/
27
-
27
+
28
28
  MMD 4 is released under both the MIT License and GPL.
29
-
30
-
29
+
30
+
31
31
  CuTest is released under the zlib/libpng license. See CuTest.c for the text
32
32
  of the license.
33
-
34
-
33
+
34
+
35
35
  ## The MIT License ##
36
-
36
+
37
37
  Permission is hereby granted, free of charge, to any person obtaining a copy
38
38
  of this software and associated documentation files (the "Software"), to deal
39
39
  in the Software without restriction, including without limitation the rights
40
40
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
41
41
  copies of the Software, and to permit persons to whom the Software is
42
42
  furnished to do so, subject to the following conditions:
43
-
43
+
44
44
  The above copyright notice and this permission notice shall be included in
45
45
  all copies or substantial portions of the Software.
46
46
 
@@ -59,17 +59,17 @@
59
59
 
60
60
 
61
61
  #define kUseObjectPoolDisabled 1 //!< Use an object pool to allocate tokens to improve
62
- //!< performance in memory allocation. Frees all
63
- //!< tokens at once, however, at end of parsing.
62
+ //!< performance in memory allocation. Frees all
63
+ //!< tokens at once, however, at end of parsing.
64
64
 
65
65
  /// Should call init() once per thread/use, and drain() once per thread/use.
66
66
  /// This allows us to know when the pool is no longer being used and it is safe
67
67
  /// to free.
68
68
 
69
69
  #ifdef kUseObjectPool
70
- void token_pool_init(void); //!< Initialize object pool for allocating tokens
71
- void token_pool_drain(void); //!< Drain pool to free memory when parse complete
72
- void token_pool_free(void); //!< Free the token object pool
70
+ void token_pool_init(void); //!< Initialize object pool for allocating tokens
71
+ void token_pool_drain(void); //!< Drain pool to free memory when parse complete
72
+ void token_pool_free(void); //!< Free the token object pool
73
73
  #endif
74
74
 
75
75
 
@@ -116,6 +116,10 @@ void mmd_print_char_latex(DString * out, char c) {
116
116
  print_const("\\textbar{}");
117
117
  break;
118
118
 
119
+ case '\n':
120
+ case '\r':
121
+ print_char('\\');
122
+
119
123
  case '#':
120
124
  case '{':
121
125
  case '}':
@@ -214,6 +218,7 @@ void mmd_print_localized_char_latex(DString * out, unsigned short type, scratch_
214
218
  break;
215
219
 
216
220
  case FRENCH:
221
+ case SPANISH:
217
222
  print_const("«");
218
223
  break;
219
224
 
@@ -238,6 +243,7 @@ void mmd_print_localized_char_latex(DString * out, unsigned short type, scratch_
238
243
  break;
239
244
 
240
245
  case FRENCH:
246
+ case SPANISH:
241
247
  print_const("»");
242
248
  break;
243
249
 
@@ -261,14 +267,13 @@ void mmd_export_link_latex(DString * out, const char * source, token * text, lin
261
267
  if (text && text->child) {
262
268
  temp_char = label_from_token(source, text);
263
269
 
264
- if (strcmp(temp_char, &(link->url[1])) == 0) {
265
- // [bar][bar] or [bar](#bar) or [bar]
266
- printf("\\autoref{%s}", &(link->url)[1]);
267
- } else {
270
+ if (temp_char && temp_char[0] != '\0') {
268
271
  mmd_export_token_tree_latex(out, source, text->child, scratch);
269
272
  print_const(" (");
270
273
  printf("\\autoref{%s}", &(link->url)[1]);
271
274
  print_const(")");
275
+ } else {
276
+ printf("\\autoref{%s}", &(link->url)[1]);
272
277
  }
273
278
 
274
279
  free(temp_char);
@@ -292,7 +297,9 @@ void mmd_export_link_latex(DString * out, const char * source, token * text, lin
292
297
  text->child->next->len++;
293
298
  }
294
299
 
295
- mmd_export_token_tree_latex(out, source, text->child, scratch);
300
+ if (text && text->child) {
301
+ mmd_export_token_tree_latex(out, source, text->child, scratch);
302
+ }
296
303
 
297
304
  print_const("}");
298
305
 
@@ -441,7 +448,7 @@ void mmd_export_toc_entry_latex(DString * out, const char * source, scratch_pad
441
448
  if (entry_level >= level) {
442
449
  // This entry is a direct descendant of the parent
443
450
  temp_char = label_from_header(source, entry);
444
- print_const("\\item{} ");
451
+ print_const("\\item ");
445
452
  mmd_export_token_tree_latex(out, source, entry->child, scratch);
446
453
  printf("(\\autoref{%s})\n\n", temp_char);
447
454
 
@@ -684,6 +691,7 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
684
691
  }
685
692
 
686
693
  mmd_export_token_tree_latex(out, source, t->child, scratch);
694
+ trim_trailing_whitespace_d_string(out);
687
695
 
688
696
  if (scratch->extensions & EXT_NO_LABELS) {
689
697
  print_const("}");
@@ -763,7 +771,7 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
763
771
 
764
772
  case BLOCK_LIST_ITEM:
765
773
  pad(out, 2, scratch);
766
- print_const("\\item{} ");
774
+ print_const("\\item ");
767
775
  scratch->padded = 2;
768
776
  mmd_export_token_tree_latex(out, source, t->child, scratch);
769
777
  scratch->padded = 0;
@@ -771,7 +779,7 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
771
779
 
772
780
  case BLOCK_LIST_ITEM_TIGHT:
773
781
  pad(out, 2, scratch);
774
- print_const("\\item{} ");
782
+ print_const("\\item ");
775
783
  scratch->padded = 2;
776
784
  mmd_export_token_tree_latex(out, source, t->child, scratch);
777
785
  scratch->padded = 0;
@@ -798,7 +806,7 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
798
806
  temp_token = t->next->child;
799
807
 
800
808
  if (temp_token->next &&
801
- temp_token->next->type == PAIR_BRACKET) {
809
+ temp_token->next->type == PAIR_BRACKET) {
802
810
  temp_token = temp_token->next;
803
811
  }
804
812
 
@@ -1026,7 +1034,7 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
1026
1034
 
1027
1035
  case ESCAPED_CHARACTER:
1028
1036
  if (!(scratch->extensions & EXT_COMPATIBILITY) &&
1029
- (source[t->start + 1] == ' ')) {
1037
+ (source[t->start + 1] == ' ')) {
1030
1038
  print_const("~");
1031
1039
  } else {
1032
1040
  mmd_print_char_latex(out, source[t->start + 1]);
@@ -1238,7 +1246,7 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
1238
1246
 
1239
1247
  case PAIR_BRACKET:
1240
1248
  if ((scratch->extensions & EXT_NOTES) &&
1241
- (t->next && t->next->type == PAIR_BRACKET_CITATION)) {
1249
+ (t->next && t->next->type == PAIR_BRACKET_CITATION)) {
1242
1250
  goto parse_citation;
1243
1251
  }
1244
1252
 
@@ -1254,8 +1262,8 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
1254
1262
  temp_token = t->next;
1255
1263
 
1256
1264
  if (temp_token &&
1257
- ((temp_token->type == PAIR_BRACKET) ||
1258
- (temp_token->type == PAIR_PAREN))) {
1265
+ ((temp_token->type == PAIR_BRACKET) ||
1266
+ (temp_token->type == PAIR_PAREN))) {
1259
1267
  temp_token = temp_token->next;
1260
1268
  }
1261
1269
 
@@ -1284,7 +1292,9 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
1284
1292
  }
1285
1293
 
1286
1294
  // No links exist, so treat as normal
1295
+ print_const("{");
1287
1296
  mmd_export_token_tree_latex(out, source, t->child, scratch);
1297
+ print_const("}");
1288
1298
  break;
1289
1299
 
1290
1300
  case PAIR_BRACKET_ABBREVIATION:
@@ -1299,9 +1309,9 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
1299
1309
 
1300
1310
  if (temp_short == -1) {
1301
1311
  // This instance is not properly formed
1302
- print_const("[>");
1312
+ print_const("{[>");
1303
1313
  mmd_export_token_tree_latex(out, source, t->child->next, scratch);
1304
- print_const("]");
1314
+ print_const("]}");
1305
1315
  break;
1306
1316
  }
1307
1317
 
@@ -1325,7 +1335,9 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
1325
1335
  }
1326
1336
  } else {
1327
1337
  // Note-based syntax disabled
1338
+ print_const("{");
1328
1339
  mmd_export_token_tree_latex(out, source, t->child, scratch);
1340
+ print_const("}");
1329
1341
  }
1330
1342
 
1331
1343
  break;
@@ -1366,9 +1378,9 @@ parse_citation:
1366
1378
  // Ensure we aren't using BibTeX
1367
1379
  if (!scratch->bibtex_file) {
1368
1380
  // This instance is not properly formed
1369
- print_const("[#");
1381
+ print_const("{[#");
1370
1382
  mmd_export_token_tree_latex(out, source, t->child->next, scratch);
1371
- print_const("]");
1383
+ print_const("]}");
1372
1384
 
1373
1385
  free(temp_char);
1374
1386
  break;
@@ -1448,7 +1460,9 @@ parse_citation:
1448
1460
  free(temp_char);
1449
1461
  } else {
1450
1462
  // Note-based syntax disabled
1463
+ print_const("{");
1451
1464
  mmd_export_token_tree_latex(out, source, t->child, scratch);
1465
+ print_const("}");
1452
1466
  }
1453
1467
 
1454
1468
  break;
@@ -1463,9 +1477,9 @@ parse_citation:
1463
1477
 
1464
1478
  if (temp_short == -1) {
1465
1479
  // This instance is not properly formed
1466
- print_const("[?");
1480
+ print_const("{[?");
1467
1481
  mmd_export_token_tree_latex(out, source, t->child->next, scratch);
1468
- print_const("]");
1482
+ print_const("]}");
1469
1483
  break;
1470
1484
  }
1471
1485
 
@@ -1488,16 +1502,18 @@ parse_citation:
1488
1502
  print_const("}");
1489
1503
  } else {
1490
1504
  // This is the first time this note was used
1491
-
1492
1505
  print_const("\\footnote{");
1493
1506
  temp_note = stack_peek_index(scratch->used_footnotes, temp_short - 1);
1494
-
1507
+ // Reset padding counter in case of multiple footnotes in single paragraph
1508
+ scratch->padded = 2;
1495
1509
  mmd_export_token_tree_latex(out, source, temp_note->content, scratch);
1496
1510
  print_const("}");
1497
1511
  }
1498
1512
  } else {
1499
1513
  // Note-based syntax disabled
1514
+ print_const("{");
1500
1515
  mmd_export_token_tree_latex(out, source, t->child, scratch);
1516
+ print_const("}");
1501
1517
  }
1502
1518
 
1503
1519
  break;
@@ -1515,7 +1531,7 @@ parse_citation:
1515
1531
 
1516
1532
  if (temp_short == -1) {
1517
1533
  // This instance is not properly formed
1518
- print_const("[?");
1534
+ print_const("{[?");
1519
1535
 
1520
1536
  if (t->child) {
1521
1537
  mmd_export_token_tree_latex(out, source, t->child->next, scratch);
@@ -1523,7 +1539,7 @@ parse_citation:
1523
1539
  print_token(t);
1524
1540
  }
1525
1541
 
1526
- print_const("]");
1542
+ print_const("]}");
1527
1543
  break;
1528
1544
  }
1529
1545
 
@@ -1563,7 +1579,9 @@ parse_citation:
1563
1579
  }
1564
1580
  } else {
1565
1581
  // Note-based syntax disabled
1582
+ print_const("{");
1566
1583
  mmd_export_token_tree_latex(out, source, t->child, scratch);
1584
+ print_const("}");
1567
1585
  }
1568
1586
 
1569
1587
  break;
@@ -1575,7 +1593,9 @@ parse_citation:
1575
1593
  if (temp_char2) {
1576
1594
  mmd_print_string_latex(out, temp_char2);
1577
1595
  } else {
1596
+ print_const("{");
1578
1597
  mmd_export_token_tree_latex(out, source, t->child, scratch);
1598
+ print_const("}");
1579
1599
  }
1580
1600
 
1581
1601
  // Don't free temp_char2 (it belongs to meta *)
@@ -1634,7 +1654,7 @@ parse_citation:
1634
1654
 
1635
1655
  // Ignore if we're rejecting or accepting
1636
1656
  if ((scratch->extensions & EXT_CRITIC_REJECT) ||
1637
- (scratch->extensions & EXT_CRITIC_ACCEPT)) {
1657
+ (scratch->extensions & EXT_CRITIC_ACCEPT)) {
1638
1658
  break;
1639
1659
  }
1640
1660
 
@@ -1654,7 +1674,7 @@ parse_citation:
1654
1674
 
1655
1675
  // Ignore if we're rejecting or accepting
1656
1676
  if ((scratch->extensions & EXT_CRITIC_REJECT) ||
1657
- (scratch->extensions & EXT_CRITIC_ACCEPT)) {
1677
+ (scratch->extensions & EXT_CRITIC_ACCEPT)) {
1658
1678
  t->child->type = TEXT_EMPTY;
1659
1679
  t->child->mate->type = TEXT_EMPTY;
1660
1680
  mmd_export_token_tree_latex(out, source, t->child, scratch);
@@ -1684,8 +1704,8 @@ parse_citation:
1684
1704
 
1685
1705
  case PAIR_CRITIC_SUB_DEL:
1686
1706
  if ((scratch->extensions & EXT_CRITIC) &&
1687
- (t->next) &&
1688
- (t->next->type == PAIR_CRITIC_SUB_ADD)) {
1707
+ (t->next) &&
1708
+ (t->next->type == PAIR_CRITIC_SUB_ADD)) {
1689
1709
  t->child->type = TEXT_EMPTY;
1690
1710
  t->child->mate->type = TEXT_EMPTY;
1691
1711
 
@@ -1706,8 +1726,8 @@ parse_citation:
1706
1726
 
1707
1727
  case PAIR_CRITIC_SUB_ADD:
1708
1728
  if ((scratch->extensions & EXT_CRITIC) &&
1709
- (t->prev) &&
1710
- (t->prev->type == PAIR_CRITIC_SUB_DEL)) {
1729
+ (t->prev) &&
1730
+ (t->prev->type == PAIR_CRITIC_SUB_DEL)) {
1711
1731
  t->child->type = TEXT_EMPTY;
1712
1732
  t->child->mate->type = TEXT_EMPTY;
1713
1733
 
@@ -1930,6 +1950,7 @@ parse_citation:
1930
1950
  case TEXT_BRACE_RIGHT:
1931
1951
  print_const("\\");
1932
1952
 
1953
+ case PAIR_RAW_FILTER:
1933
1954
  case RAW_FILTER_LEFT:
1934
1955
  case TEXT_NUMBER_POSS_LIST:
1935
1956
  case TEXT_PERIOD:
@@ -1981,6 +2002,8 @@ void mmd_export_token_latex_raw(DString * out, const char * source, token * t, s
1981
2002
  return;
1982
2003
  }
1983
2004
 
2005
+ char * temp;
2006
+
1984
2007
  switch (t->type) {
1985
2008
  case ESCAPED_CHARACTER:
1986
2009
  print_const("\\");
@@ -1992,6 +2015,27 @@ void mmd_export_token_latex_raw(DString * out, const char * source, token * t, s
1992
2015
  print_token(t);
1993
2016
  break;
1994
2017
 
2018
+ case MARKER_LIST_BULLET:
2019
+ case MARKER_LIST_ENUMERATOR:
2020
+ print_token(t);
2021
+
2022
+ temp = NULL;
2023
+
2024
+ if (t->next) {
2025
+ temp = (char *) &source[t->next->start];
2026
+ }
2027
+
2028
+ source = (char *) &source[t->start + t->len];
2029
+
2030
+ while (char_is_whitespace(*source) &&
2031
+ ((temp == NULL) ||
2032
+ (source < temp))) {
2033
+ print_char(*source);
2034
+ source++;
2035
+ }
2036
+
2037
+ break;
2038
+
1995
2039
  case SUBSCRIPT:
1996
2040
  if (t->child) {
1997
2041
  print_const("\\ensuremath{\\sim}");
@@ -2020,6 +2064,10 @@ void mmd_export_token_latex_raw(DString * out, const char * source, token * t, s
2020
2064
  case TEXT_EMPTY:
2021
2065
  break;
2022
2066
 
2067
+ case TEXT_PERCENT:
2068
+ print_const("\\%");
2069
+ break;
2070
+
2023
2071
  default:
2024
2072
  if (t->child) {
2025
2073
  mmd_export_token_tree_latex_raw(out, source, t->child, scratch);
@@ -2133,7 +2181,23 @@ void mmd_export_token_latex_tt(DString * out, const char * source, token * t, sc
2133
2181
 
2134
2182
  case ESCAPED_CHARACTER:
2135
2183
  print_const("\\textbackslash{}");
2136
- mmd_print_char_latex(out, source[t->start + 1]);
2184
+
2185
+ if (t->next && t->next->type == TEXT_EMPTY && source[t->start + 1] == ' ') {
2186
+ } else {
2187
+ mmd_print_char_latex(out, source[t->start + 1]);
2188
+ }
2189
+
2190
+ break;
2191
+
2192
+ case HASH1:
2193
+ case HASH2:
2194
+ case HASH3:
2195
+ case HASH4:
2196
+ case HASH5:
2197
+ case HASH6:
2198
+ case TEXT_HASH:
2199
+ print_const("\\");
2200
+ print_token(t);
2137
2201
  break;
2138
2202
 
2139
2203
  case HTML_ENTITY:
@@ -2152,6 +2216,14 @@ void mmd_export_token_latex_tt(DString * out, const char * source, token * t, sc
2152
2216
  t->next->type = TEXT_EMPTY;
2153
2217
  }
2154
2218
 
2219
+ case MATH_DOLLAR_SINGLE:
2220
+ print_const("\\$");
2221
+ break;
2222
+
2223
+ case MATH_DOLLAR_DOUBLE:
2224
+ print_const("\\$\\$");
2225
+ break;
2226
+
2155
2227
  case MATH_BRACKET_OPEN:
2156
2228
  case MATH_BRACKET_CLOSE:
2157
2229
  case MATH_PAREN_OPEN:
@@ -2207,6 +2279,10 @@ void mmd_export_token_latex_tt(DString * out, const char * source, token * t, sc
2207
2279
  print_const("\\}");
2208
2280
  break;
2209
2281
 
2282
+ case TEXT_PERCENT:
2283
+ print_const("\\%");
2284
+ break;
2285
+
2210
2286
  case TOC:
2211
2287
  print_const("\\{\\{TOC\\}\\}");
2212
2288
  break;
@@ -2321,6 +2397,7 @@ void mmd_start_complete_latex(DString * out, const char * source, scratch_pad *
2321
2397
  } else if (strcmp(m->key, "latexmode") == 0) {
2322
2398
  } else if (strcmp(m->key, "mmdfooter") == 0) {
2323
2399
  } else if (strcmp(m->key, "mmdheader") == 0) {
2400
+ } else if (strcmp(m->key, "odfheader") == 0) {
2324
2401
  } else if (strcmp(m->key, "quoteslanguage") == 0) {
2325
2402
  } else if (strcmp(m->key, "title") == 0) {
2326
2403
  print_const("\\def\\mytitle{");