BBRedCloth 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/BBRedCloth.gemspec +36 -0
- data/CHANGELOG +123 -0
- data/COPYING +18 -0
- data/Manifest +45 -0
- data/README.textile +149 -0
- data/Rakefile +247 -0
- data/bin/bbredcloth +34 -0
- data/ext/mingw-rbconfig.rb +176 -0
- data/ext/redcloth_scan/extconf.rb +9 -0
- data/ext/redcloth_scan/redcloth.h +196 -0
- data/ext/redcloth_scan/redcloth_attributes.c +655 -0
- data/ext/redcloth_scan/redcloth_bbcode.c +2457 -0
- data/ext/redcloth_scan/redcloth_bbcode_inline.c +1890 -0
- data/ext/redcloth_scan/redcloth_inline.c +12387 -0
- data/ext/redcloth_scan/redcloth_scan.c +10848 -0
- data/extras/ragel_profiler.rb +73 -0
- data/lib/case_sensitive_require/RedCloth.rb +6 -0
- data/lib/redcloth/erb_extension.rb +27 -0
- data/lib/redcloth/formatters/base.rb +57 -0
- data/lib/redcloth/formatters/html.rb +487 -0
- data/lib/redcloth/formatters/latex.rb +249 -0
- data/lib/redcloth/formatters/latex_entities.yml +2414 -0
- data/lib/redcloth/textile_doc.rb +196 -0
- data/lib/redcloth/version.rb +28 -0
- data/lib/redcloth.rb +37 -0
- data/setup.rb +1585 -0
- data/test/basic.yml +933 -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 +109 -0
- data/test/html.yml +313 -0
- data/test/images.yml +254 -0
- data/test/instiki.yml +38 -0
- data/test/links.yml +275 -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 +61 -0
- data/test/textism.yml +484 -0
- data/test/threshold.yml +772 -0
- data/test/validate_fixtures.rb +74 -0
- metadata +139 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
|
|
2
|
+
# This rbconfig.rb corresponds to a Ruby installation for win32 cross-compiled
|
|
3
|
+
# with mingw under i686-linux. It can be used to cross-compile extensions for
|
|
4
|
+
# win32 using said toolchain.
|
|
5
|
+
#
|
|
6
|
+
# This file assumes that a cross-compiled mingw32 build (compatible with the
|
|
7
|
+
# mswin32 builds) is installed under $HOME/ruby-mingw32.
|
|
8
|
+
|
|
9
|
+
module Config
|
|
10
|
+
#RUBY_VERSION == "1.8.5" or
|
|
11
|
+
# raise "ruby lib version (1.8.5) doesn't match executable version (#{RUBY_VERSION})"
|
|
12
|
+
|
|
13
|
+
mingw32 = ENV['MINGW32_RUBY'] || "#{ENV["HOME"]}/ruby-mingw32"
|
|
14
|
+
mingwpre = ENV['MINGW32_PREFIX']
|
|
15
|
+
TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/1.8/i386-mingw32")
|
|
16
|
+
DESTDIR = '' unless defined? DESTDIR
|
|
17
|
+
CONFIG = {}
|
|
18
|
+
CONFIG["DESTDIR"] = DESTDIR
|
|
19
|
+
CONFIG["INSTALL"] = "/usr/bin/install -c"
|
|
20
|
+
CONFIG["prefix"] = (TOPDIR || DESTDIR + mingw32)
|
|
21
|
+
CONFIG["EXEEXT"] = ".exe"
|
|
22
|
+
CONFIG["ruby_install_name"] = "ruby"
|
|
23
|
+
CONFIG["RUBY_INSTALL_NAME"] = "ruby"
|
|
24
|
+
CONFIG["RUBY_SO_NAME"] = "msvcrt-ruby18"
|
|
25
|
+
CONFIG["SHELL"] = "/bin/sh"
|
|
26
|
+
CONFIG["PATH_SEPARATOR"] = ":"
|
|
27
|
+
CONFIG["PACKAGE_NAME"] = ""
|
|
28
|
+
CONFIG["PACKAGE_TARNAME"] = ""
|
|
29
|
+
CONFIG["PACKAGE_VERSION"] = ""
|
|
30
|
+
CONFIG["PACKAGE_STRING"] = ""
|
|
31
|
+
CONFIG["PACKAGE_BUGREPORT"] = ""
|
|
32
|
+
CONFIG["exec_prefix"] = "$(prefix)"
|
|
33
|
+
CONFIG["bindir"] = "$(exec_prefix)/bin"
|
|
34
|
+
CONFIG["sbindir"] = "$(exec_prefix)/sbin"
|
|
35
|
+
CONFIG["libexecdir"] = "$(exec_prefix)/libexec"
|
|
36
|
+
CONFIG["datadir"] = "$(prefix)/share"
|
|
37
|
+
CONFIG["sysconfdir"] = "$(prefix)/etc"
|
|
38
|
+
CONFIG["sharedstatedir"] = "$(prefix)/com"
|
|
39
|
+
CONFIG["localstatedir"] = "$(prefix)/var"
|
|
40
|
+
CONFIG["libdir"] = "$(exec_prefix)/lib"
|
|
41
|
+
CONFIG["includedir"] = "$(prefix)/include"
|
|
42
|
+
CONFIG["oldincludedir"] = "/usr/include"
|
|
43
|
+
CONFIG["infodir"] = "$(prefix)/info"
|
|
44
|
+
CONFIG["mandir"] = "$(prefix)/man"
|
|
45
|
+
CONFIG["build_alias"] = "i686-linux"
|
|
46
|
+
CONFIG["host_alias"] = "#{mingwpre}"
|
|
47
|
+
CONFIG["target_alias"] = "i386-mingw32"
|
|
48
|
+
CONFIG["ECHO_C"] = ""
|
|
49
|
+
CONFIG["ECHO_N"] = "-n"
|
|
50
|
+
CONFIG["ECHO_T"] = ""
|
|
51
|
+
CONFIG["LIBS"] = "-lwsock32 "
|
|
52
|
+
CONFIG["MAJOR"] = "1"
|
|
53
|
+
CONFIG["MINOR"] = "8"
|
|
54
|
+
CONFIG["TEENY"] = "4"
|
|
55
|
+
CONFIG["build"] = "i686-pc-linux"
|
|
56
|
+
CONFIG["build_cpu"] = "i686"
|
|
57
|
+
CONFIG["build_vendor"] = "pc"
|
|
58
|
+
CONFIG["build_os"] = "linux"
|
|
59
|
+
CONFIG["host"] = "i586-pc-mingw32msvc"
|
|
60
|
+
CONFIG["host_cpu"] = "i586"
|
|
61
|
+
CONFIG["host_vendor"] = "pc"
|
|
62
|
+
CONFIG["host_os"] = "mingw32msvc"
|
|
63
|
+
CONFIG["target"] = "i386-pc-mingw32"
|
|
64
|
+
CONFIG["target_cpu"] = "i386"
|
|
65
|
+
CONFIG["target_vendor"] = "pc"
|
|
66
|
+
CONFIG["target_os"] = "mingw32"
|
|
67
|
+
CONFIG["CC"] = "#{mingwpre}-gcc"
|
|
68
|
+
CONFIG["CFLAGS"] = "-g "
|
|
69
|
+
CONFIG["LDFLAGS"] = ""
|
|
70
|
+
CONFIG["CPPFLAGS"] = ""
|
|
71
|
+
CONFIG["OBJEXT"] = "o"
|
|
72
|
+
CONFIG["CPP"] = "#{mingwpre}-gcc -E"
|
|
73
|
+
CONFIG["EGREP"] = "grep -E"
|
|
74
|
+
CONFIG["GNU_LD"] = "yes"
|
|
75
|
+
CONFIG["CPPOUTFILE"] = "-o conftest.i"
|
|
76
|
+
CONFIG["OUTFLAG"] = "-o "
|
|
77
|
+
CONFIG["YACC"] = "bison -y"
|
|
78
|
+
CONFIG["RANLIB"] = "#{mingwpre}-ranlib"
|
|
79
|
+
CONFIG["AR"] = "#{mingwpre}-ar"
|
|
80
|
+
CONFIG["NM"] = "#{mingwpre}-nm"
|
|
81
|
+
CONFIG["WINDRES"] = "#{mingwpre}-windres"
|
|
82
|
+
CONFIG["DLLWRAP"] = "#{mingwpre}-dllwrap"
|
|
83
|
+
CONFIG["OBJDUMP"] = "#{mingwpre}-objdump"
|
|
84
|
+
CONFIG["LN_S"] = "ln -s"
|
|
85
|
+
CONFIG["SET_MAKE"] = ""
|
|
86
|
+
CONFIG["INSTALL_PROGRAM"] = "$(INSTALL)"
|
|
87
|
+
CONFIG["INSTALL_SCRIPT"] = "$(INSTALL)"
|
|
88
|
+
CONFIG["INSTALL_DATA"] = "$(INSTALL) -m 644"
|
|
89
|
+
CONFIG["RM"] = "rm -f"
|
|
90
|
+
CONFIG["CP"] = "cp"
|
|
91
|
+
CONFIG["MAKEDIRS"] = "mkdir -p"
|
|
92
|
+
CONFIG["LIBOBJS"] = " fileblocks$(U).o crypt$(U).o flock$(U).o acosh$(U).o win32$(U).o"
|
|
93
|
+
CONFIG["ALLOCA"] = ""
|
|
94
|
+
CONFIG["DLDFLAGS"] = " -Wl,--enable-auto-import,--export-all"
|
|
95
|
+
CONFIG["ARCH_FLAG"] = ""
|
|
96
|
+
CONFIG["STATIC"] = ""
|
|
97
|
+
CONFIG["CCDLFLAGS"] = ""
|
|
98
|
+
CONFIG["LDSHARED"] = "#{mingwpre}-gcc -shared -s"
|
|
99
|
+
CONFIG["DLEXT"] = "so"
|
|
100
|
+
CONFIG["DLEXT2"] = "dll"
|
|
101
|
+
CONFIG["LIBEXT"] = "a"
|
|
102
|
+
CONFIG["LINK_SO"] = ""
|
|
103
|
+
CONFIG["LIBPATHFLAG"] = " -L\"%s\""
|
|
104
|
+
CONFIG["RPATHFLAG"] = ""
|
|
105
|
+
CONFIG["LIBPATHENV"] = ""
|
|
106
|
+
CONFIG["TRY_LINK"] = ""
|
|
107
|
+
CONFIG["STRIP"] = "strip"
|
|
108
|
+
CONFIG["EXTSTATIC"] = ""
|
|
109
|
+
CONFIG["setup"] = "Setup"
|
|
110
|
+
CONFIG["MINIRUBY"] = "ruby -rfake"
|
|
111
|
+
CONFIG["PREP"] = "fake.rb"
|
|
112
|
+
CONFIG["RUNRUBY"] = "$(MINIRUBY) -I`cd $(srcdir)/lib; pwd`"
|
|
113
|
+
CONFIG["EXTOUT"] = ".ext"
|
|
114
|
+
CONFIG["ARCHFILE"] = ""
|
|
115
|
+
CONFIG["RDOCTARGET"] = ""
|
|
116
|
+
CONFIG["XCFLAGS"] = " -DRUBY_EXPORT"
|
|
117
|
+
CONFIG["XLDFLAGS"] = " -Wl,--stack,0x02000000 -L."
|
|
118
|
+
CONFIG["LIBRUBY_LDSHARED"] = "#{mingwpre}-gcc -shared -s"
|
|
119
|
+
CONFIG["LIBRUBY_DLDFLAGS"] = " -Wl,--enable-auto-import,--export-all -Wl,--out-implib=$(LIBRUBY)"
|
|
120
|
+
CONFIG["rubyw_install_name"] = "rubyw"
|
|
121
|
+
CONFIG["RUBYW_INSTALL_NAME"] = "rubyw"
|
|
122
|
+
CONFIG["LIBRUBY_A"] = "lib$(RUBY_SO_NAME)-static.a"
|
|
123
|
+
CONFIG["LIBRUBY_SO"] = "$(RUBY_SO_NAME).dll"
|
|
124
|
+
CONFIG["LIBRUBY_ALIASES"] = ""
|
|
125
|
+
CONFIG["LIBRUBY"] = "lib$(LIBRUBY_SO).a"
|
|
126
|
+
CONFIG["LIBRUBYARG"] = "$(LIBRUBYARG_SHARED)"
|
|
127
|
+
CONFIG["LIBRUBYARG_STATIC"] = "-l$(RUBY_SO_NAME)-static"
|
|
128
|
+
CONFIG["LIBRUBYARG_SHARED"] = "-l$(RUBY_SO_NAME)"
|
|
129
|
+
CONFIG["SOLIBS"] = "$(LIBS)"
|
|
130
|
+
CONFIG["DLDLIBS"] = ""
|
|
131
|
+
CONFIG["ENABLE_SHARED"] = "yes"
|
|
132
|
+
CONFIG["MAINLIBS"] = ""
|
|
133
|
+
CONFIG["COMMON_LIBS"] = "m"
|
|
134
|
+
CONFIG["COMMON_MACROS"] = ""
|
|
135
|
+
CONFIG["COMMON_HEADERS"] = "windows.h winsock.h"
|
|
136
|
+
CONFIG["EXPORT_PREFIX"] = ""
|
|
137
|
+
CONFIG["MINIOBJS"] = "dmydln.o"
|
|
138
|
+
CONFIG["MAKEFILES"] = "Makefile GNUmakefile"
|
|
139
|
+
CONFIG["arch"] = "i386-mingw32"
|
|
140
|
+
CONFIG["sitearch"] = "i386-msvcrt"
|
|
141
|
+
CONFIG["sitedir"] = "$(prefix)/lib/ruby/site_ruby"
|
|
142
|
+
CONFIG["configure_args"] = "'--host=#{mingwpre}' '--target=i386-mingw32' '--build=i686-linux' '--prefix=#{mingw32}' 'build_alias=i686-linux' 'host_alias=#{mingwpre}' 'target_alias=i386-mingw32'"
|
|
143
|
+
CONFIG["NROFF"] = "/usr/bin/nroff"
|
|
144
|
+
CONFIG["MANTYPE"] = "doc"
|
|
145
|
+
CONFIG["LTLIBOBJS"] = " fileblocks$(U).lo crypt$(U).lo flock$(U).lo acosh$(U).lo win32$(U).lo"
|
|
146
|
+
CONFIG["ruby_version"] = "$(MAJOR).$(MINOR)"
|
|
147
|
+
CONFIG["rubylibdir"] = "$(libdir)/ruby/$(ruby_version)"
|
|
148
|
+
CONFIG["archdir"] = "$(rubylibdir)/$(arch)"
|
|
149
|
+
CONFIG["sitelibdir"] = "$(sitedir)/$(ruby_version)"
|
|
150
|
+
CONFIG["sitearchdir"] = "$(sitelibdir)/$(sitearch)"
|
|
151
|
+
CONFIG["topdir"] = File.dirname(__FILE__)
|
|
152
|
+
MAKEFILE_CONFIG = {}
|
|
153
|
+
CONFIG.each{|k,v| MAKEFILE_CONFIG[k] = v.dup}
|
|
154
|
+
def Config::expand(val, config = CONFIG)
|
|
155
|
+
val.gsub!(/\$\$|\$\(([^()]+)\)|\$\{([^{}]+)\}/) do |var|
|
|
156
|
+
if !(v = $1 || $2)
|
|
157
|
+
'$'
|
|
158
|
+
elsif key = config[v = v[/\A[^:]+(?=(?::(.*?)=(.*))?\z)/]]
|
|
159
|
+
pat, sub = $1, $2
|
|
160
|
+
config[v] = false
|
|
161
|
+
Config::expand(key, config)
|
|
162
|
+
config[v] = key
|
|
163
|
+
key = key.gsub(/#{Regexp.quote(pat)}(?=\s|\z)/n) {sub} if pat
|
|
164
|
+
key
|
|
165
|
+
else
|
|
166
|
+
var
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
val
|
|
170
|
+
end
|
|
171
|
+
CONFIG.each_value do |val|
|
|
172
|
+
Config::expand(val)
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
RbConfig = Config # compatibility for ruby-1.9
|
|
176
|
+
CROSS_COMPILING = nil unless defined? CROSS_COMPILING
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#ifndef redcloth_h
|
|
2
|
+
#define redcloth_h
|
|
3
|
+
|
|
4
|
+
/* Backward compatibility with Ruby < 1.8.6 */
|
|
5
|
+
#ifndef RSTRING_LEN
|
|
6
|
+
#define RSTRING_LEN(x) (RSTRING(x)->len)
|
|
7
|
+
#endif
|
|
8
|
+
#ifndef RSTRING_PTR
|
|
9
|
+
#define RSTRING_PTR(x) (RSTRING(x)->ptr)
|
|
10
|
+
#endif
|
|
11
|
+
#ifndef RARRAY_LEN
|
|
12
|
+
#define RARRAY_LEN(x) (RARRAY(x)->len)
|
|
13
|
+
#endif
|
|
14
|
+
#ifndef RARRAY_PTR
|
|
15
|
+
#define RARRAY_PTR(x) (RARRAY(x)->ptr)
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
/* variable defs */
|
|
19
|
+
#ifndef redcloth_scan_c
|
|
20
|
+
extern VALUE super_ParseError, mRedCloth, super_RedCloth;
|
|
21
|
+
extern int SYM_escape_preformatted;
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
/* function defs */
|
|
25
|
+
void rb_str_cat_escaped(VALUE self, VALUE str, char *ts, char *te);
|
|
26
|
+
void rb_str_cat_escaped_for_preformatted(VALUE self, VALUE str, char *ts, char *te);
|
|
27
|
+
void rb_str_cat_escaped_test(VALUE self, VALUE str, char *ts, char *te);
|
|
28
|
+
VALUE redcloth_inline(VALUE, char *, char *, VALUE);
|
|
29
|
+
VALUE redcloth_inline2(VALUE, VALUE, VALUE);
|
|
30
|
+
VALUE redcloth_attribute_parser(int, VALUE, char *, char *);
|
|
31
|
+
VALUE redcloth_attributes(VALUE, VALUE);
|
|
32
|
+
VALUE redcloth_link_attributes(VALUE, VALUE);
|
|
33
|
+
VALUE redcloth_transform(VALUE, char *, char *, VALUE);
|
|
34
|
+
VALUE redcloth_transform2(VALUE, VALUE);
|
|
35
|
+
void red_inc(VALUE, VALUE);
|
|
36
|
+
VALUE red_block(VALUE, VALUE, VALUE, VALUE);
|
|
37
|
+
VALUE red_blockcode(VALUE, VALUE, VALUE);
|
|
38
|
+
VALUE red_pass(VALUE, VALUE, VALUE, ID, VALUE);
|
|
39
|
+
VALUE red_pass_code(VALUE, VALUE, VALUE, ID);
|
|
40
|
+
VALUE redcloth_bbcode(VALUE, char *, char *, VALUE);
|
|
41
|
+
VALUE redcloth_bbcode2(VALUE, VALUE, VALUE);
|
|
42
|
+
VALUE redcloth_bbcode_inline(VALUE, char *, char *, VALUE);
|
|
43
|
+
VALUE redcloth_bbcode_inline2(VALUE, VALUE, VALUE);
|
|
44
|
+
|
|
45
|
+
/* parser macros */
|
|
46
|
+
#define CALL_STACK_SIZE 20
|
|
47
|
+
#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 }
|
|
50
|
+
#define CLEAR_REGS() regs = rb_hash_new();
|
|
51
|
+
#define RESET_REG() reg = NULL
|
|
52
|
+
#define CAT(H) rb_str_cat(H, ts, te-ts)
|
|
53
|
+
#define CLEAR(H) H = rb_str_new2("")
|
|
54
|
+
#define SET_PLAIN_BLOCK(T) plain_block = rb_str_new2(T)
|
|
55
|
+
#define RESET_TYPE(T) rb_hash_aset(regs, ID2SYM(rb_intern("type")), plain_block)
|
|
56
|
+
#define INLINE(H, T) rb_str_append(H, rb_funcall(self, rb_intern(T), 1, regs))
|
|
57
|
+
#define DONE(H) rb_str_append(html, H); CLEAR(H); CLEAR_REGS()
|
|
58
|
+
#define BBDONE() failed_start = rb_str_new2(""); html = rb_str_new2(""); CLEAR_REGS(); RESET_REG();
|
|
59
|
+
#define PASS(H, A, T) rb_str_append(H, red_pass(self, regs, ID2SYM(rb_intern(A)), rb_intern(T), refs))
|
|
60
|
+
#define PARSE_ATTR(A) red_parse_attr(self, regs, ID2SYM(rb_intern(A)))
|
|
61
|
+
#define PARSE_LINK_ATTR(A) red_parse_link_attr(self, regs, ID2SYM(rb_intern(A)))
|
|
62
|
+
#define PASS_CODE(H, A, T, O) rb_str_append(H, red_pass_code(self, regs, ID2SYM(rb_intern(A)), rb_intern(T)))
|
|
63
|
+
#define ADD_BLOCK() \
|
|
64
|
+
rb_str_append(html, red_block(self, regs, block, refs)); \
|
|
65
|
+
extend = Qnil; \
|
|
66
|
+
CLEAR(block); \
|
|
67
|
+
CLEAR_REGS()
|
|
68
|
+
#define ADD_EXTENDED_BLOCK() rb_str_append(html, red_block(self, regs, block, refs)); CLEAR(block);
|
|
69
|
+
#define END_EXTENDED() extend = Qnil; CLEAR_REGS();
|
|
70
|
+
#define IS_NOT_EXTENDED() NIL_P(extend)
|
|
71
|
+
#define ADD_BLOCKCODE() rb_str_append(html, red_blockcode(self, regs, block)); CLEAR(block); CLEAR_REGS()
|
|
72
|
+
#define ADD_EXTENDED_BLOCKCODE() rb_str_append(html, red_blockcode(self, regs, block)); CLEAR(block);
|
|
73
|
+
#define ASET(T, V) rb_hash_aset(regs, ID2SYM(rb_intern(T)), rb_str_new2(V));
|
|
74
|
+
#define AINC(T) red_inc(regs, ID2SYM(rb_intern(T)));
|
|
75
|
+
#define SET_ATTRIBUTES() \
|
|
76
|
+
VALUE buf = Qnil; \
|
|
77
|
+
SET_ATTRIBUTE("class_buf", "class"); \
|
|
78
|
+
SET_ATTRIBUTE("id_buf", "id"); \
|
|
79
|
+
SET_ATTRIBUTE("lang_buf", "lang"); \
|
|
80
|
+
SET_ATTRIBUTE("style_buf", "style");
|
|
81
|
+
#define SET_ATTRIBUTE(B, A) \
|
|
82
|
+
buf = rb_hash_aref(regs, ID2SYM(rb_intern(B))); \
|
|
83
|
+
if (buf != Qnil) rb_hash_aset(regs, ID2SYM(rb_intern(A)), buf);
|
|
84
|
+
#define TRANSFORM(T) \
|
|
85
|
+
if (p > reg && reg >= ts) { \
|
|
86
|
+
VALUE str = redcloth_transform(self, reg, p, refs); \
|
|
87
|
+
rb_hash_aset(regs, ID2SYM(rb_intern(T)), str); \
|
|
88
|
+
/* printf("TRANSFORM(" T ") '%s' (p:'%d' reg:'%d')\n", RSTRING(str)->ptr, p, reg);*/ \
|
|
89
|
+
} else { \
|
|
90
|
+
rb_hash_aset(regs, ID2SYM(rb_intern(T)), Qnil); \
|
|
91
|
+
}
|
|
92
|
+
#define STORE(T) \
|
|
93
|
+
if (p > reg && reg >= ts) { \
|
|
94
|
+
VALUE str = rb_str_new(reg, p-reg); \
|
|
95
|
+
rb_hash_aset(regs, ID2SYM(rb_intern(T)), str); \
|
|
96
|
+
/* printf("STORE(" T ") '%s' (p:'%d' reg:'%d')\n", RSTRING(str)->ptr, p, reg);*/ \
|
|
97
|
+
} else { \
|
|
98
|
+
rb_hash_aset(regs, ID2SYM(rb_intern(T)), Qnil); \
|
|
99
|
+
}
|
|
100
|
+
#define STORE_B(T) \
|
|
101
|
+
if (p > bck && bck >= ts) { \
|
|
102
|
+
VALUE str = rb_str_new(bck, p-bck); \
|
|
103
|
+
rb_hash_aset(regs, ID2SYM(rb_intern(T)), str); \
|
|
104
|
+
/* printf("STORE_B(" T ") '%s' (p:'%d' reg:'%d')\n", RSTRING(str)->ptr, p, reg);*/ \
|
|
105
|
+
} else { \
|
|
106
|
+
rb_hash_aset(regs, ID2SYM(rb_intern(T)), Qnil); \
|
|
107
|
+
}
|
|
108
|
+
#define BBCODE_ENABLED() rb_funcall(self, rb_intern("bbcode"), 0) == Qtrue
|
|
109
|
+
#define STORE_URL(T) \
|
|
110
|
+
if (p > reg && reg >= ts) { \
|
|
111
|
+
char punct = 1; \
|
|
112
|
+
while (p > reg && punct == 1) { \
|
|
113
|
+
switch (*(p - 1)) { \
|
|
114
|
+
case ')': \
|
|
115
|
+
{ /*needed to keep inside chars scoped for less memory usage*/\
|
|
116
|
+
char *temp_p = p - 1; \
|
|
117
|
+
char level = -1; \
|
|
118
|
+
while (temp_p > reg) { \
|
|
119
|
+
switch(*(temp_p - 1)) { \
|
|
120
|
+
case '(': ++level; break; \
|
|
121
|
+
case ')': --level; break; \
|
|
122
|
+
} \
|
|
123
|
+
--temp_p; \
|
|
124
|
+
} \
|
|
125
|
+
if (level == 0) { punct = 0; } else { --p; } \
|
|
126
|
+
} \
|
|
127
|
+
break; \
|
|
128
|
+
case '!': case '"': case '#': case '$': case '%': case ']': case '[': case '&': case '\'': \
|
|
129
|
+
case '*': case '+': case ',': case '-': case '.': case '(': case ':': \
|
|
130
|
+
case ';': case '=': case '?': case '@': case '\\': case '^': case '_': \
|
|
131
|
+
case '`': case '|': case '~': p--; break; \
|
|
132
|
+
default: punct = 0; \
|
|
133
|
+
} \
|
|
134
|
+
} \
|
|
135
|
+
te = p; \
|
|
136
|
+
} \
|
|
137
|
+
STORE(T); \
|
|
138
|
+
if ( !NIL_P(refs) && rb_funcall(refs, rb_intern("has_key?"), 1, rb_hash_aref(regs, ID2SYM(rb_intern(T)))) ) { \
|
|
139
|
+
rb_hash_aset(regs, ID2SYM(rb_intern(T)), rb_hash_aref(refs, rb_hash_aref(regs, ID2SYM(rb_intern(T))))); \
|
|
140
|
+
}
|
|
141
|
+
#define STORE_LINK_ALIAS() \
|
|
142
|
+
rb_hash_aset(refs_found, rb_hash_aref(regs, ID2SYM(rb_intern("text"))), rb_hash_aref(regs, ID2SYM(rb_intern("href"))))
|
|
143
|
+
#define CLEAR_LIST() list_layout = rb_ary_new()
|
|
144
|
+
#define LIST_ITEM() \
|
|
145
|
+
int aint = 0; \
|
|
146
|
+
VALUE aval = rb_ary_entry(list_index, nest-1); \
|
|
147
|
+
if (aval != Qnil) aint = NUM2INT(aval); \
|
|
148
|
+
if (strcmp(list_type, "ol") == 0) \
|
|
149
|
+
{ \
|
|
150
|
+
rb_ary_store(list_index, nest-1, INT2NUM(aint + 1)); \
|
|
151
|
+
} \
|
|
152
|
+
if (nest > RARRAY_LEN(list_layout)) \
|
|
153
|
+
{ \
|
|
154
|
+
sprintf(listm, "%s_open", list_type); \
|
|
155
|
+
if (list_continue == 1) \
|
|
156
|
+
{ \
|
|
157
|
+
list_continue = 0; \
|
|
158
|
+
rb_hash_aset(regs, ID2SYM(rb_intern("start")), rb_ary_entry(list_index, nest-1)); \
|
|
159
|
+
} \
|
|
160
|
+
else \
|
|
161
|
+
{ \
|
|
162
|
+
VALUE start = rb_hash_aref(regs, ID2SYM(rb_intern("start"))); \
|
|
163
|
+
if (NIL_P(start) ) \
|
|
164
|
+
{ \
|
|
165
|
+
rb_ary_store(list_index, nest-1, INT2NUM(1)); \
|
|
166
|
+
} \
|
|
167
|
+
else \
|
|
168
|
+
{ \
|
|
169
|
+
VALUE start_num = rb_funcall(start,rb_intern("to_i"),0); \
|
|
170
|
+
rb_ary_store(list_index, nest-1, start_num); \
|
|
171
|
+
} \
|
|
172
|
+
} \
|
|
173
|
+
rb_hash_aset(regs, ID2SYM(rb_intern("nest")), INT2NUM(nest)); \
|
|
174
|
+
rb_str_append(html, rb_funcall(self, rb_intern(listm), 1, regs)); \
|
|
175
|
+
rb_ary_store(list_layout, nest-1, rb_str_new2(list_type)); \
|
|
176
|
+
CLEAR_REGS(); \
|
|
177
|
+
ASET("first", "true"); \
|
|
178
|
+
} \
|
|
179
|
+
LIST_CLOSE(); \
|
|
180
|
+
rb_hash_aset(regs, ID2SYM(rb_intern("nest")), INT2NUM(RARRAY_LEN(list_layout))); \
|
|
181
|
+
ASET("type", "li_open")
|
|
182
|
+
#define LIST_CLOSE() \
|
|
183
|
+
while (nest < RARRAY_LEN(list_layout)) \
|
|
184
|
+
{ \
|
|
185
|
+
rb_hash_aset(regs, ID2SYM(rb_intern("nest")), INT2NUM(RARRAY_LEN(list_layout))); \
|
|
186
|
+
VALUE end_list = rb_ary_pop(list_layout); \
|
|
187
|
+
if (!NIL_P(end_list)) \
|
|
188
|
+
{ \
|
|
189
|
+
StringValue(end_list); \
|
|
190
|
+
sprintf(listm, "%s_close", RSTRING_PTR(end_list)); \
|
|
191
|
+
rb_str_append(html, rb_funcall(self, rb_intern(listm), 1, regs)); \
|
|
192
|
+
} \
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
#endif
|