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/mkdio.c
CHANGED
@@ -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
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
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,22 +212,31 @@ 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
|
+
static const unsigned char hexchars[] = "0123456789abcdef";
|
218
219
|
unsigned char c;
|
219
220
|
|
220
221
|
int i, size;
|
221
222
|
char *line;
|
222
223
|
|
223
224
|
size = mkd_line(s, len, &line, IS_LABEL);
|
224
|
-
|
225
|
-
if (
|
225
|
+
|
226
|
+
if ( !(flags & MKD_URLENCODEDANCHOR)
|
227
|
+
&& labelformat
|
228
|
+
&& (size>0) && !isalpha(line[0]) )
|
226
229
|
(*outchar)('L',out);
|
227
230
|
for ( i=0; i < size ; i++ ) {
|
228
231
|
c = line[i];
|
229
232
|
if ( labelformat ) {
|
230
233
|
if ( isalnum(c) || (c == '_') || (c == ':') || (c == '-') || (c == '.' ) )
|
231
234
|
(*outchar)(c, out);
|
235
|
+
else if ( flags & MKD_URLENCODEDANCHOR ) {
|
236
|
+
(*outchar)('%', out);
|
237
|
+
(*outchar)(hexchars[c >> 4 & 0xf], out);
|
238
|
+
(*outchar)(hexchars[c & 0xf], out);
|
239
|
+
}
|
232
240
|
else
|
233
241
|
(*outchar)('.', out);
|
234
242
|
}
|
@@ -289,15 +297,16 @@ int
|
|
289
297
|
mkd_generateline(char *bfr, int size, FILE *output, DWORD flags)
|
290
298
|
{
|
291
299
|
MMIOT f;
|
300
|
+
int status;
|
292
301
|
|
293
302
|
mkd_parse_line(bfr, size, &f, flags);
|
294
303
|
if ( flags & MKD_CDATA )
|
295
|
-
mkd_generatexml(T(f.out), S(f.out), output);
|
304
|
+
status = mkd_generatexml(T(f.out), S(f.out), output) != EOF;
|
296
305
|
else
|
297
|
-
fwrite(T(f.out), S(f.out), 1, output);
|
306
|
+
status = fwrite(T(f.out), S(f.out), 1, output) == S(f.out);
|
298
307
|
|
299
308
|
___mkd_freemmiot(&f, 0);
|
300
|
-
return 0;
|
309
|
+
return status ? 0 : EOF;
|
301
310
|
}
|
302
311
|
|
303
312
|
|
data/ext/mkdio.h
CHANGED
@@ -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()
|
data/ext/pgm_options.c
CHANGED
@@ -8,7 +8,9 @@
|
|
8
8
|
#include <stdio.h>
|
9
9
|
#include <stdlib.h>
|
10
10
|
#include <limits.h>
|
11
|
+
#ifndef _MSC_VER
|
11
12
|
#include <unistd.h>
|
13
|
+
#endif
|
12
14
|
#include <mkdio.h>
|
13
15
|
#include <errno.h>
|
14
16
|
#include <string.h>
|
@@ -25,7 +27,7 @@ static struct _opt {
|
|
25
27
|
char *name;
|
26
28
|
char *desc;
|
27
29
|
int off;
|
28
|
-
int skip;
|
30
|
+
int skip; /* this opt is a synonym */
|
29
31
|
int sayenable;
|
30
32
|
mkd_flag_t flag;
|
31
33
|
} opts[] = {
|
@@ -55,6 +57,12 @@ static struct _opt {
|
|
55
57
|
{ "footnotes", "markdown extra footnotes", 0, 0, 1, MKD_EXTRA_FOOTNOTE },
|
56
58
|
{ "footnote", "markdown extra footnotes", 0, 1, 1, MKD_EXTRA_FOOTNOTE },
|
57
59
|
{ "style", "extract style blocks", 1, 0, 1, MKD_NOSTYLE },
|
60
|
+
{ "dldiscount", "discount-style definition lists", 1, 0, 1, MKD_NODLDISCOUNT },
|
61
|
+
{ "dlextra", "extra-style definition lists", 0, 0, 1, MKD_DLEXTRA },
|
62
|
+
{ "fencedcode", "fenced code blocks", 0, 0, 1, MKD_FENCEDCODE },
|
63
|
+
{ "idanchor", "id= anchors in TOC", 0, 0, 1, MKD_IDANCHOR },
|
64
|
+
{ "githubtags", "permit - and _ in element names", 0, 0, 0, MKD_GITHUBTAGS },
|
65
|
+
{ "urlencodedanchor", "urlencode special chars in TOC links", 0, 0, 0, MKD_URLENCODEDANCHOR },
|
58
66
|
} ;
|
59
67
|
|
60
68
|
#define NR(x) (sizeof x / sizeof x[0])
|
data/ext/rdiscount.c
CHANGED
@@ -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.
|
@@ -36,6 +39,28 @@ static AccessorFlagPair ACCESSOR_2_FLAG[] = {
|
|
36
39
|
|
37
40
|
static VALUE rb_cRDiscount;
|
38
41
|
|
42
|
+
int rb_rdiscount__get_flags(VALUE ruby_obj)
|
43
|
+
{
|
44
|
+
AccessorFlagPair *entry;
|
45
|
+
|
46
|
+
/* compile flags */
|
47
|
+
int flags = MKD_TABSTOP | MKD_NOHEADER | MKD_DLEXTRA | MKD_FENCEDCODE | MKD_GITHUBTAGS;
|
48
|
+
|
49
|
+
/* The "smart" accessor turns OFF the MKD_NOPANTS flag. */
|
50
|
+
if ( rb_funcall(ruby_obj, rb_intern("smart"), 0) != Qtrue ) {
|
51
|
+
flags = flags | MKD_NOPANTS;
|
52
|
+
}
|
53
|
+
|
54
|
+
/* Handle standard flags declared in ACCESSOR_2_FLAG */
|
55
|
+
for ( entry = ACCESSOR_2_FLAG; entry->accessor_name; entry++ ) {
|
56
|
+
if ( rb_funcall(ruby_obj, rb_intern(entry->accessor_name), 0) == Qtrue ) {
|
57
|
+
flags = flags | entry->flag;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
return flags;
|
62
|
+
}
|
63
|
+
|
39
64
|
static VALUE
|
40
65
|
rb_rdiscount_to_html(int argc, VALUE *argv, VALUE self)
|
41
66
|
{
|
@@ -114,28 +139,6 @@ rb_rdiscount_toc_content(int argc, VALUE *argv, VALUE self)
|
|
114
139
|
return buf;
|
115
140
|
}
|
116
141
|
|
117
|
-
int rb_rdiscount__get_flags(VALUE ruby_obj)
|
118
|
-
{
|
119
|
-
AccessorFlagPair *entry;
|
120
|
-
|
121
|
-
/* compile flags */
|
122
|
-
int flags = MKD_TABSTOP | MKD_NOHEADER;
|
123
|
-
|
124
|
-
/* The "smart" accessor turns OFF the MKD_NOPANTS flag. */
|
125
|
-
if ( rb_funcall(ruby_obj, rb_intern("smart"), 0) != Qtrue ) {
|
126
|
-
flags = flags | MKD_NOPANTS;
|
127
|
-
}
|
128
|
-
|
129
|
-
/* Handle standard flags declared in ACCESSOR_2_FLAG */
|
130
|
-
for ( entry = ACCESSOR_2_FLAG; entry->accessor_name; entry++ ) {
|
131
|
-
if ( rb_funcall(ruby_obj, rb_intern(entry->accessor_name), 0) == Qtrue ) {
|
132
|
-
flags = flags | entry->flag;
|
133
|
-
}
|
134
|
-
}
|
135
|
-
|
136
|
-
return flags;
|
137
|
-
}
|
138
|
-
|
139
142
|
|
140
143
|
void Init_rdiscount()
|
141
144
|
{
|
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/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;
|
data/ext/version.c
CHANGED
@@ -7,24 +7,7 @@ char markdown_version[] = VERSION
|
|
7
7
|
#if USE_AMALLOC
|
8
8
|
" DEBUG"
|
9
9
|
#endif
|
10
|
-
#if
|
11
|
-
|
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
data/ext/xmlpage.c
CHANGED
@@ -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
|
-
|
27
|
-
|
28
|
-
|
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, "<
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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
|
-
|
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
|
45
|
+
return EOF;
|
48
46
|
}
|
data/lib/rdiscount.rb
CHANGED
data/rdiscount.gemspec
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'rdiscount'
|
3
|
-
s.version = '2.
|
3
|
+
s.version = '2.2.0.2'
|
4
4
|
s.summary = "Fast Implementation of Gruber's Markdown in C"
|
5
|
-
s.date = '
|
6
|
-
s.email = '
|
5
|
+
s.date = '2020-08-09'
|
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-3-Clause"
|
9
10
|
# = MANIFEST =
|
10
11
|
s.files = %w[
|
11
12
|
BUILDING
|
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>')
|
@@ -204,6 +213,17 @@ EOS
|
|
204
213
|
assert_equal "<pre><code>line 1\n\nline 2\n</code></pre>\n", rd.to_html
|
205
214
|
end
|
206
215
|
|
216
|
+
def test_that_gfm_code_blocks_work_with_language
|
217
|
+
rd = RDiscount.new(<<EOS)
|
218
|
+
```ruby
|
219
|
+
line 1
|
220
|
+
|
221
|
+
line 2
|
222
|
+
```
|
223
|
+
EOS
|
224
|
+
assert_equal "<pre><code class=\"ruby\">line 1\n\nline 2\n</code></pre>\n", rd.to_html
|
225
|
+
end
|
226
|
+
|
207
227
|
def test_that_pandoc_code_blocks_work
|
208
228
|
rd = RDiscount.new(<<EOS)
|
209
229
|
~~~
|
@@ -230,7 +250,7 @@ EOS
|
|
230
250
|
EOS
|
231
251
|
end
|
232
252
|
|
233
|
-
def
|
253
|
+
def test_that_extra_definition_lists_work
|
234
254
|
rd = RDiscount.new(<<EOS)
|
235
255
|
tag1
|
236
256
|
: data
|
@@ -242,4 +262,15 @@ EOS
|
|
242
262
|
</dl>
|
243
263
|
EOS
|
244
264
|
end
|
265
|
+
|
266
|
+
def test_that_emphasis_beside_international_characters_detected
|
267
|
+
rd = RDiscount.new(%(*foo ä bar*))
|
268
|
+
assert_equal %(<p><em>foo ä bar</em></p>\n), rd.to_html
|
269
|
+
|
270
|
+
rd = RDiscount.new(%(*ä foobar*))
|
271
|
+
assert_equal %(<p><em>ä foobar</em></p>\n), rd.to_html
|
272
|
+
|
273
|
+
rd = RDiscount.new(%(*foobar ä*))
|
274
|
+
assert_equal %(<p><em>foobar ä</em></p>\n), rd.to_html
|
275
|
+
end
|
245
276
|
end
|
metadata
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdiscount
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
5
|
-
prerelease:
|
4
|
+
version: 2.2.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ryan Tomayko
|
9
8
|
- David Loren Parsons
|
10
9
|
- Andrew White
|
11
10
|
- David Foster
|
12
|
-
autorequire:
|
11
|
+
autorequire:
|
13
12
|
bindir: bin
|
14
13
|
cert_chain: []
|
15
|
-
date:
|
14
|
+
date: 2020-08-09 00:00:00.000000000 Z
|
16
15
|
dependencies: []
|
17
|
-
description:
|
18
|
-
email:
|
16
|
+
description:
|
17
|
+
email: david@dafoster.net
|
19
18
|
executables:
|
20
19
|
- rdiscount
|
21
20
|
extensions:
|
@@ -72,30 +71,28 @@ files:
|
|
72
71
|
- test/markdown_test.rb
|
73
72
|
- test/rdiscount_test.rb
|
74
73
|
homepage: http://dafoster.net/projects/rdiscount/
|
75
|
-
licenses:
|
76
|
-
|
74
|
+
licenses:
|
75
|
+
- BSD-3-Clause
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
77
78
|
rdoc_options: []
|
78
79
|
require_paths:
|
79
80
|
- lib
|
80
81
|
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
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
|
-
none: false
|
88
87
|
requirements:
|
89
|
-
- -
|
88
|
+
- - ">="
|
90
89
|
- !ruby/object:Gem::Version
|
91
90
|
version: '0'
|
92
91
|
requirements: []
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
specification_version: 3
|
92
|
+
rubygems_version: 3.0.8
|
93
|
+
signing_key:
|
94
|
+
specification_version: 4
|
97
95
|
summary: Fast Implementation of Gruber's Markdown in C
|
98
96
|
test_files:
|
99
97
|
- test/markdown_test.rb
|
100
98
|
- test/rdiscount_test.rb
|
101
|
-
has_rdoc:
|