RedCloth 4.1.9-x86-mswin32-60 → 4.2.0-x86-mswin32-60

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.

Files changed (68) hide show
  1. data/CHANGELOG +55 -0
  2. data/Manifest +34 -38
  3. data/README +17 -5
  4. data/Rakefile +79 -30
  5. data/RedCloth.gemspec +5 -6
  6. data/ext/redcloth_scan/redcloth.h +38 -13
  7. data/lib/redcloth.rb +9 -3
  8. data/lib/redcloth/formatters/html.rb +2 -2
  9. data/lib/redcloth/formatters/latex.rb +99 -54
  10. data/lib/redcloth/formatters/latex_entities.yml +2 -2
  11. data/lib/redcloth/version.rb +9 -4
  12. data/lib/redcloth_scan.so +0 -0
  13. data/lib/tasks/pureruby.rake +12 -0
  14. data/spec/custom_tags_spec.rb +50 -0
  15. data/spec/differs/inline.rb +48 -0
  16. data/{test/test_erb.rb → spec/erb_spec.rb} +6 -9
  17. data/spec/extension_spec.rb +26 -0
  18. data/{test → spec/fixtures}/basic.yml +90 -4
  19. data/{test → spec/fixtures}/code.yml +29 -0
  20. data/{test → spec/fixtures}/definitions.yml +0 -0
  21. data/{test → spec/fixtures}/extra_whitespace.yml +0 -0
  22. data/{test → spec/fixtures}/filter_html.yml +0 -0
  23. data/{test → spec/fixtures}/filter_pba.yml +0 -0
  24. data/{test → spec/fixtures}/html.yml +15 -0
  25. data/{test → spec/fixtures}/images.yml +16 -6
  26. data/{test → spec/fixtures}/instiki.yml +0 -0
  27. data/{test → spec/fixtures}/links.yml +7 -1
  28. data/{test → spec/fixtures}/lists.yml +162 -1
  29. data/{test → spec/fixtures}/poignant.yml +0 -0
  30. data/{test → spec/fixtures}/sanitize_html.yml +0 -0
  31. data/{test → spec/fixtures}/table.yml +121 -23
  32. data/{test → spec/fixtures}/textism.yml +44 -15
  33. data/{test → spec/fixtures}/threshold.yml +6 -14
  34. data/spec/formatters/class_filtered_html_spec.rb +7 -0
  35. data/spec/formatters/filtered_html_spec.rb +7 -0
  36. data/spec/formatters/html_no_breaks_spec.rb +9 -0
  37. data/spec/formatters/html_spec.rb +13 -0
  38. data/spec/formatters/id_filtered_html_spec.rb +7 -0
  39. data/spec/formatters/latex_spec.rb +13 -0
  40. data/spec/formatters/lite_mode_html_spec.rb +7 -0
  41. data/spec/formatters/no_span_caps_html_spec.rb +7 -0
  42. data/spec/formatters/sanitized_html_spec.rb +7 -0
  43. data/spec/formatters/style_filtered_html_spec.rb +7 -0
  44. data/spec/parser_spec.rb +95 -0
  45. data/spec/spec.opts +3 -0
  46. data/spec/spec_helper.rb +42 -0
  47. metadata +40 -49
  48. data/ext/mingw-rbconfig.rb +0 -176
  49. data/ext/redcloth_scan/redcloth_attributes.c.rl +0 -55
  50. data/ext/redcloth_scan/redcloth_attributes.java.rl +0 -95
  51. data/ext/redcloth_scan/redcloth_attributes.rl +0 -33
  52. data/ext/redcloth_scan/redcloth_common.c.rl +0 -18
  53. data/ext/redcloth_scan/redcloth_common.java.rl +0 -18
  54. data/ext/redcloth_scan/redcloth_common.rl +0 -115
  55. data/ext/redcloth_scan/redcloth_inline.c.rl +0 -193
  56. data/ext/redcloth_scan/redcloth_inline.java.rl +0 -140
  57. data/ext/redcloth_scan/redcloth_inline.rl +0 -156
  58. data/ext/redcloth_scan/redcloth_scan.c.rl +0 -228
  59. data/ext/redcloth_scan/redcloth_scan.java.rl +0 -577
  60. data/ext/redcloth_scan/redcloth_scan.rl +0 -320
  61. data/extras/ragel_profiler.rb +0 -73
  62. data/test/helper.rb +0 -108
  63. data/test/test_custom_tags.rb +0 -58
  64. data/test/test_extensions.rb +0 -31
  65. data/test/test_formatters.rb +0 -24
  66. data/test/test_parser.rb +0 -73
  67. data/test/test_restrictions.rb +0 -41
  68. 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
- }