parity-RedCloth 4.2.9

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.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/.rspec +1 -0
  4. data/CHANGELOG +265 -0
  5. data/COPYING +18 -0
  6. data/Gemfile +7 -0
  7. data/README.rdoc +215 -0
  8. data/Rakefile +18 -0
  9. data/bin/redcloth +28 -0
  10. data/doc/textile_reference.html +631 -0
  11. data/ext/redcloth_scan/extconf.rb +6 -0
  12. data/ext/redcloth_scan/redcloth.h +220 -0
  13. data/ext/redcloth_scan/redcloth_attributes.c +650 -0
  14. data/ext/redcloth_scan/redcloth_inline.c +8153 -0
  15. data/ext/redcloth_scan/redcloth_scan.c +24407 -0
  16. data/lib/case_sensitive_require/RedCloth.rb +6 -0
  17. data/lib/redcloth/erb_extension.rb +27 -0
  18. data/lib/redcloth/formatters/base.rb +63 -0
  19. data/lib/redcloth/formatters/html.rb +352 -0
  20. data/lib/redcloth/formatters/latex.rb +331 -0
  21. data/lib/redcloth/formatters/latex_entities.yml +2414 -0
  22. data/lib/redcloth/textile_doc.rb +113 -0
  23. data/lib/redcloth/version.rb +34 -0
  24. data/lib/redcloth.rb +45 -0
  25. data/lib/tasks/pureruby.rake +17 -0
  26. data/redcloth.gemspec +54 -0
  27. data/spec/benchmark_spec.rb +15 -0
  28. data/spec/custom_tags_spec.rb +50 -0
  29. data/spec/erb_spec.rb +10 -0
  30. data/spec/extension_spec.rb +26 -0
  31. data/spec/fixtures/basic.yml +1028 -0
  32. data/spec/fixtures/code.yml +257 -0
  33. data/spec/fixtures/definitions.yml +82 -0
  34. data/spec/fixtures/extra_whitespace.yml +64 -0
  35. data/spec/fixtures/filter_html.yml +177 -0
  36. data/spec/fixtures/filter_pba.yml +20 -0
  37. data/spec/fixtures/html.yml +348 -0
  38. data/spec/fixtures/images.yml +279 -0
  39. data/spec/fixtures/instiki.yml +38 -0
  40. data/spec/fixtures/links.yml +291 -0
  41. data/spec/fixtures/lists.yml +462 -0
  42. data/spec/fixtures/poignant.yml +89 -0
  43. data/spec/fixtures/sanitize_html.yml +42 -0
  44. data/spec/fixtures/table.yml +434 -0
  45. data/spec/fixtures/textism.yml +509 -0
  46. data/spec/fixtures/threshold.yml +762 -0
  47. data/spec/formatters/class_filtered_html_spec.rb +7 -0
  48. data/spec/formatters/filtered_html_spec.rb +7 -0
  49. data/spec/formatters/html_no_breaks_spec.rb +9 -0
  50. data/spec/formatters/html_spec.rb +13 -0
  51. data/spec/formatters/id_filtered_html_spec.rb +7 -0
  52. data/spec/formatters/latex_spec.rb +13 -0
  53. data/spec/formatters/lite_mode_html_spec.rb +7 -0
  54. data/spec/formatters/no_span_caps_html_spec.rb +7 -0
  55. data/spec/formatters/sanitized_html_spec.rb +7 -0
  56. data/spec/formatters/style_filtered_html_spec.rb +7 -0
  57. data/spec/parser_spec.rb +102 -0
  58. data/spec/spec_helper.rb +36 -0
  59. data/tasks/compile.rake +47 -0
  60. data/tasks/gems.rake +37 -0
  61. data/tasks/ragel_extension_task.rb +127 -0
  62. data/tasks/release.rake +15 -0
  63. data/tasks/rspec.rake +13 -0
  64. data/tasks/rvm.rake +79 -0
  65. metadata +239 -0
@@ -0,0 +1,6 @@
1
+ require 'mkmf'
2
+ CONFIG['warnflags'].gsub!(/-Wshorten-64-to-32/, '') if CONFIG['warnflags']
3
+ $CFLAGS << ' -O0 -Wall ' if CONFIG['CC'] =~ /gcc/
4
+ dir_config("redcloth_scan")
5
+ have_library("c", "main")
6
+ create_makefile("redcloth_scan")
@@ -0,0 +1,220 @@
1
+ #ifndef redcloth_h
2
+ #define redcloth_h
3
+
4
+ #ifndef RARRAY_LEN
5
+ #define RARRAY_LEN(arr) RARRAY(arr)->len
6
+ #define RSTRING_LEN(str) RSTRING(str)->len
7
+ #define RSTRING_PTR(str) RSTRING(str)->ptr
8
+ #endif
9
+
10
+
11
+ // Different string conversions for ruby 1.8 and ruby 1.9. For 1.9,
12
+ // we need to set the encoding of the string.
13
+
14
+ // For Ruby 1.9
15
+ #ifdef HAVE_RUBY_ENCODING_H
16
+ #include "ruby/encoding.h"
17
+ #define STR_NEW(p,n) rb_enc_str_new((p),(n),rb_enc_from_index(ENCODING_GET(self)))
18
+ #define STR_NEW2(p) rb_enc_str_new((p),strlen(p),rb_enc_from_index(ENCODING_GET(self)))
19
+
20
+ // For Ruby 1.8
21
+ #else
22
+ #define STR_NEW(p,n) rb_str_new((p),(n))
23
+ #define STR_NEW2(p) rb_str_new2((p))
24
+
25
+ #endif
26
+
27
+
28
+ /* variable defs */
29
+ #ifndef redcloth_scan_c
30
+ extern VALUE super_ParseError, mRedCloth, super_RedCloth;
31
+ extern int SYM_escape_preformatted;
32
+ #endif
33
+
34
+ /* function defs */
35
+ void rb_str_cat_escaped(VALUE self, VALUE str, char *ts, char *te);
36
+ void rb_str_cat_escaped_for_preformatted(VALUE self, VALUE str, char *ts, char *te);
37
+ VALUE redcloth_inline(VALUE, char *, char *, VALUE);
38
+ VALUE redcloth_inline2(VALUE, VALUE, VALUE);
39
+ VALUE redcloth_attribute_parser(int, VALUE, char *, char *);
40
+ VALUE redcloth_attributes(VALUE, VALUE);
41
+ VALUE redcloth_link_attributes(VALUE, VALUE);
42
+ VALUE red_parse_title(VALUE, VALUE, VALUE);
43
+ VALUE redcloth_transform(VALUE, char *, char *, VALUE);
44
+ VALUE redcloth_transform2(VALUE, VALUE);
45
+ void red_inc(VALUE, VALUE);
46
+ VALUE red_block(VALUE, VALUE, VALUE, VALUE);
47
+ VALUE red_blockcode(VALUE, VALUE, VALUE);
48
+ VALUE red_pass(VALUE, VALUE, VALUE, ID, VALUE);
49
+ VALUE red_pass_code(VALUE, VALUE, VALUE, ID);
50
+
51
+ /* parser macros */
52
+ #define CLEAR_REGS() regs = rb_hash_new(); attr_regs = rb_hash_new();
53
+ #define RESET_REG() reg = NULL
54
+ #define MARK() reg = p;
55
+ #define MARK_B() bck = p;
56
+ #define MARK_ATTR() attr_reg = p;
57
+ #define CAT(H) rb_str_cat(H, ts, te-ts)
58
+ #define CLEAR(H) H = STR_NEW2("")
59
+ #define RSTRIP_BANG(H) rb_funcall(H, rb_intern("rstrip!"), 0)
60
+ #define SET_PLAIN_BLOCK(T) plain_block = STR_NEW2(T)
61
+ #define RESET_TYPE(T) rb_hash_aset(regs, ID2SYM(rb_intern("type")), plain_block)
62
+ #define INLINE(H, T) rb_str_append(H, rb_funcall(self, rb_intern(T), 1, regs))
63
+ #define DONE(H) rb_str_append(html, H); CLEAR(H); CLEAR_REGS()
64
+ #define PASS(H, A, T) rb_str_append(H, red_pass(self, regs, ID2SYM(rb_intern(A)), rb_intern(T), refs))
65
+ #define PARSE_ATTR(A) red_parse_attr(self, regs, ID2SYM(rb_intern(A)))
66
+ #define PARSE_LINK_ATTR(A) red_parse_link_attr(self, regs, ID2SYM(rb_intern(A)))
67
+ #define PARSE_IMAGE_ATTR(A) red_parse_image_attr(self, regs, ID2SYM(rb_intern(A)))
68
+ #define PASS_CODE(H, A, T) rb_str_append(H, red_pass_code(self, regs, ID2SYM(rb_intern(A)), rb_intern(T)))
69
+ #define ADD_BLOCK() \
70
+ rb_str_append(html, red_block(self, regs, block, refs)); \
71
+ extend = Qnil; \
72
+ CLEAR(block); \
73
+ CLEAR_REGS()
74
+ #define ADD_EXTENDED_BLOCK() rb_str_append(html, red_block(self, regs, block, refs)); CLEAR(block);
75
+ #define END_EXTENDED() extend = Qnil; CLEAR_REGS();
76
+ #define ADD_BLOCKCODE() rb_str_append(html, red_blockcode(self, regs, block)); CLEAR(block); CLEAR_REGS()
77
+ #define ADD_EXTENDED_BLOCKCODE() rb_str_append(html, red_blockcode(self, regs, block)); CLEAR(block);
78
+ #define ASET(T, V) rb_hash_aset(regs, ID2SYM(rb_intern(T)), STR_NEW2(V));
79
+ #define ATTR_SET(T, V) rb_hash_aset(attr_regs, ID2SYM(rb_intern(T)), STR_NEW2(V));
80
+ #define ATTR_INC(T) red_inc(attr_regs, ID2SYM(rb_intern(T)));
81
+ #define INC(N) N++;
82
+ #define SET_ATTRIBUTES() \
83
+ SET_ATTRIBUTE("class_buf", "class"); \
84
+ SET_ATTRIBUTE("id_buf", "id"); \
85
+ SET_ATTRIBUTE("lang_buf", "lang"); \
86
+ SET_ATTRIBUTE("style_buf", "style"); \
87
+ rb_funcall(regs, rb_intern("merge!"), 1, attr_regs); \
88
+ attr_regs = rb_hash_new();
89
+ #define SET_ATTRIBUTE(B, A) \
90
+ if (rb_hash_aref(regs, ID2SYM(rb_intern(B))) != Qnil) rb_hash_aset(regs, ID2SYM(rb_intern(A)), rb_hash_aref(regs, ID2SYM(rb_intern(B))));
91
+ #define TRANSFORM(T) \
92
+ if (p > reg && reg >= ts) { \
93
+ VALUE str = redcloth_transform(self, reg, p, refs); \
94
+ rb_hash_aset(regs, ID2SYM(rb_intern(T)), str); \
95
+ /*printf("TRANSFORM(" T ") '%s' (p:'%s' reg:'%s')\n", RSTRING_PTR(str), p, reg);*/ \
96
+ } else { \
97
+ rb_hash_aset(regs, ID2SYM(rb_intern(T)), Qnil); \
98
+ }
99
+ #define STORE(T) \
100
+ if (p > reg && reg >= ts) { \
101
+ VALUE str = STR_NEW(reg, p-reg); \
102
+ rb_hash_aset(regs, ID2SYM(rb_intern(T)), str); \
103
+ /*printf("STORE(" T ") '%s' (p:'%s' reg:'%s')\n", RSTRING_PTR(str), p, reg);*/ \
104
+ } else { \
105
+ rb_hash_aset(regs, ID2SYM(rb_intern(T)), Qnil); \
106
+ }
107
+ #define STORE_B(T) \
108
+ if (p > bck && bck >= ts) { \
109
+ VALUE str = STR_NEW(bck, p-bck); \
110
+ rb_hash_aset(regs, ID2SYM(rb_intern(T)), str); \
111
+ /*printf("STORE_B(" T ") '%s' (p:'%s' reg:'%s')\n", RSTRING_PTR(str), p, reg);*/ \
112
+ } else { \
113
+ rb_hash_aset(regs, ID2SYM(rb_intern(T)), Qnil); \
114
+ }
115
+ #define STORE_ATTR(T) \
116
+ if (p > attr_reg && attr_reg >= ts) { \
117
+ VALUE str = STR_NEW(attr_reg, p-attr_reg); \
118
+ rb_hash_aset(attr_regs, ID2SYM(rb_intern(T)), str); \
119
+ /*printf("STORE_B(" T ") '%s' (p:'%s' reg:'%s')\n", RSTRING_PTR(str), p, reg);*/ \
120
+ } else { \
121
+ rb_hash_aset(attr_regs, ID2SYM(rb_intern(T)), Qnil); \
122
+ }
123
+
124
+ #define STORE_URL(T) \
125
+ if (p > reg && reg >= ts) { \
126
+ char punct = 1; \
127
+ while (p > reg && punct == 1) { \
128
+ switch (*(p - 1)) { \
129
+ case ')': \
130
+ { /*needed to keep inside chars scoped for less memory usage*/\
131
+ char *temp_p = p - 1; \
132
+ signed char level = -1; \
133
+ while (temp_p > reg) { \
134
+ switch(*(temp_p - 1)) { \
135
+ case '(': ++level; break; \
136
+ case ')': --level; break; \
137
+ } \
138
+ --temp_p; \
139
+ } \
140
+ if (level == 0) { punct = 0; } else { --p; } \
141
+ } \
142
+ break; \
143
+ case '!': case '"': case '#': case '$': case '%': case ']': case '[': case '&': case '\'': \
144
+ case '*': case '+': case ',': case '-': case '.': case '(': case ':': \
145
+ case ';': case '=': case '?': case '@': case '\\': case '^': case '_': \
146
+ case '`': case '|': case '~': p--; break; \
147
+ default: punct = 0; \
148
+ } \
149
+ } \
150
+ te = p; \
151
+ } \
152
+ STORE(T); \
153
+ if ( !NIL_P(refs) && rb_funcall(refs, rb_intern("has_key?"), 1, rb_hash_aref(regs, ID2SYM(rb_intern(T)))) ) { \
154
+ rb_hash_aset(regs, ID2SYM(rb_intern(T)), rb_hash_aref(refs, rb_hash_aref(regs, ID2SYM(rb_intern(T))))); \
155
+ }
156
+ #define STORE_LINK_ALIAS() \
157
+ rb_hash_aset(refs_found, rb_hash_aref(regs, ID2SYM(rb_intern("text"))), rb_hash_aref(regs, ID2SYM(rb_intern("href"))))
158
+ #define CLEAR_LIST() list_layout = rb_ary_new()
159
+ #define SET_LIST_TYPE(T) list_type = T;
160
+ #define NEST() nest ++;
161
+ #define RESET_NEST() nest = 0;
162
+ #define LIST_LAYOUT() \
163
+ int aint = 0; \
164
+ VALUE aval = rb_ary_entry(list_index, nest-1); \
165
+ if (aval != Qnil) aint = NUM2INT(aval); \
166
+ if (strcmp(list_type, "ol") == 0 && nest > 0) \
167
+ { \
168
+ rb_ary_store(list_index, nest-1, INT2NUM(aint + 1)); \
169
+ } \
170
+ if (nest > RARRAY_LEN(list_layout)) \
171
+ { \
172
+ SET_ATTRIBUTES(); \
173
+ sprintf(listm, "%s_open", list_type); \
174
+ if (!NIL_P(rb_hash_aref(regs, ID2SYM(rb_intern("list_continue"))))) \
175
+ { \
176
+ rb_hash_aset(regs, ID2SYM(rb_intern("list_continue")), Qnil); \
177
+ rb_hash_aset(regs, ID2SYM(rb_intern("start")), rb_ary_entry(list_index, nest-1)); \
178
+ } \
179
+ else \
180
+ { \
181
+ VALUE start = rb_hash_aref(regs, ID2SYM(rb_intern("start"))); \
182
+ if (NIL_P(start) ) \
183
+ { \
184
+ rb_ary_store(list_index, nest-1, INT2NUM(1)); \
185
+ } \
186
+ else \
187
+ { \
188
+ VALUE start_num = rb_funcall(start,rb_intern("to_i"),0); \
189
+ rb_ary_store(list_index, nest-1, start_num); \
190
+ } \
191
+ } \
192
+ rb_hash_aset(regs, ID2SYM(rb_intern("nest")), INT2NUM(nest)); \
193
+ rb_str_append(html, rb_funcall(self, rb_intern(listm), 1, regs)); \
194
+ rb_ary_store(list_layout, nest-1, STR_NEW2(list_type)); \
195
+ CLEAR_REGS(); \
196
+ ASET("first", "true"); \
197
+ } \
198
+ LIST_CLOSE(); \
199
+ if (nest != 0) LIST_ITEM_CLOSE(); \
200
+ CLEAR_REGS(); \
201
+ rb_hash_aset(regs, ID2SYM(rb_intern("nest")), INT2NUM(RARRAY_LEN(list_layout))); \
202
+ ASET("type", "li_open");
203
+ #define LIST_ITEM_CLOSE() \
204
+ if ( rb_hash_aref(regs, ID2SYM(rb_intern("first"))) == Qnil ) \
205
+ rb_str_append(html, rb_funcall(self, rb_intern("li_close"), 1, regs));
206
+ #define LIST_CLOSE() \
207
+ while (nest < RARRAY_LEN(list_layout)) \
208
+ { \
209
+ rb_hash_aset(regs, ID2SYM(rb_intern("nest")), INT2NUM(RARRAY_LEN(list_layout))); \
210
+ VALUE end_list = rb_ary_pop(list_layout); \
211
+ if (!NIL_P(end_list)) \
212
+ { \
213
+ StringValue(end_list); \
214
+ sprintf(listm, "%s_close", RSTRING_PTR(end_list)); \
215
+ LIST_ITEM_CLOSE(); \
216
+ rb_str_append(html, rb_funcall(self, rb_intern(listm), 1, regs)); \
217
+ } \
218
+ }
219
+
220
+ #endif