bluecloth 2.0.11-x86-mingw32 → 2.1.0-x86-mingw32
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.
- data.tar.gz.sig +1 -2
- data/Rakefile +0 -2
- data/ext/VERSION +1 -1
- data/ext/bluecloth.c +5 -2
- data/ext/config.h +2 -0
- data/ext/extconf.rb +0 -1
- data/ext/generate.c +110 -5
- data/ext/markdown.c +31 -13
- data/ext/markdown.h +17 -3
- data/ext/mkdio.c +18 -5
- data/ext/mkdio.h +10 -2
- data/ext/version.c +16 -17
- data/lib/1.8/bluecloth_ext.so +0 -0
- data/lib/1.9/bluecloth_ext.so +0 -0
- data/lib/bluecloth.rb +41 -26
- data/spec/bluecloth/entities_spec.rb +20 -2
- data/spec/bluecloth_spec.rb +1 -1
- data/spec/contributions_spec.rb +8 -15
- data/spec/discount_spec.rb +202 -0
- metadata +6 -7
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
�Ͼи+�$:�3㡇G<V�P�t9�
|
1
|
+
Vr��Xew��g����\K�Q���g�c�,���rV/���/sU��`�gjb168?�V������r���e�EG"�v�@�^�zza}Q��֔�.�D%��+�L�H���W�$����
|
data/Rakefile
CHANGED
@@ -52,8 +52,6 @@ hoespec = Hoe.spec 'bluecloth' do
|
|
52
52
|
self.require_ruby_version( '>=1.8.7' )
|
53
53
|
|
54
54
|
self.hg_sign_tags = true if self.respond_to?( :hg_sign_tags= )
|
55
|
-
self.yard_opts = [ '--protected', '--verbose' ] if self.respond_to?( :yard_opts= )
|
56
|
-
|
57
55
|
self.rdoc_locations << "deveiate:/usr/local/www/public/code/#{remote_rdoc_dir}"
|
58
56
|
end
|
59
57
|
|
data/ext/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.8
|
data/ext/bluecloth.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* BlueCloth -- a Ruby implementation of Markdown
|
3
|
-
* $Id: bluecloth.c,v
|
3
|
+
* $Id: bluecloth.c,v 463bb88e4d08 2011/03/12 17:58:01 ged $
|
4
4
|
*
|
5
5
|
* = Authors
|
6
6
|
*
|
@@ -333,7 +333,7 @@ void Init_bluecloth_ext( void ) {
|
|
333
333
|
mkd_initialize();
|
334
334
|
|
335
335
|
rb_define_alloc_func( bluecloth_cBlueCloth, bluecloth_s_allocate );
|
336
|
-
rb_define_singleton_method( bluecloth_cBlueCloth, "discount_version",
|
336
|
+
rb_define_singleton_method( bluecloth_cBlueCloth, "discount_version",
|
337
337
|
bluecloth_s_discount_version, 0 );
|
338
338
|
|
339
339
|
rb_define_method( bluecloth_cBlueCloth, "initialize", bluecloth_initialize, -1 );
|
@@ -417,6 +417,9 @@ void Init_bluecloth_ext( void ) {
|
|
417
417
|
/* Forbid definition lists */
|
418
418
|
rb_define_const( bluecloth_cBlueCloth, "MKD_NODLIST", INT2FIX(MKD_NODLIST) );
|
419
419
|
|
420
|
+
/* Markdown-extra Footnotes */
|
421
|
+
rb_define_const( bluecloth_cBlueCloth, "MKD_EXTRA_FOOTNOTE", INT2FIX(MKD_EXTRA_FOOTNOTE) );
|
422
|
+
|
420
423
|
|
421
424
|
/* Make sure the Ruby side is loaded */
|
422
425
|
rb_require( "bluecloth" );
|
data/ext/config.h
CHANGED
data/ext/extconf.rb
CHANGED
data/ext/generate.c
CHANGED
@@ -191,6 +191,7 @@ ___mkd_reparse(char *bfr, int size, int flags, MMIOT *f)
|
|
191
191
|
|
192
192
|
sub.flags = f->flags | flags;
|
193
193
|
sub.cb = f->cb;
|
194
|
+
sub.ref_prefix = f->ref_prefix;
|
194
195
|
|
195
196
|
push(bfr, size, &sub);
|
196
197
|
EXPAND(sub.in) = 0;
|
@@ -564,6 +565,38 @@ printlinkyref(MMIOT *f, linkytype *tag, char *link, int size)
|
|
564
565
|
} /* printlinkyref */
|
565
566
|
|
566
567
|
|
568
|
+
/* helper function for php markdown extra footnotes; allow the user to
|
569
|
+
* define a prefix tag instead of just `fn`
|
570
|
+
*/
|
571
|
+
static char *
|
572
|
+
p_or_nothing(p)
|
573
|
+
MMIOT *p;
|
574
|
+
{
|
575
|
+
return p->ref_prefix ? p->ref_prefix : "fn";
|
576
|
+
}
|
577
|
+
|
578
|
+
|
579
|
+
/* php markdown extra/daring fireball style print footnotes
|
580
|
+
*/
|
581
|
+
static int
|
582
|
+
extra_linky(MMIOT *f, Cstring text, Footnote *ref)
|
583
|
+
{
|
584
|
+
if ( ref->flags & REFERENCED )
|
585
|
+
return 0;
|
586
|
+
|
587
|
+
if ( f->flags & IS_LABEL )
|
588
|
+
___mkd_reparse(T(text), S(text), linkt.flags, f);
|
589
|
+
else {
|
590
|
+
ref->flags |= REFERENCED;
|
591
|
+
ref->refnumber = ++ f->reference;
|
592
|
+
Qprintf(f, "<sup id=\"%sref:%d\"><a href=\"#%s:%d\" rel=\"footnote\">%d</a></sup>",
|
593
|
+
p_or_nothing(f), ref->refnumber,
|
594
|
+
p_or_nothing(f), ref->refnumber, ref->refnumber);
|
595
|
+
}
|
596
|
+
return 1;
|
597
|
+
} /* extra_linky */
|
598
|
+
|
599
|
+
|
567
600
|
/* print out a linky (or fail if it's Not Allowed)
|
568
601
|
*/
|
569
602
|
static int
|
@@ -628,6 +661,7 @@ linkylinky(int image, MMIOT *f)
|
|
628
661
|
Footnote key, *ref;
|
629
662
|
|
630
663
|
int status = 0;
|
664
|
+
int extra_footnote = 0;
|
631
665
|
|
632
666
|
CREATE(name);
|
633
667
|
memset(&key, 0, sizeof key);
|
@@ -654,6 +688,9 @@ linkylinky(int image, MMIOT *f)
|
|
654
688
|
*/
|
655
689
|
mmiotseek(f, implicit_mark);
|
656
690
|
goodlink = !(f->flags & MKD_1_COMPAT);
|
691
|
+
|
692
|
+
if ( (f->flags & MKD_EXTRA_FOOTNOTE) && (!image) && S(name) && T(name)[0] == '^' )
|
693
|
+
extra_footnote = 1;
|
657
694
|
}
|
658
695
|
|
659
696
|
if ( goodlink ) {
|
@@ -664,8 +701,12 @@ linkylinky(int image, MMIOT *f)
|
|
664
701
|
}
|
665
702
|
|
666
703
|
if ( ref = bsearch(&key, T(*f->footnotes), S(*f->footnotes),
|
667
|
-
sizeof key, (stfu)__mkd_footsort) )
|
668
|
-
|
704
|
+
sizeof key, (stfu)__mkd_footsort) ) {
|
705
|
+
if ( extra_footnote )
|
706
|
+
status = extra_linky(f,name,ref);
|
707
|
+
else
|
708
|
+
status = linkyformat(f, name, image, ref);
|
709
|
+
}
|
669
710
|
else if ( f->flags & IS_LABEL )
|
670
711
|
status = linkyformat(f, name, image, 0);
|
671
712
|
}
|
@@ -922,7 +963,11 @@ maybe_tag_or_link(MMIOT *f)
|
|
922
963
|
}
|
923
964
|
else if ( isspace(c) )
|
924
965
|
break;
|
966
|
+
#if WITH_GITHUB_TAGS
|
967
|
+
else if ( ! (c == '/' || c == '-' || c == '_' || isalnum(c) ) )
|
968
|
+
#else
|
925
969
|
else if ( ! (c == '/' || isalnum(c) ) )
|
970
|
+
#endif
|
926
971
|
maybetag=0;
|
927
972
|
}
|
928
973
|
|
@@ -1270,6 +1315,15 @@ text(MMIOT *f)
|
|
1270
1315
|
Qchar(c, f);
|
1271
1316
|
break;
|
1272
1317
|
|
1318
|
+
case ':': case '|':
|
1319
|
+
if ( f->flags & MKD_NOTABLES ) {
|
1320
|
+
Qchar('\\', f);
|
1321
|
+
shift(f,-1);
|
1322
|
+
break;
|
1323
|
+
}
|
1324
|
+
Qchar(c, f);
|
1325
|
+
break;
|
1326
|
+
|
1273
1327
|
case '>': case '#': case '.': case '-':
|
1274
1328
|
case '+': case '{': case '}': case ']':
|
1275
1329
|
case '!': case '[': case '*': case '_':
|
@@ -1312,12 +1366,26 @@ text(MMIOT *f)
|
|
1312
1366
|
static void
|
1313
1367
|
printheader(Paragraph *pp, MMIOT *f)
|
1314
1368
|
{
|
1369
|
+
#if WITH_ID_ANCHOR
|
1370
|
+
Qprintf(f, "<h%d", pp->hnumber);
|
1371
|
+
if ( f->flags & MKD_TOC ) {
|
1372
|
+
Qstring(" id=\"", f);
|
1373
|
+
mkd_string_to_anchor(T(pp->text->text),
|
1374
|
+
S(pp->text->text),
|
1375
|
+
(mkd_sta_function_t)Qchar, f, 1);
|
1376
|
+
Qchar('"', f);
|
1377
|
+
}
|
1378
|
+
Qchar('>', f);
|
1379
|
+
#else
|
1315
1380
|
if ( f->flags & MKD_TOC ) {
|
1316
1381
|
Qstring("<a name=\"", f);
|
1317
|
-
mkd_string_to_anchor(T(pp->text->text),
|
1382
|
+
mkd_string_to_anchor(T(pp->text->text),
|
1383
|
+
S(pp->text->text),
|
1384
|
+
(mkd_sta_function_t)Qchar, f, 1);
|
1318
1385
|
Qstring("\"></a>\n", f);
|
1319
1386
|
}
|
1320
1387
|
Qprintf(f, "<h%d>", pp->hnumber);
|
1388
|
+
#endif
|
1321
1389
|
push(T(pp->text->text), S(pp->text->text), f);
|
1322
1390
|
text(f);
|
1323
1391
|
Qprintf(f, "</h%d>", pp->hnumber);
|
@@ -1344,8 +1412,11 @@ splat(Line *p, char *block, Istring align, int force, MMIOT *f)
|
|
1344
1412
|
if ( force && (colno >= S(align)-1) )
|
1345
1413
|
idx = S(p->text);
|
1346
1414
|
else
|
1347
|
-
while ( (idx < S(p->text)) && (T(p->text)[idx] != '|') )
|
1415
|
+
while ( (idx < S(p->text)) && (T(p->text)[idx] != '|') ) {
|
1416
|
+
if ( T(p->text)[idx] == '\\' )
|
1417
|
+
++idx;
|
1348
1418
|
++idx;
|
1419
|
+
}
|
1349
1420
|
|
1350
1421
|
Qprintf(f, "<%s%s>",
|
1351
1422
|
block,
|
@@ -1393,7 +1464,9 @@ printtable(Paragraph *pp, MMIOT *f)
|
|
1393
1464
|
|
1394
1465
|
last=first=0;
|
1395
1466
|
for (end=start ; (end < S(dash->text)) && p[end] != '|'; ++ end ) {
|
1396
|
-
if (
|
1467
|
+
if ( p[end] == '\\' )
|
1468
|
+
++ end;
|
1469
|
+
else if ( !isspace(p[end]) ) {
|
1397
1470
|
if ( !first) first = p[end];
|
1398
1471
|
last = p[end];
|
1399
1472
|
}
|
@@ -1615,6 +1688,36 @@ display(Paragraph *p, MMIOT *f)
|
|
1615
1688
|
}
|
1616
1689
|
|
1617
1690
|
|
1691
|
+
/* dump out a list of footnotes
|
1692
|
+
*/
|
1693
|
+
static void
|
1694
|
+
mkd_extra_footnotes(MMIOT *m)
|
1695
|
+
{
|
1696
|
+
int j, i;
|
1697
|
+
Footnote *t;
|
1698
|
+
|
1699
|
+
if ( m->reference == 0 )
|
1700
|
+
return;
|
1701
|
+
|
1702
|
+
Csprintf(&m->out, "\n<div class=\"footnotes\">\n<hr/>\n<ol>\n");
|
1703
|
+
|
1704
|
+
for ( i=1; i <= m->reference; i++ ) {
|
1705
|
+
for ( j=0; j < S(*m->footnotes); j++ ) {
|
1706
|
+
t = &T(*m->footnotes)[j];
|
1707
|
+
if ( (t->refnumber == i) && (t->flags & REFERENCED) ) {
|
1708
|
+
Csprintf(&m->out, "<li id=\"%s:%d\">\n<p>",
|
1709
|
+
p_or_nothing(m), t->refnumber);
|
1710
|
+
Csreparse(&m->out, T(t->title), S(t->title), 0);
|
1711
|
+
Csprintf(&m->out, "<a href=\"#%sref:%d\" rev=\"footnote\">↩</a>",
|
1712
|
+
p_or_nothing(m), t->refnumber);
|
1713
|
+
Csprintf(&m->out, "</p></li>\n");
|
1714
|
+
}
|
1715
|
+
}
|
1716
|
+
}
|
1717
|
+
Csprintf(&m->out, "</ol>\n</div>\n");
|
1718
|
+
}
|
1719
|
+
|
1720
|
+
|
1618
1721
|
/* return a pointer to the compiled markdown
|
1619
1722
|
* document.
|
1620
1723
|
*/
|
@@ -1626,6 +1729,8 @@ mkd_document(Document *p, char **res)
|
|
1626
1729
|
if ( p && p->compiled ) {
|
1627
1730
|
if ( ! p->html ) {
|
1628
1731
|
htmlify(p->code, 0, 0, p->ctx);
|
1732
|
+
if ( p->ctx->flags & MKD_EXTRA_FOOTNOTE )
|
1733
|
+
mkd_extra_footnotes(p->ctx);
|
1629
1734
|
p->html = 1;
|
1630
1735
|
}
|
1631
1736
|
|
data/ext/markdown.c
CHANGED
@@ -270,25 +270,35 @@ static int
|
|
270
270
|
istable(Line *t)
|
271
271
|
{
|
272
272
|
char *p;
|
273
|
-
Line *dashes
|
274
|
-
int
|
273
|
+
Line *dashes, *body;
|
274
|
+
int l;
|
275
|
+
int dashed = 0;
|
275
276
|
|
276
|
-
/*
|
277
|
-
|
277
|
+
/* three lines, first must contain |,
|
278
|
+
second must be ---|---,
|
279
|
+
third must contain |
|
280
|
+
*/
|
281
|
+
if ( !(t->flags & PIPECHAR) )
|
282
|
+
return 0;
|
283
|
+
|
284
|
+
dashes = t->next;
|
285
|
+
if ( !(dashes && (dashes->flags & PIPECHAR)) )
|
286
|
+
return 0;
|
287
|
+
|
288
|
+
body = dashes->next;
|
289
|
+
if ( !(body && (body->flags & PIPECHAR)) )
|
278
290
|
return 0;
|
279
291
|
|
280
292
|
/* second line must contain - or | and nothing
|
281
293
|
* else except for whitespace or :
|
282
294
|
*/
|
283
|
-
for ( p = T(dashes->text)
|
284
|
-
if ( *p == '
|
285
|
-
|
286
|
-
else if ( *p == '
|
287
|
-
contains |= 0x02;
|
288
|
-
else if ( ! ((*p == ':') || isspace(*p)) )
|
295
|
+
for ( p = T(dashes->text), l = S(dashes->text); l > 0; ++p, --l)
|
296
|
+
if ( *p == '-' )
|
297
|
+
dashed = 1;
|
298
|
+
else if ( ! ((*p == '|') || (*p == ':') || isspace(*p)) )
|
289
299
|
return 0;
|
290
300
|
|
291
|
-
return
|
301
|
+
return dashed;
|
292
302
|
}
|
293
303
|
|
294
304
|
|
@@ -770,7 +780,7 @@ tableblock(Paragraph *p)
|
|
770
780
|
Line *t, *q;
|
771
781
|
|
772
782
|
for ( t = p->text; t && (q = t->next); t = t->next ) {
|
773
|
-
if ( !
|
783
|
+
if ( !(t->flags & PIPECHAR) ) {
|
774
784
|
t->next = 0;
|
775
785
|
return q;
|
776
786
|
}
|
@@ -957,7 +967,7 @@ addfootnote(Line *p, MMIOT* f)
|
|
957
967
|
CREATE(foot->tag);
|
958
968
|
CREATE(foot->link);
|
959
969
|
CREATE(foot->title);
|
960
|
-
foot->height = foot->width = 0;
|
970
|
+
foot->flags = foot->height = foot->width = 0;
|
961
971
|
|
962
972
|
for (j=i=p->dle+1; T(p->text)[j] != ']'; j++)
|
963
973
|
EXPAND(foot->tag) = T(p->text)[j];
|
@@ -966,6 +976,12 @@ addfootnote(Line *p, MMIOT* f)
|
|
966
976
|
S(foot->tag)--;
|
967
977
|
j = nextnonblank(p, j+2);
|
968
978
|
|
979
|
+
if ( (f->flags & MKD_EXTRA_FOOTNOTE) && (T(foot->tag)[0] == '^') ) {
|
980
|
+
while ( j < S(p->text) )
|
981
|
+
EXPAND(foot->title) = T(p->text)[j++];
|
982
|
+
goto skip_to_end;
|
983
|
+
}
|
984
|
+
|
969
985
|
while ( (j < S(p->text)) && !isspace(T(p->text)[j]) )
|
970
986
|
EXPAND(foot->link) = T(p->text)[j++];
|
971
987
|
EXPAND(foot->link) = 0;
|
@@ -1005,6 +1021,7 @@ addfootnote(Line *p, MMIOT* f)
|
|
1005
1021
|
--S(foot->title);
|
1006
1022
|
}
|
1007
1023
|
|
1024
|
+
skip_to_end:
|
1008
1025
|
___mkd_freeLine(p);
|
1009
1026
|
return np;
|
1010
1027
|
}
|
@@ -1201,6 +1218,7 @@ mkd_compile(Document *doc, DWORD flags)
|
|
1201
1218
|
|
1202
1219
|
doc->compiled = 1;
|
1203
1220
|
memset(doc->ctx, 0, sizeof(MMIOT) );
|
1221
|
+
doc->ctx->ref_prefix= doc->ref_prefix;
|
1204
1222
|
doc->ctx->cb = &(doc->cb);
|
1205
1223
|
doc->ctx->flags = flags & USER_FLAGS;
|
1206
1224
|
CREATE(doc->ctx->in);
|
data/ext/markdown.h
CHANGED
@@ -12,6 +12,10 @@ typedef struct footnote {
|
|
12
12
|
Cstring title; /* what it's called (TITLE= attribute) */
|
13
13
|
int height, width; /* dimensions (for image link) */
|
14
14
|
int dealloc; /* deallocation needed? */
|
15
|
+
int refnumber;
|
16
|
+
int flags;
|
17
|
+
#define EXTRA_BOOKMARK 0x01
|
18
|
+
#define REFERENCED 0x02
|
15
19
|
} Footnote;
|
16
20
|
|
17
21
|
/* each input line is read into a Line, which contains the line,
|
@@ -22,7 +26,9 @@ typedef struct footnote {
|
|
22
26
|
typedef struct line {
|
23
27
|
Cstring text;
|
24
28
|
struct line *next;
|
25
|
-
int dle;
|
29
|
+
int dle; /* leading indent on the line */
|
30
|
+
int flags; /* special attributes for this line */
|
31
|
+
#define PIPECHAR 0x01 /* line contains a | */
|
26
32
|
} Line;
|
27
33
|
|
28
34
|
|
@@ -75,6 +81,8 @@ typedef struct mmiot {
|
|
75
81
|
Cstring in;
|
76
82
|
Qblock Q;
|
77
83
|
int isp;
|
84
|
+
int reference;
|
85
|
+
char *ref_prefix;
|
78
86
|
STRING(Footnote) *footnotes;
|
79
87
|
DWORD flags;
|
80
88
|
#define MKD_NOLINKS 0x00000001
|
@@ -98,6 +106,7 @@ typedef struct mmiot {
|
|
98
106
|
#define MKD_NODIVQUOTE 0x00040000
|
99
107
|
#define MKD_NOALPHALIST 0x00080000
|
100
108
|
#define MKD_NODLIST 0x00100000
|
109
|
+
#define MKD_EXTRA_FOOTNOTE 0x00200000
|
101
110
|
#define IS_LABEL 0x08000000
|
102
111
|
#define USER_FLAGS 0x0FFFFFFF
|
103
112
|
#define INPUT_MASK (MKD_NOHEADER|MKD_TABSTOP)
|
@@ -124,6 +133,7 @@ typedef struct document {
|
|
124
133
|
int compiled; /* set after mkd_compile() */
|
125
134
|
int html; /* set after (internal) htmlify() */
|
126
135
|
int tabstop; /* for properly expanding tabs (ick) */
|
136
|
+
char *ref_prefix;
|
127
137
|
MMIOT *ctx; /* backend buffers, flags, and structures */
|
128
138
|
Callback_data cb; /* callback functions & private data */
|
129
139
|
} Document;
|
@@ -143,14 +153,18 @@ extern int mkd_line(char *, int, char **, DWORD);
|
|
143
153
|
extern int mkd_generateline(char *, int, FILE*, DWORD);
|
144
154
|
#define mkd_text mkd_generateline
|
145
155
|
extern void mkd_basename(Document*, char *);
|
146
|
-
|
156
|
+
|
157
|
+
typedef int (*mkd_sta_function_t)(const int,const void*);
|
158
|
+
extern void mkd_string_to_anchor(char*,int, mkd_sta_function_t, void*, int);
|
147
159
|
|
148
160
|
extern Document *mkd_in(FILE *, DWORD);
|
149
|
-
extern Document *mkd_string(char*,int, DWORD);
|
161
|
+
extern Document *mkd_string(const char*,int, DWORD);
|
150
162
|
|
151
163
|
extern void mkd_initialize();
|
152
164
|
extern void mkd_shlib_destructor();
|
153
165
|
|
166
|
+
extern void mkd_ref_prefix(Document*, char*);
|
167
|
+
|
154
168
|
/* internal resource handling functions.
|
155
169
|
*/
|
156
170
|
extern void ___mkd_freeLine(Line *);
|
data/ext/mkdio.c
CHANGED
@@ -34,7 +34,8 @@ new_Document()
|
|
34
34
|
}
|
35
35
|
|
36
36
|
|
37
|
-
/* add a line to the markdown input chain
|
37
|
+
/* add a line to the markdown input chain, expanding tabs and
|
38
|
+
* noting the presence of special characters as we go.
|
38
39
|
*/
|
39
40
|
static void
|
40
41
|
queue(Document* a, Cstring *line)
|
@@ -60,6 +61,8 @@ queue(Document* a, Cstring *line)
|
|
60
61
|
} while ( ++xp % a->tabstop );
|
61
62
|
}
|
62
63
|
else if ( c >= ' ' ) {
|
64
|
+
if ( c == '|' )
|
65
|
+
p->flags |= PIPECHAR;
|
63
66
|
EXPAND(p->text) = c;
|
64
67
|
++xp;
|
65
68
|
}
|
@@ -148,7 +151,7 @@ mkd_in(FILE *f, DWORD flags)
|
|
148
151
|
/* return a single character out of a buffer
|
149
152
|
*/
|
150
153
|
struct string_ctx {
|
151
|
-
char *data;
|
154
|
+
const char *data; /* the unread data */
|
152
155
|
int size; /* and how much is there? */
|
153
156
|
} ;
|
154
157
|
|
@@ -167,7 +170,7 @@ strget(struct string_ctx *in)
|
|
167
170
|
/* convert a block of text into a linked list
|
168
171
|
*/
|
169
172
|
Document *
|
170
|
-
mkd_string(char *buf, int len, DWORD flags)
|
173
|
+
mkd_string(const char *buf, int len, DWORD flags)
|
171
174
|
{
|
172
175
|
struct string_ctx about;
|
173
176
|
|
@@ -215,7 +218,7 @@ markdown(Document *document, FILE *out, int flags)
|
|
215
218
|
/* write out a Cstring, mangled into a form suitable for `<a href=` or `<a id=`
|
216
219
|
*/
|
217
220
|
void
|
218
|
-
mkd_string_to_anchor(char *s, int len,
|
221
|
+
mkd_string_to_anchor(char *s, int len, mkd_sta_function_t outchar,
|
219
222
|
void *out, int labelformat)
|
220
223
|
{
|
221
224
|
unsigned char c;
|
@@ -233,7 +236,7 @@ mkd_string_to_anchor(char *s, int len, void(*outchar)(int,void*),
|
|
233
236
|
if ( isalnum(c) || (c == '_') || (c == ':') || (c == '-') || (c == '.' ) )
|
234
237
|
(*outchar)(c, out);
|
235
238
|
else
|
236
|
-
(*outchar)('.',out);
|
239
|
+
(*outchar)('.', out);
|
237
240
|
}
|
238
241
|
else
|
239
242
|
(*outchar)(c,out);
|
@@ -342,3 +345,13 @@ mkd_e_data(Document *f, void *data)
|
|
342
345
|
if ( f )
|
343
346
|
f->cb.e_data = data;
|
344
347
|
}
|
348
|
+
|
349
|
+
|
350
|
+
/* set the href prefix for markdown extra style footnotes
|
351
|
+
*/
|
352
|
+
void
|
353
|
+
mkd_ref_prefix(Document *f, char *data)
|
354
|
+
{
|
355
|
+
if ( f )
|
356
|
+
f->ref_prefix = data;
|
357
|
+
}
|
data/ext/mkdio.h
CHANGED
@@ -10,11 +10,12 @@ typedef unsigned int mkd_flag_t;
|
|
10
10
|
/* line builder for markdown()
|
11
11
|
*/
|
12
12
|
MMIOT *mkd_in(FILE*,mkd_flag_t); /* assemble input from a file */
|
13
|
-
MMIOT *mkd_string(char*,int,mkd_flag_t); /* assemble input from a buffer */
|
13
|
+
MMIOT *mkd_string(const char*,int,mkd_flag_t); /* assemble input from a buffer */
|
14
14
|
|
15
15
|
void mkd_basename(MMIOT*,char*);
|
16
16
|
|
17
17
|
void mkd_initialize();
|
18
|
+
void mkd_with_html5_tags();
|
18
19
|
void mkd_shlib_destructor();
|
19
20
|
|
20
21
|
/* compilation, debugging, cleanup
|
@@ -27,7 +28,8 @@ int mkd_cleanup(MMIOT*);
|
|
27
28
|
int mkd_dump(MMIOT*, FILE*, int, char*);
|
28
29
|
int markdown(MMIOT*, FILE*, mkd_flag_t);
|
29
30
|
int mkd_line(char *, int, char **, mkd_flag_t);
|
30
|
-
|
31
|
+
typedef int (*mkd_sta_function_t)(const int,const void*);
|
32
|
+
void mkd_string_to_anchor(char *, int, mkd_sta_function_t, void*, int);
|
31
33
|
int mkd_xhtmlpage(MMIOT*,int,FILE*);
|
32
34
|
|
33
35
|
/* header block access
|
@@ -66,6 +68,11 @@ void mkd_e_data(void *, void *);
|
|
66
68
|
/* version#.
|
67
69
|
*/
|
68
70
|
extern char markdown_version[];
|
71
|
+
void mkd_mmiot_flags(FILE *, MMIOT *, int);
|
72
|
+
void mkd_flags_are(FILE*, mkd_flag_t, int);
|
73
|
+
|
74
|
+
void mkd_ref_prefix(MMIOT*, char*);
|
75
|
+
|
69
76
|
|
70
77
|
/* special flags for markdown() and mkd_text()
|
71
78
|
*/
|
@@ -91,6 +98,7 @@ extern char markdown_version[];
|
|
91
98
|
#define MKD_NODIVQUOTE 0x00040000 /* forbid >%class% blocks */
|
92
99
|
#define MKD_NOALPHALIST 0x00080000 /* forbid alphabetic lists */
|
93
100
|
#define MKD_NODLIST 0x00100000 /* forbid definition lists */
|
101
|
+
#define MKD_EXTRA_FOOTNOTE 0x00200000 /* enable markdown extra-style footnotes */
|
94
102
|
#define MKD_EMBED MKD_NOLINKS|MKD_NOIMAGE|MKD_TAGTEXT
|
95
103
|
|
96
104
|
/* special flags for mkd_in() and mkd_string()
|
data/ext/version.c
CHANGED
@@ -1,28 +1,27 @@
|
|
1
1
|
#include "config.h"
|
2
2
|
|
3
3
|
char markdown_version[] = VERSION
|
4
|
-
#if DL_TAG_EXTENSION
|
5
|
-
" DL_TAG"
|
6
|
-
#endif
|
7
|
-
#if PANDOC_HEADER
|
8
|
-
" HEADER"
|
9
|
-
#endif
|
10
4
|
#if 4 != 4
|
11
5
|
" TAB=4"
|
12
6
|
#endif
|
13
7
|
#if USE_AMALLOC
|
14
8
|
" DEBUG"
|
15
9
|
#endif
|
16
|
-
#if
|
17
|
-
|
18
|
-
|
19
|
-
#
|
20
|
-
"
|
21
|
-
#endif
|
22
|
-
#
|
23
|
-
"
|
24
|
-
#
|
25
|
-
|
26
|
-
|
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"
|
27
26
|
#endif
|
28
27
|
;
|
data/lib/1.8/bluecloth_ext.so
CHANGED
Binary file
|
data/lib/1.9/bluecloth_ext.so
CHANGED
Binary file
|
data/lib/bluecloth.rb
CHANGED
@@ -18,18 +18,49 @@
|
|
18
18
|
#
|
19
19
|
# == Version
|
20
20
|
#
|
21
|
-
#
|
21
|
+
# 2.1.0
|
22
|
+
#
|
23
|
+
# == Revision
|
22
24
|
#
|
25
|
+
# $Revision: 463bb88e4d08 $
|
26
|
+
#
|
23
27
|
# == License
|
24
|
-
#
|
25
|
-
#
|
26
|
-
|
27
|
-
#
|
28
|
-
#
|
28
|
+
#
|
29
|
+
# Copyright (c) 2004-2011, Michael Granger
|
30
|
+
# All rights reserved.
|
31
|
+
#
|
32
|
+
# Redistribution and use in source and binary forms, with or without
|
33
|
+
# modification, are permitted provided that the following conditions are met:
|
34
|
+
#
|
35
|
+
# * Redistributions of source code must retain the above copyright notice,
|
36
|
+
# this list of conditions and the following disclaimer.
|
37
|
+
#
|
38
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
39
|
+
# this list of conditions and the following disclaimer in the documentation
|
40
|
+
# and/or other materials provided with the distribution.
|
41
|
+
#
|
42
|
+
# * Neither the name of the author/s, nor the names of the project's
|
43
|
+
# contributors may be used to endorse or promote products derived from this
|
44
|
+
# software without specific prior written permission.
|
45
|
+
#
|
46
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
47
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
48
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
49
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
50
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
51
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
52
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
53
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
54
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
55
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
56
|
+
#
|
29
57
|
class BlueCloth
|
30
58
|
|
31
59
|
# Release Version
|
32
|
-
VERSION = '2.0
|
60
|
+
VERSION = '2.1.0'
|
61
|
+
|
62
|
+
# Version control revision
|
63
|
+
REVISION = %q$Revision: 463bb88e4d08 $
|
33
64
|
|
34
65
|
# The defaults for all supported options.
|
35
66
|
DEFAULT_OPTIONS = {
|
@@ -54,6 +85,7 @@ class BlueCloth
|
|
54
85
|
:tables => false,
|
55
86
|
:tagtext_mode => false,
|
56
87
|
:xml_cdata => false,
|
88
|
+
:footnotes => false,
|
57
89
|
}.freeze
|
58
90
|
|
59
91
|
# The number of characters of the original markdown source to include in the
|
@@ -103,6 +135,7 @@ class BlueCloth
|
|
103
135
|
if ! opthash[:divquotes] then flags |= MKD_NODIVQUOTE; end
|
104
136
|
if ! opthash[:alphalists] then flags |= MKD_NOALPHALIST; end
|
105
137
|
if ! opthash[:definition_lists] then flags |= MKD_NODLIST; end
|
138
|
+
if opthash[:footnotes] then flags |= MKD_EXTRA_FOOTNOTE; end
|
106
139
|
|
107
140
|
return flags
|
108
141
|
end
|
@@ -134,6 +167,7 @@ class BlueCloth
|
|
134
167
|
if !( flags & MKD_NODIVQUOTE ).nonzero? then opthash[:divquotes] = true; end
|
135
168
|
if !( flags & MKD_NOALPHALIST ).nonzero? then opthash[:alphalists] = true; end
|
136
169
|
if !( flags & MKD_NODLIST ).nonzero? then opthash[:definition_lists] = true; end
|
170
|
+
if ( flags & MKD_EXTRA_FOOTNOTE ).nonzero? then opthash[:footnotes] = true; end
|
137
171
|
|
138
172
|
return opthash
|
139
173
|
end
|
@@ -155,25 +189,6 @@ class BlueCloth
|
|
155
189
|
]
|
156
190
|
end
|
157
191
|
|
158
|
-
|
159
|
-
### Backward-compatible method: return +true+ if the object's :escape_html option was
|
160
|
-
### set.
|
161
|
-
def filter_html
|
162
|
-
return self.options[:escape_html]
|
163
|
-
end
|
164
|
-
|
165
|
-
|
166
|
-
### Backward-compatible method: raises an appropriate error notifying the user that
|
167
|
-
### BlueCloth2 doesn't support this option.
|
168
|
-
def filter_html=( arg )
|
169
|
-
raise NotImplementedError,
|
170
|
-
"Sorry, this version of BlueCloth no longer supports toggling of HTML filtering" +
|
171
|
-
"via #filter_html=. You now must create the BlueCloth object with the :escape_html" +
|
172
|
-
"option set to true instead."
|
173
|
-
end
|
174
|
-
|
175
|
-
|
176
|
-
|
177
192
|
end # class BlueCloth
|
178
193
|
|
179
194
|
begin
|
@@ -4,10 +4,10 @@
|
|
4
4
|
BEGIN {
|
5
5
|
require 'pathname'
|
6
6
|
basedir = Pathname.new( __FILE__ ).dirname.parent.parent
|
7
|
-
|
7
|
+
|
8
8
|
libdir = basedir + 'lib'
|
9
9
|
extdir = basedir + 'ext'
|
10
|
-
|
10
|
+
|
11
11
|
$LOAD_PATH.unshift( basedir ) unless $LOAD_PATH.include?( basedir )
|
12
12
|
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
13
13
|
$LOAD_PATH.unshift( extdir ) unless $LOAD_PATH.include?( extdir )
|
@@ -57,6 +57,24 @@ describe BlueCloth, "document with entities" do
|
|
57
57
|
---
|
58
58
|
end
|
59
59
|
|
60
|
+
it "handles a mix of entities in code spans and not in code spans (issue #73)" do
|
61
|
+
the_indented_markdown( <<-"---" ).should be_transformed_into(<<-"---").without_indentation
|
62
|
+
# HTML Text is Unicode #
|
63
|
+
|
64
|
+
* You can either use character entities or character codes for foreign language characters and symbols:
|
65
|
+
* ``é`` or ``é`` is e-acute (é)
|
66
|
+
* ``©`` or ``©`` is the copyright symbol ©
|
67
|
+
---
|
68
|
+
<h1>HTML Text is Unicode</h1>
|
69
|
+
|
70
|
+
<ul>
|
71
|
+
<li>You can either use character entities or character codes for foreign language characters and symbols:</li>
|
72
|
+
<li><code>&eacute;</code> or <code>&#233;</code> is e-acute (é)</li>
|
73
|
+
<li><code>&copy;</code> or <code>&#169;</code> is the copyright symbol ©</li>
|
74
|
+
</ul>
|
75
|
+
---
|
76
|
+
end
|
77
|
+
|
60
78
|
end
|
61
79
|
|
62
80
|
|
data/spec/bluecloth_spec.rb
CHANGED
@@ -43,7 +43,7 @@ describe BlueCloth do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
it "knows what version of Discount was used to build it" do
|
46
|
-
BlueCloth.discount_version.should =~ /^\d+\.\d+\.\d+.*
|
46
|
+
BlueCloth.discount_version.should =~ /^\d+\.\d+\.\d+.*DL=BOTH/
|
47
47
|
end
|
48
48
|
|
49
49
|
it "can build a flags bitmask out of an options hash" do
|
data/spec/contributions_spec.rb
CHANGED
@@ -3,10 +3,10 @@
|
|
3
3
|
BEGIN {
|
4
4
|
require 'pathname'
|
5
5
|
basedir = Pathname.new( __FILE__ ).dirname.parent
|
6
|
-
|
6
|
+
|
7
7
|
libdir = basedir + 'lib'
|
8
8
|
extdir = basedir + 'ext'
|
9
|
-
|
9
|
+
|
10
10
|
$LOAD_PATH.unshift( basedir ) unless $LOAD_PATH.include?( basedir )
|
11
11
|
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
12
12
|
$LOAD_PATH.unshift( extdir ) unless $LOAD_PATH.include?( extdir )
|
@@ -44,23 +44,16 @@ describe BlueCloth, "contributed features: " do
|
|
44
44
|
### Test the :filter_html restriction
|
45
45
|
it "can be configured with html filtering when created" do
|
46
46
|
bc = BlueCloth.new( 'foo', :filter_html )
|
47
|
-
bc.
|
47
|
+
bc.options.should include( :escape_html )
|
48
48
|
end
|
49
|
-
|
50
|
-
|
49
|
+
|
50
|
+
|
51
51
|
it "can be configured with html filtering (via an Array of options) when created" do
|
52
52
|
bc = BlueCloth.new( 'foo', [:filter_html] )
|
53
|
-
bc.
|
53
|
+
bc.options.should include( :escape_html )
|
54
54
|
end
|
55
|
-
|
56
|
-
|
57
|
-
it "raises an appropriate error when #filter_html= is called" do
|
58
|
-
lambda {
|
59
|
-
BlueCloth.new( 'foo' ).filter_html = true
|
60
|
-
}.should raise_error( NotImplementedError, /sorry/i )
|
61
|
-
end
|
62
|
-
|
63
|
-
|
55
|
+
|
56
|
+
|
64
57
|
it "can escape any existing HTML in the input if configured to do so" do
|
65
58
|
the_markdown( DANGEROUS_HTML, :filter_html ).
|
66
59
|
should be_transformed_into( DANGEROUS_HTML_OUTPUT )
|
data/spec/discount_spec.rb
CHANGED
@@ -217,6 +217,208 @@ describe BlueCloth, "implementation of Discount-specific features" do
|
|
217
217
|
|
218
218
|
end
|
219
219
|
|
220
|
+
|
221
|
+
describe "definition lists" do
|
222
|
+
|
223
|
+
describe "(discount style)" do
|
224
|
+
it "aren't rendered by default" do
|
225
|
+
the_indented_markdown( <<-"---" ).should be_transformed_into(<<-"---").without_indentation
|
226
|
+
=hey!=
|
227
|
+
This is a definition list
|
228
|
+
---
|
229
|
+
<p>=hey!=</p>
|
230
|
+
|
231
|
+
<pre><code>This is a definition list
|
232
|
+
</code></pre>
|
233
|
+
---
|
234
|
+
end
|
235
|
+
|
236
|
+
it "are rendered if the :definition_lists option is true" do
|
237
|
+
the_indented_markdown( <<-"---", :definition_lists => true ).should be_transformed_into(<<-"---").without_indentation
|
238
|
+
=hey!=
|
239
|
+
This is a definition list
|
240
|
+
---
|
241
|
+
<dl>
|
242
|
+
<dt>hey!</dt>
|
243
|
+
<dd>This is a definition list</dd>
|
244
|
+
</dl>
|
245
|
+
---
|
246
|
+
end
|
247
|
+
|
248
|
+
it "supports multiple-term list items" do
|
249
|
+
the_indented_markdown( <<-"---", :definition_lists => true ).should be_transformed_into(<<-"---").without_indentation
|
250
|
+
=tag1=
|
251
|
+
=tag2=
|
252
|
+
data.
|
253
|
+
---
|
254
|
+
<dl>
|
255
|
+
<dt>tag1</dt>
|
256
|
+
<dt>tag2</dt>
|
257
|
+
<dd>data.</dd>
|
258
|
+
</dl>
|
259
|
+
---
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
describe "(markdown-extra style)" do
|
264
|
+
it "aren't rendered by default" do
|
265
|
+
the_indented_markdown( <<-"---" ).should be_transformed_into(<<-"---").without_indentation
|
266
|
+
Apple
|
267
|
+
: Pomaceous fruit of plants of the genus Malus in
|
268
|
+
the family Rosaceae.
|
269
|
+
|
270
|
+
Orange
|
271
|
+
: The fruit of an evergreen tree of the genus Citrus.
|
272
|
+
---
|
273
|
+
<p>Apple
|
274
|
+
: Pomaceous fruit of plants of the genus Malus in</p>
|
275
|
+
|
276
|
+
<pre><code>the family Rosaceae.
|
277
|
+
</code></pre>
|
278
|
+
|
279
|
+
<p>Orange
|
280
|
+
: The fruit of an evergreen tree of the genus Citrus.</p>
|
281
|
+
---
|
282
|
+
end
|
283
|
+
|
284
|
+
it "are rendered if the :definition_lists option is true" do
|
285
|
+
the_indented_markdown( <<-"---", :definition_lists => true ).should be_transformed_into(<<-"---").without_indentation
|
286
|
+
Apple
|
287
|
+
: Pomaceous fruit of plants of the genus Malus in
|
288
|
+
the family Rosaceae.
|
289
|
+
|
290
|
+
Orange
|
291
|
+
: The fruit of an evergreen tree of the genus Citrus.
|
292
|
+
---
|
293
|
+
<dl>
|
294
|
+
<dt>Apple</dt>
|
295
|
+
<dd> Pomaceous fruit of plants of the genus Malus in
|
296
|
+
the family Rosaceae.</dd>
|
297
|
+
<dt>Orange</dt>
|
298
|
+
<dd> The fruit of an evergreen tree of the genus Citrus.</dd>
|
299
|
+
</dl>
|
300
|
+
---
|
301
|
+
end
|
302
|
+
|
303
|
+
it "are rendered if the :definition_lists option is true" do
|
304
|
+
the_indented_markdown( <<-"---", :definition_lists => true ).should be_transformed_into(<<-"---").without_indentation
|
305
|
+
Apple
|
306
|
+
: Pomaceous fruit of plants of the genus Malus in
|
307
|
+
the family Rosaceae.
|
308
|
+
|
309
|
+
Orange
|
310
|
+
: The fruit of an evergreen tree of the genus Citrus.
|
311
|
+
---
|
312
|
+
<dl>
|
313
|
+
<dt>Apple</dt>
|
314
|
+
<dd> Pomaceous fruit of plants of the genus Malus in
|
315
|
+
the family Rosaceae.</dd>
|
316
|
+
<dt>Orange</dt>
|
317
|
+
<dd> The fruit of an evergreen tree of the genus Citrus.</dd>
|
318
|
+
</dl>
|
319
|
+
---
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
end
|
324
|
+
|
325
|
+
|
326
|
+
describe "footnotes" do
|
327
|
+
|
328
|
+
it "aren't rendered by default" do
|
329
|
+
the_indented_markdown( <<-"---" ).should be_transformed_into(<<-"---").without_indentation
|
330
|
+
That's some text with a footnote.[^1]
|
331
|
+
|
332
|
+
[^1]: And that's the footnote.
|
333
|
+
---
|
334
|
+
<p>That's some text with a footnote.<a href=\"And\">^1</a></p>
|
335
|
+
---
|
336
|
+
end
|
337
|
+
|
338
|
+
it "are rendered if the :footnotes option is true" do
|
339
|
+
the_indented_markdown( <<-"---", :footnotes => true ).should be_transformed_into(<<-"---").without_indentation
|
340
|
+
That's some text with a footnote.[^1]
|
341
|
+
|
342
|
+
[^1]: And that's the footnote.
|
343
|
+
---
|
344
|
+
<p>That's some text with a footnote.<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup></p>
|
345
|
+
<div class="footnotes">
|
346
|
+
<hr/>
|
347
|
+
<ol>
|
348
|
+
<li id="fn:1">
|
349
|
+
<p>And that’s the footnote.<a href="#fnref:1" rev="footnote">↩</a></p></li>
|
350
|
+
</ol>
|
351
|
+
</div>
|
352
|
+
---
|
353
|
+
end
|
354
|
+
|
355
|
+
it "renders a second link to the same footnote as plain text" do
|
356
|
+
the_indented_markdown( <<-"---", :footnotes => true ).should be_transformed_into(<<-"---").without_indentation
|
357
|
+
That's some text with a footnote.[^afootnote]
|
358
|
+
And here's another.[^afootnote]
|
359
|
+
|
360
|
+
[^afootnote]: And that's the footnote.
|
361
|
+
---
|
362
|
+
<p>That's some text with a footnote.<sup id=\"fnref:1\"><a href=\"#fn:1\" rel=\"footnote\">1</a></sup>
|
363
|
+
And here's another.[^afootnote]</p>
|
364
|
+
<div class=\"footnotes\">
|
365
|
+
<hr/>
|
366
|
+
<ol>
|
367
|
+
<li id=\"fn:1\">
|
368
|
+
<p>And that’s the footnote.<a href=\"#fnref:1\" rev=\"footnote\">↩</a></p></li>
|
369
|
+
</ol>
|
370
|
+
</div>
|
371
|
+
---
|
372
|
+
end
|
373
|
+
|
374
|
+
it "support multiple block-level elements via indentation", :pedantic => true do
|
375
|
+
pending "not yet implemented by Discount" do
|
376
|
+
the_indented_markdown( <<-"---", :footnotes => true ).should be_transformed_into(<<-"---").without_indentation
|
377
|
+
That's some text with a footnote.[^1]
|
378
|
+
|
379
|
+
[^1]: And that's the footnote.
|
380
|
+
|
381
|
+
That's the second paragraph.
|
382
|
+
---
|
383
|
+
<p>That's some text with a footnote.<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup></p>
|
384
|
+
<div class="footnotes">
|
385
|
+
<hr/>
|
386
|
+
<ol>
|
387
|
+
<li id="fn:1">
|
388
|
+
<p>And that’s the footnote.</p>
|
389
|
+
<p>That’s the second paragraph.<a href="#fnref:1" rev="footnote">↩</a></p></li>
|
390
|
+
</ol>
|
391
|
+
</div>
|
392
|
+
---
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
it "support multiple block-level elements with an empty first line", :pedantic => true do
|
397
|
+
pending "not yet implemented by Discount" do
|
398
|
+
the_indented_markdown( <<-"---", :footnotes => true ).should be_transformed_into(<<-"---").without_indentation
|
399
|
+
That's some text with a footnote.[^cows]
|
400
|
+
|
401
|
+
[^cows]:
|
402
|
+
And that's the footnote.
|
403
|
+
|
404
|
+
That's the second paragraph.
|
405
|
+
---
|
406
|
+
<p>That's some text with a footnote.<sup id="fnref:cows"><a href="#fn:cows" rel="footnote">1</a></sup></p>
|
407
|
+
<div class="footnotes">
|
408
|
+
<hr />
|
409
|
+
<ol>
|
410
|
+
<li id="fn:cows">
|
411
|
+
<p>And that's the footnote.</p>
|
412
|
+
<p>That's the second paragraph. <a href="#fnref:cows" rev="footnote">↩</a></p>
|
413
|
+
</li>
|
414
|
+
</ol>
|
415
|
+
</div>
|
416
|
+
---
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
end
|
421
|
+
|
220
422
|
end
|
221
423
|
|
222
424
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bluecloth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 2.0.11
|
10
|
+
version: 2.1.0
|
11
11
|
platform: x86-mingw32
|
12
12
|
authors:
|
13
13
|
- Michael Granger
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
cmlhXe46pZNJgWKbxZah85jIjx95hR8vOI+NAM5iH9kOqK13DrxacTKPhqj5PjwF
|
36
36
|
-----END CERTIFICATE-----
|
37
37
|
|
38
|
-
date: 2011-
|
38
|
+
date: 2011-03-12 00:00:00 -08:00
|
39
39
|
default_executable:
|
40
40
|
dependencies:
|
41
41
|
- !ruby/object:Gem::Dependency
|
@@ -279,10 +279,9 @@ licenses:
|
|
279
279
|
- BSD
|
280
280
|
post_install_message:
|
281
281
|
rdoc_options:
|
282
|
-
- --protected
|
283
|
-
- --verbose
|
284
282
|
- --title
|
285
283
|
- Bluecloth Documentation
|
284
|
+
- --quiet
|
286
285
|
require_paths:
|
287
286
|
- lib
|
288
287
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -308,7 +307,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
308
307
|
requirements: []
|
309
308
|
|
310
309
|
rubyforge_project: bluecloth
|
311
|
-
rubygems_version: 1.
|
310
|
+
rubygems_version: 1.5.2
|
312
311
|
signing_key:
|
313
312
|
specification_version: 3
|
314
313
|
summary: BlueCloth is a Ruby implementation of John Gruber's [Markdown][markdown], a text-to-HTML conversion tool for web writers
|
metadata.gz.sig
CHANGED
Binary file
|