rdiscount 2.1.8 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 405bc946f3603de05c87ad440e64d3b22f111991
4
- data.tar.gz: f6dcc0125d0eb194721a3f4979bccad2b6afc69e
3
+ metadata.gz: 5fa600678c5314e67b7b61b113b1a061ed42f5a8
4
+ data.tar.gz: c9fef34817017c9be900f6897647471d10dac7fe
5
5
  SHA512:
6
- metadata.gz: b7573a6ccf9a830cff5f4768bc3d21625d189f88f93f7b1ed35bcc9c1cb1636b22013c8354d19f4b2d135568f96e4bd7072a0462eef28aa64c94566933f03305
7
- data.tar.gz: 4b88d0299ed378916b70b5159a96092062c22760ebb8fdd3fd98a519d5a528a7f40d652a29f450a9c6c4c006b380d944b234303267620eb6493b3f6be9a71589
6
+ metadata.gz: 7e29504a28c0dc25eb1a863e48484940c16a05a1ebb1f73046c2ef86f818ab0503e7425f0fa8733b3465b65c54a6592c6ccb58ad263425c61a27ae6ea64ebf0c
7
+ data.tar.gz: 91f0960039b2e8a9d0f44c7be7cbdecdca768f490bef418e04754d5ecfa9c47fdb336742bbd777fae72bb186d3f2a2febc335097862cb14128efb346d1b66fdd
data/BUILDING CHANGED
@@ -20,7 +20,7 @@ the rake gather task to copy discount source files into the ext/ directory:
20
20
  Submodule 'discount' (git://github.com/davidfstr/discount.git) registered for path 'discount'
21
21
  Cloning into discount...
22
22
  $ cd discount
23
- $ ./configure.sh --with-fenced-code --with-github-tags --with-dl=both
23
+ $ ./configure.sh
24
24
  $ make # ensure it compiles
25
25
  $ cd ..
26
26
  $ rake gather
@@ -52,6 +52,9 @@ ext. This must be done manually. Here's a quick way to get the full list:
52
52
 
53
53
  $ echo ext/*.c ext/*.h ext/*.rb ext/blocktags ext/VERSION | tr ' ' "\n" | sort
54
54
 
55
+ (There is an old Rakefile target called "rdiscount.gemspec" that looks like it
56
+ is designed to perform an update of these files, however I haven't tested it.)
57
+
55
58
  Build the RDiscount gem. If you get errors related to missing files
56
59
  in ext, make sure you updated the gemspec correctly in the previous step.
57
60
 
@@ -1,6 +1,7 @@
1
1
  Discount Markdown Processor for Ruby
2
2
  ====================================
3
- [![Build Status](https://travis-ci.org/davidfstr/rdiscount.png)](https://travis-ci.org/davidfstr/rdiscount)
3
+ [![Build Status](https://travis-ci.org/davidfstr/rdiscount.svg?branch=master)](https://travis-ci.org/davidfstr/rdiscount)
4
+ [![Build status](https://ci.appveyor.com/api/projects/status/47i0qxrnvjbg724f/branch/master?svg=true)](https://ci.appveyor.com/project/DavidFoster/rdiscount/branch/master)
4
5
 
5
6
  Discount is an implementation of John Gruber's Markdown markup language in C. It
6
7
  implements all of the language described in [the markdown syntax document][1] and
@@ -1 +1 @@
1
- 2.1.8
1
+ 2.2.0
@@ -8,7 +8,7 @@
8
8
 
9
9
  #define MAGIC 0x1f2e3d4c
10
10
 
11
- struct alist { int magic, size; struct alist *next, *last; };
11
+ struct alist { int magic, size, index; int *end; struct alist *next, *last; };
12
12
 
13
13
  static struct alist list = { 0, 0, 0, 0 };
14
14
 
@@ -16,14 +16,32 @@ static int mallocs=0;
16
16
  static int reallocs=0;
17
17
  static int frees=0;
18
18
 
19
+ static int index = 0;
20
+
21
+ static void
22
+ die(char *msg, int index)
23
+ {
24
+ fprintf(stderr, msg, index);
25
+ abort();
26
+ }
27
+
28
+
19
29
  void *
20
- acalloc(int size, int count)
30
+ acalloc(int count, int size)
21
31
  {
22
- struct alist *ret = calloc(size + sizeof(struct alist), count);
32
+ struct alist *ret;
33
+
34
+ if ( size > 1 ) {
35
+ count *= size;
36
+ size = 1;
37
+ }
23
38
 
24
- if ( ret ) {
39
+ if ( ret = calloc(count + sizeof(struct alist) + sizeof(int), size) ) {
25
40
  ret->magic = MAGIC;
26
41
  ret->size = size * count;
42
+ ret->index = index ++;
43
+ ret->end = (int*)(count + (char*) (ret + 1));
44
+ *(ret->end) = ~MAGIC;
27
45
  if ( list.next ) {
28
46
  ret->next = list.next;
29
47
  ret->last = &list;
@@ -54,6 +72,8 @@ afree(void *ptr)
54
72
  struct alist *p2 = ((struct alist*)ptr)-1;
55
73
 
56
74
  if ( p2->magic == MAGIC ) {
75
+ if ( ! (p2->end && *(p2->end) == ~MAGIC) )
76
+ die("goddam: corrupted memory block %d in free()!\n", p2->index);
57
77
  p2->last->next = p2->next;
58
78
  p2->next->last = p2->last;
59
79
  ++frees;
@@ -71,12 +91,16 @@ arealloc(void *ptr, int size)
71
91
  struct alist save;
72
92
 
73
93
  if ( p2->magic == MAGIC ) {
94
+ if ( ! (p2->end && *(p2->end) == ~MAGIC) )
95
+ die("goddam: corrupted memory block %d in realloc()!\n", p2->index);
74
96
  save.next = p2->next;
75
97
  save.last = p2->last;
76
- p2 = realloc(p2, sizeof(*p2) + size);
98
+ p2 = realloc(p2, sizeof(int) + sizeof(*p2) + size);
77
99
 
78
100
  if ( p2 ) {
79
101
  p2->size = size;
102
+ p2->end = (int*)(size + (char*) (p2 + 1));
103
+ *(p2->end) = ~MAGIC;
80
104
  p2->next->last = p2;
81
105
  p2->last->next = p2;
82
106
  ++reallocs;
@@ -7,16 +7,6 @@
7
7
  /* tabs are four spaces */
8
8
  #define TABSTOP 4
9
9
 
10
- /* enable fenced code blocks */
11
- #define WITH_FENCED_CODE 1
12
-
13
- /* include - and _ as acceptable characters in HTML tag names */
14
- #define WITH_GITHUB_TAGS 1
15
-
16
- /* enable discount and PHP Markdown Extra definition lists */
17
- #define USE_EXTRA_DL 1
18
- #define USE_DISCOUNT_DL 1
19
-
20
10
  /* these are setup by extconf.rb */
21
11
  #if HAVE_RANDOM
22
12
  #define COINTOSS() (random()&1)
data/ext/css.c CHANGED
@@ -75,11 +75,13 @@ int
75
75
  mkd_generatecss(Document *d, FILE *f)
76
76
  {
77
77
  char *res;
78
- int written = EOF, size = mkd_css(d, &res);
78
+ int written;
79
+ int size = mkd_css(d, &res);
79
80
 
80
- if ( size > 0 )
81
- written = fwrite(res, 1, size, f);
81
+ written = (size > 0) ? fwrite(res,1,size,f) : 0;
82
+
82
83
  if ( res )
83
84
  free(res);
85
+
84
86
  return (written == size) ? size : EOF;
85
87
  }
@@ -145,7 +145,6 @@ mkd_dump(Document *doc, FILE *out, int flags, char *title)
145
145
  dumptree(doc->code, &stack, out);
146
146
  DELETE(stack);
147
147
 
148
- mkd_cleanup(doc);
149
148
  return 0;
150
149
  }
151
150
  return -1;
@@ -8,7 +8,7 @@ HAVE_RAND = have_func('rand')
8
8
  HAVE_SRAND = have_func('srand')
9
9
 
10
10
  def sized_int(size, types)
11
- types.find { |type| check_sizeof(type) == 4 } ||
11
+ types.find { |type| check_sizeof(type) == size } ||
12
12
  abort("no int with size #{size}")
13
13
  end
14
14
 
@@ -30,6 +30,12 @@ static struct flagnames flagnames[] = {
30
30
  { MKD_NODLIST, "!DLIST" },
31
31
  { MKD_EXTRA_FOOTNOTE, "FOOTNOTE" },
32
32
  { MKD_NOSTYLE, "!STYLE" },
33
+ { MKD_NODLDISCOUNT, "!DLDISCOUNT" },
34
+ { MKD_DLEXTRA, "DLEXTRA" },
35
+ { MKD_FENCEDCODE, "FENCEDCODE" },
36
+ { MKD_IDANCHOR, "IDANCHOR" },
37
+ { MKD_GITHUBTAGS, "GITHUBTAGS" },
38
+ { MKD_URLENCODEDANCHOR, "URLENCODEDANCHOR" },
33
39
  };
34
40
  #define NR(x) (sizeof x/sizeof x[0])
35
41
 
@@ -786,7 +786,7 @@ mangle(char *s, int len, MMIOT *f)
786
786
  {
787
787
  while ( len-- > 0 ) {
788
788
  #if DEBIAN_GLITCH
789
- Qprintf(f, "&#02d;", *((unsigned char*)(s++)) );
789
+ Qprintf(f, "&#%02d;", *((unsigned char*)(s++)) );
790
790
  #else
791
791
  Qstring("&#", f);
792
792
  Qprintf(f, COINTOSS() ? "x%02x;" : "%02d;", *((unsigned char*)(s++)) );
@@ -860,7 +860,6 @@ code(MMIOT *f, char *s, int length)
860
860
  cputc(c, f);
861
861
  } /* code */
862
862
 
863
-
864
863
  /* delspan() -- write out a chunk of text, blocking with <del>...</del>
865
864
  */
866
865
  static void
@@ -1009,11 +1008,9 @@ maybe_tag_or_link(MMIOT *f)
1009
1008
  }
1010
1009
  else if ( isspace(c) )
1011
1010
  break;
1012
- #if WITH_GITHUB_TAGS
1013
- else if ( ! (c == '/' || c == '-' || c == '_' || isalnum(c) ) )
1014
- #else
1015
- else if ( ! (c == '/' || isalnum(c) ) )
1016
- #endif
1011
+ else if ( ! (c == '/'
1012
+ || (f->flags & MKD_GITHUBTAGS && (c == '-' || c == '_'))
1013
+ || isalnum(c) ) )
1017
1014
  maybetag=0;
1018
1015
  }
1019
1016
 
@@ -1064,6 +1061,8 @@ maybe_autolink(MMIOT *f)
1064
1061
  if ( peek(f, size+2) != EOF )
1065
1062
  ++size;
1066
1063
  }
1064
+ else if ( c & 0x80 ) /* HACK: ignore utf-8 extended characters */
1065
+ continue;
1067
1066
  else if ( isspace(c) || strchr("'\"()[]{}<>`", c) || c == MKD_EOLN )
1068
1067
  break;
1069
1068
  }
@@ -1208,6 +1207,29 @@ smartypants(int c, int *flags, MMIOT *f)
1208
1207
  } /* smartypants */
1209
1208
 
1210
1209
 
1210
+ #if WITH_LATEX
1211
+ /* process latex with arbitrary 2-character ( $$ .. $$, \[ .. \], \( .. \)
1212
+ * delimiters
1213
+ */
1214
+ static int
1215
+ mathhandler(MMIOT *f, int e1, int e2)
1216
+ {
1217
+ int i = 0;
1218
+
1219
+ while(peek(f, ++i) != EOF) {
1220
+ if (peek(f, i) == e1 && peek(f, i+1) == e2) {
1221
+ cputc(peek(f,-1), f);
1222
+ cputc(peek(f, 0), f);
1223
+ while ( i-- > -1 )
1224
+ cputc(pull(f), f);
1225
+ return 1;
1226
+ }
1227
+ }
1228
+ return 0;
1229
+ }
1230
+ #endif
1231
+
1232
+
1211
1233
  /* process a body of text encased in some sort of tick marks. If it
1212
1234
  * works, generate the output and return 1, otherwise just return 0 and
1213
1235
  * let the caller figure it out.
@@ -1283,6 +1305,7 @@ text(MMIOT *f)
1283
1305
  else
1284
1306
  Qchar(c, f);
1285
1307
  break;
1308
+
1286
1309
  case '[': if ( tag_text(f) || !linkylinky(0, f) )
1287
1310
  Qchar(c, f);
1288
1311
  break;
@@ -1386,7 +1409,14 @@ text(MMIOT *f)
1386
1409
 
1387
1410
  case EOF: Qchar('\\', f);
1388
1411
  break;
1389
-
1412
+
1413
+ #if WITH_LATEX
1414
+ case '[':
1415
+ case '(': if ( mathhandler(f, '\\', (c =='(')?')':']') )
1416
+ break;
1417
+ /* else fall through to default */
1418
+ #endif
1419
+
1390
1420
  default: if ( escaped(f,c) ||
1391
1421
  strchr(">#.-+{}]![*_\\()`", c) )
1392
1422
  Qchar(c, f);
@@ -1412,6 +1442,16 @@ text(MMIOT *f)
1412
1442
  Qchar(c, f);
1413
1443
  break;
1414
1444
 
1445
+ #if WITH_LATEX
1446
+ case '$': if ( peek(f, 1) == '$' ) {
1447
+ pull(f);
1448
+ if ( mathhandler(f, '$', '$') )
1449
+ break;
1450
+ Qchar('$', f);
1451
+ }
1452
+ /* fall through to default */
1453
+ #endif
1454
+
1415
1455
  default: Qchar(c, f);
1416
1456
  break;
1417
1457
  }
@@ -1426,26 +1466,26 @@ text(MMIOT *f)
1426
1466
  static void
1427
1467
  printheader(Paragraph *pp, MMIOT *f)
1428
1468
  {
1429
- #if WITH_ID_ANCHOR
1430
- Qprintf(f, "<h%d", pp->hnumber);
1431
- if ( f->flags & MKD_TOC ) {
1432
- Qstring(" id=\"", f);
1433
- mkd_string_to_anchor(T(pp->text->text),
1434
- S(pp->text->text),
1435
- (mkd_sta_function_t)Qchar, f, 1);
1436
- Qchar('"', f);
1437
- }
1438
- Qchar('>', f);
1439
- #else
1440
- if ( f->flags & MKD_TOC ) {
1441
- Qstring("<a name=\"", f);
1442
- mkd_string_to_anchor(T(pp->text->text),
1443
- S(pp->text->text),
1444
- (mkd_sta_function_t)Qchar, f, 1);
1445
- Qstring("\"></a>\n", f);
1469
+ if ( f->flags & MKD_IDANCHOR ) {
1470
+ Qprintf(f, "<h%d", pp->hnumber);
1471
+ if ( f->flags & MKD_TOC ) {
1472
+ Qstring(" id=\"", f);
1473
+ mkd_string_to_anchor(T(pp->text->text),
1474
+ S(pp->text->text),
1475
+ (mkd_sta_function_t)Qchar, f, 1, f->flags);
1476
+ Qchar('"', f);
1477
+ }
1478
+ Qchar('>', f);
1479
+ } else {
1480
+ if ( f->flags & MKD_TOC ) {
1481
+ Qstring("<a name=\"", f);
1482
+ mkd_string_to_anchor(T(pp->text->text),
1483
+ S(pp->text->text),
1484
+ (mkd_sta_function_t)Qchar, f, 1, f->flags);
1485
+ Qstring("\"></a>\n", f);
1486
+ }
1487
+ Qprintf(f, "<h%d>", pp->hnumber);
1446
1488
  }
1447
- Qprintf(f, "<h%d>", pp->hnumber);
1448
- #endif
1449
1489
  push(T(pp->text->text), S(pp->text->text), f);
1450
1490
  text(f);
1451
1491
  Qprintf(f, "</h%d>", pp->hnumber);
@@ -1812,15 +1852,19 @@ mkd_document(Document *p, char **res)
1812
1852
  if ( p->ctx->flags & MKD_EXTRA_FOOTNOTE )
1813
1853
  mkd_extra_footnotes(p->ctx);
1814
1854
  p->html = 1;
1815
- }
1816
-
1817
- size = S(p->ctx->out);
1855
+ size = S(p->ctx->out);
1818
1856
 
1819
- if ( (size == 0) || T(p->ctx->out)[size-1] )
1820
- EXPAND(p->ctx->out) = 0;
1857
+ if ( (size == 0) || T(p->ctx->out)[size-1] ) {
1858
+ /* Add a null byte at the end of the generated html,
1859
+ * but pretend it doesn't exist.
1860
+ */
1861
+ EXPAND(p->ctx->out) = 0;
1862
+ --S(p->ctx->out);
1863
+ }
1864
+ }
1821
1865
 
1822
1866
  *res = T(p->ctx->out);
1823
- return size;
1867
+ return S(p->ctx->out);
1824
1868
  }
1825
1869
  return EOF;
1826
1870
  }
@@ -178,20 +178,16 @@ splitline(Line *t, int cutpoint)
178
178
 
179
179
  #define UNCHECK(l) ((l)->flags &= ~CHECKED)
180
180
 
181
- #ifdef WITH_FENCED_CODE
182
- # define UNLESS_FENCED(t) if (fenced) { \
181
+ #define UNLESS_FENCED(t) if (fenced) { \
183
182
  other = 1; l->count += (c == ' ' ? 0 : -1); \
184
183
  } else { t; }
185
- #else
186
- # define UNLESS_FENCED(t) t;
187
- #endif
188
184
 
189
185
  /*
190
186
  * walk a line, seeing if it's any of half a dozen interesting regular
191
187
  * types.
192
188
  */
193
189
  static void
194
- checkline(Line *l)
190
+ checkline(Line *l, DWORD flags)
195
191
  {
196
192
  int eol, i;
197
193
  int dashes = 0, spaces = 0,
@@ -210,6 +206,7 @@ checkline(Line *l)
210
206
 
211
207
  for (i=l->dle; i<eol; i++) {
212
208
  register int c = T(l->text)[i];
209
+ int is_fence_char = 0;
213
210
 
214
211
  if ( c != ' ' ) l->count++;
215
212
 
@@ -219,14 +216,20 @@ checkline(Line *l)
219
216
  case '=': equals = 1; break;
220
217
  case '_': UNLESS_FENCED(underscores = 1); break;
221
218
  case '*': stars = 1; break;
222
- #if WITH_FENCED_CODE
223
- case '~': if (other) return; fenced = 1; tildes = 1; break;
224
- case '`': if (other) return; fenced = 1; backticks = 1; break;
225
- #endif
226
219
  default:
227
- other = 1;
228
- l->count--;
229
- if (!fenced) return;
220
+ if (flags & MKD_FENCEDCODE) {
221
+ switch (c) {
222
+ case '~': if (other) return; is_fence_char = 1; tildes = 1; break;
223
+ case '`': if (other) return; is_fence_char = 1; backticks = 1; break;
224
+ }
225
+ if (is_fence_char) {
226
+ fenced = 1;
227
+ break;
228
+ }
229
+ }
230
+ other = 1;
231
+ l->count--;
232
+ if (!fenced) return;
230
233
  }
231
234
  }
232
235
 
@@ -242,28 +245,32 @@ checkline(Line *l)
242
245
  if ( stars || underscores ) { l->kind = chk_hr; }
243
246
  else if ( dashes ) { l->kind = chk_dash; }
244
247
  else if ( equals ) { l->kind = chk_equal; }
245
- #if WITH_FENCED_CODE
246
248
  else if ( tildes ) { l->kind = chk_tilde; }
247
249
  else if ( backticks ) { l->kind = chk_backtick; }
248
- #endif
249
250
  }
250
251
 
251
252
 
252
253
 
254
+ /* markdown only does special handling of comments if the comment end
255
+ * is at the end of a line
256
+ */
253
257
  static Line *
254
258
  commentblock(Paragraph *p, int *unclosed)
255
259
  {
256
260
  Line *t, *ret;
257
261
  char *end;
258
262
 
259
- for ( t = p->text; t ; t = t->next) {
260
- if ( end = strstr(T(t->text), "-->") ) {
261
- splitline(t, 3 + (end - T(t->text)) );
262
- ret = t->next;
263
- t->next = 0;
264
- return ret;
265
- }
263
+ for ( t = p->text; t ; t = t->next) {
264
+ if ( end = strstr(T(t->text), "-->") ) {
265
+ if ( nextnonblank(t, 3 + (end - T(t->text))) < S(t->text) )
266
+ continue;
267
+ /*splitline(t, 3 + (end - T(t->text)) );*/
268
+ ret = t->next;
269
+ t->next = 0;
270
+ return ret;
271
+ }
266
272
  }
273
+
267
274
  *unclosed = 1;
268
275
  return t;
269
276
 
@@ -307,8 +314,8 @@ htmlblock(Paragraph *p, struct kw *tag, int *unclosed)
307
314
  else {
308
315
  if ( closing = (c == '/') ) c = flogetc(&f);
309
316
 
310
- for ( i=0; i < tag->size; c=flogetc(&f) ) {
311
- if ( tag->id[i++] != toupper(c) )
317
+ for ( i=0; i < tag->size; i++, c=flogetc(&f) ) {
318
+ if ( tag->id[i] != toupper(c) )
312
319
  break;
313
320
  }
314
321
 
@@ -372,10 +379,10 @@ iscode(Line *t)
372
379
 
373
380
 
374
381
  static inline int
375
- ishr(Line *t)
382
+ ishr(Line *t, DWORD flags)
376
383
  {
377
384
  if ( ! (t->flags & CHECKED) )
378
- checkline(t);
385
+ checkline(t, flags);
379
386
 
380
387
  if ( t->count > 2 )
381
388
  return t->kind == chk_hr || t->kind == chk_dash || t->kind == chk_equal;
@@ -384,7 +391,7 @@ ishr(Line *t)
384
391
 
385
392
 
386
393
  static int
387
- issetext(Line *t, int *htyp)
394
+ issetext(Line *t, int *htyp, DWORD flags)
388
395
  {
389
396
  Line *n;
390
397
 
@@ -394,7 +401,7 @@ issetext(Line *t, int *htyp)
394
401
 
395
402
  if ( (n = t->next) ) {
396
403
  if ( !(n->flags & CHECKED) )
397
- checkline(n);
404
+ checkline(n, flags);
398
405
 
399
406
  if ( n->kind == chk_dash || n->kind == chk_equal ) {
400
407
  *htyp = SETEXT;
@@ -406,7 +413,7 @@ issetext(Line *t, int *htyp)
406
413
 
407
414
 
408
415
  static int
409
- ishdr(Line *t, int *htyp)
416
+ ishdr(Line *t, int *htyp, DWORD flags)
410
417
  {
411
418
  /* ANY leading `#`'s make this into an ETX header
412
419
  */
@@ -417,27 +424,28 @@ ishdr(Line *t, int *htyp)
417
424
 
418
425
  /* And if not, maybe it's a SETEXT header instead
419
426
  */
420
- return issetext(t, htyp);
427
+ return issetext(t, htyp, flags);
421
428
  }
422
429
 
423
430
 
424
431
  static inline int
425
- end_of_block(Line *t)
432
+ end_of_block(Line *t, DWORD flags)
426
433
  {
427
434
  int dummy;
428
435
 
429
436
  if ( !t )
430
437
  return 0;
431
438
 
432
- return ( (S(t->text) <= t->dle) || ishr(t) || ishdr(t, &dummy) );
439
+ return ( (S(t->text) <= t->dle) || ishr(t, flags) || ishdr(t, &dummy, flags) );
433
440
  }
434
441
 
435
442
 
436
443
  static Line*
437
- is_discount_dt(Line *t, int *clip)
444
+ is_discount_dt(Line *t, int *clip, DWORD flags)
438
445
  {
439
- #if USE_DISCOUNT_DL
440
- if ( t && t->next
446
+ if ( !(flags & MKD_NODLDISCOUNT)
447
+ && t
448
+ && t->next
441
449
  && (S(t->text) > 2)
442
450
  && (t->dle == 0)
443
451
  && (T(t->text)[0] == '=')
@@ -447,9 +455,8 @@ is_discount_dt(Line *t, int *clip)
447
455
  return t;
448
456
  }
449
457
  else
450
- return is_discount_dt(t->next, clip);
458
+ return is_discount_dt(t->next, clip, flags);
451
459
  }
452
- #endif
453
460
  return 0;
454
461
  }
455
462
 
@@ -463,15 +470,15 @@ is_extra_dd(Line *t)
463
470
 
464
471
 
465
472
  static Line*
466
- is_extra_dt(Line *t, int *clip)
473
+ is_extra_dt(Line *t, int *clip, DWORD flags)
467
474
  {
468
- #if USE_EXTRA_DL
469
-
470
- if ( t && t->next && S(t->text) && T(t->text)[0] != '='
475
+ if ( flags & MKD_DLEXTRA
476
+ && t
477
+ && t->next && S(t->text) && T(t->text)[0] != '='
471
478
  && T(t->text)[S(t->text)-1] != '=') {
472
479
  Line *x;
473
480
 
474
- if ( iscode(t) || end_of_block(t) )
481
+ if ( iscode(t) || end_of_block(t, flags) )
475
482
  return 0;
476
483
 
477
484
  if ( (x = skipempty(t->next)) && is_extra_dd(x) ) {
@@ -479,25 +486,24 @@ is_extra_dt(Line *t, int *clip)
479
486
  return t;
480
487
  }
481
488
 
482
- if ( x=is_extra_dt(t->next, clip) )
489
+ if ( x=is_extra_dt(t->next, clip, flags) )
483
490
  return x;
484
491
  }
485
- #endif
486
492
  return 0;
487
493
  }
488
494
 
489
495
 
490
496
  static Line*
491
- isdefinition(Line *t, int *clip, int *kind)
497
+ isdefinition(Line *t, int *clip, int *kind, DWORD flags)
492
498
  {
493
499
  Line *ret;
494
500
 
495
501
  *kind = 1;
496
- if ( ret = is_discount_dt(t,clip) )
502
+ if ( ret = is_discount_dt(t,clip,flags) )
497
503
  return ret;
498
504
 
499
505
  *kind=2;
500
- return is_extra_dt(t,clip);
506
+ return is_extra_dt(t,clip,flags);
501
507
  }
502
508
 
503
509
 
@@ -507,10 +513,10 @@ islist(Line *t, int *clip, DWORD flags, int *list_type)
507
513
  int i, j;
508
514
  char *q;
509
515
 
510
- if ( end_of_block(t) )
516
+ if ( end_of_block(t, flags) )
511
517
  return 0;
512
518
 
513
- if ( !(flags & (MKD_NODLIST|MKD_STRICT)) && isdefinition(t,clip,list_type) )
519
+ if ( !(flags & (MKD_NODLIST|MKD_STRICT)) && isdefinition(t,clip,list_type,flags) )
514
520
  return DL;
515
521
 
516
522
  if ( strchr("*-+", T(t->text)[t->dle]) && isspace(T(t->text)[t->dle+1]) ) {
@@ -615,12 +621,14 @@ codeblock(Paragraph *p)
615
621
  }
616
622
 
617
623
 
618
- #ifdef WITH_FENCED_CODE
619
624
  static int
620
- iscodefence(Line *r, int size, line_type kind)
625
+ iscodefence(Line *r, int size, line_type kind, DWORD flags)
621
626
  {
627
+ if ( !(flags & MKD_FENCEDCODE) )
628
+ return 0;
629
+
622
630
  if ( !(r->flags & CHECKED) )
623
- checkline(r);
631
+ checkline(r, flags);
624
632
 
625
633
  if ( kind )
626
634
  return (r->kind == kind) && (r->count >= size);
@@ -629,7 +637,7 @@ iscodefence(Line *r, int size, line_type kind)
629
637
  }
630
638
 
631
639
  static Paragraph *
632
- fencedcodeblock(ParagraphRoot *d, Line **ptr)
640
+ fencedcodeblock(ParagraphRoot *d, Line **ptr, DWORD flags)
633
641
  {
634
642
  Line *first, *r;
635
643
  Paragraph *ret;
@@ -638,14 +646,14 @@ fencedcodeblock(ParagraphRoot *d, Line **ptr)
638
646
 
639
647
  /* don't allow zero-length code fences
640
648
  */
641
- if ( (first->next == 0) || iscodefence(first->next, first->count, 0) )
649
+ if ( (first->next == 0) || iscodefence(first->next, first->count, 0, flags) )
642
650
  return 0;
643
651
 
644
652
  /* find the closing fence, discard the fences,
645
653
  * return a Paragraph with the contents
646
654
  */
647
655
  for ( r = first; r && r->next; r = r->next )
648
- if ( iscodefence(r->next, first->count, first->kind) ) {
656
+ if ( iscodefence(r->next, first->count, first->kind, flags) ) {
649
657
  (*ptr) = r->next->next;
650
658
  ret = Pp(d, first->next, CODE);
651
659
  if (S(first->text) - first->count > 0) {
@@ -663,7 +671,6 @@ fencedcodeblock(ParagraphRoot *d, Line **ptr)
663
671
  }
664
672
  return 0;
665
673
  }
666
- #endif
667
674
 
668
675
 
669
676
  static int
@@ -689,7 +696,7 @@ endoftextblock(Line *t, int toplevelblock, DWORD flags)
689
696
  {
690
697
  int z;
691
698
 
692
- if ( end_of_block(t) || isquote(t) )
699
+ if ( end_of_block(t, flags) || isquote(t) )
693
700
  return 1;
694
701
 
695
702
  /* HORRIBLE STANDARDS KLUDGES:
@@ -878,9 +885,9 @@ listitem(Paragraph *p, int indent, DWORD flags, linefn check)
878
885
  indent = clip ? clip : 2;
879
886
  }
880
887
 
881
- if ( (q->dle < indent) && (ishr(q) || islist(q,&z,flags,&z)
888
+ if ( (q->dle < indent) && (ishr(q,flags) || islist(q,&z,flags,&z)
882
889
  || (check && (*check)(q)))
883
- && !issetext(q,&z) ) {
890
+ && !issetext(q,&z,flags) ) {
884
891
  q = t->next;
885
892
  t->next = 0;
886
893
  return q;
@@ -902,7 +909,7 @@ definition_block(Paragraph *top, int clip, MMIOT *f, int kind)
902
909
 
903
910
  while (( labels = q )) {
904
911
 
905
- if ( (q = isdefinition(labels, &z, &kind)) == 0 )
912
+ if ( (q = isdefinition(labels, &z, &kind, f->flags)) == 0 )
906
913
  break;
907
914
 
908
915
  if ( (text = skipempty(q->next)) == 0 )
@@ -1254,11 +1261,9 @@ compile(Line *ptr, int toplevel, MMIOT *f)
1254
1261
 
1255
1262
  ptr = codeblock(p);
1256
1263
  }
1257
- #if WITH_FENCED_CODE
1258
- else if ( iscodefence(ptr,3,0) && (p=fencedcodeblock(&d, &ptr)) )
1264
+ else if ( iscodefence(ptr,3,0,f->flags) && (p=fencedcodeblock(&d, &ptr, f->flags)) )
1259
1265
  /* yay, it's already done */ ;
1260
- #endif
1261
- else if ( ishr(ptr) ) {
1266
+ else if ( ishr(ptr, f->flags) ) {
1262
1267
  p = Pp(&d, 0, HR);
1263
1268
  r = ptr;
1264
1269
  ptr = ptr->next;
@@ -1280,7 +1285,7 @@ compile(Line *ptr, int toplevel, MMIOT *f)
1280
1285
  p->down = compile(p->text, 1, f);
1281
1286
  p->text = 0;
1282
1287
  }
1283
- else if ( ishdr(ptr, &hdr_type) ) {
1288
+ else if ( ishdr(ptr, &hdr_type, f->flags) ) {
1284
1289
  p = Pp(&d, ptr, HDR);
1285
1290
  ptr = headerblock(p, hdr_type);
1286
1291
  }
@@ -1321,14 +1326,24 @@ mkd_compile(Document *doc, DWORD flags)
1321
1326
  if ( !doc )
1322
1327
  return 0;
1323
1328
 
1324
- if ( doc->compiled )
1325
- return 1;
1329
+ flags &= USER_FLAGS;
1330
+
1331
+ if ( doc->compiled ) {
1332
+ if ( doc->ctx->flags == flags )
1333
+ return 1;
1334
+ else {
1335
+ if ( doc->code)
1336
+ ___mkd_freeParagraph(doc->code);
1337
+ if ( doc->ctx->footnotes )
1338
+ ___mkd_freefootnotes(doc->ctx);
1339
+ }
1340
+ }
1326
1341
 
1327
1342
  doc->compiled = 1;
1328
1343
  memset(doc->ctx, 0, sizeof(MMIOT) );
1329
1344
  doc->ctx->ref_prefix= doc->ref_prefix;
1330
1345
  doc->ctx->cb = &(doc->cb);
1331
- doc->ctx->flags = flags & USER_FLAGS;
1346
+ doc->ctx->flags = flags;
1332
1347
  CREATE(doc->ctx->in);
1333
1348
  doc->ctx->footnotes = malloc(sizeof doc->ctx->footnotes[0]);
1334
1349
  doc->ctx->footnotes->reference = 0;
@@ -129,8 +129,14 @@ typedef struct mmiot {
129
129
  #define MKD_NODLIST 0x00100000
130
130
  #define MKD_EXTRA_FOOTNOTE 0x00200000
131
131
  #define MKD_NOSTYLE 0x00400000
132
- #define IS_LABEL 0x08000000
133
- #define USER_FLAGS 0x0FFFFFFF
132
+ #define MKD_NODLDISCOUNT 0x00800000
133
+ #define MKD_DLEXTRA 0x01000000
134
+ #define MKD_FENCEDCODE 0x02000000
135
+ #define MKD_IDANCHOR 0x04000000
136
+ #define MKD_GITHUBTAGS 0x08000000
137
+ #define MKD_URLENCODEDANCHOR 0x10000000
138
+ #define IS_LABEL 0x20000000
139
+ #define USER_FLAGS 0x3FFFFFFF
134
140
  #define INPUT_MASK (MKD_NOHEADER|MKD_TABSTOP)
135
141
 
136
142
  Callback_data *cb;
@@ -190,7 +196,7 @@ extern int mkd_generateline(char *, int, FILE*, DWORD);
190
196
  extern void mkd_basename(Document*, char *);
191
197
 
192
198
  typedef int (*mkd_sta_function_t)(const int,const void*);
193
- extern void mkd_string_to_anchor(char*,int, mkd_sta_function_t, void*, int);
199
+ extern void mkd_string_to_anchor(char*,int, mkd_sta_function_t, void*, int, DWORD);
194
200
 
195
201
  extern Document *mkd_in(FILE *, DWORD);
196
202
  extern Document *mkd_string(const char*,int, DWORD);
@@ -224,4 +230,9 @@ extern void __mkd_header_dle(Line *);
224
230
 
225
231
  extern int __mkd_io_strget(struct string_stream *);
226
232
 
233
+ /* utility function to do some operation and exit the current function
234
+ * if it fails
235
+ */
236
+ #define DO_OR_DIE(op) if ( (op) == EOF ) return EOF; else 1
237
+
227
238
  #endif/*_MARKDOWN_D*/
@@ -16,6 +16,7 @@
16
16
 
17
17
  typedef ANCHOR(Line) LineAnchor;
18
18
 
19
+
19
20
  /* create a new blank Document
20
21
  */
21
22
  Document*
@@ -183,15 +184,13 @@ mkd_generatehtml(Document *p, FILE *output)
183
184
  char *doc;
184
185
  int szdoc;
185
186
 
186
- if ( (szdoc = mkd_document(p, &doc)) != EOF ) {
187
- if ( p->ctx->flags & MKD_CDATA )
188
- mkd_generatexml(doc, szdoc, output);
189
- else
190
- fwrite(doc, szdoc, 1, output);
191
- putc('\n', output);
192
- return 0;
193
- }
194
- return -1;
187
+ DO_OR_DIE( szdoc = mkd_document(p,&doc) );
188
+ if ( p->ctx->flags & MKD_CDATA )
189
+ DO_OR_DIE( mkd_generatexml(doc, szdoc, output) );
190
+ else if ( fwrite(doc, szdoc, 1, output) != 1 )
191
+ return EOF;
192
+ DO_OR_DIE( putc('\n', output) );
193
+ return 0;
195
194
  }
196
195
 
197
196
 
@@ -213,37 +212,33 @@ markdown(Document *document, FILE *out, int flags)
213
212
  */
214
213
  void
215
214
  mkd_string_to_anchor(char *s, int len, mkd_sta_function_t outchar,
216
- void *out, int labelformat)
215
+ void *out, int labelformat,
216
+ DWORD flags)
217
217
  {
218
- #if WITH_URLENCODED_ANCHOR
219
218
  static const unsigned char hexchars[] = "0123456789abcdef";
220
- #endif
221
219
  unsigned char c;
222
220
 
223
221
  int i, size;
224
222
  char *line;
225
223
 
226
224
  size = mkd_line(s, len, &line, IS_LABEL);
227
-
228
- #if !WITH_URLENCODED_ANCHOR
229
- if ( labelformat && (size>0) && !isalpha(line[0]) )
225
+
226
+ if ( !(flags & MKD_URLENCODEDANCHOR)
227
+ && labelformat
228
+ && (size>0) && !isalpha(line[0]) )
230
229
  (*outchar)('L',out);
231
- #endif
232
230
  for ( i=0; i < size ; i++ ) {
233
231
  c = line[i];
234
232
  if ( labelformat ) {
235
233
  if ( isalnum(c) || (c == '_') || (c == ':') || (c == '-') || (c == '.' ) )
236
234
  (*outchar)(c, out);
237
- else
238
- #if WITH_URLENCODED_ANCHOR
239
- {
235
+ else if ( flags & MKD_URLENCODEDANCHOR ) {
240
236
  (*outchar)('%', out);
241
237
  (*outchar)(hexchars[c >> 4 & 0xf], out);
242
238
  (*outchar)(hexchars[c & 0xf], out);
243
239
  }
244
- #else
240
+ else
245
241
  (*outchar)('.', out);
246
- #endif
247
242
  }
248
243
  else
249
244
  (*outchar)(c,out);
@@ -302,15 +297,16 @@ int
302
297
  mkd_generateline(char *bfr, int size, FILE *output, DWORD flags)
303
298
  {
304
299
  MMIOT f;
300
+ int status;
305
301
 
306
302
  mkd_parse_line(bfr, size, &f, flags);
307
303
  if ( flags & MKD_CDATA )
308
- mkd_generatexml(T(f.out), S(f.out), output);
304
+ status = mkd_generatexml(T(f.out), S(f.out), output) != EOF;
309
305
  else
310
- fwrite(T(f.out), S(f.out), 1, output);
306
+ status = fwrite(T(f.out), S(f.out), 1, output) == S(f.out);
311
307
 
312
308
  ___mkd_freemmiot(&f, 0);
313
- return 0;
309
+ return status ? 0 : EOF;
314
310
  }
315
311
 
316
312
 
@@ -106,6 +106,13 @@ void mkd_ref_prefix(MMIOT*, char*);
106
106
  #define MKD_NODLIST 0x00100000 /* forbid definition lists */
107
107
  #define MKD_EXTRA_FOOTNOTE 0x00200000 /* enable markdown extra-style footnotes */
108
108
  #define MKD_NOSTYLE 0x00400000 /* don't extract <style> blocks */
109
+ #define MKD_NODLDISCOUNT 0x00800000 /* disable discount-style definition lists */
110
+ #define MKD_DLEXTRA 0x01000000 /* enable extra-style definition lists */
111
+ #define MKD_FENCEDCODE 0x02000000 /* enabled fenced code blocks */
112
+ #define MKD_IDANCHOR 0x04000000 /* use id= anchors for TOC links */
113
+ #define MKD_GITHUBTAGS 0x08000000 /* allow dash and underscore in element names */
114
+ #define MKD_URLENCODEDANCHOR 0x10000000 /* urlencode non-identifier chars instead of replacing with dots */
115
+
109
116
  #define MKD_EMBED MKD_NOLINKS|MKD_NOIMAGE|MKD_TAGTEXT
110
117
 
111
118
  /* special flags for mkd_in() and mkd_string()
@@ -25,7 +25,7 @@ static struct _opt {
25
25
  char *name;
26
26
  char *desc;
27
27
  int off;
28
- int skip;
28
+ int skip; /* this opt is a synonym */
29
29
  int sayenable;
30
30
  mkd_flag_t flag;
31
31
  } opts[] = {
@@ -55,6 +55,12 @@ static struct _opt {
55
55
  { "footnotes", "markdown extra footnotes", 0, 0, 1, MKD_EXTRA_FOOTNOTE },
56
56
  { "footnote", "markdown extra footnotes", 0, 1, 1, MKD_EXTRA_FOOTNOTE },
57
57
  { "style", "extract style blocks", 1, 0, 1, MKD_NOSTYLE },
58
+ { "dldiscount", "discount-style definition lists", 1, 0, 1, MKD_NODLDISCOUNT },
59
+ { "dlextra", "extra-style definition lists", 0, 0, 1, MKD_DLEXTRA },
60
+ { "fencedcode", "fenced code blocks", 0, 0, 1, MKD_FENCEDCODE },
61
+ { "idanchor", "id= anchors in TOC", 0, 0, 1, MKD_IDANCHOR },
62
+ { "githubtags", "permit - and _ in element names", 0, 0, 0, MKD_GITHUBTAGS },
63
+ { "urlencodedanchor", "urlencode special chars in TOC links", 0, 0, 0, MKD_URLENCODEDANCHOR },
58
64
  } ;
59
65
 
60
66
  #define NR(x) (sizeof x / sizeof x[0])
@@ -14,6 +14,9 @@ typedef struct {
14
14
  * The following flags are handled specially:
15
15
  * - MKD_TABSTOP: Always set.
16
16
  * - MKD_NOHEADER: Always set.
17
+ * - MKD_DLEXTRA: Always set. (For compatibility with RDiscount 2.1.8 and earlier.)
18
+ * - MKD_FENCEDCODE: Always set. (For compatibility with RDiscount 2.1.8 and earlier.)
19
+ * - MKD_GITHUBTAGS: Always set. (For compatibility with RDiscount 2.1.8 and earlier.)
17
20
  * - MKD_NOPANTS: Set unless the "smart" accessor returns true.
18
21
  *
19
22
  * See rb_rdiscount__get_flags() for the detailed implementation.
@@ -119,7 +122,7 @@ int rb_rdiscount__get_flags(VALUE ruby_obj)
119
122
  AccessorFlagPair *entry;
120
123
 
121
124
  /* compile flags */
122
- int flags = MKD_TABSTOP | MKD_NOHEADER;
125
+ int flags = MKD_TABSTOP | MKD_NOHEADER | MKD_DLEXTRA | MKD_FENCEDCODE | MKD_GITHUBTAGS;
123
126
 
124
127
  /* The "smart" accessor turns OFF the MKD_NOPANTS flag. */
125
128
  if ( rb_funcall(ruby_obj, rb_intern("smart"), 0) != Qtrue ) {
data/ext/toc.c CHANGED
@@ -62,11 +62,11 @@ mkd_toc(Document *p, char **doc)
62
62
  Csprintf(&res, "%*s<li><a href=\"#", srcp->hnumber, "");
63
63
  mkd_string_to_anchor(T(srcp->text->text),
64
64
  S(srcp->text->text),
65
- (mkd_sta_function_t)Csputc, &res,1);
65
+ (mkd_sta_function_t)Csputc, &res,1,p->ctx->flags);
66
66
  Csprintf(&res, "\">");
67
67
  mkd_string_to_anchor(T(srcp->text->text),
68
68
  S(srcp->text->text),
69
- (mkd_sta_function_t)Csputc, &res,0);
69
+ (mkd_sta_function_t)Csputc, &res,0,p->ctx->flags);
70
70
  Csprintf(&res, "</a>");
71
71
 
72
72
  first = 0;
@@ -7,24 +7,7 @@ char markdown_version[] = VERSION
7
7
  #if USE_AMALLOC
8
8
  " DEBUG"
9
9
  #endif
10
- #if USE_DISCOUNT_DL
11
- # if USE_EXTRA_DL
12
- " DL=BOTH"
13
- # else
14
- " DL=DISCOUNT"
15
- # endif
16
- #elif USE_EXTRA_DL
17
- " DL=EXTRA"
18
- #else
19
- " DL=NONE"
20
- #endif
21
- #if WITH_ID_ANCHOR
22
- " ID-ANCHOR"
23
- #endif
24
- #if WITH_GITHUB_TAGS
25
- " GITHUB-TAGS"
26
- #endif
27
- #if WITH_FENCED_CODE
28
- " FENCED-CODE"
10
+ #if WITH_LATEX
11
+ " LATEX"
29
12
  #endif
30
13
  ;
data/ext/xml.c CHANGED
@@ -47,9 +47,9 @@ mkd_generatexml(char *p, int size, FILE *out)
47
47
  c = *p++;
48
48
 
49
49
  if ( entity = mkd_xmlchar(c) )
50
- fputs(entity, out);
50
+ DO_OR_DIE( fputs(entity, out) );
51
51
  else
52
- fputc(c, out);
52
+ DO_OR_DIE( fputc(c, out) );
53
53
  }
54
54
  return 0;
55
55
  }
@@ -22,27 +22,25 @@ mkd_xhtmlpage(Document *p, int flags, FILE *out)
22
22
  extern char *mkd_doc_title(Document *);
23
23
 
24
24
  if ( mkd_compile(p, flags) ) {
25
- fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
26
- fprintf(out, "<!DOCTYPE html "
27
- " PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\""
28
- " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n");
25
+ DO_OR_DIE( fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
26
+ "<!DOCTYPE html "
27
+ " PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\""
28
+ " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
29
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n") );
29
30
 
30
- fprintf(out, "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n");
31
-
32
- fprintf(out, "<head>\n");
33
- if ( title = mkd_doc_title(p) )
34
- fprintf(out, "<title>%s</title>\n", title);
35
- mkd_generatecss(p, out);
36
- fprintf(out, "</head>\n");
37
-
38
- fprintf(out, "<body>\n");
39
- mkd_generatehtml(p, out);
40
- fprintf(out, "</body>\n");
41
- fprintf(out, "</html>\n");
31
+ DO_OR_DIE( fprintf(out, "<head>\n") );
32
+ if ( title = mkd_doc_title(p) ) {
33
+ DO_OR_DIE( fprintf(out, "<title>%s</title>\n", title) );
34
+ }
35
+ DO_OR_DIE( mkd_generatecss(p, out) );
36
+ DO_OR_DIE( fprintf(out, "</head>\n"
37
+ "<body>\n") );
42
38
 
43
- mkd_cleanup(p);
39
+ DO_OR_DIE( mkd_generatehtml(p, out) );
40
+ DO_OR_DIE( fprintf(out, "</body>\n"
41
+ "</html>\n") );
44
42
 
45
43
  return 0;
46
44
  }
47
- return -1;
45
+ return EOF;
48
46
  }
@@ -24,7 +24,7 @@
24
24
  # end
25
25
  #
26
26
  class RDiscount
27
- VERSION = '2.1.8'
27
+ VERSION = '2.2.0'
28
28
 
29
29
  # Original Markdown formatted text.
30
30
  attr_reader :text
@@ -1,12 +1,12 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'rdiscount'
3
- s.version = '2.1.8'
3
+ s.version = '2.2.0'
4
4
  s.summary = "Fast Implementation of Gruber's Markdown in C"
5
5
  s.date = '2015-02-01'
6
- s.email = 'davidfstr@gmail.com'
6
+ s.email = 'david@dafoster.net'
7
7
  s.homepage = 'http://dafoster.net/projects/rdiscount/'
8
8
  s.authors = ["Ryan Tomayko", "David Loren Parsons", "Andrew White", "David Foster"]
9
- s.license = "BSD"
9
+ s.license = "BSD-3-Clause"
10
10
  # = MANIFEST =
11
11
  s.files = %w[
12
12
  BUILDING
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdiscount
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.8
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Tomayko
@@ -14,7 +14,7 @@ cert_chain: []
14
14
  date: 2015-02-01 00:00:00.000000000 Z
15
15
  dependencies: []
16
16
  description:
17
- email: davidfstr@gmail.com
17
+ email: david@dafoster.net
18
18
  executables:
19
19
  - rdiscount
20
20
  extensions:
@@ -72,7 +72,7 @@ files:
72
72
  - test/rdiscount_test.rb
73
73
  homepage: http://dafoster.net/projects/rdiscount/
74
74
  licenses:
75
- - BSD
75
+ - BSD-3-Clause
76
76
  metadata: {}
77
77
  post_install_message:
78
78
  rdoc_options: []
@@ -90,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
90
  version: '0'
91
91
  requirements: []
92
92
  rubyforge_project: wink
93
- rubygems_version: 2.2.2
93
+ rubygems_version: 2.5.1
94
94
  signing_key:
95
95
  specification_version: 4
96
96
  summary: Fast Implementation of Gruber's Markdown in C