rdiscount 2.1.8 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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