RedCloth 4.0.4 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of RedCloth might be problematic. Click here for more details.
- data/CHANGELOG +18 -5
- data/Manifest +57 -0
- data/Rakefile +138 -173
- data/RedCloth.gemspec +143 -0
- data/{extras → ext}/mingw-rbconfig.rb +0 -0
- data/ext/redcloth_scan/redcloth.h +27 -20
- data/ext/redcloth_scan/redcloth_attributes.c +41 -41
- data/ext/redcloth_scan/redcloth_attributes.c.rl +56 -0
- data/ext/redcloth_scan/redcloth_attributes.java.rl +96 -0
- data/ext/redcloth_scan/redcloth_attributes.rl +6 -51
- data/ext/redcloth_scan/redcloth_common.c.rl +18 -0
- data/ext/redcloth_scan/redcloth_common.java.rl +18 -0
- data/ext/redcloth_scan/redcloth_common.rl +17 -27
- data/ext/redcloth_scan/redcloth_inline.c +210 -211
- data/ext/redcloth_scan/redcloth_inline.c.rl +159 -0
- data/ext/redcloth_scan/redcloth_inline.java.rl +108 -0
- data/ext/redcloth_scan/redcloth_inline.rl +49 -198
- data/ext/redcloth_scan/redcloth_scan.c +6708 -6698
- data/ext/redcloth_scan/redcloth_scan.c.rl +227 -0
- data/ext/redcloth_scan/redcloth_scan.java.rl +555 -0
- data/ext/redcloth_scan/redcloth_scan.rl +66 -282
- data/lib/redcloth.rb +6 -0
- data/lib/redcloth/erb_extension.rb +27 -0
- data/lib/redcloth/version.rb +2 -2
- data/setup.rb +1585 -0
- data/test/basic.yml +3 -4
- data/test/code.yml +28 -2
- data/test/test_erb.rb +13 -0
- metadata +73 -38
- data/lib/redcloth_scan.bundle +0 -0
@@ -0,0 +1,159 @@
|
|
1
|
+
/*
|
2
|
+
* redcloth_inline.c.rl
|
3
|
+
*
|
4
|
+
* Copyright (C) 2008 Jason Garber
|
5
|
+
*/
|
6
|
+
#include <ruby.h>
|
7
|
+
#include "redcloth.h"
|
8
|
+
|
9
|
+
%%{
|
10
|
+
|
11
|
+
machine redcloth_inline;
|
12
|
+
include redcloth_common "redcloth_common.c.rl";
|
13
|
+
include redcloth_inline "redcloth_inline.rl";
|
14
|
+
|
15
|
+
}%%
|
16
|
+
|
17
|
+
%% write data nofinal;
|
18
|
+
|
19
|
+
VALUE
|
20
|
+
red_pass(VALUE self, VALUE regs, VALUE ref, ID meth, VALUE refs)
|
21
|
+
{
|
22
|
+
VALUE txt = rb_hash_aref(regs, ref);
|
23
|
+
if (!NIL_P(txt)) rb_hash_aset(regs, ref, redcloth_inline2(self, txt, refs));
|
24
|
+
return rb_funcall(self, meth, 1, regs);
|
25
|
+
}
|
26
|
+
|
27
|
+
VALUE
|
28
|
+
red_parse_attr(VALUE self, VALUE regs, VALUE ref)
|
29
|
+
{
|
30
|
+
VALUE txt = rb_hash_aref(regs, ref);
|
31
|
+
VALUE new_regs = redcloth_attributes(self, txt);
|
32
|
+
return rb_funcall(regs, rb_intern("update"), 1, new_regs);
|
33
|
+
}
|
34
|
+
|
35
|
+
VALUE
|
36
|
+
red_parse_link_attr(VALUE self, VALUE regs, VALUE ref)
|
37
|
+
{
|
38
|
+
VALUE txt = rb_hash_aref(regs, ref);
|
39
|
+
VALUE new_regs = redcloth_link_attributes(self, txt);
|
40
|
+
return rb_funcall(regs, rb_intern("update"), 1, new_regs);
|
41
|
+
}
|
42
|
+
|
43
|
+
VALUE
|
44
|
+
red_pass_code(VALUE self, VALUE regs, VALUE ref, ID meth)
|
45
|
+
{
|
46
|
+
VALUE txt = rb_hash_aref(regs, ref);
|
47
|
+
if (!NIL_P(txt)) {
|
48
|
+
VALUE txt2 = rb_str_new2("");
|
49
|
+
rb_str_cat_escaped_for_preformatted(self, txt2, RSTRING_PTR(txt), RSTRING_PTR(txt) + RSTRING_LEN(txt));
|
50
|
+
rb_hash_aset(regs, ref, txt2);
|
51
|
+
}
|
52
|
+
return rb_funcall(self, meth, 1, regs);
|
53
|
+
}
|
54
|
+
|
55
|
+
VALUE
|
56
|
+
red_block(VALUE self, VALUE regs, VALUE block, VALUE refs)
|
57
|
+
{
|
58
|
+
ID method;
|
59
|
+
VALUE fallback;
|
60
|
+
VALUE sym_text = ID2SYM(rb_intern("text"));
|
61
|
+
VALUE btype = rb_hash_aref(regs, ID2SYM(rb_intern("type")));
|
62
|
+
block = rb_funcall(block, rb_intern("strip"), 0);
|
63
|
+
if ((!NIL_P(block)) && !NIL_P(btype))
|
64
|
+
{
|
65
|
+
method = rb_intern(RSTRING_PTR(btype));
|
66
|
+
if (method == rb_intern("notextile")) {
|
67
|
+
rb_hash_aset(regs, sym_text, block);
|
68
|
+
} else {
|
69
|
+
rb_hash_aset(regs, sym_text, redcloth_inline2(self, block, refs));
|
70
|
+
}
|
71
|
+
if (rb_respond_to(self, method)) {
|
72
|
+
block = rb_funcall(self, method, 1, regs);
|
73
|
+
} else {
|
74
|
+
fallback = rb_hash_aref(regs, ID2SYM(rb_intern("fallback")));
|
75
|
+
if (!NIL_P(fallback)) {
|
76
|
+
rb_str_append(fallback, rb_hash_aref(regs, sym_text));
|
77
|
+
CLEAR_REGS();
|
78
|
+
rb_hash_aset(regs, sym_text, fallback);
|
79
|
+
}
|
80
|
+
block = rb_funcall(self, rb_intern("p"), 1, regs);
|
81
|
+
}
|
82
|
+
}
|
83
|
+
return block;
|
84
|
+
}
|
85
|
+
|
86
|
+
VALUE
|
87
|
+
red_blockcode(VALUE self, VALUE regs, VALUE block)
|
88
|
+
{
|
89
|
+
VALUE btype = rb_hash_aref(regs, ID2SYM(rb_intern("type")));
|
90
|
+
if (RSTRING_LEN(block) > 0)
|
91
|
+
{
|
92
|
+
rb_hash_aset(regs, ID2SYM(rb_intern("text")), block);
|
93
|
+
block = rb_funcall(self, rb_intern(RSTRING_PTR(btype)), 1, regs);
|
94
|
+
}
|
95
|
+
return block;
|
96
|
+
}
|
97
|
+
|
98
|
+
void
|
99
|
+
red_inc(VALUE regs, VALUE ref)
|
100
|
+
{
|
101
|
+
int aint = 0;
|
102
|
+
VALUE aval = rb_hash_aref(regs, ref);
|
103
|
+
if (aval != Qnil) aint = NUM2INT(aval);
|
104
|
+
rb_hash_aset(regs, ref, INT2NUM(aint + 1));
|
105
|
+
}
|
106
|
+
|
107
|
+
VALUE
|
108
|
+
redcloth_inline(self, p, pe, refs)
|
109
|
+
VALUE self;
|
110
|
+
char *p, *pe;
|
111
|
+
VALUE refs;
|
112
|
+
{
|
113
|
+
int cs, act;
|
114
|
+
char *ts, *te, *reg, *eof;
|
115
|
+
char *orig_p = p, *orig_pe = pe;
|
116
|
+
VALUE block = rb_str_new2("");
|
117
|
+
VALUE regs = Qnil;
|
118
|
+
unsigned int opts = 0;
|
119
|
+
VALUE buf = Qnil;
|
120
|
+
|
121
|
+
%% write init;
|
122
|
+
|
123
|
+
%% write exec;
|
124
|
+
|
125
|
+
return block;
|
126
|
+
}
|
127
|
+
|
128
|
+
/** Append characters to a string, escaping (&, <, >, ", ') using the formatter's escape method.
|
129
|
+
* @param str ruby string
|
130
|
+
* @param ts start of character buffer to append
|
131
|
+
* @param te end of character buffer
|
132
|
+
*/
|
133
|
+
void
|
134
|
+
rb_str_cat_escaped(self, str, ts, te)
|
135
|
+
VALUE self, str;
|
136
|
+
char *ts, *te;
|
137
|
+
{
|
138
|
+
VALUE source_str = rb_str_new(ts, te-ts);
|
139
|
+
VALUE escaped_str = rb_funcall(self, rb_intern("escape"), 1, source_str);
|
140
|
+
rb_str_concat(str, escaped_str);
|
141
|
+
}
|
142
|
+
|
143
|
+
void
|
144
|
+
rb_str_cat_escaped_for_preformatted(self, str, ts, te)
|
145
|
+
VALUE self, str;
|
146
|
+
char *ts, *te;
|
147
|
+
{
|
148
|
+
VALUE source_str = rb_str_new(ts, te-ts);
|
149
|
+
VALUE escaped_str = rb_funcall(self, rb_intern("escape_pre"), 1, source_str);
|
150
|
+
rb_str_concat(str, escaped_str);
|
151
|
+
}
|
152
|
+
|
153
|
+
VALUE
|
154
|
+
redcloth_inline2(self, str, refs)
|
155
|
+
VALUE self, str, refs;
|
156
|
+
{
|
157
|
+
StringValue(str);
|
158
|
+
return redcloth_inline(self, RSTRING_PTR(str), RSTRING_PTR(str) + RSTRING_LEN(str) + 1, refs);
|
159
|
+
}
|
@@ -0,0 +1,108 @@
|
|
1
|
+
/*
|
2
|
+
* redcloth_inline.rl
|
3
|
+
*
|
4
|
+
* Copyright (C) 2008 Jason Garber
|
5
|
+
*/
|
6
|
+
import java.io.IOException;
|
7
|
+
|
8
|
+
import org.jruby.Ruby;
|
9
|
+
import org.jruby.RubyArray;
|
10
|
+
import org.jruby.RubyClass;
|
11
|
+
import org.jruby.RubyHash;
|
12
|
+
import org.jruby.RubyModule;
|
13
|
+
import org.jruby.RubyNumeric;
|
14
|
+
import org.jruby.RubyObject;
|
15
|
+
import org.jruby.RubyString;
|
16
|
+
import org.jruby.RubySymbol;
|
17
|
+
import org.jruby.anno.JRubyMethod;
|
18
|
+
import org.jruby.runtime.Block;
|
19
|
+
import org.jruby.runtime.CallbackFactory;
|
20
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
21
|
+
import org.jruby.exceptions.RaiseException;
|
22
|
+
import org.jruby.runtime.load.BasicLibraryService;
|
23
|
+
|
24
|
+
import org.jruby.util.ByteList;
|
25
|
+
|
26
|
+
public class RedclothInline extends RedclothScanService.Base {
|
27
|
+
|
28
|
+
%%{
|
29
|
+
|
30
|
+
machine redcloth_inline;
|
31
|
+
include redcloth_common "redcloth_common.java.rl";
|
32
|
+
include redcloth_inline "redcloth_inline.rl";
|
33
|
+
|
34
|
+
}%%
|
35
|
+
|
36
|
+
%% write data nofinal;
|
37
|
+
|
38
|
+
public IRubyObject red_pass_code(IRubyObject self, IRubyObject regs, IRubyObject ref, String meth) {
|
39
|
+
IRubyObject txt = ((RubyHash)regs).aref(ref);
|
40
|
+
if(!txt.isNil()) {
|
41
|
+
IRubyObject txt2 = RubyString.newEmptyString(runtime);
|
42
|
+
strCatEscapedForPreformatted(self, txt2, ((RubyString)txt).getByteList().bytes, ((RubyString)txt).getByteList().begin, ((RubyString)txt).getByteList().begin + ((RubyString)txt).getByteList().realSize);
|
43
|
+
((RubyHash)regs).aset(ref, txt2);
|
44
|
+
}
|
45
|
+
return self.callMethod(runtime.getCurrentContext(), meth, regs);
|
46
|
+
}
|
47
|
+
|
48
|
+
public IRubyObject red_parse_attr(IRubyObject self, IRubyObject regs, IRubyObject ref) {
|
49
|
+
IRubyObject txt = ((RubyHash)regs).aref(ref);
|
50
|
+
IRubyObject new_regs = RedclothAttributes.attributes(self, txt);
|
51
|
+
return regs.callMethod(runtime.getCurrentContext(), "update", new_regs);
|
52
|
+
}
|
53
|
+
|
54
|
+
public IRubyObject red_parse_link_attr(IRubyObject self, IRubyObject regs, IRubyObject ref) {
|
55
|
+
IRubyObject txt = ((RubyHash)regs).aref(ref);
|
56
|
+
IRubyObject new_regs = RedclothAttributes.link_attributes(self, txt);
|
57
|
+
return regs.callMethod(runtime.getCurrentContext(), "update", new_regs);
|
58
|
+
}
|
59
|
+
|
60
|
+
public void PASS_CODE(IRubyObject H, String A, String T, int O) {
|
61
|
+
((RubyString)H).append(red_pass_code(self, regs, runtime.newSymbol(A), T));
|
62
|
+
}
|
63
|
+
|
64
|
+
public void PARSE_ATTR(String A) {
|
65
|
+
red_parse_attr(self, regs, runtime.newSymbol(A));
|
66
|
+
}
|
67
|
+
|
68
|
+
public void PARSE_LINK_ATTR(String A) {
|
69
|
+
red_parse_link_attr(self, regs, runtime.newSymbol(A));
|
70
|
+
}
|
71
|
+
|
72
|
+
private int opts;
|
73
|
+
private IRubyObject buf;
|
74
|
+
|
75
|
+
public RedclothInline(IRubyObject self, byte[] data, int p, int pe, IRubyObject refs) {
|
76
|
+
this.runtime = self.getRuntime();
|
77
|
+
this.self = self;
|
78
|
+
|
79
|
+
// This is GROSS but necessary for EOF matching
|
80
|
+
this.data = new byte[pe+1];
|
81
|
+
System.arraycopy(data, p, this.data, 0, pe);
|
82
|
+
this.data[pe] = 0;
|
83
|
+
|
84
|
+
this.p = 0;
|
85
|
+
this.pe = pe+1;
|
86
|
+
this.eof = this.pe;
|
87
|
+
this.orig_p = 0;
|
88
|
+
this.orig_pe = this.pe;
|
89
|
+
this.refs = refs;
|
90
|
+
this.block = RubyString.newEmptyString(runtime);
|
91
|
+
this.regs = runtime.getNil();
|
92
|
+
this.opts = 0;
|
93
|
+
this.buf = runtime.getNil();
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
public IRubyObject inline() {
|
98
|
+
%% write init;
|
99
|
+
%% write exec;
|
100
|
+
|
101
|
+
return block;
|
102
|
+
}
|
103
|
+
|
104
|
+
public static IRubyObject inline2(IRubyObject self, IRubyObject str, IRubyObject refs) {
|
105
|
+
ByteList bl = str.convertToString().getByteList();
|
106
|
+
return new RedclothInline(self, bl.bytes, bl.begin, bl.realSize, refs).inline();
|
107
|
+
}
|
108
|
+
}
|
@@ -3,28 +3,24 @@
|
|
3
3
|
*
|
4
4
|
* Copyright (C) 2008 Jason Garber
|
5
5
|
*/
|
6
|
-
#include <ruby.h>
|
7
|
-
#include "redcloth.h"
|
8
|
-
|
9
6
|
%%{
|
10
7
|
|
11
8
|
machine redcloth_inline;
|
12
|
-
include redcloth_common "redcloth_common.rl";
|
13
9
|
|
14
10
|
# links
|
15
11
|
mtext_noquotes = mtext -- '"' ;
|
16
12
|
quoted_mtext = '"' mtext_noquotes '"' ;
|
17
13
|
mtext_including_quotes = (mtext_noquotes ' "' mtext_noquotes '" ' mtext_noquotes?)+ ;
|
18
|
-
link_says = ( C_noactions "."* " "* ((quoted_mtext | mtext_including_quotes | mtext_noquotes) -- '":') ) >A %{ STORE(link_text); } ;
|
14
|
+
link_says = ( C_noactions "."* " "* ((quoted_mtext | mtext_including_quotes | mtext_noquotes) -- '":') ) >A %{ STORE("link_text"); } ;
|
19
15
|
link_says_noquotes_noactions = ( C_noquotes_noactions "."* " "* ((mtext_noquotes) -- '":') ) ;
|
20
|
-
link = ( '"' link_says '":' %A uri %{ STORE_URL(href); } ) >X ;
|
16
|
+
link = ( '"' link_says '":' %A uri %{ STORE_URL("href"); } ) >X ;
|
21
17
|
link_noquotes_noactions = ( '"' link_says_noquotes_noactions '":' uri ) ;
|
22
|
-
bracketed_link = ( '["' link_says '":' %A uri %{ STORE(href); } :> "]" ) >X ;
|
18
|
+
bracketed_link = ( '["' link_says '":' %A uri %{ STORE("href"); } :> "]" ) >X ;
|
23
19
|
|
24
20
|
# images
|
25
|
-
image_src = ( uri ) >A %{ STORE(src) } ;
|
21
|
+
image_src = ( uri ) >A %{ STORE("src"); } ;
|
26
22
|
image_is = ( A2 C ". "? image_src :> title? ) ;
|
27
|
-
image_link = ( ":" uri >A %{ STORE_URL(href); } ) ;
|
23
|
+
image_link = ( ":" uri >A %{ STORE_URL("href"); } ) ;
|
28
24
|
image = ( "["? "!" image_is "!" %A image_link? "]"? ) >X ;
|
29
25
|
|
30
26
|
# footnotes
|
@@ -43,7 +39,7 @@
|
|
43
39
|
i = "["? "__" >X mtext >A %T :> "__" "]"? ;
|
44
40
|
del = "[-" >X C ( mtext ) >A %T :>> "-]" ;
|
45
41
|
emdash_parenthetical_phrase_with_spaces = " -- " mtext " -- " ;
|
46
|
-
del_phrase = (( " " >A %{ STORE(beginning_space); } "-") >X C ( mtext ) >A %T :>> ( "-" end_markup_phrase )) - emdash_parenthetical_phrase_with_spaces ;
|
42
|
+
del_phrase = (( " " >A %{ STORE("beginning_space"); } "-") >X C ( mtext ) >A %T :>> ( "-" end_markup_phrase )) - emdash_parenthetical_phrase_with_spaces ;
|
47
43
|
ins = "["? "+" >X mtext >A %T :> "+" "]"? ;
|
48
44
|
sup = "[^" >X mtext >A %T :> "^]" ;
|
49
45
|
sup_phrase = ( "^" when starts_phrase) >X ( mtext ) >A %T :>> ( "^" end_markup_phrase ) ;
|
@@ -74,7 +70,7 @@
|
|
74
70
|
emdash = "--" ;
|
75
71
|
arrow = "->" ;
|
76
72
|
endash = " - " ;
|
77
|
-
acronym = ( [A-Z] >A [A-Z0-9]{2,} %T "(" default+ >A %{ STORE(title) } :> ")" ) >X ;
|
73
|
+
acronym = ( [A-Z] >A [A-Z0-9]{2,} %T "(" default+ >A %{ STORE("title"); } :> ")" ) >X ;
|
78
74
|
caps_noactions = upper{3,} ;
|
79
75
|
caps = ( caps_noactions >A %*T ) >X ;
|
80
76
|
dim_digit = [0-9.]+ ;
|
@@ -101,54 +97,54 @@
|
|
101
97
|
|
102
98
|
main := |*
|
103
99
|
|
104
|
-
image { INLINE(block, image); };
|
100
|
+
image { INLINE(block, "image"); };
|
105
101
|
|
106
|
-
link { PARSE_LINK_ATTR(link_text); PASS(block, name, link); };
|
107
|
-
bracketed_link { PARSE_LINK_ATTR(link_text); PASS(block, name, link); };
|
102
|
+
link { PARSE_LINK_ATTR("link_text"); PASS(block, "name", "link"); };
|
103
|
+
bracketed_link { PARSE_LINK_ATTR("link_text"); PASS(block, "name", "link"); };
|
108
104
|
|
109
|
-
code { PARSE_ATTR(text); PASS_CODE(block, text, code, opts); };
|
105
|
+
code { PARSE_ATTR("text"); PASS_CODE(block, "text", "code", opts); };
|
110
106
|
code_tag_start { CAT(block); fgoto code_tag; };
|
111
|
-
notextile { INLINE(block, notextile); };
|
112
|
-
strong { PARSE_ATTR(text); PASS(block, text, strong); };
|
113
|
-
b { PARSE_ATTR(text); PASS(block, text, b); };
|
114
|
-
em { PARSE_ATTR(text); PASS(block, text, em); };
|
115
|
-
i { PARSE_ATTR(text); PASS(block, text, i); };
|
116
|
-
del { PASS(block, text, del); };
|
117
|
-
del_phrase { PASS(block, text, del_phrase); };
|
118
|
-
ins { PARSE_ATTR(text); PASS(block, text, ins); };
|
119
|
-
sup { PARSE_ATTR(text); PASS(block, text, sup); };
|
120
|
-
sup_phrase { PARSE_ATTR(text); PASS(block, text, sup_phrase); };
|
121
|
-
sub { PARSE_ATTR(text); PASS(block, text, sub); };
|
122
|
-
sub_phrase { PARSE_ATTR(text); PASS(block, text, sub_phrase); };
|
123
|
-
span { PARSE_ATTR(text); PASS(block, text, span); };
|
124
|
-
span_phrase { PARSE_ATTR(text); PASS(block, text, span_phrase); };
|
125
|
-
cite { PARSE_ATTR(text); PASS(block, text, cite); };
|
107
|
+
notextile { INLINE(block, "notextile"); };
|
108
|
+
strong { PARSE_ATTR("text"); PASS(block, "text", "strong"); };
|
109
|
+
b { PARSE_ATTR("text"); PASS(block, "text", "b"); };
|
110
|
+
em { PARSE_ATTR("text"); PASS(block, "text", "em"); };
|
111
|
+
i { PARSE_ATTR("text"); PASS(block, "text", "i"); };
|
112
|
+
del { PASS(block, "text", "del"); };
|
113
|
+
del_phrase { PASS(block, "text", "del_phrase"); };
|
114
|
+
ins { PARSE_ATTR("text"); PASS(block, "text", "ins"); };
|
115
|
+
sup { PARSE_ATTR("text"); PASS(block, "text", "sup"); };
|
116
|
+
sup_phrase { PARSE_ATTR("text"); PASS(block, "text", "sup_phrase"); };
|
117
|
+
sub { PARSE_ATTR("text"); PASS(block, "text", "sub"); };
|
118
|
+
sub_phrase { PARSE_ATTR("text"); PASS(block, "text", "sub_phrase"); };
|
119
|
+
span { PARSE_ATTR("text"); PASS(block, "text", "span"); };
|
120
|
+
span_phrase { PARSE_ATTR("text"); PASS(block, "text", "span_phrase"); };
|
121
|
+
cite { PARSE_ATTR("text"); PASS(block, "text", "cite"); };
|
126
122
|
ignore => ignore;
|
127
|
-
snip { PASS(block, text, snip); };
|
128
|
-
quote1 { PASS(block, text, quote1); };
|
129
|
-
quote2 { PASS(block, text, quote2); };
|
130
|
-
multi_paragraph_quote { PASS(block, text, multi_paragraph_quote); };
|
123
|
+
snip { PASS(block, "text", "snip"); };
|
124
|
+
quote1 { PASS(block, "text", "quote1"); };
|
125
|
+
quote2 { PASS(block, "text", "quote2"); };
|
126
|
+
multi_paragraph_quote { PASS(block, "text", "multi_paragraph_quote"); };
|
131
127
|
|
132
|
-
ellipsis { INLINE(block, ellipsis); };
|
133
|
-
emdash { INLINE(block, emdash); };
|
134
|
-
endash { INLINE(block, endash); };
|
135
|
-
arrow { INLINE(block, arrow); };
|
136
|
-
caps { INLINE(block, caps); };
|
137
|
-
acronym { INLINE(block, acronym); };
|
138
|
-
dim { INLINE(block, dim); };
|
139
|
-
trademark { INLINE(block, trademark); };
|
140
|
-
registered { INLINE(block, registered); };
|
141
|
-
copyright { INLINE(block, copyright); };
|
142
|
-
footno { PASS(block, text, footno); };
|
143
|
-
entity { INLINE(block, entity); };
|
128
|
+
ellipsis { INLINE(block, "ellipsis"); };
|
129
|
+
emdash { INLINE(block, "emdash"); };
|
130
|
+
endash { INLINE(block, "endash"); };
|
131
|
+
arrow { INLINE(block, "arrow"); };
|
132
|
+
caps { INLINE(block, "caps"); };
|
133
|
+
acronym { INLINE(block, "acronym"); };
|
134
|
+
dim { INLINE(block, "dim"); };
|
135
|
+
trademark { INLINE(block, "trademark"); };
|
136
|
+
registered { INLINE(block, "registered"); };
|
137
|
+
copyright { INLINE(block, "copyright"); };
|
138
|
+
footno { PASS(block, "text", "footno"); };
|
139
|
+
entity { INLINE(block, "entity"); };
|
144
140
|
|
145
|
-
script_tag { INLINE(block, inline_html); };
|
146
|
-
start_tag { INLINE(block, inline_html); };
|
147
|
-
end_tag { INLINE(block, inline_html); };
|
148
|
-
empty_tag { INLINE(block, inline_html); };
|
149
|
-
html_comment { INLINE(block, inline_html); };
|
141
|
+
script_tag { INLINE(block, "inline_html"); };
|
142
|
+
start_tag { INLINE(block, "inline_html"); };
|
143
|
+
end_tag { INLINE(block, "inline_html"); };
|
144
|
+
empty_tag { INLINE(block, "inline_html"); };
|
145
|
+
html_comment { INLINE(block, "inline_html"); };
|
150
146
|
|
151
|
-
redcloth_version { INLINE(block, inline_redcloth_version); };
|
147
|
+
redcloth_version { INLINE(block, "inline_redcloth_version"); };
|
152
148
|
|
153
149
|
other_phrase => esc;
|
154
150
|
PUNCT => esc;
|
@@ -158,149 +154,4 @@
|
|
158
154
|
|
159
155
|
*|;
|
160
156
|
|
161
|
-
}
|
162
|
-
|
163
|
-
%% write data nofinal;
|
164
|
-
|
165
|
-
VALUE
|
166
|
-
red_pass(VALUE self, VALUE regs, VALUE ref, ID meth, VALUE refs)
|
167
|
-
{
|
168
|
-
VALUE txt = rb_hash_aref(regs, ref);
|
169
|
-
if (!NIL_P(txt)) rb_hash_aset(regs, ref, redcloth_inline2(self, txt, refs));
|
170
|
-
return rb_funcall(self, meth, 1, regs);
|
171
|
-
}
|
172
|
-
|
173
|
-
VALUE
|
174
|
-
red_parse_attr(VALUE self, VALUE regs, VALUE ref)
|
175
|
-
{
|
176
|
-
VALUE txt = rb_hash_aref(regs, ref);
|
177
|
-
VALUE new_regs = redcloth_attributes(self, txt);
|
178
|
-
return rb_funcall(regs, rb_intern("update"), 1, new_regs);
|
179
|
-
}
|
180
|
-
|
181
|
-
VALUE
|
182
|
-
red_parse_link_attr(VALUE self, VALUE regs, VALUE ref)
|
183
|
-
{
|
184
|
-
VALUE txt = rb_hash_aref(regs, ref);
|
185
|
-
VALUE new_regs = redcloth_link_attributes(self, txt);
|
186
|
-
return rb_funcall(regs, rb_intern("update"), 1, new_regs);
|
187
|
-
}
|
188
|
-
|
189
|
-
VALUE
|
190
|
-
red_pass_code(VALUE self, VALUE regs, VALUE ref, ID meth)
|
191
|
-
{
|
192
|
-
VALUE txt = rb_hash_aref(regs, ref);
|
193
|
-
if (!NIL_P(txt)) {
|
194
|
-
VALUE txt2 = rb_str_new2("");
|
195
|
-
rb_str_cat_escaped_for_preformatted(self, txt2, RSTRING_PTR(txt), RSTRING_PTR(txt) + RSTRING_LEN(txt));
|
196
|
-
rb_hash_aset(regs, ref, txt2);
|
197
|
-
}
|
198
|
-
return rb_funcall(self, meth, 1, regs);
|
199
|
-
}
|
200
|
-
|
201
|
-
VALUE
|
202
|
-
red_block(VALUE self, VALUE regs, VALUE block, VALUE refs)
|
203
|
-
{
|
204
|
-
ID method;
|
205
|
-
VALUE fallback;
|
206
|
-
VALUE sym_text = ID2SYM(rb_intern("text"));
|
207
|
-
VALUE btype = rb_hash_aref(regs, ID2SYM(rb_intern("type")));
|
208
|
-
block = rb_funcall(block, rb_intern("strip"), 0);
|
209
|
-
if ((!NIL_P(block)) && !NIL_P(btype))
|
210
|
-
{
|
211
|
-
method = rb_intern(RSTRING_PTR(btype));
|
212
|
-
if (method == rb_intern("notextile")) {
|
213
|
-
rb_hash_aset(regs, sym_text, block);
|
214
|
-
} else {
|
215
|
-
rb_hash_aset(regs, sym_text, redcloth_inline2(self, block, refs));
|
216
|
-
}
|
217
|
-
if (rb_respond_to(self, method)) {
|
218
|
-
block = rb_funcall(self, method, 1, regs);
|
219
|
-
} else {
|
220
|
-
fallback = rb_hash_aref(regs, ID2SYM(rb_intern("fallback")));
|
221
|
-
if (!NIL_P(fallback)) {
|
222
|
-
rb_str_append(fallback, rb_hash_aref(regs, sym_text));
|
223
|
-
CLEAR_REGS();
|
224
|
-
rb_hash_aset(regs, sym_text, fallback);
|
225
|
-
}
|
226
|
-
block = rb_funcall(self, rb_intern("p"), 1, regs);
|
227
|
-
}
|
228
|
-
}
|
229
|
-
return block;
|
230
|
-
}
|
231
|
-
|
232
|
-
VALUE
|
233
|
-
red_blockcode(VALUE self, VALUE regs, VALUE block)
|
234
|
-
{
|
235
|
-
VALUE btype = rb_hash_aref(regs, ID2SYM(rb_intern("type")));
|
236
|
-
block = rb_funcall(block, rb_intern("strip"), 0);
|
237
|
-
if (RSTRING_LEN(block) > 0)
|
238
|
-
{
|
239
|
-
rb_hash_aset(regs, ID2SYM(rb_intern("text")), block);
|
240
|
-
block = rb_funcall(self, rb_intern(RSTRING_PTR(btype)), 1, regs);
|
241
|
-
}
|
242
|
-
return block;
|
243
|
-
}
|
244
|
-
|
245
|
-
void
|
246
|
-
red_inc(VALUE regs, VALUE ref)
|
247
|
-
{
|
248
|
-
int aint = 0;
|
249
|
-
VALUE aval = rb_hash_aref(regs, ref);
|
250
|
-
if (aval != Qnil) aint = NUM2INT(aval);
|
251
|
-
rb_hash_aset(regs, ref, INT2NUM(aint + 1));
|
252
|
-
}
|
253
|
-
|
254
|
-
VALUE
|
255
|
-
redcloth_inline(self, p, pe, refs)
|
256
|
-
VALUE self;
|
257
|
-
char *p, *pe;
|
258
|
-
VALUE refs;
|
259
|
-
{
|
260
|
-
int cs, act;
|
261
|
-
char *ts, *te, *reg, *eof;
|
262
|
-
char *orig_p = p, *orig_pe = pe;
|
263
|
-
VALUE block = rb_str_new2("");
|
264
|
-
VALUE regs = Qnil;
|
265
|
-
unsigned int opts = 0;
|
266
|
-
VALUE buf = Qnil;
|
267
|
-
|
268
|
-
%% write init;
|
269
|
-
|
270
|
-
%% write exec;
|
271
|
-
|
272
|
-
return block;
|
273
|
-
}
|
274
|
-
|
275
|
-
/** Append characters to a string, escaping (&, <, >, ", ') using the formatter's escape method.
|
276
|
-
* @param str ruby string
|
277
|
-
* @param ts start of character buffer to append
|
278
|
-
* @param te end of character buffer
|
279
|
-
*/
|
280
|
-
void
|
281
|
-
rb_str_cat_escaped(self, str, ts, te)
|
282
|
-
VALUE self, str;
|
283
|
-
char *ts, *te;
|
284
|
-
{
|
285
|
-
VALUE source_str = rb_str_new(ts, te-ts);
|
286
|
-
VALUE escaped_str = rb_funcall(self, rb_intern("escape"), 1, source_str);
|
287
|
-
rb_str_concat(str, escaped_str);
|
288
|
-
}
|
289
|
-
|
290
|
-
void
|
291
|
-
rb_str_cat_escaped_for_preformatted(self, str, ts, te)
|
292
|
-
VALUE self, str;
|
293
|
-
char *ts, *te;
|
294
|
-
{
|
295
|
-
VALUE source_str = rb_str_new(ts, te-ts);
|
296
|
-
VALUE escaped_str = rb_funcall(self, rb_intern("escape_pre"), 1, source_str);
|
297
|
-
rb_str_concat(str, escaped_str);
|
298
|
-
}
|
299
|
-
|
300
|
-
VALUE
|
301
|
-
redcloth_inline2(self, str, refs)
|
302
|
-
VALUE self, str, refs;
|
303
|
-
{
|
304
|
-
StringValue(str);
|
305
|
-
return redcloth_inline(self, RSTRING_PTR(str), RSTRING_PTR(str) + RSTRING_LEN(str) + 1, refs);
|
306
|
-
}
|
157
|
+
}%%;
|