RedCloth 3.0.4 → 4.0.0
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 +17 -0
- data/COPYING +18 -0
- data/README +156 -0
- data/Rakefile +238 -0
- data/bin/redcloth +27 -2
- data/ext/redcloth_scan/extconf.rb +9 -0
- data/ext/redcloth_scan/redcloth.h +149 -0
- data/ext/redcloth_scan/redcloth_attributes.c +650 -0
- data/ext/redcloth_scan/redcloth_attributes.rl +78 -0
- data/ext/redcloth_scan/redcloth_common.rl +113 -0
- data/ext/redcloth_scan/redcloth_inline.c +5102 -0
- data/ext/redcloth_scan/redcloth_inline.rl +282 -0
- data/ext/redcloth_scan/redcloth_scan.c +9300 -0
- data/ext/redcloth_scan/redcloth_scan.rl +523 -0
- data/extras/mingw-rbconfig.rb +176 -0
- data/extras/ragel_profiler.rb +73 -0
- data/lib/redcloth.rb +22 -1128
- data/lib/redcloth/formatters/base.rb +50 -0
- data/lib/redcloth/formatters/html.rb +342 -0
- data/lib/redcloth/formatters/latex.rb +227 -0
- data/lib/redcloth/formatters/latex_entities.yml +2414 -0
- data/lib/redcloth/textile_doc.rb +105 -0
- data/lib/redcloth/version.rb +18 -0
- data/test/basic.yml +794 -0
- data/test/code.yml +195 -0
- data/test/definitions.yml +71 -0
- data/test/extra_whitespace.yml +64 -0
- data/test/filter_html.yml +177 -0
- data/test/filter_pba.yml +12 -0
- data/test/helper.rb +108 -0
- data/test/html.yml +271 -0
- data/test/images.yml +202 -0
- data/{tests → test}/instiki.yml +14 -15
- data/test/links.yml +214 -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_extensions.rb +31 -0
- data/test/test_formatters.rb +15 -0
- data/test/test_parser.rb +68 -0
- data/test/test_restrictions.rb +41 -0
- data/test/textism.yml +480 -0
- data/test/threshold.yml +772 -0
- data/test/validate_fixtures.rb +73 -0
- metadata +94 -60
- data/doc/CHANGELOG +0 -160
- data/doc/COPYING +0 -25
- data/doc/README +0 -106
- data/doc/REFERENCE +0 -216
- data/doc/make.rb +0 -359
- data/run-tests.rb +0 -28
- data/setup.rb +0 -1376
- data/tests/code.yml +0 -105
- data/tests/hard_breaks.yml +0 -26
- data/tests/images.yml +0 -171
- data/tests/links.yml +0 -155
- data/tests/lists.yml +0 -77
- data/tests/markdown.yml +0 -218
- data/tests/poignant.yml +0 -64
- data/tests/table.yml +0 -198
- data/tests/textism.yml +0 -406
data/test/poignant.yml
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
--- # Tests from the (Poignant Guide)
|
2
|
+
in: >
|
3
|
+
h3. False
|
4
|
+
|
5
|
+
|
6
|
+
!<i/blix-neg.gif(Shape of a cat.)!
|
7
|
+
|
8
|
+
|
9
|
+
_The cat Trady Blix. Frozen in emptiness. Immaculate whiskers rigid. Placid
|
10
|
+
eyes of lake. Tail of warm icicle. Sponsored by a Very Powerful Pause Button._
|
11
|
+
|
12
|
+
|
13
|
+
The darkness surrounding Blix can be called *negative space*. Hang on to that phrase.
|
14
|
+
Let it suggest that the emptiness has a negative connotation. In a similar way,
|
15
|
+
@nil@ has a slightly sour note that it whistles.
|
16
|
+
|
17
|
+
|
18
|
+
Generally speaking, everything in Ruby has a positive charge to it. This spark
|
19
|
+
flows through strings, numbers, regexps, all of it. Only two keywords wear a
|
20
|
+
shady cloak: @nil@ and @false@ draggin us down.
|
21
|
+
|
22
|
+
|
23
|
+
You can test that charge with an @if@ keyword. It looks very much like the
|
24
|
+
@do@ blocks we saw in the last chapter, in that both end with an @end@.
|
25
|
+
|
26
|
+
|
27
|
+
<pre>
|
28
|
+
if plastic_cup
|
29
|
+
print "Plastic cup is on the up 'n' up!"
|
30
|
+
end
|
31
|
+
</pre>
|
32
|
+
|
33
|
+
|
34
|
+
If @plastic_cup@ contains either @nil@ or @false@, you won't see anything print
|
35
|
+
to the screen. They're not on the @if@ guest list. So @if@ isn't going to run
|
36
|
+
any of the code it's protecting.
|
37
|
+
|
38
|
+
|
39
|
+
But @nil@ and @false@ need not walk away in shame. They may be of questionable
|
40
|
+
character, but @unless@ runs a smaller establishment that caters to the bedraggled.
|
41
|
+
The @unless@ keyword has a policy of only allowing those with a negative charge in.
|
42
|
+
Who are: @nil@ and @false@.
|
43
|
+
|
44
|
+
|
45
|
+
<pre>
|
46
|
+
unless plastic_cup
|
47
|
+
print "Plastic cup is on the down low."
|
48
|
+
end
|
49
|
+
</pre>
|
50
|
+
|
51
|
+
|
52
|
+
You can also use @if@ and @unless@ at the end of a single line of code, if that's
|
53
|
+
all that is being protected.
|
54
|
+
|
55
|
+
|
56
|
+
<pre>
|
57
|
+
print "Yeah, plastic cup is up again!" if plastic_cup
|
58
|
+
print "Hardly. It's down." unless plastic_cup
|
59
|
+
</pre>
|
60
|
+
|
61
|
+
|
62
|
+
Now that you've met @false@, I'm sure you can see what's on next.
|
63
|
+
|
64
|
+
html: |-
|
65
|
+
<h3>False</h3>
|
66
|
+
<p style="float:left;"><img src="i/blix-neg.gif" title="Shape of a cat." alt="Shape of a cat." /></p>
|
67
|
+
<p><em>The cat Trady Blix. Frozen in emptiness. Immaculate whiskers rigid. Placid eyes of lake. Tail of warm icicle. Sponsored by a Very Powerful Pause Button.</em></p>
|
68
|
+
<p>The darkness surrounding Blix can be called <strong>negative space</strong>. Hang on to that phrase. Let it suggest that the emptiness has a negative connotation. In a similar way, <code>nil</code> has a slightly sour note that it whistles.</p>
|
69
|
+
<p>Generally speaking, everything in Ruby has a positive charge to it. This spark flows through strings, numbers, regexps, all of it. Only two keywords wear a shady cloak: <code>nil</code> and <code>false</code> draggin us down.</p>
|
70
|
+
<p>You can test that charge with an <code>if</code> keyword. It looks very much like the <code>do</code> blocks we saw in the last chapter, in that both end with an <code>end</code>.</p>
|
71
|
+
<pre>
|
72
|
+
if plastic_cup
|
73
|
+
print "Plastic cup is on the up 'n' up!"
|
74
|
+
end
|
75
|
+
</pre>
|
76
|
+
<p>If <code>plastic_cup</code> contains either <code>nil</code> or <code>false</code>, you won’t see anything print to the screen. They’re not on the <code>if</code> guest list. So <code>if</code> isn’t going to run any of the code it’s protecting.</p>
|
77
|
+
<p>But <code>nil</code> and <code>false</code> need not walk away in shame. They may be of questionable character, but <code>unless</code> runs a smaller establishment that caters to the bedraggled. The <code>unless</code> keyword has a policy of only allowing those with a negative charge in. Who are: <code>nil</code> and <code>false</code>.</p>
|
78
|
+
<pre>
|
79
|
+
unless plastic_cup
|
80
|
+
print "Plastic cup is on the down low."
|
81
|
+
end
|
82
|
+
</pre>
|
83
|
+
<p>You can also use <code>if</code> and <code>unless</code> at the end of a single line of code, if that’s all that is being protected.</p>
|
84
|
+
<pre>
|
85
|
+
print "Yeah, plastic cup is up again!" if plastic_cup
|
86
|
+
print "Hardly. It's down." unless plastic_cup
|
87
|
+
</pre>
|
88
|
+
<p>Now that you’ve met <code>false</code>, I’m sure you can see what’s on next.</p>
|
89
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
---
|
2
|
+
in: Just a little harmless xss <script src=http://ha.ckers.org/xss.js>stuff</script>.
|
3
|
+
sanitized_html: <p>Just a little harmless xss stuff.</p>
|
4
|
+
---
|
5
|
+
in: Here's a bad image <img src="JaVaScRiPt:alert('XSS');" />
|
6
|
+
sanitized_html: <p>Here’s a bad image <img /></p>
|
7
|
+
---
|
8
|
+
in: Just some random > and < characters, but also a <br/> tag.
|
9
|
+
sanitized_html: <p>Just some random > and < characters, but also a <br/> tag.</p>
|
10
|
+
---
|
11
|
+
name: processes text beginning with space
|
12
|
+
in: ' This began with a space and ends with some XSS: <script type="text/javascript">alert("Hai. I`m in ya PC. Makin ya XSS viruzz! KThxBye");</script>'
|
13
|
+
sanitized_html: 'This began with a space and ends with some <span class="caps">XSS</span>: alert(“Hai. I`m in ya PC. Makin ya <span class="caps">XSS</span> viruzz! KThxBye”);'
|
14
|
+
---
|
15
|
+
name: processes text in notextile tags
|
16
|
+
in: |-
|
17
|
+
<notextile>
|
18
|
+
The bad tags should be <b>missing</b>: <script type="text/javascript">alert("Hai. I`m in ya PC. Makin ya XSS viruzz! KThxBye");</script>
|
19
|
+
</notextile>
|
20
|
+
sanitized_html: |-
|
21
|
+
The bad tags should be <b>missing</b>: alert("Hai. I`m in ya PC. Makin ya XSS viruzz! KThxBye");
|
22
|
+
---
|
23
|
+
name: processes text in inline notextile tags
|
24
|
+
in: |-
|
25
|
+
The bad tags should be <b>missing</b>: <notextile><script type="text/javascript">alert("Hai. I`m in ya PC. Makin ya XSS viruzz! KThxBye");</script></notextile>
|
26
|
+
sanitized_html: |-
|
27
|
+
<p>The bad tags should be <b>missing</b>: alert("Hai. I`m in ya PC. Makin ya XSS viruzz! KThxBye");</p>
|
28
|
+
---
|
29
|
+
name: removes script tags
|
30
|
+
in: |-
|
31
|
+
<script type="text/javascript">
|
32
|
+
alert("Hai. I`m in ya PC. Makin ya XSS viruzz! KThxBye");
|
33
|
+
</script>
|
34
|
+
sanitized_html: "alert(“Hai. I`m in ya PC. Makin ya <span class=\"caps\">XSS</span> viruzz! KThxBye”);"
|
35
|
+
---
|
36
|
+
name: removes nested script tags
|
37
|
+
in: |-
|
38
|
+
<script type="text/javascript"><script>
|
39
|
+
alert("Hai. I`m in ya PC. Makin ya XSS viruzz! KThxBye");
|
40
|
+
</script></script>
|
41
|
+
sanitized_html: |-
|
42
|
+
alert(“Hai. I`m in ya PC. Makin ya <span class="caps">XSS</span> viruzz! KThxBye”);
|
data/test/table.yml
ADDED
@@ -0,0 +1,267 @@
|
|
1
|
+
---
|
2
|
+
in: |
|
3
|
+
|a|b|c|
|
4
|
+
|1|2|3|
|
5
|
+
|
6
|
+
h3. A header after the table
|
7
|
+
html: |-
|
8
|
+
<table>
|
9
|
+
<tr>
|
10
|
+
<td>a</td>
|
11
|
+
<td>b</td>
|
12
|
+
<td>c</td>
|
13
|
+
</tr>
|
14
|
+
<tr>
|
15
|
+
<td>1</td>
|
16
|
+
<td>2</td>
|
17
|
+
<td>3</td>
|
18
|
+
</tr>
|
19
|
+
</table>
|
20
|
+
<h3>A header after the table</h3>
|
21
|
+
---
|
22
|
+
in: |
|
23
|
+
|_. a|_. b|_. c|
|
24
|
+
|1|2|3|
|
25
|
+
html: |-
|
26
|
+
<table>
|
27
|
+
<tr>
|
28
|
+
<th>a</th>
|
29
|
+
<th>b</th>
|
30
|
+
<th>c</th>
|
31
|
+
</tr>
|
32
|
+
<tr>
|
33
|
+
<td>1</td>
|
34
|
+
<td>2</td>
|
35
|
+
<td>3</td>
|
36
|
+
</tr>
|
37
|
+
</table>
|
38
|
+
---
|
39
|
+
in: |-
|
40
|
+
|This|is|a|simple|table|
|
41
|
+
|This|is|a|simple|row|
|
42
|
+
html: |-
|
43
|
+
<table>
|
44
|
+
<tr>
|
45
|
+
<td>This</td>
|
46
|
+
<td>is</td>
|
47
|
+
<td>a</td>
|
48
|
+
<td>simple</td>
|
49
|
+
<td>table</td>
|
50
|
+
</tr>
|
51
|
+
<tr>
|
52
|
+
<td>This</td>
|
53
|
+
<td>is</td>
|
54
|
+
<td>a</td>
|
55
|
+
<td>simple</td>
|
56
|
+
<td>row</td>
|
57
|
+
</tr>
|
58
|
+
</table>
|
59
|
+
---
|
60
|
+
in: |-
|
61
|
+
table{border:1px solid black}.
|
62
|
+
|This|is|a|row|
|
63
|
+
|This|is|a|row|
|
64
|
+
html: |-
|
65
|
+
<table style="border:1px solid black;">
|
66
|
+
<tr>
|
67
|
+
<td>This</td>
|
68
|
+
<td>is</td>
|
69
|
+
<td>a</td>
|
70
|
+
<td>row</td>
|
71
|
+
</tr>
|
72
|
+
<tr>
|
73
|
+
<td>This</td>
|
74
|
+
<td>is</td>
|
75
|
+
<td>a</td>
|
76
|
+
<td>row</td>
|
77
|
+
</tr>
|
78
|
+
</table>
|
79
|
+
---
|
80
|
+
in: '{background:#ddd}. |This|is|a|row|'
|
81
|
+
html: |-
|
82
|
+
<table>
|
83
|
+
<tr style="background:#ddd;">
|
84
|
+
<td>This</td>
|
85
|
+
<td>is</td>
|
86
|
+
<td>a</td>
|
87
|
+
<td>row</td>
|
88
|
+
</tr>
|
89
|
+
</table>
|
90
|
+
---
|
91
|
+
in: |-
|
92
|
+
|a|b|c|
|
93
|
+
| |2|3|
|
94
|
+
html: |-
|
95
|
+
<table>
|
96
|
+
<tr>
|
97
|
+
<td>a</td>
|
98
|
+
<td>b</td>
|
99
|
+
<td>c</td>
|
100
|
+
</tr>
|
101
|
+
<tr>
|
102
|
+
<td> </td>
|
103
|
+
<td>2</td>
|
104
|
+
<td>3</td>
|
105
|
+
</tr>
|
106
|
+
</table>
|
107
|
+
---
|
108
|
+
in: |-
|
109
|
+
table{width: 200px; border:2px solid gray;}.
|
110
|
+
|_=. Alignment|
|
111
|
+
|=. centered|
|
112
|
+
|=(. a bit right|
|
113
|
+
|=). a bit left|
|
114
|
+
|>). almost right|
|
115
|
+
|<(. almost left|
|
116
|
+
|>. right|
|
117
|
+
|<. left|
|
118
|
+
html: |-
|
119
|
+
<table style="width: 200px; border:2px solid gray;">
|
120
|
+
<tr>
|
121
|
+
<th style="text-align:center;">Alignment</th>
|
122
|
+
</tr>
|
123
|
+
<tr>
|
124
|
+
<td style="text-align:center;">centered</td>
|
125
|
+
</tr>
|
126
|
+
<tr>
|
127
|
+
<td style="padding-left:1em;text-align:center;">a bit right</td>
|
128
|
+
</tr>
|
129
|
+
<tr>
|
130
|
+
<td style="padding-right:1em;text-align:center;">a bit left</td>
|
131
|
+
</tr>
|
132
|
+
<tr>
|
133
|
+
<td style="padding-right:1em;text-align:right;">almost right</td>
|
134
|
+
</tr>
|
135
|
+
<tr>
|
136
|
+
<td style="padding-left:1em;text-align:left;">almost left</td>
|
137
|
+
</tr>
|
138
|
+
<tr>
|
139
|
+
<td style="text-align:right;">right</td>
|
140
|
+
</tr>
|
141
|
+
<tr>
|
142
|
+
<td style="text-align:left;">left</td>
|
143
|
+
</tr>
|
144
|
+
</table>
|
145
|
+
---
|
146
|
+
in: |-
|
147
|
+
|{background:#ddd}. Cell with gray background|
|
148
|
+
|\2. Cell spanning 2 columns|
|
149
|
+
|/3. Cell spanning 3 rows|
|
150
|
+
|>. Right-aligned cell|
|
151
|
+
html: |-
|
152
|
+
<table>
|
153
|
+
<tr>
|
154
|
+
<td style="background:#ddd;">Cell with gray background</td>
|
155
|
+
</tr>
|
156
|
+
<tr>
|
157
|
+
<td colspan="2">Cell spanning 2 columns</td>
|
158
|
+
</tr>
|
159
|
+
<tr>
|
160
|
+
<td rowspan="3">Cell spanning 3 rows</td>
|
161
|
+
</tr>
|
162
|
+
<tr>
|
163
|
+
<td style="text-align:right;">Right-aligned cell</td>
|
164
|
+
</tr>
|
165
|
+
</table>
|
166
|
+
---
|
167
|
+
in: |
|
168
|
+
{background:#ddd}. |S|Target|Complete|App|Milestone|
|
169
|
+
|!/i/g.gif!|11/29/04|11/29/04|011|XML spec complete (KH is on schedule)|
|
170
|
+
|!/i/g.gif!|11/22/04|11/22/04|070|Dialog pass 1 builds an index file|
|
171
|
+
|!/i/g.gif!|11/24/04|11/24/04|070|Dialog pass 2 98% complete|
|
172
|
+
|!/i/g.gif!|11/30/04|11/30/04|070|Feature complete. Passes end-to-end smoke test.|
|
173
|
+
|!/i/w.gif!|12/02/04| |011|Dialog pass 1 and 2 complete (98+%)|
|
174
|
+
|!/i/w.gif!|12/03/04| |081|Feature complete|
|
175
|
+
html: |-
|
176
|
+
<table>
|
177
|
+
<tr style="background:#ddd;">
|
178
|
+
<td>S</td>
|
179
|
+
<td>Target</td>
|
180
|
+
<td>Complete</td>
|
181
|
+
<td>App</td>
|
182
|
+
<td>Milestone</td>
|
183
|
+
</tr>
|
184
|
+
<tr>
|
185
|
+
<td><img src="/i/g.gif" alt="" /></td>
|
186
|
+
<td>11/29/04</td>
|
187
|
+
<td>11/29/04</td>
|
188
|
+
<td>011</td>
|
189
|
+
<td><span class="caps">XML</span> spec complete (KH is on schedule)</td>
|
190
|
+
</tr>
|
191
|
+
<tr>
|
192
|
+
<td><img src="/i/g.gif" alt="" /></td>
|
193
|
+
<td>11/22/04</td>
|
194
|
+
<td>11/22/04</td>
|
195
|
+
<td>070</td>
|
196
|
+
<td>Dialog pass 1 builds an index file</td>
|
197
|
+
</tr>
|
198
|
+
<tr>
|
199
|
+
<td><img src="/i/g.gif" alt="" /></td>
|
200
|
+
<td>11/24/04</td>
|
201
|
+
<td>11/24/04</td>
|
202
|
+
<td>070</td>
|
203
|
+
<td>Dialog pass 2 98% complete</td>
|
204
|
+
</tr>
|
205
|
+
<tr>
|
206
|
+
<td><img src="/i/g.gif" alt="" /></td>
|
207
|
+
<td>11/30/04</td>
|
208
|
+
<td>11/30/04</td>
|
209
|
+
<td>070</td>
|
210
|
+
<td>Feature complete. Passes end-to-end smoke test.</td>
|
211
|
+
</tr>
|
212
|
+
<tr>
|
213
|
+
<td><img src="/i/w.gif" alt="" /></td>
|
214
|
+
<td>12/02/04</td>
|
215
|
+
<td> </td>
|
216
|
+
<td>011</td>
|
217
|
+
<td>Dialog pass 1 and 2 complete (98+%)</td>
|
218
|
+
</tr>
|
219
|
+
<tr>
|
220
|
+
<td><img src="/i/w.gif" alt="" /></td>
|
221
|
+
<td>12/03/04</td>
|
222
|
+
<td> </td>
|
223
|
+
<td>081</td>
|
224
|
+
<td>Feature complete</td>
|
225
|
+
</tr>
|
226
|
+
</table>
|
227
|
+
---
|
228
|
+
name: combined table header and colspan
|
229
|
+
in: |-
|
230
|
+
table(my_class).
|
231
|
+
|_\2. a |_. b |_. c |
|
232
|
+
| 1 | 2 | 3 | 4 |
|
233
|
+
html: |-
|
234
|
+
<table class="my_class">
|
235
|
+
<tr>
|
236
|
+
<th colspan="2">a </th>
|
237
|
+
<th>b </th>
|
238
|
+
<th>c </th>
|
239
|
+
</tr>
|
240
|
+
<tr>
|
241
|
+
<td> 1 </td>
|
242
|
+
<td> 2 </td>
|
243
|
+
<td> 3 </td>
|
244
|
+
<td> 4 </td>
|
245
|
+
</tr>
|
246
|
+
</table>
|
247
|
+
---
|
248
|
+
name: two adjacent tables
|
249
|
+
in: |-
|
250
|
+
|a|b|c|
|
251
|
+
|
252
|
+
|1|2|3|
|
253
|
+
html: |-
|
254
|
+
<table>
|
255
|
+
<tr>
|
256
|
+
<td>a</td>
|
257
|
+
<td>b</td>
|
258
|
+
<td>c</td>
|
259
|
+
</tr>
|
260
|
+
</table>
|
261
|
+
<table>
|
262
|
+
<tr>
|
263
|
+
<td>1</td>
|
264
|
+
<td>2</td>
|
265
|
+
<td>3</td>
|
266
|
+
</tr>
|
267
|
+
</table>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class TestCustomTags < Test::Unit::TestCase
|
6
|
+
|
7
|
+
module FigureTag
|
8
|
+
def fig( opts )
|
9
|
+
label, img = opts[:text].split('|').map! {|str| str.strip}
|
10
|
+
|
11
|
+
html = %Q{<div class="img" id="figure-#{label.tr('.', '-')}">\n}
|
12
|
+
html << %Q{ <a class="fig" href="/images/#{img}">\n}
|
13
|
+
html << %Q{ <img src="/images/thumbs/#{img}" alt="Figure #{label}" />\n}
|
14
|
+
html << %Q{ </a>\n}
|
15
|
+
html << %Q{ <p>Figure #{label}</p>\n}
|
16
|
+
html << %Q{<div>\n}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_fig_tag
|
21
|
+
input = %Q{The first line of text.\n\n}
|
22
|
+
input << %Q{fig. 1.1 | img.jpg\n\n}
|
23
|
+
input << %Q{The last line of text.\n}
|
24
|
+
r = RedCloth.new input
|
25
|
+
r.extend FigureTag
|
26
|
+
str = r.to_html
|
27
|
+
|
28
|
+
html = %Q{<p>The first line of text.</p>\n}
|
29
|
+
html << %Q{<div class="img" id="figure-1-1">\n}
|
30
|
+
html << %Q{ <a class="fig" href="/images/img.jpg">\n}
|
31
|
+
html << %Q{ <img src="/images/thumbs/img.jpg" alt="Figure 1.1" />\n}
|
32
|
+
html << %Q{ </a>\n}
|
33
|
+
html << %Q{ <p>Figure 1.1</p>\n}
|
34
|
+
html << %Q{<div>\n}
|
35
|
+
html << %Q{<p>The last line of text.</p>}
|
36
|
+
|
37
|
+
assert_equal(html, str)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_fallback
|
41
|
+
r = RedCloth.new %Q/fig()>[no]{color:red}. 1.1 | img.jpg/
|
42
|
+
str = r.to_html
|
43
|
+
|
44
|
+
assert_equal "<p>fig()>[no]{color:red}. 1.1 | img.jpg</p>", str
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class TestExtensions < Test::Unit::TestCase
|
6
|
+
|
7
|
+
require 'redcloth'
|
8
|
+
|
9
|
+
# http://www.ralree.info/2006/9/13/extending-redcloth
|
10
|
+
module RedClothSmileyExtension
|
11
|
+
def refs_smiley(text)
|
12
|
+
text.gsub!(/(\s)~(:P|:D|:O|:o|:S|:\||;\)|:'\(|:\)|:\()/) do |m|
|
13
|
+
bef,ma = $~[1..2]
|
14
|
+
filename = "/images/emoticons/"+(ma.split(//).collect{|l| l[0] }.join('_'))+".png"
|
15
|
+
"#{bef}<img src='#{filename}' title='#{ma}' class='smiley' />"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
RedCloth.send(:include, RedClothSmileyExtension)
|
21
|
+
|
22
|
+
def test_smiley
|
23
|
+
input = %Q{You're so silly! ~:P}
|
24
|
+
|
25
|
+
str = RedCloth.new(input).to_html(:textile, :refs_smiley)
|
26
|
+
|
27
|
+
html = %Q{<p>You’re so silly! <img src='/images/emoticons/58_80.png' title=':P' class='smiley' /></p>}
|
28
|
+
|
29
|
+
assert_equal(html, str)
|
30
|
+
end
|
31
|
+
end
|