rdiscount 2.1.7.1 → 2.1.8
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 +4 -4
- data/Rakefile +1 -1
- data/ext/VERSION +1 -1
- data/ext/emmatch.c +1 -1
- data/ext/generate.c +33 -15
- data/ext/markdown.c +19 -7
- data/ext/markdown.h +10 -2
- data/ext/mkdio.c +13 -0
- data/ext/resource.c +4 -4
- data/lib/rdiscount.rb +1 -1
- data/rdiscount.gemspec +2 -2
- data/test/rdiscount_test.rb +9 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 405bc946f3603de05c87ad440e64d3b22f111991
|
4
|
+
data.tar.gz: f6dcc0125d0eb194721a3f4979bccad2b6afc69e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7573a6ccf9a830cff5f4768bc3d21625d189f88f93f7b1ed35bcc9c1cb1636b22013c8354d19f4b2d135568f96e4bd7072a0462eef28aa64c94566933f03305
|
7
|
+
data.tar.gz: 4b88d0299ed378916b70b5159a96092062c22760ebb8fdd3fd98a519d5a528a7f40d652a29f450a9c6c4c006b380d944b234303267620eb6493b3f6be9a71589
|
data/Rakefile
CHANGED
@@ -8,7 +8,7 @@ task :default => :test
|
|
8
8
|
# Ruby Extension
|
9
9
|
# ==========================================================
|
10
10
|
|
11
|
-
DLEXT =
|
11
|
+
DLEXT = RbConfig::MAKEFILE_CONFIG['DLEXT']
|
12
12
|
RUBYDIGEST = Digest::MD5.hexdigest(`ruby --version`)
|
13
13
|
|
14
14
|
file "ext/ruby-#{RUBYDIGEST}" do |f|
|
data/ext/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.8
|
data/ext/emmatch.c
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
* of html has been generated.
|
23
23
|
*
|
24
24
|
* It should create MarkdownTest_1.0 (and _1.0.3)
|
25
|
-
*
|
25
|
+
* compatible emphasis for non-pathological cases
|
26
26
|
* and it should fail in a standards-compliant way
|
27
27
|
* when someone attempts to feed it junk.
|
28
28
|
*
|
data/ext/generate.c
CHANGED
@@ -38,6 +38,16 @@ push(char *bfr, int size, MMIOT *f)
|
|
38
38
|
}
|
39
39
|
|
40
40
|
|
41
|
+
/*
|
42
|
+
* push a character into the generator input buffer
|
43
|
+
*/
|
44
|
+
static void
|
45
|
+
pushc(char c, MMIOT *f)
|
46
|
+
{
|
47
|
+
EXPAND(f->in) = c;
|
48
|
+
}
|
49
|
+
|
50
|
+
|
41
51
|
/* look <i> characters ahead of the cursor.
|
42
52
|
*/
|
43
53
|
static inline int
|
@@ -207,7 +217,7 @@ ___mkd_reparse(char *bfr, int size, int flags, MMIOT *f, char *esc)
|
|
207
217
|
sub.esc = f->esc;
|
208
218
|
|
209
219
|
push(bfr, size, &sub);
|
210
|
-
|
220
|
+
pushc(0, &sub);
|
211
221
|
S(sub.in)--;
|
212
222
|
|
213
223
|
text(&sub);
|
@@ -262,7 +272,7 @@ puturl(char *s, int size, MMIOT *f, int display)
|
|
262
272
|
Qstring("%22", f);
|
263
273
|
else if ( isalnum(c) || ispunct(c) || (display && isspace(c)) )
|
264
274
|
Qchar(c, f);
|
265
|
-
else if ( c ==
|
275
|
+
else if ( c == MKD_EOLN ) /* untokenize hard return */
|
266
276
|
Qstring(" ", f);
|
267
277
|
else
|
268
278
|
Qprintf(f, "%%%02X", c);
|
@@ -618,7 +628,7 @@ extra_linky(MMIOT *f, Cstring text, Footnote *ref)
|
|
618
628
|
___mkd_reparse(T(text), S(text), linkt.flags, f, 0);
|
619
629
|
else {
|
620
630
|
ref->flags |= REFERENCED;
|
621
|
-
ref->refnumber = ++ f->reference;
|
631
|
+
ref->refnumber = ++ f->footnotes->reference;
|
622
632
|
Qprintf(f, "<sup id=\"%sref:%d\"><a href=\"#%s:%d\" rel=\"footnote\">%d</a></sup>",
|
623
633
|
p_or_nothing(f), ref->refnumber,
|
624
634
|
p_or_nothing(f), ref->refnumber, ref->refnumber);
|
@@ -731,8 +741,9 @@ linkylinky(int image, MMIOT *f)
|
|
731
741
|
S(key.tag) = S(name);
|
732
742
|
}
|
733
743
|
|
734
|
-
if ( ref = bsearch(&key, T(
|
735
|
-
|
744
|
+
if ( ref = bsearch(&key, T(f->footnotes->note),
|
745
|
+
S(f->footnotes->note),
|
746
|
+
sizeof key, (stfu)__mkd_footsort) ) {
|
736
747
|
if ( extra_footnote )
|
737
748
|
status = extra_linky(f,name,ref);
|
738
749
|
else
|
@@ -774,8 +785,12 @@ static void
|
|
774
785
|
mangle(char *s, int len, MMIOT *f)
|
775
786
|
{
|
776
787
|
while ( len-- > 0 ) {
|
788
|
+
#if DEBIAN_GLITCH
|
789
|
+
Qprintf(f, "d;", *((unsigned char*)(s++)) );
|
790
|
+
#else
|
777
791
|
Qstring("&#", f);
|
778
792
|
Qprintf(f, COINTOSS() ? "x%02x;" : "%02d;", *((unsigned char*)(s++)) );
|
793
|
+
#endif
|
779
794
|
}
|
780
795
|
}
|
781
796
|
|
@@ -837,7 +852,7 @@ code(MMIOT *f, char *s, int length)
|
|
837
852
|
int i,c;
|
838
853
|
|
839
854
|
for ( i=0; i < length; i++ )
|
840
|
-
if ( (c = s[i]) ==
|
855
|
+
if ( (c = s[i]) == MKD_EOLN) /* ^C: expand back to 2 spaces */
|
841
856
|
Qstring(" ", f);
|
842
857
|
else if ( c == '\\' && (i < length-1) && escaped(f, s[i+1]) )
|
843
858
|
cputc(s[++i], f);
|
@@ -1044,13 +1059,14 @@ maybe_autolink(MMIOT *f)
|
|
1044
1059
|
|
1045
1060
|
/* greedily scan forward for the end of a legitimate link.
|
1046
1061
|
*/
|
1047
|
-
for ( size=0; (c=peek(f, size+1)) != EOF; size++ )
|
1062
|
+
for ( size=0; (c=peek(f, size+1)) != EOF; size++ ) {
|
1048
1063
|
if ( c == '\\' ) {
|
1049
1064
|
if ( peek(f, size+2) != EOF )
|
1050
1065
|
++size;
|
1051
1066
|
}
|
1052
|
-
else if ( isspace(c) || strchr("'\"()[]{}<>`", c) )
|
1067
|
+
else if ( isspace(c) || strchr("'\"()[]{}<>`", c) || c == MKD_EOLN )
|
1053
1068
|
break;
|
1069
|
+
}
|
1054
1070
|
|
1055
1071
|
if ( (size > 1) && process_possible_link(f, size) ) {
|
1056
1072
|
shift(f, size);
|
@@ -1243,7 +1259,8 @@ text(MMIOT *f)
|
|
1243
1259
|
switch (c) {
|
1244
1260
|
case 0: break;
|
1245
1261
|
|
1246
|
-
case
|
1262
|
+
case MKD_EOLN:
|
1263
|
+
Qstring(tag_text(f) ? " " : "<br/>", f);
|
1247
1264
|
break;
|
1248
1265
|
|
1249
1266
|
case '>': if ( tag_text(f) )
|
@@ -1567,13 +1584,14 @@ printblock(Paragraph *pp, MMIOT *f)
|
|
1567
1584
|
&& T(t->text)[S(t->text)-2] == ' '
|
1568
1585
|
&& T(t->text)[S(t->text)-1] == ' ' ) {
|
1569
1586
|
push(T(t->text), S(t->text)-2, f);
|
1570
|
-
|
1587
|
+
pushc(MKD_EOLN, f);
|
1588
|
+
pushc('\n', f);
|
1571
1589
|
}
|
1572
1590
|
else {
|
1573
1591
|
___mkd_tidy(&t->text);
|
1574
1592
|
push(T(t->text), S(t->text), f);
|
1575
1593
|
if ( t->next )
|
1576
|
-
|
1594
|
+
pushc('\n', f);
|
1577
1595
|
}
|
1578
1596
|
}
|
1579
1597
|
t = t->next;
|
@@ -1758,14 +1776,14 @@ mkd_extra_footnotes(MMIOT *m)
|
|
1758
1776
|
int j, i;
|
1759
1777
|
Footnote *t;
|
1760
1778
|
|
1761
|
-
if ( m->reference == 0 )
|
1779
|
+
if ( m->footnotes->reference == 0 )
|
1762
1780
|
return;
|
1763
1781
|
|
1764
1782
|
Csprintf(&m->out, "\n<div class=\"footnotes\">\n<hr/>\n<ol>\n");
|
1765
1783
|
|
1766
|
-
for ( i=1; i <= m->reference; i++ ) {
|
1767
|
-
for ( j=0; j < S(
|
1768
|
-
t = &T(
|
1784
|
+
for ( i=1; i <= m->footnotes->reference; i++ ) {
|
1785
|
+
for ( j=0; j < S(m->footnotes->note); j++ ) {
|
1786
|
+
t = &T(m->footnotes->note)[j];
|
1769
1787
|
if ( (t->refnumber == i) && (t->flags & REFERENCED) ) {
|
1770
1788
|
Csprintf(&m->out, "<li id=\"%s:%d\">\n<p>",
|
1771
1789
|
p_or_nothing(m), t->refnumber);
|
data/ext/markdown.c
CHANGED
@@ -177,9 +177,14 @@ splitline(Line *t, int cutpoint)
|
|
177
177
|
}
|
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
183
|
other = 1; l->count += (c == ' ' ? 0 : -1); \
|
182
184
|
} else { t; }
|
185
|
+
#else
|
186
|
+
# define UNLESS_FENCED(t) t;
|
187
|
+
#endif
|
183
188
|
|
184
189
|
/*
|
185
190
|
* walk a line, seeing if it's any of half a dozen interesting regular
|
@@ -530,8 +535,7 @@ islist(Line *t, int *clip, DWORD flags, int *list_type)
|
|
530
535
|
strtoul(T(t->text)+t->dle, &q, 10);
|
531
536
|
if ( (q > T(t->text)+t->dle) && (q == T(t->text) + (j-1)) ) {
|
532
537
|
j = nextnonblank(t,j);
|
533
|
-
|
534
|
-
*clip = (j > 4) ? 4 : j;
|
538
|
+
*clip = j;
|
535
539
|
*list_type = OL;
|
536
540
|
return AL;
|
537
541
|
}
|
@@ -847,6 +851,12 @@ listitem(Paragraph *p, int indent, DWORD flags, linefn check)
|
|
847
851
|
UNCHECK(t);
|
848
852
|
t->dle = mkd_firstnonblank(t);
|
849
853
|
|
854
|
+
/* even though we had to trim a long leader off this item,
|
855
|
+
* the indent for trailing paragraphs is still 4...
|
856
|
+
*/
|
857
|
+
if (indent > 4) {
|
858
|
+
indent = 4;
|
859
|
+
}
|
850
860
|
if ( (q = skipempty(t->next)) == 0 ) {
|
851
861
|
___mkd_freeLineRange(t,q);
|
852
862
|
return 0;
|
@@ -998,7 +1008,7 @@ addfootnote(Line *p, MMIOT* f)
|
|
998
1008
|
int c;
|
999
1009
|
Line *np = p->next;
|
1000
1010
|
|
1001
|
-
Footnote *foot = &EXPAND(
|
1011
|
+
Footnote *foot = &EXPAND(f->footnotes->note);
|
1002
1012
|
|
1003
1013
|
CREATE(foot->tag);
|
1004
1014
|
CREATE(foot->link);
|
@@ -1013,6 +1023,7 @@ addfootnote(Line *p, MMIOT* f)
|
|
1013
1023
|
j = nextnonblank(p, j+2);
|
1014
1024
|
|
1015
1025
|
if ( (f->flags & MKD_EXTRA_FOOTNOTE) && (T(foot->tag)[0] == '^') ) {
|
1026
|
+
/* need to consume all lines until non-indented block? */
|
1016
1027
|
while ( j < S(p->text) )
|
1017
1028
|
EXPAND(foot->title) = T(p->text)[j++];
|
1018
1029
|
goto skip_to_end;
|
@@ -1320,13 +1331,14 @@ mkd_compile(Document *doc, DWORD flags)
|
|
1320
1331
|
doc->ctx->flags = flags & USER_FLAGS;
|
1321
1332
|
CREATE(doc->ctx->in);
|
1322
1333
|
doc->ctx->footnotes = malloc(sizeof doc->ctx->footnotes[0]);
|
1323
|
-
|
1334
|
+
doc->ctx->footnotes->reference = 0;
|
1335
|
+
CREATE(doc->ctx->footnotes->note);
|
1324
1336
|
|
1325
1337
|
mkd_initialize();
|
1326
1338
|
|
1327
1339
|
doc->code = compile_document(T(doc->content), doc->ctx);
|
1328
|
-
qsort(T(
|
1329
|
-
sizeof T(
|
1340
|
+
qsort(T(doc->ctx->footnotes->note), S(doc->ctx->footnotes->note),
|
1341
|
+
sizeof T(doc->ctx->footnotes->note)[0],
|
1330
1342
|
(stfu)__mkd_footsort);
|
1331
1343
|
memset(&doc->content, 0, sizeof doc->content);
|
1332
1344
|
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
|
@@ -132,6 +137,9 @@ typedef struct mmiot {
|
|
132
137
|
} MMIOT;
|
133
138
|
|
134
139
|
|
140
|
+
#define MKD_EOLN 3
|
141
|
+
|
142
|
+
|
135
143
|
/*
|
136
144
|
* the mkdio text input functions return a document structure,
|
137
145
|
* which contains a header (retrieved from the document if
|
data/ext/mkdio.c
CHANGED
@@ -215,6 +215,9 @@ void
|
|
215
215
|
mkd_string_to_anchor(char *s, int len, mkd_sta_function_t outchar,
|
216
216
|
void *out, int labelformat)
|
217
217
|
{
|
218
|
+
#if WITH_URLENCODED_ANCHOR
|
219
|
+
static const unsigned char hexchars[] = "0123456789abcdef";
|
220
|
+
#endif
|
218
221
|
unsigned char c;
|
219
222
|
|
220
223
|
int i, size;
|
@@ -222,15 +225,25 @@ mkd_string_to_anchor(char *s, int len, mkd_sta_function_t outchar,
|
|
222
225
|
|
223
226
|
size = mkd_line(s, len, &line, IS_LABEL);
|
224
227
|
|
228
|
+
#if !WITH_URLENCODED_ANCHOR
|
225
229
|
if ( labelformat && (size>0) && !isalpha(line[0]) )
|
226
230
|
(*outchar)('L',out);
|
231
|
+
#endif
|
227
232
|
for ( i=0; i < size ; i++ ) {
|
228
233
|
c = line[i];
|
229
234
|
if ( labelformat ) {
|
230
235
|
if ( isalnum(c) || (c == '_') || (c == ':') || (c == '-') || (c == '.' ) )
|
231
236
|
(*outchar)(c, out);
|
232
237
|
else
|
238
|
+
#if WITH_URLENCODED_ANCHOR
|
239
|
+
{
|
240
|
+
(*outchar)('%', out);
|
241
|
+
(*outchar)(hexchars[c >> 4 & 0xf], out);
|
242
|
+
(*outchar)(hexchars[c & 0xf], out);
|
243
|
+
}
|
244
|
+
#else
|
233
245
|
(*outchar)('.', out);
|
246
|
+
#endif
|
234
247
|
}
|
235
248
|
else
|
236
249
|
(*outchar)(c,out);
|
data/ext/resource.c
CHANGED
@@ -76,9 +76,9 @@ ___mkd_freefootnotes(MMIOT *f)
|
|
76
76
|
int i;
|
77
77
|
|
78
78
|
if ( f->footnotes ) {
|
79
|
-
for (i=0; i < S(
|
80
|
-
___mkd_freefootnote( &T(
|
81
|
-
DELETE(
|
79
|
+
for (i=0; i < S(f->footnotes->note); i++)
|
80
|
+
___mkd_freefootnote( &T(f->footnotes->note)[i] );
|
81
|
+
DELETE(f->footnotes->note);
|
82
82
|
free(f->footnotes);
|
83
83
|
}
|
84
84
|
}
|
@@ -98,7 +98,7 @@ ___mkd_initmmiot(MMIOT *f, void *footnotes)
|
|
98
98
|
f->footnotes = footnotes;
|
99
99
|
else {
|
100
100
|
f->footnotes = malloc(sizeof f->footnotes[0]);
|
101
|
-
CREATE(
|
101
|
+
CREATE(f->footnotes->note);
|
102
102
|
}
|
103
103
|
}
|
104
104
|
}
|
data/lib/rdiscount.rb
CHANGED
data/rdiscount.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'rdiscount'
|
3
|
-
s.version = '2.1.
|
3
|
+
s.version = '2.1.8'
|
4
4
|
s.summary = "Fast Implementation of Gruber's Markdown in C"
|
5
|
-
s.date = '
|
5
|
+
s.date = '2015-02-01'
|
6
6
|
s.email = 'davidfstr@gmail.com'
|
7
7
|
s.homepage = 'http://dafoster.net/projects/rdiscount/'
|
8
8
|
s.authors = ["Ryan Tomayko", "David Loren Parsons", "Andrew White", "David Foster"]
|
data/test/rdiscount_test.rb
CHANGED
@@ -153,6 +153,15 @@ EOS
|
|
153
153
|
rd = RDiscount.new(<<EOS, :footnotes)
|
154
154
|
Obtuse text.[^1]
|
155
155
|
|
156
|
+
[^1]: Clarification
|
157
|
+
EOS
|
158
|
+
assert rd.to_html.include?('<a href="#fn:1" rel="footnote">1</a>')
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_that_footnotes_in_span_works
|
162
|
+
rd = RDiscount.new(<<EOS, :footnotes)
|
163
|
+
[Obtuse text.[^1]](class:someclass)
|
164
|
+
|
156
165
|
[^1]: Clarification
|
157
166
|
EOS
|
158
167
|
assert rd.to_html.include?('<a href="#fn:1" rel="footnote">1</a>')
|
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.
|
4
|
+
version: 2.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Tomayko
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2015-02-01 00:00:00.000000000 Z
|
15
15
|
dependencies: []
|
16
16
|
description:
|
17
17
|
email: davidfstr@gmail.com
|
@@ -80,12 +80,12 @@ require_paths:
|
|
80
80
|
- lib
|
81
81
|
required_ruby_version: !ruby/object:Gem::Requirement
|
82
82
|
requirements:
|
83
|
-
- -
|
83
|
+
- - "!="
|
84
84
|
- !ruby/object:Gem::Version
|
85
85
|
version: 1.9.2
|
86
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- -
|
88
|
+
- - ">="
|
89
89
|
- !ruby/object:Gem::Version
|
90
90
|
version: '0'
|
91
91
|
requirements: []
|