RedCloth 4.1.9-universal-java → 4.2.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 +55 -0
- data/Manifest +34 -38
- data/README +17 -5
- data/Rakefile +79 -30
- data/RedCloth.gemspec +8 -9
- data/ext/redcloth_scan/redcloth.h +38 -13
- data/lib/redcloth.rb +9 -3
- data/lib/redcloth/formatters/html.rb +2 -2
- data/lib/redcloth/formatters/latex.rb +99 -54
- data/lib/redcloth/formatters/latex_entities.yml +2 -2
- data/lib/redcloth/version.rb +9 -4
- data/lib/redcloth_scan.jar +0 -0
- data/lib/tasks/pureruby.rake +12 -0
- data/spec/custom_tags_spec.rb +50 -0
- data/spec/differs/inline.rb +48 -0
- data/{test/test_erb.rb → spec/erb_spec.rb} +6 -9
- data/spec/extension_spec.rb +26 -0
- data/{test → spec/fixtures}/basic.yml +90 -4
- data/{test → spec/fixtures}/code.yml +29 -0
- data/{test → spec/fixtures}/definitions.yml +0 -0
- data/{test → spec/fixtures}/extra_whitespace.yml +0 -0
- data/{test → spec/fixtures}/filter_html.yml +0 -0
- data/{test → spec/fixtures}/filter_pba.yml +0 -0
- data/{test → spec/fixtures}/html.yml +15 -0
- data/{test → spec/fixtures}/images.yml +16 -6
- data/{test → spec/fixtures}/instiki.yml +0 -0
- data/{test → spec/fixtures}/links.yml +7 -1
- data/{test → spec/fixtures}/lists.yml +162 -1
- data/{test → spec/fixtures}/poignant.yml +0 -0
- data/{test → spec/fixtures}/sanitize_html.yml +0 -0
- data/{test → spec/fixtures}/table.yml +121 -23
- data/{test → spec/fixtures}/textism.yml +44 -15
- data/{test → spec/fixtures}/threshold.yml +6 -14
- data/spec/formatters/class_filtered_html_spec.rb +7 -0
- data/spec/formatters/filtered_html_spec.rb +7 -0
- data/spec/formatters/html_no_breaks_spec.rb +9 -0
- data/spec/formatters/html_spec.rb +13 -0
- data/spec/formatters/id_filtered_html_spec.rb +7 -0
- data/spec/formatters/latex_spec.rb +13 -0
- data/spec/formatters/lite_mode_html_spec.rb +7 -0
- data/spec/formatters/no_span_caps_html_spec.rb +7 -0
- data/spec/formatters/sanitized_html_spec.rb +7 -0
- data/spec/formatters/style_filtered_html_spec.rb +7 -0
- data/spec/parser_spec.rb +95 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +42 -0
- metadata +46 -51
- data/ext/mingw-rbconfig.rb +0 -176
- data/ext/redcloth_scan/redcloth_attributes.c.rl +0 -55
- data/ext/redcloth_scan/redcloth_attributes.java.rl +0 -95
- data/ext/redcloth_scan/redcloth_attributes.rl +0 -33
- data/ext/redcloth_scan/redcloth_common.c.rl +0 -18
- data/ext/redcloth_scan/redcloth_common.java.rl +0 -18
- data/ext/redcloth_scan/redcloth_common.rl +0 -115
- data/ext/redcloth_scan/redcloth_inline.c.rl +0 -193
- data/ext/redcloth_scan/redcloth_inline.java.rl +0 -140
- data/ext/redcloth_scan/redcloth_inline.rl +0 -156
- data/ext/redcloth_scan/redcloth_scan.c.rl +0 -228
- data/ext/redcloth_scan/redcloth_scan.java.rl +0 -577
- data/ext/redcloth_scan/redcloth_scan.rl +0 -320
- data/extras/ragel_profiler.rb +0 -73
- data/test/helper.rb +0 -108
- data/test/test_custom_tags.rb +0 -58
- data/test/test_extensions.rb +0 -31
- data/test/test_formatters.rb +0 -24
- data/test/test_parser.rb +0 -73
- data/test/test_restrictions.rb +0 -41
- data/test/validate_fixtures.rb +0 -74
@@ -1,140 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* redcloth_inline.rl
|
3
|
-
*
|
4
|
-
* Copyright (C) 2009 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 = red_parse_title(RedclothAttributes.link_attributes(self, txt), ref);
|
57
|
-
return regs.callMethod(runtime.getCurrentContext(), "update", new_regs);
|
58
|
-
}
|
59
|
-
|
60
|
-
public IRubyObject red_parse_image_attr(IRubyObject self, IRubyObject regs, IRubyObject ref) {
|
61
|
-
return red_parse_title(regs, ref);
|
62
|
-
}
|
63
|
-
|
64
|
-
public IRubyObject red_parse_title(IRubyObject regs, IRubyObject ref) {
|
65
|
-
IRubyObject name = ((RubyHash)regs).aref(ref);
|
66
|
-
if ( !name.isNil() ) {
|
67
|
-
String s = name.convertToString().toString();
|
68
|
-
int p = s.length();
|
69
|
-
if (s.charAt(p - 1) == ')') {
|
70
|
-
int level = -1;
|
71
|
-
p--;
|
72
|
-
while (p > 0 && level < 0) {
|
73
|
-
switch(s.charAt(p - 1)) {
|
74
|
-
case '(': ++level; break;
|
75
|
-
case ')': --level; break;
|
76
|
-
}
|
77
|
-
--p;
|
78
|
-
}
|
79
|
-
IRubyObject title = runtime.newString(s.substring(p + 1, s.length() - 1));
|
80
|
-
if(p > 0 && s.charAt(p - 1) == ' ') --p;
|
81
|
-
if(p != 0) {
|
82
|
-
((RubyHash)regs).aset(ref, runtime.newString(s.substring(0, p)));
|
83
|
-
((RubyHash)regs).aset(runtime.newSymbol("title"), title);
|
84
|
-
}
|
85
|
-
}
|
86
|
-
}
|
87
|
-
return regs;
|
88
|
-
}
|
89
|
-
|
90
|
-
public void PASS_CODE(IRubyObject H, String A, String T, int O) {
|
91
|
-
((RubyString)H).append(red_pass_code(self, regs, runtime.newSymbol(A), T));
|
92
|
-
}
|
93
|
-
|
94
|
-
public void PARSE_ATTR(String A) {
|
95
|
-
red_parse_attr(self, regs, runtime.newSymbol(A));
|
96
|
-
}
|
97
|
-
|
98
|
-
public void PARSE_LINK_ATTR(String A) {
|
99
|
-
red_parse_link_attr(self, regs, runtime.newSymbol(A));
|
100
|
-
}
|
101
|
-
|
102
|
-
public void PARSE_IMAGE_ATTR(String A) {
|
103
|
-
red_parse_image_attr(self, regs, runtime.newSymbol(A));
|
104
|
-
}
|
105
|
-
|
106
|
-
private int opts;
|
107
|
-
|
108
|
-
public RedclothInline(IRubyObject self, byte[] data, int p, int pe, IRubyObject refs) {
|
109
|
-
this.runtime = self.getRuntime();
|
110
|
-
this.self = self;
|
111
|
-
|
112
|
-
// This is GROSS but necessary for EOF matching
|
113
|
-
this.data = new byte[pe+1];
|
114
|
-
System.arraycopy(data, p, this.data, 0, pe);
|
115
|
-
this.data[pe] = 0;
|
116
|
-
|
117
|
-
this.p = 0;
|
118
|
-
this.pe = pe+1;
|
119
|
-
this.eof = this.pe;
|
120
|
-
this.orig_p = 0;
|
121
|
-
this.orig_pe = this.pe;
|
122
|
-
this.refs = refs;
|
123
|
-
this.block = RubyString.newEmptyString(runtime);
|
124
|
-
this.regs = runtime.getNil();
|
125
|
-
this.opts = 0;
|
126
|
-
}
|
127
|
-
|
128
|
-
|
129
|
-
public IRubyObject inline() {
|
130
|
-
%% write init;
|
131
|
-
%% write exec;
|
132
|
-
|
133
|
-
return block;
|
134
|
-
}
|
135
|
-
|
136
|
-
public static IRubyObject inline2(IRubyObject self, IRubyObject str, IRubyObject refs) {
|
137
|
-
ByteList bl = str.convertToString().getByteList();
|
138
|
-
return new RedclothInline(self, bl.bytes, bl.begin, bl.realSize, refs).inline();
|
139
|
-
}
|
140
|
-
}
|
@@ -1,156 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* redcloth_inline.rl
|
3
|
-
*
|
4
|
-
* Copyright (C) 2009 Jason Garber
|
5
|
-
*/
|
6
|
-
%%{
|
7
|
-
|
8
|
-
machine redcloth_inline;
|
9
|
-
|
10
|
-
# links
|
11
|
-
mtext_noquotes = mtext -- '"' ;
|
12
|
-
quoted_mtext = '"' mtext_noquotes '"' ;
|
13
|
-
mtext_including_quotes = (mtext_noquotes ' "' mtext_noquotes '" ' mtext_noquotes?)+ ;
|
14
|
-
link_says = ( C_noactions "."* " "* ((quoted_mtext | mtext_including_quotes | mtext_noquotes) -- '":') ) >A %{ STORE("name"); } ;
|
15
|
-
link_says_noquotes_noactions = ( C_noquotes_noactions "."* " "* ((mtext_noquotes) -- '":') ) ;
|
16
|
-
link = ( '"' link_says '":' %A uri %{ STORE_URL("href"); } ) >X ;
|
17
|
-
link_noquotes_noactions = ( '"' link_says_noquotes_noactions '":' uri ) ;
|
18
|
-
bracketed_link = ( '["' link_says '":' %A uri %{ STORE("href"); } :> "]" ) >X ;
|
19
|
-
|
20
|
-
# images
|
21
|
-
image_title = ( '(' mtext ')' ) ;
|
22
|
-
image_is = ( A2 C ". "? (uri image_title?) >A %{ STORE("src"); } ) ;
|
23
|
-
image_link = ( ":" uri >A %{ STORE_URL("href"); } ) ;
|
24
|
-
image = ( "!" image_is "!" %A image_link? ) >X ;
|
25
|
-
bracketed_image = ( "[!" image_is "!" %A image_link? "]" ) >X ;
|
26
|
-
|
27
|
-
# footnotes
|
28
|
-
footno = "[" >X %A digit+ %T "]" ;
|
29
|
-
|
30
|
-
# markup
|
31
|
-
end_markup_phrase = (" " | PUNCT | EOF | LF) @{ fhold; };
|
32
|
-
code = "["? "@" >X mtext >A %T :> "@" "]"? ;
|
33
|
-
script_tag = ( "<script" [^>]* ">" (default+ -- "</script>") "</script>" LF? ) >X >A %T ;
|
34
|
-
strong = "["? "*" >X mtext >A %T :> "*" "]"? ;
|
35
|
-
b = "["? "**" >X mtext >A %T :> "**" "]"? ;
|
36
|
-
em = "["? "_" >X mtext >A %T :> "_" "]"? ;
|
37
|
-
i = "["? "__" >X mtext >A %T :> "__" "]"? ;
|
38
|
-
del = "[-" >X C ( mtext ) >A %T :>> "-]" ;
|
39
|
-
emdash_parenthetical_phrase_with_spaces = " -- " mtext " -- " ;
|
40
|
-
del_phrase = (( " " >A %{ STORE("beginning_space"); } "-" | "-" when starts_line) >X C ( mtext ) >A %T :>> ( "-" end_markup_phrase )) - emdash_parenthetical_phrase_with_spaces ;
|
41
|
-
ins = "["? "+" >X mtext >A %T :> "+" "]"? ;
|
42
|
-
sup = "[^" >X mtext >A %T :> "^]" ;
|
43
|
-
sup_phrase = ( "^" when starts_phrase) >X ( mtext ) >A %T :>> ( "^" end_markup_phrase ) ;
|
44
|
-
sub = "[~" >X mtext >A %T :> "~]" ;
|
45
|
-
sub_phrase = ( "~" when starts_phrase) >X ( mtext ) >A %T :>> ( "~" end_markup_phrase ) ;
|
46
|
-
span = "[%" >X mtext >A %T :> "%]" ;
|
47
|
-
span_phrase = (("%" when starts_phrase) >X ( mtext ) >A %T :>> ( "%" end_markup_phrase )) ;
|
48
|
-
cite = "["? "??" >X mtext >A %T :> "??" "]"? ;
|
49
|
-
ignore = "["? "==" >X %A mtext %T :> "==" "]"? ;
|
50
|
-
snip = "["? "```" >X %A mtext %T :> "```" "]"? ;
|
51
|
-
|
52
|
-
# quotes
|
53
|
-
quote1 = "'" >X %A mtext %T :> "'" ;
|
54
|
-
non_quote_chars_or_link = (chars -- '"') | link_noquotes_noactions ;
|
55
|
-
mtext_inside_quotes = ( non_quote_chars_or_link (mspace non_quote_chars_or_link)* ) ;
|
56
|
-
html_tag_up_to_attribute_quote = "<" Name space+ NameAttr space* "=" space* ;
|
57
|
-
quote2 = ('"' >X %A ( mtext_inside_quotes - (mtext_inside_quotes html_tag_up_to_attribute_quote ) ) %T :> '"' ) ;
|
58
|
-
multi_paragraph_quote = (('"' when starts_line) >X %A ( chars -- '"' ) %T );
|
59
|
-
|
60
|
-
# html
|
61
|
-
start_tag = ( "<" Name space+ AttrSet* (AttrEnd)? ">" | "<" Name ">" ) >X >A %T ;
|
62
|
-
empty_tag = ( "<" Name space+ AttrSet* (AttrEnd)? "/>" | "<" Name "/>" ) >X >A %T ;
|
63
|
-
end_tag = ( "</" Name space* ">" ) >X >A %T ;
|
64
|
-
html_comment = ("<!--" (default+) :>> "-->") >X >A %T;
|
65
|
-
|
66
|
-
# glyphs
|
67
|
-
ellipsis = ( " "? >A %T "..." ) >X ;
|
68
|
-
emdash = "--" ;
|
69
|
-
arrow = "->" ;
|
70
|
-
endash = " - " ;
|
71
|
-
acronym = ( [A-Z] >A [A-Z0-9]{2,} %T "(" default+ >A %{ STORE("title"); } :> ")" ) >X ;
|
72
|
-
caps_noactions = upper{3,} ;
|
73
|
-
caps = ( caps_noactions >A %*T ) >X ;
|
74
|
-
dim_digit = [0-9.]+ ;
|
75
|
-
prime = ("'" | '"')?;
|
76
|
-
dim_noactions = dim_digit prime (("x" | " x ") dim_digit prime) %T (("x" | " x ") dim_digit prime)? ;
|
77
|
-
dim = dim_noactions >X >A %T ;
|
78
|
-
tm = [Tt] [Mm] ;
|
79
|
-
trademark = " "? ( "[" tm "]" | "(" tm ")" ) ;
|
80
|
-
reg = [Rr] ;
|
81
|
-
registered = " "? ( "[" reg "]" | "(" reg ")" ) ;
|
82
|
-
cee = [Cc] ;
|
83
|
-
copyright = ( "[" cee "]" | "(" cee ")" ) ;
|
84
|
-
entity = ( "&" %A ( '#' digit+ | ( alpha ( alpha | digit )+ ) ) %T ';' ) >X ;
|
85
|
-
|
86
|
-
# info
|
87
|
-
redcloth_version = "[RedCloth::VERSION]" ;
|
88
|
-
|
89
|
-
other_phrase = phrase -- dim_noactions;
|
90
|
-
|
91
|
-
code_tag := |*
|
92
|
-
code_tag_end { CAT(block); fgoto main; };
|
93
|
-
default => esc_pre;
|
94
|
-
*|;
|
95
|
-
|
96
|
-
main := |*
|
97
|
-
|
98
|
-
image { PARSE_IMAGE_ATTR("src"); INLINE(block, "image"); };
|
99
|
-
bracketed_image { PARSE_IMAGE_ATTR("src"); INLINE(block, "image"); };
|
100
|
-
|
101
|
-
link { PARSE_LINK_ATTR("name"); PASS(block, "name", "link"); };
|
102
|
-
bracketed_link { PARSE_LINK_ATTR("name"); PASS(block, "name", "link"); };
|
103
|
-
|
104
|
-
code { PARSE_ATTR("text"); PASS_CODE(block, "text", "code", opts); };
|
105
|
-
code_tag_start { CAT(block); fgoto code_tag; };
|
106
|
-
notextile { INLINE(block, "notextile"); };
|
107
|
-
strong { PARSE_ATTR("text"); PASS(block, "text", "strong"); };
|
108
|
-
b { PARSE_ATTR("text"); PASS(block, "text", "b"); };
|
109
|
-
em { PARSE_ATTR("text"); PASS(block, "text", "em"); };
|
110
|
-
i { PARSE_ATTR("text"); PASS(block, "text", "i"); };
|
111
|
-
del { PASS(block, "text", "del"); };
|
112
|
-
del_phrase { PASS(block, "text", "del_phrase"); };
|
113
|
-
ins { PARSE_ATTR("text"); PASS(block, "text", "ins"); };
|
114
|
-
sup { PARSE_ATTR("text"); PASS(block, "text", "sup"); };
|
115
|
-
sup_phrase { PARSE_ATTR("text"); PASS(block, "text", "sup_phrase"); };
|
116
|
-
sub { PARSE_ATTR("text"); PASS(block, "text", "sub"); };
|
117
|
-
sub_phrase { PARSE_ATTR("text"); PASS(block, "text", "sub_phrase"); };
|
118
|
-
span { PARSE_ATTR("text"); PASS(block, "text", "span"); };
|
119
|
-
span_phrase { PARSE_ATTR("text"); PASS(block, "text", "span_phrase"); };
|
120
|
-
cite { PARSE_ATTR("text"); PASS(block, "text", "cite"); };
|
121
|
-
ignore => ignore;
|
122
|
-
snip { PASS(block, "text", "snip"); };
|
123
|
-
quote1 { PASS(block, "text", "quote1"); };
|
124
|
-
quote2 { PASS(block, "text", "quote2"); };
|
125
|
-
multi_paragraph_quote { PASS(block, "text", "multi_paragraph_quote"); };
|
126
|
-
|
127
|
-
ellipsis { INLINE(block, "ellipsis"); };
|
128
|
-
emdash { INLINE(block, "emdash"); };
|
129
|
-
endash { INLINE(block, "endash"); };
|
130
|
-
arrow { INLINE(block, "arrow"); };
|
131
|
-
caps { INLINE(block, "caps"); };
|
132
|
-
acronym { INLINE(block, "acronym"); };
|
133
|
-
dim { INLINE(block, "dim"); };
|
134
|
-
trademark { INLINE(block, "trademark"); };
|
135
|
-
registered { INLINE(block, "registered"); };
|
136
|
-
copyright { INLINE(block, "copyright"); };
|
137
|
-
footno { PASS(block, "text", "footno"); };
|
138
|
-
entity { INLINE(block, "entity"); };
|
139
|
-
|
140
|
-
script_tag { INLINE(block, "inline_html"); };
|
141
|
-
start_tag { INLINE(block, "inline_html"); };
|
142
|
-
end_tag { INLINE(block, "inline_html"); };
|
143
|
-
empty_tag { INLINE(block, "inline_html"); };
|
144
|
-
html_comment { INLINE(block, "inline_html"); };
|
145
|
-
|
146
|
-
redcloth_version { INLINE(block, "inline_redcloth_version"); };
|
147
|
-
|
148
|
-
other_phrase => esc;
|
149
|
-
PUNCT => esc;
|
150
|
-
space => esc;
|
151
|
-
|
152
|
-
EOF;
|
153
|
-
|
154
|
-
*|;
|
155
|
-
|
156
|
-
}%%;
|
@@ -1,228 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* redcloth_scan.c.rl
|
3
|
-
*
|
4
|
-
* Copyright (C) 2009 Jason Garber
|
5
|
-
*/
|
6
|
-
#define redcloth_scan_c
|
7
|
-
|
8
|
-
#include <ruby.h>
|
9
|
-
#include "redcloth.h"
|
10
|
-
|
11
|
-
VALUE mRedCloth, super_ParseError, super_RedCloth, super_HTML, super_LATEX;
|
12
|
-
int SYM_escape_preformatted, SYM_escape_attributes;
|
13
|
-
|
14
|
-
%%{
|
15
|
-
|
16
|
-
machine redcloth_scan;
|
17
|
-
include redcloth_common "redcloth_common.c.rl";
|
18
|
-
|
19
|
-
action extend { extend = rb_hash_aref(regs, ID2SYM(rb_intern("type"))); }
|
20
|
-
|
21
|
-
include redcloth_scan "redcloth_scan.rl";
|
22
|
-
|
23
|
-
}%%
|
24
|
-
|
25
|
-
%% write data nofinal;
|
26
|
-
|
27
|
-
VALUE
|
28
|
-
redcloth_transform(self, p, pe, refs)
|
29
|
-
VALUE self;
|
30
|
-
char *p, *pe;
|
31
|
-
VALUE refs;
|
32
|
-
{
|
33
|
-
char *orig_p = p, *orig_pe = pe;
|
34
|
-
int cs, act, nest = 0;
|
35
|
-
char *ts = NULL, *te = NULL, *reg = NULL, *bck = NULL, *eof = NULL;
|
36
|
-
VALUE html = STR_NEW2("");
|
37
|
-
VALUE table = STR_NEW2("");
|
38
|
-
VALUE block = STR_NEW2("");
|
39
|
-
VALUE regs; CLEAR_REGS()
|
40
|
-
|
41
|
-
|
42
|
-
VALUE list_layout = Qnil;
|
43
|
-
char *list_type = NULL;
|
44
|
-
VALUE list_index = rb_ary_new();
|
45
|
-
int list_continue = 0;
|
46
|
-
VALUE plain_block; SET_PLAIN_BLOCK("p");
|
47
|
-
VALUE extend = Qnil;
|
48
|
-
char listm[10] = "";
|
49
|
-
VALUE refs_found = rb_hash_new();
|
50
|
-
|
51
|
-
%% write init;
|
52
|
-
|
53
|
-
%% write exec;
|
54
|
-
|
55
|
-
if (RSTRING_LEN(block) > 0)
|
56
|
-
{
|
57
|
-
ADD_BLOCK();
|
58
|
-
}
|
59
|
-
|
60
|
-
if ( NIL_P(refs) && rb_funcall(refs_found, rb_intern("empty?"), 0) == Qfalse ) {
|
61
|
-
return redcloth_transform(self, orig_p, orig_pe, refs_found);
|
62
|
-
} else {
|
63
|
-
rb_funcall(self, rb_intern("after_transform"), 1, html);
|
64
|
-
return html;
|
65
|
-
}
|
66
|
-
}
|
67
|
-
|
68
|
-
VALUE
|
69
|
-
redcloth_transform2(self, str)
|
70
|
-
VALUE self, str;
|
71
|
-
{
|
72
|
-
StringValue(str);
|
73
|
-
rb_funcall(self, rb_intern("before_transform"), 1, str);
|
74
|
-
return redcloth_transform(self, RSTRING_PTR(str), RSTRING_PTR(str) + RSTRING_LEN(str) + 1, Qnil);
|
75
|
-
}
|
76
|
-
|
77
|
-
/*
|
78
|
-
* Converts special characters into HTML entities.
|
79
|
-
*/
|
80
|
-
static VALUE
|
81
|
-
redcloth_html_esc(int argc, VALUE* argv, VALUE self) //(self, str, level)
|
82
|
-
{
|
83
|
-
VALUE str, level;
|
84
|
-
|
85
|
-
rb_scan_args(argc, argv, "11", &str, &level);
|
86
|
-
|
87
|
-
VALUE new_str = STR_NEW2("");
|
88
|
-
if (str == Qnil)
|
89
|
-
return new_str;
|
90
|
-
|
91
|
-
StringValue(str);
|
92
|
-
|
93
|
-
if (RSTRING_LEN(str) == 0)
|
94
|
-
return new_str;
|
95
|
-
|
96
|
-
char *ts = RSTRING_PTR(str), *te = RSTRING_PTR(str) + RSTRING_LEN(str);
|
97
|
-
char *t = ts, *t2 = ts, *ch = NULL;
|
98
|
-
if (te <= ts) return Qnil;
|
99
|
-
|
100
|
-
while (t2 < te) {
|
101
|
-
ch = NULL;
|
102
|
-
|
103
|
-
// normal + pre
|
104
|
-
switch (*t2)
|
105
|
-
{
|
106
|
-
case '&': ch = "amp"; break;
|
107
|
-
case '>': ch = "gt"; break;
|
108
|
-
case '<': ch = "lt"; break;
|
109
|
-
}
|
110
|
-
|
111
|
-
// normal (non-pre)
|
112
|
-
if (level != SYM_escape_preformatted) {
|
113
|
-
switch (*t2)
|
114
|
-
{
|
115
|
-
case '\n': ch = "br"; break;
|
116
|
-
case '"' : ch = "quot"; break;
|
117
|
-
case '\'':
|
118
|
-
ch = (level == SYM_escape_attributes) ? "apos" : "squot";
|
119
|
-
break;
|
120
|
-
}
|
121
|
-
}
|
122
|
-
|
123
|
-
if (ch != NULL)
|
124
|
-
{
|
125
|
-
if (t2 > t)
|
126
|
-
rb_str_cat(new_str, t, t2-t);
|
127
|
-
rb_str_concat(new_str, rb_funcall(self, rb_intern(ch), 1, rb_hash_new()));
|
128
|
-
t = t2 + 1;
|
129
|
-
}
|
130
|
-
|
131
|
-
t2++;
|
132
|
-
}
|
133
|
-
if (t2 > t)
|
134
|
-
rb_str_cat(new_str, t, t2-t);
|
135
|
-
|
136
|
-
return new_str;
|
137
|
-
}
|
138
|
-
|
139
|
-
/*
|
140
|
-
* Converts special characters into LaTeX entities.
|
141
|
-
*/
|
142
|
-
static VALUE
|
143
|
-
redcloth_latex_esc(VALUE self, VALUE str)
|
144
|
-
{
|
145
|
-
VALUE new_str = STR_NEW2("");
|
146
|
-
|
147
|
-
if (str == Qnil)
|
148
|
-
return new_str;
|
149
|
-
|
150
|
-
StringValue(str);
|
151
|
-
|
152
|
-
if (RSTRING_LEN(str) == 0)
|
153
|
-
return new_str;
|
154
|
-
|
155
|
-
char *ts = RSTRING_PTR(str), *te = RSTRING_PTR(str) + RSTRING_LEN(str);
|
156
|
-
char *t = ts, *t2 = ts, *ch = NULL;
|
157
|
-
if (te <= ts) return Qnil;
|
158
|
-
|
159
|
-
while (t2 < te) {
|
160
|
-
ch = NULL;
|
161
|
-
|
162
|
-
switch (*t2)
|
163
|
-
{
|
164
|
-
case '{': ch = "#123"; break;
|
165
|
-
case '}': ch = "#125"; break;
|
166
|
-
case '\\': ch = "#92"; break;
|
167
|
-
case '#': ch = "#35"; break;
|
168
|
-
case '$': ch = "#36"; break;
|
169
|
-
case '%': ch = "#37"; break;
|
170
|
-
case '&': ch = "amp"; break;
|
171
|
-
case '_': ch = "#95"; break;
|
172
|
-
case '^': ch = "circ"; break;
|
173
|
-
case '~': ch = "tilde"; break;
|
174
|
-
case '<': ch = "lt"; break;
|
175
|
-
case '>': ch = "gt"; break;
|
176
|
-
case '\n': ch = "#10"; break;
|
177
|
-
}
|
178
|
-
|
179
|
-
if (ch != NULL)
|
180
|
-
{
|
181
|
-
if (t2 > t)
|
182
|
-
rb_str_cat(new_str, t, t2-t);
|
183
|
-
VALUE opts = rb_hash_new();
|
184
|
-
rb_hash_aset(opts, ID2SYM(rb_intern("text")), STR_NEW2(ch));
|
185
|
-
rb_str_concat(new_str, rb_funcall(self, rb_intern("entity"), 1, opts));
|
186
|
-
t = t2 + 1;
|
187
|
-
}
|
188
|
-
|
189
|
-
t2++;
|
190
|
-
}
|
191
|
-
if (t2 > t)
|
192
|
-
rb_str_cat(new_str, t, t2-t);
|
193
|
-
|
194
|
-
return new_str;
|
195
|
-
}
|
196
|
-
|
197
|
-
/*
|
198
|
-
* Transforms a Textile document with +formatter+
|
199
|
-
*/
|
200
|
-
static VALUE
|
201
|
-
redcloth_to(self, formatter)
|
202
|
-
VALUE self, formatter;
|
203
|
-
{
|
204
|
-
rb_funcall(self, rb_intern("delete!"), 1, STR_NEW2("\r"));
|
205
|
-
VALUE working_copy = rb_obj_clone(self);
|
206
|
-
rb_extend_object(working_copy, formatter);
|
207
|
-
|
208
|
-
if (rb_funcall(working_copy, rb_intern("lite_mode"), 0) == Qtrue) {
|
209
|
-
return redcloth_inline2(working_copy, self, rb_hash_new());
|
210
|
-
} else {
|
211
|
-
return redcloth_transform2(working_copy, self);
|
212
|
-
}
|
213
|
-
}
|
214
|
-
|
215
|
-
void Init_redcloth_scan()
|
216
|
-
{
|
217
|
-
mRedCloth = rb_define_module("RedCloth");
|
218
|
-
/* A Textile document that can be converted to other formats. See
|
219
|
-
the README for Textile syntax. */
|
220
|
-
super_RedCloth = rb_define_class_under(mRedCloth, "TextileDoc", rb_cString);
|
221
|
-
rb_define_method(super_RedCloth, "to", redcloth_to, 1);
|
222
|
-
super_ParseError = rb_define_class_under(super_RedCloth, "ParseError", rb_eException);
|
223
|
-
/* Escaping */
|
224
|
-
rb_define_method(super_RedCloth, "html_esc", redcloth_html_esc, -1);
|
225
|
-
rb_define_method(super_RedCloth, "latex_esc", redcloth_latex_esc, 1);
|
226
|
-
SYM_escape_preformatted = ID2SYM(rb_intern("html_escape_preformatted"));
|
227
|
-
SYM_escape_attributes = ID2SYM(rb_intern("html_escape_attributes"));
|
228
|
-
}
|