rdiscount 2.1.7 → 2.2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/BUILDING +13 -6
- data/README.markdown +2 -1
- data/Rakefile +4 -2
- data/ext/VERSION +1 -1
- data/ext/amalloc.c +29 -5
- data/ext/config.h +0 -10
- data/ext/css.c +5 -3
- data/ext/dumptree.c +0 -1
- data/ext/emmatch.c +1 -1
- data/ext/extconf.rb +13 -1
- data/ext/flags.c +6 -0
- data/ext/generate.c +109 -47
- data/ext/markdown.c +96 -69
- data/ext/markdown.h +24 -5
- data/ext/mkdio.c +24 -15
- data/ext/mkdio.h +7 -0
- data/ext/pgm_options.c +9 -1
- data/ext/rdiscount.c +25 -22
- data/ext/resource.c +4 -4
- data/ext/toc.c +2 -2
- data/ext/version.c +2 -19
- data/ext/xml.c +2 -2
- data/ext/xmlpage.c +16 -18
- data/lib/rdiscount.rb +1 -1
- data/rdiscount.gemspec +4 -3
- data/test/rdiscount_test.rb +32 -1
- metadata +14 -17
data/ext/markdown.c
CHANGED
@@ -177,6 +177,7 @@ splitline(Line *t, int cutpoint)
|
|
177
177
|
}
|
178
178
|
|
179
179
|
#define UNCHECK(l) ((l)->flags &= ~CHECKED)
|
180
|
+
|
180
181
|
#define UNLESS_FENCED(t) if (fenced) { \
|
181
182
|
other = 1; l->count += (c == ' ' ? 0 : -1); \
|
182
183
|
} else { t; }
|
@@ -186,7 +187,7 @@ splitline(Line *t, int cutpoint)
|
|
186
187
|
* types.
|
187
188
|
*/
|
188
189
|
static void
|
189
|
-
checkline(Line *l)
|
190
|
+
checkline(Line *l, DWORD flags)
|
190
191
|
{
|
191
192
|
int eol, i;
|
192
193
|
int dashes = 0, spaces = 0,
|
@@ -205,6 +206,7 @@ checkline(Line *l)
|
|
205
206
|
|
206
207
|
for (i=l->dle; i<eol; i++) {
|
207
208
|
register int c = T(l->text)[i];
|
209
|
+
int is_fence_char = 0;
|
208
210
|
|
209
211
|
if ( c != ' ' ) l->count++;
|
210
212
|
|
@@ -214,14 +216,20 @@ checkline(Line *l)
|
|
214
216
|
case '=': equals = 1; break;
|
215
217
|
case '_': UNLESS_FENCED(underscores = 1); break;
|
216
218
|
case '*': stars = 1; break;
|
217
|
-
#if WITH_FENCED_CODE
|
218
|
-
case '~': if (other) return; fenced = 1; tildes = 1; break;
|
219
|
-
case '`': if (other) return; fenced = 1; backticks = 1; break;
|
220
|
-
#endif
|
221
219
|
default:
|
222
|
-
|
223
|
-
|
224
|
-
|
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;
|
225
233
|
}
|
226
234
|
}
|
227
235
|
|
@@ -237,28 +245,32 @@ checkline(Line *l)
|
|
237
245
|
if ( stars || underscores ) { l->kind = chk_hr; }
|
238
246
|
else if ( dashes ) { l->kind = chk_dash; }
|
239
247
|
else if ( equals ) { l->kind = chk_equal; }
|
240
|
-
#if WITH_FENCED_CODE
|
241
248
|
else if ( tildes ) { l->kind = chk_tilde; }
|
242
249
|
else if ( backticks ) { l->kind = chk_backtick; }
|
243
|
-
#endif
|
244
250
|
}
|
245
251
|
|
246
252
|
|
247
253
|
|
254
|
+
/* markdown only does special handling of comments if the comment end
|
255
|
+
* is at the end of a line
|
256
|
+
*/
|
248
257
|
static Line *
|
249
258
|
commentblock(Paragraph *p, int *unclosed)
|
250
259
|
{
|
251
260
|
Line *t, *ret;
|
252
261
|
char *end;
|
253
262
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
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
|
+
}
|
261
272
|
}
|
273
|
+
|
262
274
|
*unclosed = 1;
|
263
275
|
return t;
|
264
276
|
|
@@ -302,8 +314,8 @@ htmlblock(Paragraph *p, struct kw *tag, int *unclosed)
|
|
302
314
|
else {
|
303
315
|
if ( closing = (c == '/') ) c = flogetc(&f);
|
304
316
|
|
305
|
-
for ( i=0; i < tag->size; c=flogetc(&f) ) {
|
306
|
-
if ( tag->id[i
|
317
|
+
for ( i=0; i < tag->size; i++, c=flogetc(&f) ) {
|
318
|
+
if ( tag->id[i] != toupper(c) )
|
307
319
|
break;
|
308
320
|
}
|
309
321
|
|
@@ -367,10 +379,10 @@ iscode(Line *t)
|
|
367
379
|
|
368
380
|
|
369
381
|
static inline int
|
370
|
-
ishr(Line *t)
|
382
|
+
ishr(Line *t, DWORD flags)
|
371
383
|
{
|
372
384
|
if ( ! (t->flags & CHECKED) )
|
373
|
-
checkline(t);
|
385
|
+
checkline(t, flags);
|
374
386
|
|
375
387
|
if ( t->count > 2 )
|
376
388
|
return t->kind == chk_hr || t->kind == chk_dash || t->kind == chk_equal;
|
@@ -379,7 +391,7 @@ ishr(Line *t)
|
|
379
391
|
|
380
392
|
|
381
393
|
static int
|
382
|
-
issetext(Line *t, int *htyp)
|
394
|
+
issetext(Line *t, int *htyp, DWORD flags)
|
383
395
|
{
|
384
396
|
Line *n;
|
385
397
|
|
@@ -389,7 +401,7 @@ issetext(Line *t, int *htyp)
|
|
389
401
|
|
390
402
|
if ( (n = t->next) ) {
|
391
403
|
if ( !(n->flags & CHECKED) )
|
392
|
-
checkline(n);
|
404
|
+
checkline(n, flags);
|
393
405
|
|
394
406
|
if ( n->kind == chk_dash || n->kind == chk_equal ) {
|
395
407
|
*htyp = SETEXT;
|
@@ -401,7 +413,7 @@ issetext(Line *t, int *htyp)
|
|
401
413
|
|
402
414
|
|
403
415
|
static int
|
404
|
-
ishdr(Line *t, int *htyp)
|
416
|
+
ishdr(Line *t, int *htyp, DWORD flags)
|
405
417
|
{
|
406
418
|
/* ANY leading `#`'s make this into an ETX header
|
407
419
|
*/
|
@@ -412,27 +424,28 @@ ishdr(Line *t, int *htyp)
|
|
412
424
|
|
413
425
|
/* And if not, maybe it's a SETEXT header instead
|
414
426
|
*/
|
415
|
-
return issetext(t, htyp);
|
427
|
+
return issetext(t, htyp, flags);
|
416
428
|
}
|
417
429
|
|
418
430
|
|
419
431
|
static inline int
|
420
|
-
end_of_block(Line *t)
|
432
|
+
end_of_block(Line *t, DWORD flags)
|
421
433
|
{
|
422
434
|
int dummy;
|
423
435
|
|
424
436
|
if ( !t )
|
425
437
|
return 0;
|
426
438
|
|
427
|
-
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) );
|
428
440
|
}
|
429
441
|
|
430
442
|
|
431
443
|
static Line*
|
432
|
-
is_discount_dt(Line *t, int *clip)
|
444
|
+
is_discount_dt(Line *t, int *clip, DWORD flags)
|
433
445
|
{
|
434
|
-
|
435
|
-
|
446
|
+
if ( !(flags & MKD_NODLDISCOUNT)
|
447
|
+
&& t
|
448
|
+
&& t->next
|
436
449
|
&& (S(t->text) > 2)
|
437
450
|
&& (t->dle == 0)
|
438
451
|
&& (T(t->text)[0] == '=')
|
@@ -442,9 +455,8 @@ is_discount_dt(Line *t, int *clip)
|
|
442
455
|
return t;
|
443
456
|
}
|
444
457
|
else
|
445
|
-
return is_discount_dt(t->next, clip);
|
458
|
+
return is_discount_dt(t->next, clip, flags);
|
446
459
|
}
|
447
|
-
#endif
|
448
460
|
return 0;
|
449
461
|
}
|
450
462
|
|
@@ -458,15 +470,15 @@ is_extra_dd(Line *t)
|
|
458
470
|
|
459
471
|
|
460
472
|
static Line*
|
461
|
-
is_extra_dt(Line *t, int *clip)
|
473
|
+
is_extra_dt(Line *t, int *clip, DWORD flags)
|
462
474
|
{
|
463
|
-
|
464
|
-
|
465
|
-
|
475
|
+
if ( flags & MKD_DLEXTRA
|
476
|
+
&& t
|
477
|
+
&& t->next && S(t->text) && T(t->text)[0] != '='
|
466
478
|
&& T(t->text)[S(t->text)-1] != '=') {
|
467
479
|
Line *x;
|
468
480
|
|
469
|
-
if ( iscode(t) || end_of_block(t) )
|
481
|
+
if ( iscode(t) || end_of_block(t, flags) )
|
470
482
|
return 0;
|
471
483
|
|
472
484
|
if ( (x = skipempty(t->next)) && is_extra_dd(x) ) {
|
@@ -474,25 +486,24 @@ is_extra_dt(Line *t, int *clip)
|
|
474
486
|
return t;
|
475
487
|
}
|
476
488
|
|
477
|
-
if ( x=is_extra_dt(t->next, clip) )
|
489
|
+
if ( x=is_extra_dt(t->next, clip, flags) )
|
478
490
|
return x;
|
479
491
|
}
|
480
|
-
#endif
|
481
492
|
return 0;
|
482
493
|
}
|
483
494
|
|
484
495
|
|
485
496
|
static Line*
|
486
|
-
isdefinition(Line *t, int *clip, int *kind)
|
497
|
+
isdefinition(Line *t, int *clip, int *kind, DWORD flags)
|
487
498
|
{
|
488
499
|
Line *ret;
|
489
500
|
|
490
501
|
*kind = 1;
|
491
|
-
if ( ret = is_discount_dt(t,clip) )
|
502
|
+
if ( ret = is_discount_dt(t,clip,flags) )
|
492
503
|
return ret;
|
493
504
|
|
494
505
|
*kind=2;
|
495
|
-
return is_extra_dt(t,clip);
|
506
|
+
return is_extra_dt(t,clip,flags);
|
496
507
|
}
|
497
508
|
|
498
509
|
|
@@ -502,10 +513,10 @@ islist(Line *t, int *clip, DWORD flags, int *list_type)
|
|
502
513
|
int i, j;
|
503
514
|
char *q;
|
504
515
|
|
505
|
-
if ( end_of_block(t) )
|
516
|
+
if ( end_of_block(t, flags) )
|
506
517
|
return 0;
|
507
518
|
|
508
|
-
if ( !(flags & (MKD_NODLIST|MKD_STRICT)) && isdefinition(t,clip,list_type) )
|
519
|
+
if ( !(flags & (MKD_NODLIST|MKD_STRICT)) && isdefinition(t,clip,list_type,flags) )
|
509
520
|
return DL;
|
510
521
|
|
511
522
|
if ( strchr("*-+", T(t->text)[t->dle]) && isspace(T(t->text)[t->dle+1]) ) {
|
@@ -530,8 +541,7 @@ islist(Line *t, int *clip, DWORD flags, int *list_type)
|
|
530
541
|
strtoul(T(t->text)+t->dle, &q, 10);
|
531
542
|
if ( (q > T(t->text)+t->dle) && (q == T(t->text) + (j-1)) ) {
|
532
543
|
j = nextnonblank(t,j);
|
533
|
-
|
534
|
-
*clip = (j > 4) ? 4 : j;
|
544
|
+
*clip = j;
|
535
545
|
*list_type = OL;
|
536
546
|
return AL;
|
537
547
|
}
|
@@ -611,12 +621,14 @@ codeblock(Paragraph *p)
|
|
611
621
|
}
|
612
622
|
|
613
623
|
|
614
|
-
#ifdef WITH_FENCED_CODE
|
615
624
|
static int
|
616
|
-
iscodefence(Line *r, int size, line_type kind)
|
625
|
+
iscodefence(Line *r, int size, line_type kind, DWORD flags)
|
617
626
|
{
|
627
|
+
if ( !(flags & MKD_FENCEDCODE) )
|
628
|
+
return 0;
|
629
|
+
|
618
630
|
if ( !(r->flags & CHECKED) )
|
619
|
-
checkline(r);
|
631
|
+
checkline(r, flags);
|
620
632
|
|
621
633
|
if ( kind )
|
622
634
|
return (r->kind == kind) && (r->count >= size);
|
@@ -625,7 +637,7 @@ iscodefence(Line *r, int size, line_type kind)
|
|
625
637
|
}
|
626
638
|
|
627
639
|
static Paragraph *
|
628
|
-
fencedcodeblock(ParagraphRoot *d, Line **ptr)
|
640
|
+
fencedcodeblock(ParagraphRoot *d, Line **ptr, DWORD flags)
|
629
641
|
{
|
630
642
|
Line *first, *r;
|
631
643
|
Paragraph *ret;
|
@@ -634,14 +646,14 @@ fencedcodeblock(ParagraphRoot *d, Line **ptr)
|
|
634
646
|
|
635
647
|
/* don't allow zero-length code fences
|
636
648
|
*/
|
637
|
-
if ( (first->next == 0) || iscodefence(first->next, first->count, 0) )
|
649
|
+
if ( (first->next == 0) || iscodefence(first->next, first->count, 0, flags) )
|
638
650
|
return 0;
|
639
651
|
|
640
652
|
/* find the closing fence, discard the fences,
|
641
653
|
* return a Paragraph with the contents
|
642
654
|
*/
|
643
655
|
for ( r = first; r && r->next; r = r->next )
|
644
|
-
if ( iscodefence(r->next, first->count, first->kind) ) {
|
656
|
+
if ( iscodefence(r->next, first->count, first->kind, flags) ) {
|
645
657
|
(*ptr) = r->next->next;
|
646
658
|
ret = Pp(d, first->next, CODE);
|
647
659
|
if (S(first->text) - first->count > 0) {
|
@@ -659,7 +671,6 @@ fencedcodeblock(ParagraphRoot *d, Line **ptr)
|
|
659
671
|
}
|
660
672
|
return 0;
|
661
673
|
}
|
662
|
-
#endif
|
663
674
|
|
664
675
|
|
665
676
|
static int
|
@@ -685,7 +696,7 @@ endoftextblock(Line *t, int toplevelblock, DWORD flags)
|
|
685
696
|
{
|
686
697
|
int z;
|
687
698
|
|
688
|
-
if ( end_of_block(t) || isquote(t) )
|
699
|
+
if ( end_of_block(t, flags) || isquote(t) )
|
689
700
|
return 1;
|
690
701
|
|
691
702
|
/* HORRIBLE STANDARDS KLUDGES:
|
@@ -847,6 +858,12 @@ listitem(Paragraph *p, int indent, DWORD flags, linefn check)
|
|
847
858
|
UNCHECK(t);
|
848
859
|
t->dle = mkd_firstnonblank(t);
|
849
860
|
|
861
|
+
/* even though we had to trim a long leader off this item,
|
862
|
+
* the indent for trailing paragraphs is still 4...
|
863
|
+
*/
|
864
|
+
if (indent > 4) {
|
865
|
+
indent = 4;
|
866
|
+
}
|
850
867
|
if ( (q = skipempty(t->next)) == 0 ) {
|
851
868
|
___mkd_freeLineRange(t,q);
|
852
869
|
return 0;
|
@@ -868,9 +885,9 @@ listitem(Paragraph *p, int indent, DWORD flags, linefn check)
|
|
868
885
|
indent = clip ? clip : 2;
|
869
886
|
}
|
870
887
|
|
871
|
-
if ( (q->dle < indent) && (ishr(q) || islist(q,&z,flags,&z)
|
888
|
+
if ( (q->dle < indent) && (ishr(q,flags) || islist(q,&z,flags,&z)
|
872
889
|
|| (check && (*check)(q)))
|
873
|
-
&& !issetext(q,&z) ) {
|
890
|
+
&& !issetext(q,&z,flags) ) {
|
874
891
|
q = t->next;
|
875
892
|
t->next = 0;
|
876
893
|
return q;
|
@@ -892,7 +909,7 @@ definition_block(Paragraph *top, int clip, MMIOT *f, int kind)
|
|
892
909
|
|
893
910
|
while (( labels = q )) {
|
894
911
|
|
895
|
-
if ( (q = isdefinition(labels, &z, &kind)) == 0 )
|
912
|
+
if ( (q = isdefinition(labels, &z, &kind, f->flags)) == 0 )
|
896
913
|
break;
|
897
914
|
|
898
915
|
if ( (text = skipempty(q->next)) == 0 )
|
@@ -998,7 +1015,7 @@ addfootnote(Line *p, MMIOT* f)
|
|
998
1015
|
int c;
|
999
1016
|
Line *np = p->next;
|
1000
1017
|
|
1001
|
-
Footnote *foot = &EXPAND(
|
1018
|
+
Footnote *foot = &EXPAND(f->footnotes->note);
|
1002
1019
|
|
1003
1020
|
CREATE(foot->tag);
|
1004
1021
|
CREATE(foot->link);
|
@@ -1013,6 +1030,7 @@ addfootnote(Line *p, MMIOT* f)
|
|
1013
1030
|
j = nextnonblank(p, j+2);
|
1014
1031
|
|
1015
1032
|
if ( (f->flags & MKD_EXTRA_FOOTNOTE) && (T(foot->tag)[0] == '^') ) {
|
1033
|
+
/* need to consume all lines until non-indented block? */
|
1016
1034
|
while ( j < S(p->text) )
|
1017
1035
|
EXPAND(foot->title) = T(p->text)[j++];
|
1018
1036
|
goto skip_to_end;
|
@@ -1243,11 +1261,9 @@ compile(Line *ptr, int toplevel, MMIOT *f)
|
|
1243
1261
|
|
1244
1262
|
ptr = codeblock(p);
|
1245
1263
|
}
|
1246
|
-
|
1247
|
-
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)) )
|
1248
1265
|
/* yay, it's already done */ ;
|
1249
|
-
|
1250
|
-
else if ( ishr(ptr) ) {
|
1266
|
+
else if ( ishr(ptr, f->flags) ) {
|
1251
1267
|
p = Pp(&d, 0, HR);
|
1252
1268
|
r = ptr;
|
1253
1269
|
ptr = ptr->next;
|
@@ -1269,7 +1285,7 @@ compile(Line *ptr, int toplevel, MMIOT *f)
|
|
1269
1285
|
p->down = compile(p->text, 1, f);
|
1270
1286
|
p->text = 0;
|
1271
1287
|
}
|
1272
|
-
else if ( ishdr(ptr, &hdr_type) ) {
|
1288
|
+
else if ( ishdr(ptr, &hdr_type, f->flags) ) {
|
1273
1289
|
p = Pp(&d, ptr, HDR);
|
1274
1290
|
ptr = headerblock(p, hdr_type);
|
1275
1291
|
}
|
@@ -1310,23 +1326,34 @@ mkd_compile(Document *doc, DWORD flags)
|
|
1310
1326
|
if ( !doc )
|
1311
1327
|
return 0;
|
1312
1328
|
|
1313
|
-
|
1314
|
-
|
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
|
+
}
|
1315
1341
|
|
1316
1342
|
doc->compiled = 1;
|
1317
1343
|
memset(doc->ctx, 0, sizeof(MMIOT) );
|
1318
1344
|
doc->ctx->ref_prefix= doc->ref_prefix;
|
1319
1345
|
doc->ctx->cb = &(doc->cb);
|
1320
|
-
doc->ctx->flags = flags
|
1346
|
+
doc->ctx->flags = flags;
|
1321
1347
|
CREATE(doc->ctx->in);
|
1322
1348
|
doc->ctx->footnotes = malloc(sizeof doc->ctx->footnotes[0]);
|
1323
|
-
|
1349
|
+
doc->ctx->footnotes->reference = 0;
|
1350
|
+
CREATE(doc->ctx->footnotes->note);
|
1324
1351
|
|
1325
1352
|
mkd_initialize();
|
1326
1353
|
|
1327
1354
|
doc->code = compile_document(T(doc->content), doc->ctx);
|
1328
|
-
qsort(T(
|
1329
|
-
sizeof T(
|
1355
|
+
qsort(T(doc->ctx->footnotes->note), S(doc->ctx->footnotes->note),
|
1356
|
+
sizeof T(doc->ctx->footnotes->note)[0],
|
1330
1357
|
(stfu)__mkd_footsort);
|
1331
1358
|
memset(&doc->content, 0, sizeof doc->content);
|
1332
1359
|
return 1;
|
data/ext/markdown.h
CHANGED
@@ -88,6 +88,12 @@ struct escaped {
|
|
88
88
|
} ;
|
89
89
|
|
90
90
|
|
91
|
+
struct footnote_list {
|
92
|
+
int reference;
|
93
|
+
STRING(Footnote) note;
|
94
|
+
} ;
|
95
|
+
|
96
|
+
|
91
97
|
/* a magic markdown io thing holds all the data structures needed to
|
92
98
|
* do the backend processing of a markdown document
|
93
99
|
*/
|
@@ -96,10 +102,9 @@ typedef struct mmiot {
|
|
96
102
|
Cstring in;
|
97
103
|
Qblock Q;
|
98
104
|
int isp;
|
99
|
-
int reference;
|
100
105
|
struct escaped *esc;
|
101
106
|
char *ref_prefix;
|
102
|
-
|
107
|
+
struct footnote_list *footnotes;
|
103
108
|
DWORD flags;
|
104
109
|
#define MKD_NOLINKS 0x00000001
|
105
110
|
#define MKD_NOIMAGE 0x00000002
|
@@ -124,14 +129,23 @@ typedef struct mmiot {
|
|
124
129
|
#define MKD_NODLIST 0x00100000
|
125
130
|
#define MKD_EXTRA_FOOTNOTE 0x00200000
|
126
131
|
#define MKD_NOSTYLE 0x00400000
|
127
|
-
#define
|
128
|
-
#define
|
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
|
129
140
|
#define INPUT_MASK (MKD_NOHEADER|MKD_TABSTOP)
|
130
141
|
|
131
142
|
Callback_data *cb;
|
132
143
|
} MMIOT;
|
133
144
|
|
134
145
|
|
146
|
+
#define MKD_EOLN 3
|
147
|
+
|
148
|
+
|
135
149
|
/*
|
136
150
|
* the mkdio text input functions return a document structure,
|
137
151
|
* which contains a header (retrieved from the document if
|
@@ -182,7 +196,7 @@ extern int mkd_generateline(char *, int, FILE*, DWORD);
|
|
182
196
|
extern void mkd_basename(Document*, char *);
|
183
197
|
|
184
198
|
typedef int (*mkd_sta_function_t)(const int,const void*);
|
185
|
-
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);
|
186
200
|
|
187
201
|
extern Document *mkd_in(FILE *, DWORD);
|
188
202
|
extern Document *mkd_string(const char*,int, DWORD);
|
@@ -216,4 +230,9 @@ extern void __mkd_header_dle(Line *);
|
|
216
230
|
|
217
231
|
extern int __mkd_io_strget(struct string_stream *);
|
218
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
|
+
|
219
238
|
#endif/*_MARKDOWN_D*/
|