rdiscount 2.0.7.3 → 2.1.6
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/BUILDING +4 -3
- data/COPYING +25 -44
- data/Rakefile +4 -0
- data/ext/Csio.c +1 -1
- data/ext/VERSION +1 -1
- data/ext/blocktags +33 -0
- data/ext/config.h +6 -0
- data/ext/cstring.h +2 -2
- data/ext/flags.c +1 -0
- data/ext/generate.c +146 -64
- data/ext/github_flavoured.c +100 -0
- data/ext/html5.c +0 -2
- data/ext/markdown.c +229 -136
- data/ext/markdown.h +40 -3
- data/ext/mkdio.c +25 -28
- data/ext/mkdio.h +9 -2
- data/ext/mktags.c +89 -0
- data/ext/pgm_options.c +138 -0
- data/ext/pgm_options.h +9 -0
- data/ext/rdiscount.c +52 -52
- data/ext/setup.c +1 -9
- data/ext/tags.c +34 -66
- data/ext/toc.c +21 -10
- data/ext/version.c +9 -1
- data/lib/rdiscount.rb +7 -1
- data/rdiscount.gemspec +7 -2
- data/test/rdiscount_test.rb +86 -1
- metadata +7 -2
data/ext/pgm_options.h
ADDED
data/ext/rdiscount.c
CHANGED
@@ -3,6 +3,37 @@
|
|
3
3
|
#include "ruby.h"
|
4
4
|
#include "mkdio.h"
|
5
5
|
|
6
|
+
typedef struct {
|
7
|
+
char *accessor_name;
|
8
|
+
int flag;
|
9
|
+
} AccessorFlagPair;
|
10
|
+
|
11
|
+
/*
|
12
|
+
* Maps accessor names on the RDiscount object to Discount flags.
|
13
|
+
*
|
14
|
+
* The following flags are handled specially:
|
15
|
+
* - MKD_TABSTOP: Always set.
|
16
|
+
* - MKD_NOHEADER: Always set.
|
17
|
+
* - MKD_NOPANTS: Set unless the "smart" accessor returns true.
|
18
|
+
*
|
19
|
+
* See rb_rdiscount__get_flags() for the detailed implementation.
|
20
|
+
*/
|
21
|
+
static AccessorFlagPair ACCESSOR_2_FLAG[] = {
|
22
|
+
{ "filter_html", MKD_NOHTML },
|
23
|
+
{ "footnotes", MKD_EXTRA_FOOTNOTE },
|
24
|
+
{ "generate_toc", MKD_TOC },
|
25
|
+
{ "no_image", MKD_NOIMAGE },
|
26
|
+
{ "no_links", MKD_NOLINKS },
|
27
|
+
{ "no_tables", MKD_NOTABLES },
|
28
|
+
{ "strict", MKD_STRICT },
|
29
|
+
{ "autolink", MKD_AUTOLINK },
|
30
|
+
{ "safelink", MKD_SAFELINK },
|
31
|
+
{ "no_pseudo_protocols", MKD_NO_EXT },
|
32
|
+
{ "no_superscript", MKD_NOSUPERSCRIPT },
|
33
|
+
{ "no_strikethrough", MKD_NOSTRIKETHROUGH },
|
34
|
+
{ NULL, 0 } /* sentinel */
|
35
|
+
};
|
36
|
+
|
6
37
|
static VALUE rb_cRDiscount;
|
7
38
|
|
8
39
|
static VALUE
|
@@ -27,7 +58,7 @@ rb_rdiscount_to_html(int argc, VALUE *argv, VALUE self)
|
|
27
58
|
* of at least 21 bits).
|
28
59
|
*/
|
29
60
|
char *old_locale = strdup(setlocale(LC_CTYPE, NULL));
|
30
|
-
setlocale(LC_CTYPE, "C");
|
61
|
+
setlocale(LC_CTYPE, "C"); /* ASCII (and passthru characters > 127) */
|
31
62
|
|
32
63
|
MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);
|
33
64
|
|
@@ -46,8 +77,8 @@ rb_rdiscount_to_html(int argc, VALUE *argv, VALUE self)
|
|
46
77
|
|
47
78
|
/* force the input encoding */
|
48
79
|
if ( rb_respond_to(text, rb_intern("encoding")) ) {
|
49
|
-
|
50
|
-
|
80
|
+
encoding = rb_funcall(text, rb_intern("encoding"), 0);
|
81
|
+
rb_funcall(buf, rb_intern("force_encoding"), 1, encoding);
|
51
82
|
}
|
52
83
|
|
53
84
|
return buf;
|
@@ -85,55 +116,24 @@ rb_rdiscount_toc_content(int argc, VALUE *argv, VALUE self)
|
|
85
116
|
|
86
117
|
int rb_rdiscount__get_flags(VALUE ruby_obj)
|
87
118
|
{
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
/* no_image */
|
108
|
-
if ( rb_funcall(ruby_obj, rb_intern("no_image"), 0) == Qtrue)
|
109
|
-
flags = flags | MKD_NOIMAGE;
|
110
|
-
|
111
|
-
/* no_links */
|
112
|
-
if ( rb_funcall(ruby_obj, rb_intern("no_links"), 0) == Qtrue)
|
113
|
-
flags = flags | MKD_NOLINKS;
|
114
|
-
|
115
|
-
/* no_tables */
|
116
|
-
if ( rb_funcall(ruby_obj, rb_intern("no_tables"), 0) == Qtrue)
|
117
|
-
flags = flags | MKD_NOTABLES;
|
118
|
-
|
119
|
-
/* strict */
|
120
|
-
if ( rb_funcall(ruby_obj, rb_intern("strict"), 0) == Qtrue)
|
121
|
-
flags = flags | MKD_STRICT;
|
122
|
-
|
123
|
-
/* autolink */
|
124
|
-
if ( rb_funcall(ruby_obj, rb_intern("autolink"), 0) == Qtrue)
|
125
|
-
flags = flags | MKD_AUTOLINK;
|
126
|
-
|
127
|
-
/* safelink */
|
128
|
-
if ( rb_funcall(ruby_obj, rb_intern("safelink"), 0) == Qtrue)
|
129
|
-
flags = flags | MKD_SAFELINK;
|
130
|
-
|
131
|
-
/* no_pseudo_protocols */
|
132
|
-
if ( rb_funcall(ruby_obj, rb_intern("no_pseudo_protocols"), 0) == Qtrue)
|
133
|
-
flags = flags | MKD_NO_EXT;
|
134
|
-
|
135
|
-
|
136
|
-
return flags;
|
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
137
|
}
|
138
138
|
|
139
139
|
|
data/ext/setup.c
CHANGED
@@ -18,7 +18,6 @@
|
|
18
18
|
#include "amalloc.h"
|
19
19
|
#include "tags.h"
|
20
20
|
|
21
|
-
static int need_to_setup = 1;
|
22
21
|
static int need_to_initrng = 1;
|
23
22
|
|
24
23
|
void
|
@@ -29,19 +28,12 @@ mkd_initialize()
|
|
29
28
|
need_to_initrng = 0;
|
30
29
|
INITRNG(time(0));
|
31
30
|
}
|
32
|
-
if ( need_to_setup ) {
|
33
|
-
need_to_setup = 0;
|
34
|
-
mkd_prepare_tags();
|
35
|
-
}
|
36
31
|
}
|
37
32
|
|
38
33
|
|
39
34
|
void
|
40
35
|
mkd_shlib_destructor()
|
41
36
|
{
|
42
|
-
|
43
|
-
need_to_setup = 1;
|
44
|
-
mkd_deallocate_tags();
|
45
|
-
}
|
37
|
+
mkd_deallocate_tags();
|
46
38
|
}
|
47
39
|
|
data/ext/tags.c
CHANGED
@@ -4,19 +4,33 @@
|
|
4
4
|
#include "cstring.h"
|
5
5
|
#include "tags.h"
|
6
6
|
|
7
|
-
STRING(struct kw)
|
7
|
+
STRING(struct kw) extratags;
|
8
|
+
|
9
|
+
/* the standard collection of tags are built and sorted when
|
10
|
+
* discount is configured, so all we need to do is pull them
|
11
|
+
* in and use them.
|
12
|
+
*
|
13
|
+
* Additional tags still need to be allocated, sorted, and deallocated.
|
14
|
+
*/
|
15
|
+
#include "blocktags"
|
8
16
|
|
9
17
|
|
10
|
-
/* define
|
18
|
+
/* define an additional html block tag
|
11
19
|
*/
|
12
20
|
void
|
13
21
|
mkd_define_tag(char *id, int selfclose)
|
14
22
|
{
|
15
|
-
struct kw *p
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
struct kw *p;
|
24
|
+
|
25
|
+
/* only add the new tag if it doesn't exist in
|
26
|
+
* either the standard or extra tag tables.
|
27
|
+
*/
|
28
|
+
if ( !(p = mkd_search_tags(id, strlen(id))) ) {
|
29
|
+
p = &EXPAND(extratags);
|
30
|
+
p->id = id;
|
31
|
+
p->size = strlen(id);
|
32
|
+
p->selfclose = selfclose;
|
33
|
+
}
|
20
34
|
}
|
21
35
|
|
22
36
|
|
@@ -37,87 +51,41 @@ casort(struct kw *a, struct kw *b)
|
|
37
51
|
typedef int (*stfu)(const void*,const void*);
|
38
52
|
|
39
53
|
|
40
|
-
/* sort the list of html block tags for later searching
|
54
|
+
/* sort the list of extra html block tags for later searching
|
41
55
|
*/
|
42
56
|
void
|
43
57
|
mkd_sort_tags()
|
44
58
|
{
|
45
|
-
qsort(T(
|
59
|
+
qsort(T(extratags), S(extratags), sizeof(struct kw), (stfu)casort);
|
46
60
|
}
|
47
61
|
|
48
62
|
|
49
|
-
|
50
63
|
/* look for a token in the html block tag list
|
51
64
|
*/
|
52
65
|
struct kw*
|
53
66
|
mkd_search_tags(char *pat, int len)
|
54
67
|
{
|
55
68
|
struct kw key;
|
69
|
+
struct kw *ret;
|
56
70
|
|
57
71
|
key.id = pat;
|
58
72
|
key.size = len;
|
59
73
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
static int populated = 0;
|
74
|
+
if ( (ret=bsearch(&key,blocktags,NR_blocktags,sizeof key,(stfu)casort)) )
|
75
|
+
return ret;
|
65
76
|
|
77
|
+
if ( S(extratags) )
|
78
|
+
return bsearch(&key,T(extratags),S(extratags),sizeof key,(stfu)casort);
|
79
|
+
|
80
|
+
return 0;
|
81
|
+
}
|
66
82
|
|
67
|
-
/* load in the standard collection of html tags that markdown supports
|
68
|
-
*/
|
69
|
-
void
|
70
|
-
mkd_prepare_tags()
|
71
|
-
{
|
72
|
-
|
73
|
-
#define KW(x) mkd_define_tag(x, 0)
|
74
|
-
#define SC(x) mkd_define_tag(x, 1)
|
75
83
|
|
76
|
-
|
77
|
-
populated = 1;
|
78
|
-
|
79
|
-
KW("STYLE");
|
80
|
-
KW("SCRIPT");
|
81
|
-
KW("ADDRESS");
|
82
|
-
KW("BDO");
|
83
|
-
KW("BLOCKQUOTE");
|
84
|
-
KW("CENTER");
|
85
|
-
KW("DFN");
|
86
|
-
KW("DIV");
|
87
|
-
KW("OBJECT");
|
88
|
-
KW("H1");
|
89
|
-
KW("H2");
|
90
|
-
KW("H3");
|
91
|
-
KW("H4");
|
92
|
-
KW("H5");
|
93
|
-
KW("H6");
|
94
|
-
KW("LISTING");
|
95
|
-
KW("NOBR");
|
96
|
-
KW("UL");
|
97
|
-
KW("P");
|
98
|
-
KW("OL");
|
99
|
-
KW("DL");
|
100
|
-
KW("PLAINTEXT");
|
101
|
-
KW("PRE");
|
102
|
-
KW("TABLE");
|
103
|
-
KW("WBR");
|
104
|
-
KW("XMP");
|
105
|
-
SC("HR");
|
106
|
-
SC("BR");
|
107
|
-
KW("IFRAME");
|
108
|
-
KW("MAP");
|
109
|
-
|
110
|
-
mkd_sort_tags();
|
111
|
-
} /* mkd_prepare_tags */
|
112
|
-
|
113
|
-
|
114
|
-
/* destroy the blocktags list (for shared libraries)
|
84
|
+
/* destroy the extratags list (for shared libraries)
|
115
85
|
*/
|
116
86
|
void
|
117
87
|
mkd_deallocate_tags()
|
118
88
|
{
|
119
|
-
if ( S(
|
120
|
-
|
121
|
-
DELETE(blocktags);
|
122
|
-
}
|
89
|
+
if ( S(extratags) > 0 )
|
90
|
+
DELETE(extratags);
|
123
91
|
} /* mkd_deallocate_tags */
|
data/ext/toc.c
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
/*
|
2
2
|
* toc -- spit out a table of contents based on header blocks
|
3
3
|
*
|
4
|
-
* Copyright (C) 2008 Jjgod Jiang, David L Parsons
|
4
|
+
* Copyright (C) 2008 Jjgod Jiang, David L Parsons
|
5
|
+
* portions Copyright (C) 2011 Stefano D'Angelo
|
5
6
|
* The redistribution terms are provided in the COPYRIGHT file that must
|
6
7
|
* be distributed with this source code.
|
7
8
|
*/
|
@@ -23,6 +24,7 @@ mkd_toc(Document *p, char **doc)
|
|
23
24
|
int last_hnumber = 0;
|
24
25
|
Cstring res;
|
25
26
|
int size;
|
27
|
+
int first = 1;
|
26
28
|
|
27
29
|
if ( !(doc && p && p->ctx) ) return -1;
|
28
30
|
|
@@ -38,16 +40,23 @@ mkd_toc(Document *p, char **doc)
|
|
38
40
|
for ( srcp = tp->down; srcp; srcp = srcp->next ) {
|
39
41
|
if ( srcp->typ == HDR && srcp->text ) {
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
while ( last_hnumber > srcp->hnumber ) {
|
44
|
+
if ( (last_hnumber - srcp->hnumber) > 1 )
|
45
|
+
Csprintf(&res, "\n");
|
46
|
+
Csprintf(&res, "</li>\n%*s</ul>\n%*s",
|
47
|
+
last_hnumber-1, "", last_hnumber-1, "");
|
48
|
+
--last_hnumber;
|
46
49
|
}
|
47
50
|
|
51
|
+
if ( last_hnumber == srcp->hnumber )
|
52
|
+
Csprintf(&res, "</li>\n");
|
53
|
+
else if ( (srcp->hnumber > last_hnumber) && !first )
|
54
|
+
Csprintf(&res, "\n");
|
55
|
+
|
48
56
|
while ( srcp->hnumber > last_hnumber ) {
|
49
|
-
Csprintf(&res, "%*s
|
50
|
-
|
57
|
+
Csprintf(&res, "%*s<ul>\n", last_hnumber, "");
|
58
|
+
if ( (srcp->hnumber - last_hnumber) > 1 )
|
59
|
+
Csprintf(&res, "%*s<li>\n", last_hnumber+1, "");
|
51
60
|
++last_hnumber;
|
52
61
|
}
|
53
62
|
Csprintf(&res, "%*s<li><a href=\"#", srcp->hnumber, "");
|
@@ -59,7 +68,8 @@ mkd_toc(Document *p, char **doc)
|
|
59
68
|
S(srcp->text->text),
|
60
69
|
(mkd_sta_function_t)Csputc, &res,0);
|
61
70
|
Csprintf(&res, "</a>");
|
62
|
-
|
71
|
+
|
72
|
+
first = 0;
|
63
73
|
}
|
64
74
|
}
|
65
75
|
}
|
@@ -67,7 +77,8 @@ mkd_toc(Document *p, char **doc)
|
|
67
77
|
|
68
78
|
while ( last_hnumber > 0 ) {
|
69
79
|
--last_hnumber;
|
70
|
-
Csprintf(&res,
|
80
|
+
Csprintf(&res, "</li>\n%*s</ul>\n%*s",
|
81
|
+
last_hnumber, "", last_hnumber, "");
|
71
82
|
}
|
72
83
|
|
73
84
|
if ( (size = S(res)) > 0 ) {
|
data/ext/version.c
CHANGED
data/lib/rdiscount.rb
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
# end
|
25
25
|
#
|
26
26
|
class RDiscount
|
27
|
-
VERSION = '2.
|
27
|
+
VERSION = '2.1.6'
|
28
28
|
|
29
29
|
# Original Markdown formatted text.
|
30
30
|
attr_reader :text
|
@@ -68,6 +68,12 @@ class RDiscount
|
|
68
68
|
|
69
69
|
# Do not process pseudo-protocols like <tt>[](id:name)</tt>
|
70
70
|
attr_accessor :no_pseudo_protocols
|
71
|
+
|
72
|
+
# Disable superscript processing.
|
73
|
+
attr_accessor :no_superscript
|
74
|
+
|
75
|
+
# Disable strikethrough processing.
|
76
|
+
attr_accessor :no_strikethrough
|
71
77
|
|
72
78
|
# Create a RDiscount Markdown processor. The +text+ argument
|
73
79
|
# should be a string containing Markdown text. Additional arguments may be
|
data/rdiscount.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'rdiscount'
|
3
|
-
s.version = '2.
|
3
|
+
s.version = '2.1.6'
|
4
4
|
s.summary = "Fast Implementation of Gruber's Markdown in C"
|
5
|
-
s.date = '2013-05-
|
5
|
+
s.date = '2013-05-28'
|
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"]
|
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
ext/amalloc.c
|
20
20
|
ext/amalloc.h
|
21
21
|
ext/basename.c
|
22
|
+
ext/blocktags
|
22
23
|
ext/config.h
|
23
24
|
ext/css.c
|
24
25
|
ext/cstring.h
|
@@ -28,11 +29,15 @@ Gem::Specification.new do |s|
|
|
28
29
|
ext/extconf.rb
|
29
30
|
ext/flags.c
|
30
31
|
ext/generate.c
|
32
|
+
ext/github_flavoured.c
|
31
33
|
ext/html5.c
|
32
34
|
ext/markdown.c
|
33
35
|
ext/markdown.h
|
34
36
|
ext/mkdio.c
|
35
37
|
ext/mkdio.h
|
38
|
+
ext/mktags.c
|
39
|
+
ext/pgm_options.c
|
40
|
+
ext/pgm_options.h
|
36
41
|
ext/rdiscount.c
|
37
42
|
ext/resource.c
|
38
43
|
ext/setup.c
|