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
@@ -63,14 +63,6 @@
63
63
  #endif
64
64
 
65
65
 
66
- /// Combine directory and base filename to create a full path */
67
- char * path_from_dir_base(const char * dir, const char * base);
68
-
69
-
70
- // Read file into memory
71
- DString * scan_file(const char * fname);
72
-
73
-
74
66
  /// Recursively transclude source text, given a search directory.
75
67
  /// Track files to prevent infinite recursive loops
76
68
  void mmd_transclude_source(DString * source, const char * search_path, const char * source_path, short format, stack * parsed, stack * manifest);
@@ -102,8 +102,8 @@ char * uuid_string_from_bits(unsigned char * raw) {
102
102
  char * result = malloc(37);
103
103
 
104
104
  sprintf(result, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
105
- raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6], raw[7],
106
- raw[8], raw[9], raw[10], raw[11], raw[12], raw[13], raw[14], raw[15] );
105
+ raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6], raw[7],
106
+ raw[8], raw[9], raw[10], raw[11], raw[12], raw[13], raw[14], raw[15] );
107
107
 
108
108
  return result;
109
109
  }
@@ -149,6 +149,6 @@ void custom_seed_rand(void) {
149
149
  // This is not a "cryptographically secure" random seed,
150
150
  // but good enough for an EPUB id....
151
151
  unsigned long seed = mix(clock(), time(NULL), clock());
152
- srand(seed);
152
+ srand((unsigned int)seed);
153
153
  }
154
154
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  version.h -- MultiMarkdown
4
4
 
5
- Copyright © 2016 - 2017 Fletcher T. Penney.
5
+ Copyright © 2016 - 2018 Fletcher T. Penney.
6
6
 
7
7
 
8
8
 
@@ -23,8 +23,8 @@
23
23
 
24
24
  #define MULTIMARKDOWN_NAME "MultiMarkdown"
25
25
 
26
- #define MULTIMARKDOWN_VERSION "6.2.2"
27
- #define MULTIMARKDOWN_COPYRIGHT "Copyright © 2016 - 2017 Fletcher T. Penney."
26
+ #define MULTIMARKDOWN_VERSION "6.4.0"
27
+ #define MULTIMARKDOWN_COPYRIGHT "Copyright © 2016 - 2018 Fletcher T. Penney."
28
28
 
29
29
  #define MULTIMARKDOWN_LICENSE "\tThe `MultiMarkdown 6` project is released under the MIT License..\n"\
30
30
  " \n"\
@@ -69,6 +69,7 @@
69
69
  #include "memoir.h"
70
70
  #include "mmd.h"
71
71
  #include "opendocument-content.h"
72
+ #include "opml.h"
72
73
  #include "parser.h"
73
74
  #include "scanners.h"
74
75
  #include "token.h"
@@ -153,6 +154,7 @@ scratch_pad * scratch_pad_new(mmd_engine * e, short format) {
153
154
  p->header_stack = e->header_stack;
154
155
 
155
156
  p->outline_stack = stack_new(0);
157
+ p->opml_item_closed = 1;
156
158
 
157
159
  p->recurse_depth = 0;
158
160
 
@@ -418,8 +420,8 @@ char * label_from_string(const char * str) {
418
420
  next_char++;
419
421
  }
420
422
  } else if ((*str >= '0' && *str <= '9') || (*str >= 'A' && *str <= 'Z')
421
- || (*str >= 'a' && *str <= 'z') || (*str == '.') || (*str == '_')
422
- || (*str == '-') || (*str == ':')) {
423
+ || (*str >= 'a' && *str <= 'z') || (*str == '.') || (*str == '_')
424
+ || (*str == '-') || (*str == ':')) {
423
425
  // Allow 0-9, A-Z, a-z, ., _, -, :
424
426
  d_string_append_c(out, tolower(*str));
425
427
  }
@@ -475,6 +477,22 @@ char * clean_string(const char * str, bool lowercase) {
475
477
 
476
478
  while (*str != '\0') {
477
479
  switch (*str) {
480
+ case '\\':
481
+ switch (*(str + 1)) {
482
+ case '\n':
483
+ case '\r':
484
+ d_string_append_c(out, '\n');
485
+ block_whitespace = true;
486
+ break;
487
+
488
+ default:
489
+ d_string_append_c(out, '\\');
490
+ block_whitespace = false;
491
+ break;
492
+ }
493
+
494
+ break;
495
+
478
496
  case '\t':
479
497
  case ' ':
480
498
  case '\n':
@@ -598,8 +616,10 @@ attr * parse_attributes(char * source) {
598
616
  a->next = attr_new(key, value);
599
617
  a = a->next;
600
618
  } else {
619
+ #ifndef __clang_analyzer__
601
620
  a = attr_new(key, value);
602
621
  attributes = a;
622
+ #endif
603
623
  }
604
624
 
605
625
  free(value); // We stored a modified copy
@@ -609,7 +629,7 @@ attr * parse_attributes(char * source) {
609
629
  }
610
630
 
611
631
 
612
- link * link_new(const char * source, token * label, char * url, char * title, char * attributes) {
632
+ link * link_new(const char * source, token * label, char * url, char * title, char * attributes, short flags) {
613
633
  link * l = malloc(sizeof(link));
614
634
 
615
635
  if (l) {
@@ -626,6 +646,8 @@ link * link_new(const char * source, token * label, char * url, char * title, ch
626
646
  l->url = clean_string(url, false);
627
647
  l->title = (title == NULL) ? NULL : my_strdup(title);
628
648
  l->attributes = (attributes == NULL) ? NULL : parse_attributes(attributes);
649
+
650
+ l->flags = flags;
629
651
  }
630
652
 
631
653
  return l;
@@ -909,7 +931,7 @@ char * destination_accept(const char * source, token ** remainder, bool validate
909
931
 
910
932
  // Advance remainder to end of destination
911
933
  while ((*remainder)->next &&
912
- (*remainder)->next->start < start + scan_len) {
934
+ (*remainder)->next->start < start + scan_len) {
913
935
  *remainder = (*remainder)->next;
914
936
  }
915
937
 
@@ -962,7 +984,7 @@ char * url_accept(const char * source, size_t start, size_t max_len, size_t * en
962
984
 
963
985
  // Is this <foo>?
964
986
  if ((source[start] == '<') &&
965
- (source[start + scan_len - 1] == '>')) {
987
+ (source[start + scan_len - 1] == '>')) {
966
988
  // Strip '<' and '>'
967
989
  start++;
968
990
  scan_len -= 2;
@@ -1027,7 +1049,7 @@ void extract_from_paren(token * paren, const char * source, char ** url, char **
1027
1049
  }
1028
1050
 
1029
1051
 
1030
- /// Create a link from an explicit link `[foo](bar)`
1052
+ /// Create a link from an explicit "inline" link `[foo](bar)`
1031
1053
  link * explicit_link(scratch_pad * scratch, token * bracket, token * paren, const char * source) {
1032
1054
  char * url_char = NULL;
1033
1055
  char * title_char = NULL;
@@ -1038,10 +1060,10 @@ link * explicit_link(scratch_pad * scratch, token * bracket, token * paren, cons
1038
1060
 
1039
1061
  if (attr_char) {
1040
1062
  if (!(scratch->extensions & EXT_COMPATIBILITY)) {
1041
- l = link_new(source, NULL, url_char, title_char, attr_char);
1063
+ l = link_new(source, NULL, url_char, title_char, attr_char, LINK_INLINE);
1042
1064
  }
1043
1065
  } else {
1044
- l = link_new(source, NULL, url_char, title_char, attr_char);
1066
+ l = link_new(source, NULL, url_char, title_char, attr_char, LINK_INLINE);
1045
1067
  }
1046
1068
 
1047
1069
  free(url_char);
@@ -1054,6 +1076,7 @@ link * explicit_link(scratch_pad * scratch, token * bracket, token * paren, cons
1054
1076
 
1055
1077
  footnote * footnote_new(const char * source, token * label, token * content, bool lowercase) {
1056
1078
  footnote * f = malloc(sizeof(footnote));
1079
+ token * walker;
1057
1080
 
1058
1081
  if (f) {
1059
1082
  f->label = label;
@@ -1072,6 +1095,25 @@ footnote * footnote_new(const char * source, token * label, token * content, boo
1072
1095
  token_trim_leading_whitespace(content, source);
1073
1096
 
1074
1097
  default:
1098
+ // Trim trailing newlines
1099
+ walker = content->tail;
1100
+
1101
+ while (walker) {
1102
+ switch (walker->type) {
1103
+ case TEXT_NL:
1104
+ case TEXT_NL_SP:
1105
+ content->tail = walker->prev;
1106
+ token_free(walker);
1107
+ walker = content->tail;
1108
+ walker->next = NULL;
1109
+ break;
1110
+
1111
+ default:
1112
+ walker = NULL;
1113
+ break;
1114
+ }
1115
+ }
1116
+
1075
1117
  f->content = token_new_parent(content, BLOCK_PARA);
1076
1118
  f->free_para = true;
1077
1119
  break;
@@ -1294,12 +1336,12 @@ bool definition_extract(mmd_engine * e, token ** remainder) {
1294
1336
  }
1295
1337
  }
1296
1338
 
1297
- l = link_new(e->dstr->str, label, url_char, title_char, attr_char);
1339
+ l = link_new(e->dstr->str, label, url_char, title_char, attr_char, LINK_REFERENCE);
1298
1340
  } else {
1299
1341
  // Not valid match
1300
1342
  }
1301
1343
  } else {
1302
- l = link_new(e->dstr->str, label, url_char, title_char, attr_char);
1344
+ l = link_new(e->dstr->str, label, url_char, title_char, attr_char, LINK_REFERENCE);
1303
1345
  }
1304
1346
 
1305
1347
  // Store link for later use
@@ -1363,12 +1405,14 @@ void process_definition_block(mmd_engine * e, token * block) {
1363
1405
  }
1364
1406
 
1365
1407
  // Adjust the properties
1366
- free(f->label_text);
1367
- f->label_text = f->clean_text;
1408
+ if (f) {
1409
+ free(f->label_text);
1410
+ f->label_text = f->clean_text;
1411
+ }
1368
1412
 
1369
1413
  if (f->content->child &&
1370
- f->content->child->next &&
1371
- f->content->child->next->next) {
1414
+ f->content->child->next &&
1415
+ f->content->child->next->next) {
1372
1416
  f->clean_text = clean_string_from_range(e->dstr->str, f->content->child->next->next->start, block->start + block->len - f->content->child->next->next->start, false);
1373
1417
  } else {
1374
1418
  f->clean_text = NULL;
@@ -1514,7 +1558,7 @@ void process_header_to_links(mmd_engine * e, token * h) {
1514
1558
 
1515
1559
  d_string_append(url, label);
1516
1560
 
1517
- link * l = link_new(e->dstr->str, h, url->str, NULL, NULL);
1561
+ link * l = link_new(e->dstr->str, h, url->str, NULL, NULL, LINK_AUTO);
1518
1562
 
1519
1563
  // Store link for later use
1520
1564
  stack_push(e->link_stack, l);
@@ -1542,7 +1586,7 @@ void process_table_to_link(mmd_engine * e, token * t) {
1542
1586
  token * temp_token = t->next->child;
1543
1587
 
1544
1588
  if (temp_token->next &&
1545
- temp_token->next->type == PAIR_BRACKET) {
1589
+ temp_token->next->type == PAIR_BRACKET) {
1546
1590
  temp_token = temp_token->next;
1547
1591
  }
1548
1592
 
@@ -1551,7 +1595,7 @@ void process_table_to_link(mmd_engine * e, token * t) {
1551
1595
  DString * url = d_string_new("#");
1552
1596
  d_string_append(url, label);
1553
1597
 
1554
- link * l = link_new(e->dstr->str, temp_token, url->str, NULL, NULL);
1598
+ link * l = link_new(e->dstr->str, temp_token, url->str, NULL, NULL, LINK_AUTO);
1555
1599
 
1556
1600
  stack_push(e->link_stack, l);
1557
1601
 
@@ -1571,7 +1615,7 @@ void process_table_stack(mmd_engine * e) {
1571
1615
  /// Parse metadata
1572
1616
  void process_metadata_stack(mmd_engine * e, scratch_pad * scratch) {
1573
1617
  if ((scratch->extensions & EXT_NO_METADATA) ||
1574
- (scratch->extensions & EXT_COMPATIBILITY)) {
1618
+ (scratch->extensions & EXT_COMPATIBILITY)) {
1575
1619
  return;
1576
1620
  }
1577
1621
 
@@ -1601,13 +1645,13 @@ void process_metadata_stack(mmd_engine * e, scratch_pad * scratch) {
1601
1645
  }
1602
1646
  } else if (strcmp(m->key, "latexheaderlevel") == 0) {
1603
1647
  if ((scratch->output_format == FORMAT_LATEX) ||
1604
- (scratch->output_format == FORMAT_BEAMER) ||
1605
- (scratch->output_format == FORMAT_MEMOIR)) {
1648
+ (scratch->output_format == FORMAT_BEAMER) ||
1649
+ (scratch->output_format == FORMAT_MEMOIR)) {
1606
1650
  header_level = atoi(m->value);
1607
1651
  }
1608
1652
  } else if (strcmp(m->key, "odfheaderlevel") == 0) {
1609
1653
  if ((scratch->output_format == FORMAT_ODT) ||
1610
- (scratch->output_format == FORMAT_FODT)) {
1654
+ (scratch->output_format == FORMAT_FODT)) {
1611
1655
  header_level = atoi(m->value);
1612
1656
  }
1613
1657
  } else if (strcmp(m->key, "language") == 0) {
@@ -1618,7 +1662,7 @@ void process_metadata_stack(mmd_engine * e, scratch_pad * scratch) {
1618
1662
  scratch->quotes_lang = GERMAN;
1619
1663
  } else if (strcmp(temp_char, "es") == 0) {
1620
1664
  scratch->language = LC_ES;
1621
- scratch->quotes_lang = ENGLISH;
1665
+ scratch->quotes_lang = SPANISH;
1622
1666
  } else if (strcmp(temp_char, "fr") == 0) {
1623
1667
  scratch->language = LC_FR;
1624
1668
  scratch->quotes_lang = FRENCH;
@@ -1650,18 +1694,21 @@ void process_metadata_stack(mmd_engine * e, scratch_pad * scratch) {
1650
1694
  temp_char = label_from_string(m->value);
1651
1695
 
1652
1696
  if ((strcmp(temp_char, "dutch") == 0) ||
1653
- (strcmp(temp_char, "nl") == 0)) {
1697
+ (strcmp(temp_char, "nl") == 0)) {
1654
1698
  scratch->quotes_lang = DUTCH;
1655
1699
  } else if ((strcmp(temp_char, "french") == 0) ||
1656
- (strcmp(temp_char, "fr") == 0)) {
1700
+ (strcmp(temp_char, "fr") == 0)) {
1657
1701
  scratch->quotes_lang = FRENCH;
1658
1702
  } else if ((strcmp(temp_char, "german") == 0) ||
1659
- (strcmp(temp_char, "de") == 0)) {
1703
+ (strcmp(temp_char, "de") == 0)) {
1660
1704
  scratch->quotes_lang = GERMAN;
1661
1705
  } else if (strcmp(temp_char, "germanguillemets") == 0) {
1662
1706
  scratch->quotes_lang = GERMANGUILL;
1707
+ } else if ((strcmp(temp_char, "spanish") == 0) ||
1708
+ (strcmp(temp_char, "es") == 0)) {
1709
+ scratch->quotes_lang = SPANISH;
1663
1710
  } else if ((strcmp(temp_char, "swedish") == 0) ||
1664
- (strcmp(temp_char, "sv") == 0)) {
1711
+ (strcmp(temp_char, "sv") == 0)) {
1665
1712
  scratch->quotes_lang = SWEDISH;
1666
1713
  } else {
1667
1714
  scratch->quotes_lang = ENGLISH;
@@ -1767,7 +1814,7 @@ void automatic_search(mmd_engine * e, token * t, trie * ac) {
1767
1814
 
1768
1815
  void identify_global_search_terms(mmd_engine * e, scratch_pad * scratch) {
1769
1816
  // Only search if we have a target
1770
- int count = e->abbreviation_stack->size + e->glossary_stack->size;
1817
+ size_t count = e->abbreviation_stack->size + e->glossary_stack->size;
1771
1818
 
1772
1819
  if (count == 0) {
1773
1820
  return;
@@ -1825,6 +1872,7 @@ void mmd_engine_export_token_tree(DString * out, mmd_engine * e, short format) {
1825
1872
 
1826
1873
  mmd_export_token_tree_beamer(out, e->dstr->str, e->root, scratch);
1827
1874
 
1875
+ // Close out any existing outline levels
1828
1876
  mmd_outline_add_beamer(out, NULL, scratch);
1829
1877
 
1830
1878
  mmd_export_citation_list_beamer(out, e->dstr->str, scratch);
@@ -1905,6 +1953,10 @@ void mmd_engine_export_token_tree(DString * out, mmd_engine * e, short format) {
1905
1953
 
1906
1954
  // mmd_end_complete_odf(out, e->dstr->str, scratch);
1907
1955
  break;
1956
+
1957
+ case FORMAT_OPML:
1958
+ mmd_export_token_tree_opml(out, e->dstr->str, e->root, scratch);
1959
+ break;
1908
1960
  }
1909
1961
 
1910
1962
  // Preserve asset_hash for possible use in export
@@ -2459,6 +2511,18 @@ void strip_leading_whitespace(token * chain, const char * source) {
2459
2511
  }
2460
2512
 
2461
2513
 
2514
+ void trim_trailing_whitespace_d_string(DString * d) {
2515
+ if (d) {
2516
+ char * c = &(d->str[d->currentStringLength - 1]);
2517
+
2518
+ while (d->currentStringLength && char_is_whitespace(*c)) {
2519
+ *c-- = 0;
2520
+ d->currentStringLength--;
2521
+ }
2522
+ }
2523
+ }
2524
+
2525
+
2462
2526
  bool table_has_caption(token * t) {
2463
2527
 
2464
2528
  if (t->next && t->next->type == BLOCK_PARA) {
@@ -2468,13 +2532,18 @@ bool table_has_caption(token * t) {
2468
2532
  t = t->next;
2469
2533
 
2470
2534
  if (t && t->next &&
2471
- t->next->type == PAIR_BRACKET) {
2535
+ t->next->type == PAIR_BRACKET) {
2472
2536
  t = t->next;
2473
2537
  }
2474
2538
 
2539
+ if (t == NULL) {
2540
+ // End of file
2541
+ return true;
2542
+ }
2543
+
2475
2544
  if (t && t->next &&
2476
- ((t->next->type == TEXT_NL) ||
2477
- (t->next->type == TEXT_LINEBREAK))) {
2545
+ ((t->next->type == TEXT_NL) ||
2546
+ (t->next->type == TEXT_LINEBREAK))) {
2478
2547
  t = t->next;
2479
2548
  }
2480
2549
 
@@ -113,6 +113,7 @@ typedef struct {
113
113
  stack * header_stack;
114
114
 
115
115
  stack * outline_stack;
116
+ short opml_item_closed;
116
117
 
117
118
  short recurse_depth;
118
119
 
@@ -144,9 +145,17 @@ struct link {
144
145
  char * url;
145
146
  char * title;
146
147
  attr * attributes;
148
+ short flags;
147
149
  UT_hash_handle hh;
148
150
  };
149
151
 
152
+ enum link_flags {
153
+ LINK_INLINE = 1 << 0, //!< Inline link, e.g. [foo](#bar)
154
+ LINK_IMPLICIT = 1 << 1, //!< Implicit link, e.g. [foo]
155
+ LINK_REFERENCE = 1 << 2, //!< Reference definition
156
+ LINK_AUTO = 1 << 3, //!< Automatically generated link (e.g. Headers, tables)
157
+ };
158
+
150
159
  typedef struct link link;
151
160
 
152
161
  struct footnote {
@@ -236,6 +245,8 @@ void read_table_column_alignments(const char * source, token * table, scratch_pa
236
245
 
237
246
  void strip_leading_whitespace(token * chain, const char * source);
238
247
 
248
+ void trim_trailing_whitespace_d_string(DString * d);
249
+
239
250
  bool table_has_caption(token * table);
240
251
 
241
252
  char * get_fence_language_specifier(token * fence, const char * source);
Binary file
@@ -1,6 +1,6 @@
1
1
  class MultiMarkdown
2
2
 
3
3
  # The ruby 'multimarkdown' gem version
4
- VERSION = "6.2.2.1"
4
+ VERSION = "6.4.0.1"
5
5
 
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rmultimarkdown
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.2.2.1
4
+ version: 6.4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Till Schulte-Coerne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-26 00:00:00.000000000 Z
11
+ date: 2018-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -54,8 +54,8 @@ files:
54
54
  - ext/mmd/d_string.c
55
55
  - ext/mmd/epub.c
56
56
  - ext/mmd/epub.h
57
- - ext/mmd/fodt.c
58
- - ext/mmd/fodt.h
57
+ - ext/mmd/file.c
58
+ - ext/mmd/file.h
59
59
  - ext/mmd/html.c
60
60
  - ext/mmd/html.h
61
61
  - ext/mmd/i18n.h
@@ -78,6 +78,14 @@ files:
78
78
  - ext/mmd/opendocument-content.h
79
79
  - ext/mmd/opendocument.c
80
80
  - ext/mmd/opendocument.h
81
+ - ext/mmd/opml-lexer.c
82
+ - ext/mmd/opml-lexer.h
83
+ - ext/mmd/opml-parser.c
84
+ - ext/mmd/opml-parser.h
85
+ - ext/mmd/opml-reader.c
86
+ - ext/mmd/opml-reader.h
87
+ - ext/mmd/opml.c
88
+ - ext/mmd/opml.h
81
89
  - ext/mmd/parser.c
82
90
  - ext/mmd/parser.h
83
91
  - ext/mmd/rng.c
@@ -132,5 +140,5 @@ signing_key:
132
140
  specification_version: 4
133
141
  summary: A MultiMarkdown 6 binding for Ruby
134
142
  test_files:
135
- - test/extensions_test.rb
136
143
  - test/multi_markdown_test.rb
144
+ - test/extensions_test.rb