BBRedCloth 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
data/BBRedCloth.gemspec CHANGED
@@ -2,26 +2,26 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{BBRedCloth}
5
- s.version = "0.8.0"
5
+ s.version = "0.8.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Ryan Alyea"]
9
- s.date = %q{2010-09-12}
10
- s.default_executable = %q{bbredcloth}
11
- s.description = %q{BBRedCloth-0.8.0 - Textile parser for Ruby. Includes BBCode additions.
9
+ s.date = %q{2011-04-19}
10
+ s.default_executable = %q{redcloth}
11
+ s.description = %q{BBRedCloth-0.8.1 - Textile parser for Ruby. Includes BBCode additions.
12
12
  http://redcloth.org/}
13
13
  s.email = %q{ryan@fangamer.com}
14
- s.executables = ["bbredcloth"]
14
+ s.executables = ["redcloth"]
15
15
  s.extensions = ["ext/redcloth_scan/extconf.rb"]
16
16
  s.extra_rdoc_files = ["CHANGELOG", "lib/case_sensitive_require/RedCloth.rb", "lib/redcloth/erb_extension.rb", "lib/redcloth/formatters/base.rb", "lib/redcloth/formatters/html.rb", "lib/redcloth/formatters/latex.rb", "lib/redcloth/textile_doc.rb", "lib/redcloth/version.rb", "lib/redcloth.rb", "README.textile"]
17
- s.files = ["bin/bbredcloth", "CHANGELOG", "COPYING", "ext/mingw-rbconfig.rb", "ext/redcloth_scan/extconf.rb", "ext/redcloth_scan/redcloth.h", "extras/ragel_profiler.rb", "lib/case_sensitive_require/RedCloth.rb", "lib/redcloth/erb_extension.rb", "lib/redcloth/formatters/base.rb", "lib/redcloth/formatters/html.rb", "lib/redcloth/formatters/latex.rb", "lib/redcloth/formatters/latex_entities.yml", "lib/redcloth/textile_doc.rb", "lib/redcloth/version.rb", "lib/redcloth.rb", "Manifest", "Rakefile", "README.textile", "setup.rb", "test/basic.yml", "test/code.yml", "test/definitions.yml", "test/extra_whitespace.yml", "test/filter_html.yml", "test/filter_pba.yml", "test/helper.rb", "test/html.yml", "test/images.yml", "test/instiki.yml", "test/links.yml", "test/lists.yml", "test/poignant.yml", "test/sanitize_html.yml", "test/table.yml", "test/test_custom_tags.rb", "test/test_erb.rb", "test/test_extensions.rb", "test/test_formatters.rb", "test/test_parser.rb", "test/test_restrictions.rb", "test/textism.yml", "test/threshold.yml", "test/validate_fixtures.rb", "BBRedCloth.gemspec", "ext/redcloth_scan/redcloth_attributes.c", "ext/redcloth_scan/redcloth_inline.c", "ext/redcloth_scan/redcloth_scan.c", "ext/redcloth_scan/redcloth_bbcode.c", "ext/redcloth_scan/redcloth_bbcode_inline.c"]
17
+ s.files = ["bin/redcloth", "CHANGELOG", "COPYING", "ext/mingw-rbconfig.rb", "ext/redcloth_scan/extconf.rb", "ext/redcloth_scan/redcloth.h", "ext/redcloth_scan/redcloth_attributes.c.rl", "ext/redcloth_scan/redcloth_attributes.java.rl", "ext/redcloth_scan/redcloth_attributes.rl", "ext/redcloth_scan/redcloth_bbcode.c.rl", "ext/redcloth_scan/redcloth_bbcode.rl", "ext/redcloth_scan/redcloth_bbcode_inline.rl", "ext/redcloth_scan/redcloth_bbcode_inline.c.rl", "ext/redcloth_scan/redcloth_common.c.rl", "ext/redcloth_scan/redcloth_common.java.rl", "ext/redcloth_scan/redcloth_common.rl", "ext/redcloth_scan/redcloth_inline.c.rl", "ext/redcloth_scan/redcloth_inline.java.rl", "ext/redcloth_scan/redcloth_inline.rl", "ext/redcloth_scan/redcloth_scan.c.rl", "ext/redcloth_scan/redcloth_scan.java.rl", "ext/redcloth_scan/redcloth_scan.rl", "extras/ragel_profiler.rb", "lib/case_sensitive_require/RedCloth.rb", "lib/redcloth/erb_extension.rb", "lib/redcloth/formatters/base.rb", "lib/redcloth/formatters/html.rb", "lib/redcloth/formatters/latex.rb", "lib/redcloth/formatters/latex_entities.yml", "lib/redcloth/textile_doc.rb", "lib/redcloth/version.rb", "lib/redcloth.rb", "Manifest", "Rakefile", "README.textile", "setup.rb", "test/basic.yml", "test/code.yml", "test/definitions.yml", "test/extra_whitespace.yml", "test/filter_html.yml", "test/filter_pba.yml", "test/helper.rb", "test/html.yml", "test/images.yml", "test/instiki.yml", "test/links.yml", "test/lists.yml", "test/poignant.yml", "test/sanitize_html.yml", "test/table.yml", "test/test_custom_tags.rb", "test/test_erb.rb", "test/test_extensions.rb", "test/test_formatters.rb", "test/test_parser.rb", "test/test_restrictions.rb", "test/textism.yml", "test/threshold.yml", "test/validate_fixtures.rb", "BBRedCloth.gemspec", "ext/redcloth_scan/redcloth_attributes.c", "ext/redcloth_scan/redcloth_inline.c", "ext/redcloth_scan/redcloth_scan.c", "ext/redcloth_scan/redcloth_bbcode.c", "ext/redcloth_scan/redcloth_bbcode_inline.c"]
18
18
  s.homepage = %q{http://redcloth.org}
19
19
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "BBRedCloth", "--main", "README.textile"]
20
20
  s.require_paths = ["lib", "ext", "lib/case_sensitive_require"]
21
21
  s.required_ruby_version = Gem::Requirement.new(">= 1.8.4")
22
22
  s.rubyforge_project = %q{bbredcloth}
23
23
  s.rubygems_version = %q{1.3.7}
24
- s.summary = %q{BBRedCloth-0.8.0 - Textile parser for Ruby. Includes BBCode additions. http://redcloth.org/}
24
+ s.summary = %q{BBRedCloth-0.8.1 - Textile parser for Ruby. Includes BBCode additions. http://redcloth.org/}
25
25
  s.test_files = ["test/test_custom_tags.rb", "test/test_erb.rb", "test/test_extensions.rb", "test/test_formatters.rb", "test/test_parser.rb", "test/test_restrictions.rb"]
26
26
 
27
27
  if s.respond_to? :specification_version then
data/Manifest CHANGED
@@ -1,10 +1,25 @@
1
- bin/bbredcloth
1
+ bin/redcloth
2
2
  CHANGELOG
3
3
  COPYING
4
4
  ext/mingw-rbconfig.rb
5
5
  ext/redcloth_scan/extconf.rb
6
6
  ext/redcloth_scan/redcloth.h
7
-
7
+ ext/redcloth_scan/redcloth_attributes.c.rl
8
+ ext/redcloth_scan/redcloth_attributes.java.rl
9
+ ext/redcloth_scan/redcloth_attributes.rl
10
+ ext/redcloth_scan/redcloth_bbcode.c.rl
11
+ ext/redcloth_scan/redcloth_bbcode.rl
12
+ ext/redcloth_scan/redcloth_bbcode_inline.rl
13
+ ext/redcloth_scan/redcloth_bbcode_inline.c.rl
14
+ ext/redcloth_scan/redcloth_common.c.rl
15
+ ext/redcloth_scan/redcloth_common.java.rl
16
+ ext/redcloth_scan/redcloth_common.rl
17
+ ext/redcloth_scan/redcloth_inline.c.rl
18
+ ext/redcloth_scan/redcloth_inline.java.rl
19
+ ext/redcloth_scan/redcloth_inline.rl
20
+ ext/redcloth_scan/redcloth_scan.c.rl
21
+ ext/redcloth_scan/redcloth_scan.java.rl
22
+ ext/redcloth_scan/redcloth_scan.rl
8
23
  extras/ragel_profiler.rb
9
24
  lib/case_sensitive_require/RedCloth.rb
10
25
  lib/redcloth/erb_extension.rb
@@ -9,23 +9,17 @@ if %w(--version -v).include? ARGV.first
9
9
  end
10
10
 
11
11
  output_as = "html"
12
- bbcode_only = false
13
12
  opts = OptionParser.new do |opts|
14
- opts.banner = "Usage: bbredcloth [options] [redcloth_formatted.txt]"
13
+ opts.banner = "Usage: redcloth [options] [redcloth_formatted.txt]"
15
14
  opts.separator "If no file specified, STDIN will be used. If you are typing input, you can send an EOF by pressing ^D (^Z on Windows)"
16
15
  opts.separator ""
17
16
  opts.on("-o", "--output STYLE", "Output format (defaults to #{output_as})") do |o|
18
17
  output_as = o
19
18
  end
20
- opts.on("-b","--bbcode-only", "BBCode-Only") do |b|
21
- bbcode_only = b
22
- end
23
19
  end
24
20
  opts.parse! ARGV
25
21
 
26
- p bbcode_only
27
-
28
- red = RedCloth.new( ARGF.read, [(bbcode_only ? :bbcode_only : :bbcode)] )
22
+ red = RedCloth.new( ARGF.read )
29
23
  out_meth = "to_#{ output_as }"
30
24
  if red.respond_to? out_meth
31
25
  puts red.method( out_meth ).call
@@ -36,6 +36,7 @@ void red_inc(VALUE, VALUE);
36
36
  VALUE red_block(VALUE, VALUE, VALUE, VALUE);
37
37
  VALUE red_blockcode(VALUE, VALUE, VALUE);
38
38
  VALUE red_pass(VALUE, VALUE, VALUE, ID, VALUE);
39
+ VALUE red_passthrough(VALUE self, char *ts, char *te, VALUE refs);
39
40
  VALUE red_pass_code(VALUE, VALUE, VALUE, ID);
40
41
  VALUE redcloth_bbcode(VALUE, char *, char *, VALUE);
41
42
  VALUE redcloth_bbcode2(VALUE, VALUE, VALUE);
@@ -45,8 +46,10 @@ VALUE redcloth_bbcode_inline2(VALUE, VALUE, VALUE);
45
46
  /* parser macros */
46
47
  #define CALL_STACK_SIZE 20
47
48
  #define UNLESS_DISABLED_INLINE(H, T, F) \
48
- if (rb_funcall(rb_funcall(self, rb_intern("disable_inline"), 0),rb_intern("include?"), 1,ID2SYM(rb_intern(#T))) == Qtrue) { rb_str_cat_escaped(self, H, ts, te); } \
49
- else { F }
49
+ if (rb_funcall(rb_funcall(self, rb_intern("disable_inline"), 0),rb_intern("include?"), 1,ID2SYM(rb_intern(#T))) == Qtrue) { rb_str_append(H,red_passthrough(self, ts, te, refs)); } \
50
+ else { /*VALUE test = rb_str_new(ts,te-ts); printf("\nred_passthrough_else() '%s'\n", RSTRING(test)->ptr);*/ F }
51
+ #define UNLESS_DISABLED_ATTRIBUTE(T, F) \
52
+ if (!(rb_funcall(rb_funcall(self, rb_intern("disable_inline"), 0),rb_intern("include?"), 1,ID2SYM(rb_intern(#T))) == Qtrue)) { F } //if !(rb_funcall(rb_funcall(self, rb_intern("disable_inline"), 0),rb_intern("include?"), 1,ID2SYM(rb_intern(#T))) == Qtrue) { F }
50
53
  #define CLEAR_REGS() regs = rb_hash_new();
51
54
  #define RESET_REG() reg = NULL
52
55
  #define CAT(H) rb_str_cat(H, ts, te-ts)
@@ -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
+ }%%;
@@ -2014,35 +2014,35 @@ _eof_trans:
2014
2014
  break;
2015
2015
  case 26:
2016
2016
  #line 60 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2017
- {te = p+1;{ PASS(block, "text", "strong"); }}
2017
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,strong,PASS(block, "text", "strong");) }}
2018
2018
  break;
2019
2019
  case 27:
2020
2020
  #line 61 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2021
- {te = p+1;{ PASS(block, "text", "em"); }}
2021
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,em,PASS(block, "text", "em");) }}
2022
2022
  break;
2023
2023
  case 28:
2024
2024
  #line 62 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2025
- {te = p+1;{ PASS(block, "text", "ins"); }}
2025
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,ins,PASS(block, "text", "ins");) }}
2026
2026
  break;
2027
2027
  case 29:
2028
2028
  #line 63 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2029
- {te = p+1;{ PASS(block, "text", "del"); }}
2029
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,s,PASS(block, "text", "del");) }}
2030
2030
  break;
2031
2031
  case 30:
2032
2032
  #line 64 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2033
- {te = p+1;{ PASS(block, "text", "del"); }}
2033
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,del,PASS(block, "text", "del");) }}
2034
2034
  break;
2035
2035
  case 31:
2036
2036
  #line 65 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2037
- {te = p+1;{ PASS(block, "text", "ins"); }}
2037
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,ins,PASS(block, "text", "ins");) }}
2038
2038
  break;
2039
2039
  case 32:
2040
2040
  #line 66 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2041
- {te = p+1;{ PASS(block, "text", "sub"); }}
2041
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,sub,PASS(block, "text", "sub");) }}
2042
2042
  break;
2043
2043
  case 33:
2044
2044
  #line 67 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2045
- {te = p+1;{ PASS(block, "text", "sup"); }}
2045
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,sup,PASS(block, "text", "sup");) }}
2046
2046
  break;
2047
2047
  case 34:
2048
2048
  #line 8 "ext/redcloth_scan/redcloth_bbcode.c.rl"
@@ -2050,27 +2050,27 @@ _eof_trans:
2050
2050
  break;
2051
2051
  case 35:
2052
2052
  #line 69 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2053
- {te = p+1;{ PASS(block, "text", "color"); }}
2053
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,color,PASS(block, "text", "color");) }}
2054
2054
  break;
2055
2055
  case 36:
2056
2056
  #line 70 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2057
- {te = p+1;{ PASS(block, "text", "bbsize"); }}
2057
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,size,PASS(block, "text", "bbsize");) }}
2058
2058
  break;
2059
2059
  case 37:
2060
2060
  #line 71 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2061
- {te = p+1;{ PASS(block, "text", "bbalign"); }}
2061
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,align,PASS(block, "text", "bbalign");) }}
2062
2062
  break;
2063
2063
  case 38:
2064
2064
  #line 72 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2065
- {te = p+1;{ PASS(block, "text", "acronym"); }}
2065
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,acronym,PASS(block, "text", "acronym");) }}
2066
2066
  break;
2067
2067
  case 39:
2068
2068
  #line 73 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2069
- {te = p+1;{ PASS(block, "name", "link"); }}
2069
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,link,PASS(block, "name", "link");) }}
2070
2070
  break;
2071
2071
  case 40:
2072
2072
  #line 74 "ext/redcloth_scan/redcloth_bbcode.c.rl"
2073
- {te = p+1;{ PASS(block, "name", "link"); }}
2073
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,link,PASS(block, "name", "link");) }}
2074
2074
  break;
2075
2075
  case 41:
2076
2076
  #line 75 "ext/redcloth_scan/redcloth_bbcode.c.rl"
@@ -0,0 +1,60 @@
1
+ /*
2
+ * redcloth_bbcode.c.rl
3
+ *
4
+ * Copyright (C) 2009 Ryan Alyea
5
+ */
6
+ #include <ruby.h>
7
+ #include "redcloth.h"
8
+
9
+ %%{
10
+
11
+ machine redcloth_bbcode;
12
+ include redcloth_common "redcloth_common.c.rl";
13
+ include redcloth_bbcode "redcloth_bbcode.rl";
14
+
15
+ }%%
16
+
17
+ %% write data nofinal;
18
+
19
+ VALUE
20
+ redcloth_bbcode(self, p, pe, refs)
21
+ VALUE self;
22
+ char *p, *pe;
23
+ VALUE refs;
24
+ {
25
+ int cs, act, nest;
26
+ char *ts = NULL, *te = NULL, *reg = NULL, *bck = NULL, *eof = NULL;
27
+ char *orig_p = p, *orig_pe = pe;
28
+ VALUE block = rb_str_new2("");
29
+ VALUE regs = Qnil; CLEAR_REGS()
30
+ unsigned int opts = 0;
31
+ VALUE buf = Qnil;
32
+ VALUE hash = Qnil;
33
+
34
+ VALUE html = rb_str_new2("");
35
+ VALUE failed_start = rb_str_new2("");
36
+ char *failed_start_point_p = NULL, *failed_start_point_ts = NULL, *failed_start_point_te = NULL;
37
+ int stack[CALL_STACK_SIZE],top,nested_quote = 0, nested_spoiler = 0, store_cite = 1, store_title = 1;
38
+
39
+ %% write init;
40
+
41
+ %% write exec;
42
+
43
+ if (RSTRING_LEN(block) > 0)
44
+ {
45
+ rb_hash_aset(regs, ID2SYM(rb_intern("text")), block);
46
+ rb_str_append(html, rb_funcall(self, rb_intern("p"), 1, regs));
47
+ CLEAR(block);
48
+ CLEAR_REGS()
49
+ }
50
+
51
+ return rb_funcall(html, rb_intern("strip"), 0);
52
+ }
53
+
54
+ VALUE
55
+ redcloth_bbcode2(self, str, refs)
56
+ VALUE self, str, refs;
57
+ {
58
+ StringValue(str);
59
+ return redcloth_bbcode(self, RSTRING_PTR(str), RSTRING_PTR(str) + RSTRING_LEN(str) + 1, refs);
60
+ }
@@ -0,0 +1,127 @@
1
+ /*
2
+ * redcloth_bbcode.rl
3
+ *
4
+ * Copyright (C) 2009 Ryan Alyea
5
+ */
6
+ %%{
7
+
8
+ machine redcloth_bbcode;
9
+ include redcloth_bbcode_inline 'redcloth_bbcode_inline.rl';
10
+
11
+ #bb_pre_tag_start = "[pre" [^\]]* "]" (space* "[code]")? ;
12
+ #bb_pre_tag_end = ("[/code]" space*)? "[/pre]" LF? ;
13
+
14
+ bb_quote_title = " title"? "=" bbmtext %{ if(store_cite) STORE("cite"); } >A;
15
+ bb_quote_tag_start = LF? ("[quote" bb_quote_title? "]") ;
16
+ bb_quote_tag_end = "[/quote]" LF? ;
17
+
18
+ bb_spoiler_tag_title = " title"? "=" bbmtext %{ if(store_title) STORE("title"); } >A;
19
+ bb_spoiler_tag_start = ("[spoiler" bb_spoiler_tag_title? "]") ;
20
+ bb_spoiler_tag_end = "[/spoiler]" LF? ;
21
+
22
+ bbcode_tag = "[";
23
+ bbcode_tag_not_quote_end = bbcode_tag -- bb_quote_tag_end;
24
+
25
+ blank_line = LF;
26
+ double_return = LF{2,} ;
27
+
28
+ direct_uri = "http" "s"? "://" uchar+ absolute_path?;
29
+ automatic_url = direct_uri >X >A %{ STORE_URL("href"); } ;
30
+
31
+ bb_pre_tag := |*
32
+ bb_pre_tag_end {
33
+ rb_hash_aset(regs, ID2SYM(rb_intern("text")), rb_funcall(self, rb_intern("escape_pre"), 1, rb_funcall(block,rb_intern("strip"),0)));
34
+ rb_str_append(html,rb_funcall(self, rb_intern("bb_block_pre"), 1, regs));
35
+ CLEAR(block);
36
+ CLEAR_REGS();
37
+ fgoto main;
38
+ };
39
+ default => cat;
40
+ EOF => { CLEAR(block); CLEAR_REGS(); rb_str_append(block,failed_start); failed_start = rb_str_new2(""); p = failed_start_point_p; ts = failed_start_point_ts; te = failed_start_point_te; fgoto done; };
41
+ *|;
42
+
43
+ bb_quote_tag := |*
44
+ bb_quote_tag_start => { CAT(block); ++nested_quote; };
45
+ bb_quote_tag_end {
46
+ if (nested_quote-- == 0) {
47
+ //printf("\n\nQUOTE TAG: %s \n\n",RSTRING_PTR(rb_funcall(block,rb_intern("strip"),0)));
48
+ rb_hash_aset(regs, ID2SYM(rb_intern("text")), redcloth_bbcode2(self,rb_funcall(block,rb_intern("strip"),0),rb_hash_new()));
49
+ rb_str_append(html,rb_funcall(self, rb_intern("bbquote"), 1, regs));
50
+ nested_quote = 0;
51
+ store_cite = 1;
52
+ CLEAR(block);
53
+ CLEAR_REGS();
54
+ fgoto main;
55
+ }
56
+ else { CAT(block); }
57
+ };
58
+ default => cat;
59
+ EOF => { CLEAR(block); CLEAR_REGS(); rb_str_append(block,failed_start); failed_start = rb_str_new2(""); p = failed_start_point_p; ts = failed_start_point_ts; te = failed_start_point_te; fgoto done; };
60
+ *|;
61
+
62
+ bb_spoiler_tag := |*
63
+ bb_spoiler_tag_start => { CAT(block); ++nested_spoiler; };
64
+ bb_spoiler_tag_end {
65
+ if (nested_spoiler-- == 0) {
66
+ rb_hash_aset(regs, ID2SYM(rb_intern("text")), redcloth_bbcode2(self,rb_funcall(block,rb_intern("strip"),0),rb_hash_new()));
67
+ rb_str_append(html,rb_funcall(self, rb_intern("bb_block_spoiler"), 1, regs));
68
+ nested_spoiler = 0;
69
+ store_title = 1;
70
+ CLEAR(block);
71
+ CLEAR_REGS();
72
+ fgoto main;
73
+ }
74
+ else { CAT(block); }
75
+ };
76
+ default => cat;
77
+ EOF => { CLEAR(block); CLEAR_REGS(); rb_str_append(block,failed_start); failed_start = rb_str_new2(""); p = failed_start_point_p; ts = failed_start_point_ts; te = failed_start_point_te; fgoto done; };
78
+ *|;
79
+
80
+ done := |*
81
+ EOF;
82
+ *|;
83
+
84
+ block := |*
85
+ EOF {
86
+ rb_hash_aset(regs, ID2SYM(rb_intern("text")), rb_funcall(block,rb_intern("strip"),0));
87
+ rb_str_append(html, rb_funcall(self, rb_intern("p"), 1, regs));
88
+ CLEAR(block);
89
+ CLEAR_REGS()
90
+ fgoto main;
91
+ };
92
+ bb_quote_tag_start {
93
+ rb_hash_aset(regs, ID2SYM(rb_intern("text")), rb_funcall(block,rb_intern("strip"),0));
94
+ rb_str_append(html, rb_funcall(self, rb_intern("p"), 1, regs));
95
+ CLEAR(block);
96
+ CLEAR_REGS()
97
+ failed_start_point_p = p; failed_start_point_ts = ts; failed_start_point_te = te;
98
+ fgoto bb_quote_tag;
99
+ };
100
+ automatic_url { UNLESS_DISABLED_INLINE(block,link,PASS(block, "name", "link");) };
101
+ bbcode_tag => {
102
+ fhold;
103
+ fcall bbcode_inline;
104
+ };
105
+ double_return {
106
+ rb_hash_aset(regs, ID2SYM(rb_intern("text")), rb_funcall(block,rb_intern("strip"),0));
107
+ rb_str_append(html, rb_funcall(self, rb_intern("p"), 1, regs));
108
+ CLEAR(block);
109
+ CLEAR_REGS()
110
+ fgoto main;
111
+ };
112
+ default => esc;
113
+ *|;
114
+
115
+ main := |*
116
+ #bbcode_tag => {
117
+ # fhold;
118
+ # fcall bbcode_inline;
119
+ #};
120
+ bb_pre_tag_start => { rb_str_append(failed_start,rb_str_new(ts,te-ts)); failed_start_point_p = p; failed_start_point_ts = ts; failed_start_point_te = te; fgoto bb_pre_tag; };
121
+ bb_quote_tag_start => { rb_str_append(failed_start,rb_str_new(ts,te-ts)); failed_start_point_p = p; failed_start_point_ts = ts; failed_start_point_te = te; store_cite = 0; fgoto bb_quote_tag; };
122
+ bb_spoiler_tag_start => { rb_str_append(failed_start,rb_str_new(ts,te-ts)); failed_start_point_p = p; failed_start_point_ts = ts; failed_start_point_te = te; store_title = 0; fgoto bb_spoiler_tag; };
123
+ blank_line => cat;
124
+ default => { fhold; fgoto block; };
125
+ *|;
126
+
127
+ }%%;
@@ -1722,35 +1722,35 @@ _eof_trans:
1722
1722
  break;
1723
1723
  case 23:
1724
1724
  #line 60 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1725
- {te = p+1;{ PASS(block, "text", "strong"); }}
1725
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,strong,PASS(block, "text", "strong");) }}
1726
1726
  break;
1727
1727
  case 24:
1728
1728
  #line 61 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1729
- {te = p+1;{ PASS(block, "text", "em"); }}
1729
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,em,PASS(block, "text", "em");) }}
1730
1730
  break;
1731
1731
  case 25:
1732
1732
  #line 62 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1733
- {te = p+1;{ PASS(block, "text", "ins"); }}
1733
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,ins,PASS(block, "text", "ins");) }}
1734
1734
  break;
1735
1735
  case 26:
1736
1736
  #line 63 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1737
- {te = p+1;{ PASS(block, "text", "del"); }}
1737
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,s,PASS(block, "text", "del");) }}
1738
1738
  break;
1739
1739
  case 27:
1740
1740
  #line 64 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1741
- {te = p+1;{ PASS(block, "text", "del"); }}
1741
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,del,PASS(block, "text", "del");) }}
1742
1742
  break;
1743
1743
  case 28:
1744
1744
  #line 65 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1745
- {te = p+1;{ PASS(block, "text", "ins"); }}
1745
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,ins,PASS(block, "text", "ins");) }}
1746
1746
  break;
1747
1747
  case 29:
1748
1748
  #line 66 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1749
- {te = p+1;{ PASS(block, "text", "sub"); }}
1749
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,sub,PASS(block, "text", "sub");) }}
1750
1750
  break;
1751
1751
  case 30:
1752
1752
  #line 67 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1753
- {te = p+1;{ PASS(block, "text", "sup"); }}
1753
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,sup,PASS(block, "text", "sup");) }}
1754
1754
  break;
1755
1755
  case 31:
1756
1756
  #line 8 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
@@ -1758,27 +1758,27 @@ _eof_trans:
1758
1758
  break;
1759
1759
  case 32:
1760
1760
  #line 69 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1761
- {te = p+1;{ PASS(block, "text", "color"); }}
1761
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,color,PASS(block, "text", "color");) }}
1762
1762
  break;
1763
1763
  case 33:
1764
1764
  #line 70 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1765
- {te = p+1;{ PASS(block, "text", "bbsize"); }}
1765
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,size,PASS(block, "text", "bbsize");) }}
1766
1766
  break;
1767
1767
  case 34:
1768
1768
  #line 71 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1769
- {te = p+1;{ PASS(block, "text", "bbalign"); }}
1769
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,align,PASS(block, "text", "bbalign");) }}
1770
1770
  break;
1771
1771
  case 35:
1772
1772
  #line 72 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1773
- {te = p+1;{ PASS(block, "text", "acronym"); }}
1773
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,acronym,PASS(block, "text", "acronym");) }}
1774
1774
  break;
1775
1775
  case 36:
1776
1776
  #line 73 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1777
- {te = p+1;{ PASS(block, "name", "link"); }}
1777
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,link,PASS(block, "name", "link");) }}
1778
1778
  break;
1779
1779
  case 37:
1780
1780
  #line 74 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"
1781
- {te = p+1;{ PASS(block, "name", "link"); }}
1781
+ {te = p+1;{ UNLESS_DISABLED_INLINE(block,link,PASS(block, "name", "link");) }}
1782
1782
  break;
1783
1783
  case 38:
1784
1784
  #line 75 "ext/redcloth_scan/redcloth_bbcode_inline.c.rl"