RedCloth 4.1.0-universal-java
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 +103 -0
- data/COPYING +18 -0
- data/Manifest +57 -0
- data/README +156 -0
- data/Rakefile +205 -0
- data/RedCloth.gemspec +141 -0
- data/bin/redcloth +28 -0
- data/ext/mingw-rbconfig.rb +176 -0
- data/ext/redcloth_scan/extconf.rb +9 -0
- data/ext/redcloth_scan/redcloth.h +164 -0
- 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 +33 -0
- 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 +111 -0
- 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 +157 -0
- 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 +323 -0
- data/extras/ragel_profiler.rb +73 -0
- data/lib/case_sensitive_require/RedCloth.rb +6 -0
- data/lib/redcloth.rb +37 -0
- data/lib/redcloth/erb_extension.rb +27 -0
- data/lib/redcloth/formatters/base.rb +57 -0
- data/lib/redcloth/formatters/html.rb +349 -0
- data/lib/redcloth/formatters/latex.rb +249 -0
- data/lib/redcloth/formatters/latex_entities.yml +2414 -0
- data/lib/redcloth/textile_doc.rb +105 -0
- data/lib/redcloth/version.rb +28 -0
- data/lib/redcloth_scan.jar +0 -0
- data/setup.rb +1585 -0
- data/test/basic.yml +870 -0
- data/test/code.yml +229 -0
- data/test/definitions.yml +82 -0
- data/test/extra_whitespace.yml +64 -0
- data/test/filter_html.yml +177 -0
- data/test/filter_pba.yml +20 -0
- data/test/helper.rb +108 -0
- data/test/html.yml +305 -0
- data/test/images.yml +246 -0
- data/test/instiki.yml +38 -0
- data/test/links.yml +259 -0
- data/test/lists.yml +283 -0
- data/test/poignant.yml +89 -0
- data/test/sanitize_html.yml +42 -0
- data/test/table.yml +267 -0
- data/test/test_custom_tags.rb +46 -0
- data/test/test_erb.rb +13 -0
- data/test/test_extensions.rb +31 -0
- data/test/test_formatters.rb +24 -0
- data/test/test_parser.rb +73 -0
- data/test/test_restrictions.rb +41 -0
- data/test/textism.yml +480 -0
- data/test/threshold.yml +772 -0
- data/test/validate_fixtures.rb +73 -0
- metadata +139 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
/*
|
2
|
+
* redcloth_attributes.c.rl
|
3
|
+
*
|
4
|
+
* Copyright (C) 2008 Jason Garber
|
5
|
+
*/
|
6
|
+
#include <ruby.h>
|
7
|
+
#include "redcloth.h"
|
8
|
+
|
9
|
+
%%{
|
10
|
+
|
11
|
+
machine redcloth_attributes;
|
12
|
+
include redcloth_common "redcloth_common.c.rl";
|
13
|
+
include redcloth_attributes "redcloth_attributes.rl";
|
14
|
+
|
15
|
+
}%%
|
16
|
+
|
17
|
+
%% write data nofinal;
|
18
|
+
|
19
|
+
|
20
|
+
VALUE
|
21
|
+
redcloth_attribute_parser(machine, self, p, pe)
|
22
|
+
int machine;
|
23
|
+
VALUE self;
|
24
|
+
char *p, *pe;
|
25
|
+
{
|
26
|
+
int cs, act;
|
27
|
+
char *ts, *te, *reg, *bck, *eof;
|
28
|
+
VALUE regs = rb_hash_new();
|
29
|
+
VALUE buf = Qnil;
|
30
|
+
|
31
|
+
%% write init;
|
32
|
+
|
33
|
+
cs = machine;
|
34
|
+
|
35
|
+
%% write exec;
|
36
|
+
|
37
|
+
return regs;
|
38
|
+
}
|
39
|
+
|
40
|
+
VALUE
|
41
|
+
redcloth_attributes(self, str)
|
42
|
+
VALUE self, str;
|
43
|
+
{
|
44
|
+
StringValue(str);
|
45
|
+
int cs = redcloth_attributes_en_inline;
|
46
|
+
return redcloth_attribute_parser(cs, self, RSTRING_PTR(str), RSTRING_PTR(str) + RSTRING_LEN(str) + 1);
|
47
|
+
}
|
48
|
+
|
49
|
+
VALUE
|
50
|
+
redcloth_link_attributes(self, str)
|
51
|
+
VALUE self, str;
|
52
|
+
{
|
53
|
+
StringValue(str);
|
54
|
+
int cs = redcloth_attributes_en_link_says;
|
55
|
+
return redcloth_attribute_parser(cs, self, RSTRING_PTR(str), RSTRING_PTR(str) + RSTRING_LEN(str) + 1);
|
56
|
+
}
|
@@ -0,0 +1,96 @@
|
|
1
|
+
/*
|
2
|
+
* redcloth_attributes.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 RedclothAttributes extends RedclothScanService.Base {
|
27
|
+
|
28
|
+
%%{
|
29
|
+
|
30
|
+
machine redcloth_attributes;
|
31
|
+
include redcloth_common "redcloth_common.java.rl";
|
32
|
+
include redcloth_attributes "redcloth_attributes.rl";
|
33
|
+
|
34
|
+
}%%
|
35
|
+
|
36
|
+
%% write data nofinal;
|
37
|
+
|
38
|
+
public void SET_ATTRIBUTES() {
|
39
|
+
SET_ATTRIBUTE("class_buf", "class");
|
40
|
+
SET_ATTRIBUTE("id_buf", "id");
|
41
|
+
SET_ATTRIBUTE("lang_buf", "lang");
|
42
|
+
SET_ATTRIBUTE("style_buf", "style");
|
43
|
+
}
|
44
|
+
|
45
|
+
public void SET_ATTRIBUTE(String B, String A) {
|
46
|
+
buf = ((RubyHash)regs).aref(runtime.newSymbol(B));
|
47
|
+
if(!buf.isNil()) {
|
48
|
+
((RubyHash)regs).aset(runtime.newSymbol(A), buf);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
private int machine;
|
53
|
+
private IRubyObject buf;
|
54
|
+
|
55
|
+
public RedclothAttributes(int machine, IRubyObject self, byte[] data, int p, int pe) {
|
56
|
+
this.runtime = self.getRuntime();
|
57
|
+
this.self = self;
|
58
|
+
|
59
|
+
// This is GROSS but necessary for EOF matching
|
60
|
+
this.data = new byte[pe+1];
|
61
|
+
System.arraycopy(data, p, this.data, 0, pe);
|
62
|
+
this.data[pe] = 0;
|
63
|
+
|
64
|
+
this.p = 0;
|
65
|
+
this.pe = pe+1;
|
66
|
+
this.eof = this.pe;
|
67
|
+
this.orig_p = 0;
|
68
|
+
this.orig_pe = this.pe;
|
69
|
+
|
70
|
+
this.regs = RubyHash.newHash(runtime);
|
71
|
+
this.buf = runtime.getNil();
|
72
|
+
this.machine = machine;
|
73
|
+
}
|
74
|
+
|
75
|
+
public IRubyObject parse() {
|
76
|
+
%% write init;
|
77
|
+
|
78
|
+
cs = machine;
|
79
|
+
|
80
|
+
%% write exec;
|
81
|
+
|
82
|
+
return regs;
|
83
|
+
}
|
84
|
+
|
85
|
+
public static IRubyObject attributes(IRubyObject self, IRubyObject str) {
|
86
|
+
ByteList bl = str.convertToString().getByteList();
|
87
|
+
int cs = redcloth_attributes_en_inline;
|
88
|
+
return new RedclothAttributes(cs, self, bl.bytes, bl.begin, bl.realSize).parse();
|
89
|
+
}
|
90
|
+
|
91
|
+
public static IRubyObject link_attributes(IRubyObject self, IRubyObject str) {
|
92
|
+
ByteList bl = str.convertToString().getByteList();
|
93
|
+
int cs = redcloth_attributes_en_link_says;
|
94
|
+
return new RedclothAttributes(cs, self, bl.bytes, bl.begin, bl.realSize).parse();
|
95
|
+
}
|
96
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
/*
|
2
|
+
* redcloth_attributes.rl
|
3
|
+
*
|
4
|
+
* Copyright (C) 2008 Jason Garber
|
5
|
+
*/
|
6
|
+
%%{
|
7
|
+
|
8
|
+
machine redcloth_attributes;
|
9
|
+
|
10
|
+
C2_CLAS = ( "(" ( [^)#]+ >A %{ STORE("class_buf"); } )? ("#" [^)]+ >A %{STORE("id_buf");} )? ")" ) ;
|
11
|
+
C2_LNGE = ( "[" [^\]]+ >A %{ STORE("lang_buf"); } "]" ) ;
|
12
|
+
C2_STYL = ( "{" [^}]+ >A %{ STORE("style_buf"); } "}" ) ;
|
13
|
+
C2 = ( C2_CLAS | C2_STYL | C2_LNGE )+ ;
|
14
|
+
|
15
|
+
mtext_with_attributes = ( C2 mtext >A %T ) >X ;
|
16
|
+
|
17
|
+
inline := |*
|
18
|
+
|
19
|
+
mtext_with_attributes { SET_ATTRIBUTES(); } ;
|
20
|
+
|
21
|
+
*|;
|
22
|
+
|
23
|
+
link_text_with_attributes = C2 "."* " "* ( mtext+ ) >A %{ STORE("name"); } ;
|
24
|
+
link_text_without_attributes = ( mtext+ ) >B %{ STORE_B("name_without_attributes"); } ;
|
25
|
+
|
26
|
+
link_says := |*
|
27
|
+
|
28
|
+
link_text_with_attributes { SET_ATTRIBUTES(); } ;
|
29
|
+
link_text_without_attributes { SET_ATTRIBUTE("name_without_attributes", "name"); } ;
|
30
|
+
|
31
|
+
*|;
|
32
|
+
|
33
|
+
}%%;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
%%{
|
2
|
+
|
3
|
+
machine redcloth_common;
|
4
|
+
include redcloth_common "redcloth_common.rl";
|
5
|
+
|
6
|
+
action esc { rb_str_cat_escaped(self, block, ts, te); }
|
7
|
+
action esc_pre { rb_str_cat_escaped_for_preformatted(self, block, ts, te); }
|
8
|
+
action ignore { rb_str_append(block, rb_funcall(self, rb_intern("ignore"), 1, regs)); }
|
9
|
+
|
10
|
+
# conditionals
|
11
|
+
action starts_line {
|
12
|
+
p == orig_p || *(p-1) == '\r' || *(p-1) == '\n' || *(p-1) == '\f'
|
13
|
+
}
|
14
|
+
action starts_phrase {
|
15
|
+
p == orig_p || *(p-1) == '\r' || *(p-1) == '\n' || *(p-1) == '\f' || *(p-1) == ' '
|
16
|
+
}
|
17
|
+
|
18
|
+
}%%;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
%%{
|
2
|
+
|
3
|
+
machine redcloth_common;
|
4
|
+
include redcloth_common "redcloth_common.rl";
|
5
|
+
|
6
|
+
action esc { strCatEscaped(self, block, data, ts, te); }
|
7
|
+
action esc_pre { strCatEscapedForPreformatted(self, block, data, ts, te); }
|
8
|
+
action ignore { ((RubyString)block).append(self.callMethod(runtime.getCurrentContext(), "ignore", regs)); }
|
9
|
+
|
10
|
+
# conditionals
|
11
|
+
action starts_line {
|
12
|
+
p == orig_p || data[(p-1)] == '\r' || data[(p-1)] == '\n' || data[(p-1)] == '\f'
|
13
|
+
}
|
14
|
+
action starts_phrase {
|
15
|
+
p == orig_p || data[(p-1)] == '\r' || data[(p-1)] == '\n' || data[(p-1)] == '\f' || data[(p-1)] == ' '
|
16
|
+
}
|
17
|
+
|
18
|
+
}%%;
|
@@ -0,0 +1,111 @@
|
|
1
|
+
%%{
|
2
|
+
|
3
|
+
machine redcloth_common;
|
4
|
+
|
5
|
+
action A { reg = p; }
|
6
|
+
action B { bck = p; }
|
7
|
+
action T { STORE("text"); }
|
8
|
+
action X { CLEAR_REGS(); RESET_REG(); }
|
9
|
+
action cat { CAT(block); }
|
10
|
+
|
11
|
+
# simple
|
12
|
+
LF = ( '\n' ) ;
|
13
|
+
default = ^0 ;
|
14
|
+
EOF = 0 ;
|
15
|
+
|
16
|
+
# textile modifiers
|
17
|
+
A_LEFT = "<" %{ ASET("align", "left"); } ;
|
18
|
+
A_RIGHT = ">" %{ ASET("align", "right"); } ;
|
19
|
+
A_JUSTIFIED = "<>" %{ ASET("align", "justify"); } ;
|
20
|
+
A_CENTER = "=" %{ ASET("align", "center"); } ;
|
21
|
+
A_PADLEFT = "(" >A %{ AINC("padding-left"); } ;
|
22
|
+
A_PADRIGHT = ")" >A %{ AINC("padding-right"); } ;
|
23
|
+
A_HLGN = ( A_LEFT | A_RIGHT | A_JUSTIFIED | A_CENTER | A_PADLEFT | A_PADRIGHT ) ;
|
24
|
+
A_LIMIT = ( A_LEFT | A_CENTER | A_RIGHT ) ;
|
25
|
+
A_VLGN = ( "-" %{ ASET("vertical-align", "middle"); } | "^" %{ ASET("vertical-align", "top"); } | "~" %{ ASET("vertical-align", "bottom"); } ) ;
|
26
|
+
C_CLAS = ( "(" ( [^)#]+ >A %{ STORE("class"); } )? ("#" [^)]+ >A %{STORE("id");} )? ")" ) ;
|
27
|
+
C_LNGE = ( "[" [^\]]+ >A %{ STORE("lang"); } "]" ) ;
|
28
|
+
C_STYL = ( "{" [^}]+ >A %{ STORE("style"); } "}" ) ;
|
29
|
+
S_CSPN = ( "\\" [0-9]+ >A %{ STORE("colspan"); } ) ;
|
30
|
+
S_RSPN = ( "/" [0-9]+ >A %{ STORE("rowspan"); } ) ;
|
31
|
+
D_HEADER = "_" %{ ASET("th", "true"); } ;
|
32
|
+
A = ( ( A_HLGN | A_VLGN )* ) ;
|
33
|
+
A2 = ( A_LIMIT? ) ;
|
34
|
+
S = ( S_CSPN | S_RSPN )* ;
|
35
|
+
C = ( C_CLAS | C_STYL | C_LNGE )* ;
|
36
|
+
D = ( D_HEADER ) ;
|
37
|
+
N_CONT = "_" %{ list_continue = 1; };
|
38
|
+
N_NUM = digit+ >A %{ STORE("start"); };
|
39
|
+
N = ( N_CONT | N_NUM )? ;
|
40
|
+
PUNCT = ( "!" | '"' | "#" | "$" | "%" | "&" | "'" | "," | "-" | "." | "/" | ":" | ";" | "=" | "?" | "\\" | "^" | "`" | "|" | "~" | "[" | "]" | "(" | ")" | "<" ) ;
|
41
|
+
dotspace = ("." " "*) ;
|
42
|
+
indent = [ \t]* ;
|
43
|
+
|
44
|
+
# very un-DRY; Adrian says an action-stripping macro will come in a future Ragel version
|
45
|
+
A_LEFT_noactions = "<" ;
|
46
|
+
A_RIGHT_noactions = ">" ;
|
47
|
+
A_JUSTIFIED_noactions = "<>" ;
|
48
|
+
A_CENTER_noactions = "=" ;
|
49
|
+
A_PADLEFT_noactions = "(" ;
|
50
|
+
A_PADRIGHT_noactions = ")" ;
|
51
|
+
A_HLGN_noactions = ( A_LEFT_noactions | A_RIGHT_noactions | A_JUSTIFIED_noactions | A_CENTER_noactions | A_PADLEFT_noactions | A_PADRIGHT_noactions ) ;
|
52
|
+
A_VLGN_noactions = ( "-" | "^" | "~" ) ;
|
53
|
+
C_CLAS_noactions = ( "(" ( [^)#]+ )? ("#" [^)]+ )? ")" ) ;
|
54
|
+
C_LNGE_noactions = ( "[" [^\]]+ "]" ) ;
|
55
|
+
C_STYL_noactions = ( "{" [^}]+ "}" ) ;
|
56
|
+
A_noactions = ( ( A_HLGN_noactions | A_VLGN_noactions )* ) ;
|
57
|
+
C_noactions = ( C_CLAS_noactions | C_STYL_noactions | C_LNGE_noactions )* ;
|
58
|
+
C_noquotes_noactions = C_noactions -- '"' ;
|
59
|
+
|
60
|
+
# text blocks
|
61
|
+
trailing = PUNCT - ("'" | '"') ;
|
62
|
+
chars = (default - space)+ ;
|
63
|
+
phrase = chars -- trailing ;
|
64
|
+
|
65
|
+
# html tags (from Hpricot)
|
66
|
+
NameChar = [\-A-Za-z0-9._:?] ;
|
67
|
+
Name = [A-Za-z_:] NameChar* ;
|
68
|
+
NameAttr = NameChar+ ;
|
69
|
+
Q1Attr = [^']* ;
|
70
|
+
Q2Attr = [^"]* ;
|
71
|
+
UnqAttr = ( space | [^ \t\r\n<>"'] [^ \t\r\n<>]* ) ;
|
72
|
+
Nmtoken = NameChar+ ;
|
73
|
+
Attr = NameAttr space* "=" space* ('"' Q2Attr '"' | "'" Q1Attr "'" | UnqAttr space+ ) space* ;
|
74
|
+
AttrEnd = ( NameAttr space* "=" space* UnqAttr? | Nmtoken ) ;
|
75
|
+
AttrSet = ( Attr | Nmtoken space+ ) ;
|
76
|
+
|
77
|
+
script_tag_start = ( "<script" [^>]* ">" ) >X >A %T ;
|
78
|
+
script_tag_end = ( "</script>" >A %T LF? ) >X ;
|
79
|
+
|
80
|
+
|
81
|
+
# URI tokens (lifted from Mongrel)
|
82
|
+
CTL = (cntrl | 127);
|
83
|
+
safe = ("$" | "-" | "_" | ".");
|
84
|
+
extra = ("!" | "*" | "'" | "(" | ")" | "," | "#");
|
85
|
+
reserved = (";" | "/" | "?" | ":" | "@" | "&" | "=" | "+");
|
86
|
+
unsafe = (CTL | " " | "\"" | "%" | "<" | ">");
|
87
|
+
national = any -- (alpha | digit | reserved | extra | safe | unsafe);
|
88
|
+
unreserved = (alpha | digit | safe | extra | national);
|
89
|
+
escape = ("%" xdigit xdigit);
|
90
|
+
uchar = (unreserved | escape);
|
91
|
+
pchar = (uchar | ":" | "@" | "&" | "=" | "+");
|
92
|
+
scheme = ( alpha | digit | "+" | "-" | "." )+ ;
|
93
|
+
absolute_uri = (scheme ":" (uchar | reserved )*);
|
94
|
+
safepath = (pchar* (alpha | digit | safe) pchar*) ;
|
95
|
+
path = (safepath ( "/" pchar* )*) ;
|
96
|
+
query = ( uchar | reserved )* ;
|
97
|
+
param = ( pchar | "/" )* ;
|
98
|
+
params = (param ( ";" param )*) ;
|
99
|
+
rel_path = (path (";" params)?) ("?" query)?;
|
100
|
+
absolute_path = ("/"+ rel_path?);
|
101
|
+
target = ("#" pchar*) ;
|
102
|
+
uri = (target | absolute_uri | absolute_path | rel_path) ;
|
103
|
+
|
104
|
+
# common
|
105
|
+
title = ( '(' default+ >A %{ STORE("title"); } :> ')' ) ;
|
106
|
+
word = ( alnum | safe | " " ) ;
|
107
|
+
mspace = ( ( " " | "\t" | LF )+ ) -- LF{2} ;
|
108
|
+
mtext = ( chars (mspace chars)* ) ;
|
109
|
+
|
110
|
+
|
111
|
+
}%%;
|
@@ -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
|
+
}
|