wikitext 0.3 → 0.4
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/ext/parser.c +73 -3
- data/ext/token.c +4 -0
- data/ext/token.h +4 -0
- data/ext/wikitext.c +1 -0
- data/ext/wikitext_ragel.c +498 -558
- data/spec/img_spec.rb +176 -0
- data/spec/integration_spec.rb +3 -0
- data/spec/tokenizing_spec.rb +2 -1
- data/spec/wikitext_spec.rb +10 -0
- metadata +2 -1
data/spec/img_spec.rb
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright 2008 Wincent Colaiuta
|
3
|
+
# This program is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require File.join(File.dirname(__FILE__), 'spec_helper.rb')
|
17
|
+
require 'wikitext'
|
18
|
+
|
19
|
+
describe Wikitext::Parser, 'embedding img tags' do
|
20
|
+
before do
|
21
|
+
@parser = Wikitext::Parser.new
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should convert valid markup into inline image tags' do
|
25
|
+
@parser.parse('{{foo.png}}').should == %Q{<p><img src="/images/foo.png" alt="foo.png" /></p>\n}
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should appear embedded in an inline flow' do
|
29
|
+
@parser.parse('before {{foo.png}} after').should == %Q{<p>before <img src="/images/foo.png" alt="foo.png" /> after</p>\n}
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should allow images in subdirectories' do
|
33
|
+
@parser.parse('{{foo/bar.png}}').should == %Q{<p><img src="/images/foo/bar.png" alt="foo/bar.png" /></p>\n}
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should work in BLOCKQUOTE blocks' do
|
37
|
+
expected = dedent <<-END
|
38
|
+
<blockquote>
|
39
|
+
<p><img src="/images/foo.png" alt="foo.png" /></p>
|
40
|
+
</blockquote>
|
41
|
+
END
|
42
|
+
@parser.parse('> {{foo.png}}').should == expected
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should work in unordered lists' do
|
46
|
+
input = dedent <<-END
|
47
|
+
* {{foo.png}}
|
48
|
+
* {{bar.png}}
|
49
|
+
* {{baz.png}}
|
50
|
+
END
|
51
|
+
expected = dedent <<-END
|
52
|
+
<ul>
|
53
|
+
<li><img src="/images/foo.png" alt="foo.png" /></li>
|
54
|
+
<li><img src="/images/bar.png" alt="bar.png" /></li>
|
55
|
+
<li><img src="/images/baz.png" alt="baz.png" /></li>
|
56
|
+
</ul>
|
57
|
+
END
|
58
|
+
@parser.parse(input).should == expected
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should work in ordered lists' do
|
62
|
+
input = dedent <<-END
|
63
|
+
# {{foo.png}}
|
64
|
+
# {{bar.png}}
|
65
|
+
# {{baz.png}}
|
66
|
+
END
|
67
|
+
expected = dedent <<-END
|
68
|
+
<ol>
|
69
|
+
<li><img src="/images/foo.png" alt="foo.png" /></li>
|
70
|
+
<li><img src="/images/bar.png" alt="bar.png" /></li>
|
71
|
+
<li><img src="/images/baz.png" alt="baz.png" /></li>
|
72
|
+
</ol>
|
73
|
+
END
|
74
|
+
@parser.parse(input).should == expected
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should work in <h1> headings' do
|
78
|
+
@parser.parse('= {{foo.png}} =').should == %Q{<h1><img src="/images/foo.png" alt="foo.png" /></h1>\n}
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should work in <h2> headings' do
|
82
|
+
@parser.parse('== {{foo.png}} ==').should == %Q{<h2><img src="/images/foo.png" alt="foo.png" /></h2>\n}
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should work in <h3> headings' do
|
86
|
+
@parser.parse('=== {{foo.png}} ===').should == %Q{<h3><img src="/images/foo.png" alt="foo.png" /></h3>\n}
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should work in <h4> headings' do
|
90
|
+
@parser.parse('==== {{foo.png}} ====').should == %Q{<h4><img src="/images/foo.png" alt="foo.png" /></h4>\n}
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should work in <h5> headings' do
|
94
|
+
@parser.parse('===== {{foo.png}} =====').should == %Q{<h5><img src="/images/foo.png" alt="foo.png" /></h5>\n}
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should work in <h6> headings' do
|
98
|
+
@parser.parse('====== {{foo.png}} ======').should == %Q{<h6><img src="/images/foo.png" alt="foo.png" /></h6>\n}
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should pass single curly braces through unaltered' do
|
102
|
+
@parser.parse('{foo.png}').should == %Q{<p>{foo.png}</p>\n}
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should have no effect inside PRE blocks' do
|
106
|
+
@parser.parse(' {{foo.png}}').should == %Q{<pre>{{foo.png}}</pre>\n}
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'should have no effect inside PRE_START blocks' do
|
110
|
+
@parser.parse('<pre>{{foo.png}}</pre>').should == %Q{<pre>{{foo.png}}</pre>\n}
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should have no effect inside NO_WIKI spans' do
|
114
|
+
@parser.parse('<nowiki>{{foo.png}}</nowiki>').should == %Q{<p>{{foo.png}}</p>\n}
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'should be passed through in internal link targets' do
|
118
|
+
@parser.parse('[[{{foo.png}}]]').should == %Q{<p><a href="/wiki/%7b%7bfoo.png%7d%7d">{{foo.png}}</a></p>\n}
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should be passed through in internal link text' do
|
122
|
+
@parser.parse('[[article|{{foo.png}}]]').should == %Q{<p><a href="/wiki/article">{{foo.png}}</a></p>\n}
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should not be allowed as an external link target' do
|
126
|
+
expected = %Q{<p>[<img src="/images/foo.png" alt="foo.png" /> the link]</p>\n}
|
127
|
+
@parser.parse('[{{foo.png}} the link]').should == expected
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should be passed through in external link text' do
|
131
|
+
expected = %Q{<p><a href="http://example.com/" class="external">{{foo.png}}</a></p>\n}
|
132
|
+
@parser.parse('[http://example.com/ {{foo.png}}]').should == expected
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'should not allow embedded quotes' do
|
136
|
+
@parser.parse('{{"fun".png}}').should == %Q{<p>{{"fun".png}}</p>\n}
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should not allow embedded spaces' do
|
140
|
+
@parser.parse('{{foo bar.png}}').should == %Q{<p>{{foo bar.png}}</p>\n}
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'should not allow characters beyond printable ASCII' do
|
144
|
+
@parser.parse('{{500€.png}}').should == %Q{<p>{{500€.png}}</p>\n}
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'should allow overrides of the image prefix at initialization time' do
|
148
|
+
parser = Wikitext::Parser.new(:img_prefix => '/gfx/')
|
149
|
+
parser.parse('{{foo.png}}').should == %Q{<p><img src="/gfx/foo.png" alt="foo.png" /></p>\n}
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'should suppress the image prefix if passed an empty string at initialization time' do
|
153
|
+
parser = Wikitext::Parser.new(:img_prefix => '')
|
154
|
+
parser.parse('{{foo.png}}').should == %Q{<p><img src="foo.png" alt="foo.png" /></p>\n}
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'should suppress image prefix if passed nil at initialization time' do
|
158
|
+
parser = Wikitext::Parser.new(:img_prefix => nil)
|
159
|
+
parser.parse('{{foo.png}}').should == %Q{<p><img src="foo.png" alt="foo.png" /></p>\n}
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'should allow overrides of the image prefix after initialization' do
|
163
|
+
@parser.img_prefix = '/gfx/'
|
164
|
+
@parser.parse('{{foo.png}}').should == %Q{<p><img src="/gfx/foo.png" alt="foo.png" /></p>\n}
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'should suppress image if prefix set to an empty string after initialization' do
|
168
|
+
@parser.img_prefix = ''
|
169
|
+
@parser.parse('{{foo.png}}').should == %Q{<p><img src="foo.png" alt="foo.png" /></p>\n}
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'should suppress image if prefix set to nil after initialization' do
|
173
|
+
@parser.img_prefix = nil
|
174
|
+
@parser.parse('{{foo.png}}').should == %Q{<p><img src="foo.png" alt="foo.png" /></p>\n}
|
175
|
+
end
|
176
|
+
end
|
data/spec/integration_spec.rb
CHANGED
@@ -90,6 +90,8 @@ describe Wikitext::Parser, 'with large slab of input text' do
|
|
90
90
|
|
91
91
|
a normal paragraph again
|
92
92
|
|
93
|
+
{{an_image.png}}
|
94
|
+
|
93
95
|
> This is another blockquote which demonstrates that we
|
94
96
|
> can nest other structures inside of it. For example, here
|
95
97
|
> we have a code sample:
|
@@ -194,6 +196,7 @@ describe Wikitext::Parser, 'with large slab of input text' do
|
|
194
196
|
which would '''otherwise''' have <tt>special</tt> meaning
|
195
197
|
although explicit entities © are passed through unchanged</pre>
|
196
198
|
<p>a normal paragraph again</p>
|
199
|
+
<p><img src="/images/an_image.png" alt="an_image.png" /></p>
|
197
200
|
<blockquote>
|
198
201
|
<p>This is another blockquote which demonstrates that we can nest other structures inside of it. For example, here we have a code sample:</p>
|
199
202
|
<pre>line 1
|
data/spec/tokenizing_spec.rb
CHANGED
@@ -101,9 +101,10 @@ describe Wikitext::Parser, 'tokenizing' do
|
|
101
101
|
|
102
102
|
it 'should be able to tokenize strings containing "}"' do
|
103
103
|
# was a bug: we were throwing an exception "failed before finding a token" because our PRINTABLE rule omitted this code point
|
104
|
+
# later on the "}" became the RIGHT_CURLY token, so the spec has been modified accordingly
|
104
105
|
lambda { @tokens = @parser.tokenize('}') }.should_not raise_error
|
105
106
|
@tokens.length.should == 2
|
106
|
-
@tokens[0].token_type.should == :
|
107
|
+
@tokens[0].token_type.should == :right_curly # was PRINTABLE
|
107
108
|
@tokens[0].string_value.should == '}'
|
108
109
|
@tokens[0].line_start.should == 1
|
109
110
|
@tokens[0].column_start.should == 1
|
data/spec/wikitext_spec.rb
CHANGED
@@ -41,6 +41,10 @@ describe Wikitext::Parser do
|
|
41
41
|
@parser.internal_link_prefix.should == '/wiki/'
|
42
42
|
end
|
43
43
|
|
44
|
+
it 'should use "/images/" as default img prefix' do
|
45
|
+
@parser.img_prefix.should == '/images/'
|
46
|
+
end
|
47
|
+
|
44
48
|
it 'should turn space-to-underscore off by default' do
|
45
49
|
@parser.space_to_underscore.should == false
|
46
50
|
end
|
@@ -70,6 +74,12 @@ describe Wikitext::Parser do
|
|
70
74
|
Wikitext::Parser.new(:internal_link_prefix => '/baz/').internal_link_prefix.should == '/baz/'
|
71
75
|
end
|
72
76
|
|
77
|
+
it 'should allow overriding of the img prefix' do
|
78
|
+
Wikitext::Parser.new(:img_prefix => '/bar/').img_prefix.should == '/bar/'
|
79
|
+
Wikitext::Parser.new(:img_prefix => '').img_prefix.should == ''
|
80
|
+
Wikitext::Parser.new(:img_prefix => nil).img_prefix.should == nil
|
81
|
+
end
|
82
|
+
|
73
83
|
it 'should allow overriding of space-to-underscore' do
|
74
84
|
Wikitext::Parser.new(:space_to_underscore => true).space_to_underscore.should == true
|
75
85
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wikitext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.4"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wincent Colaiuta
|
@@ -34,6 +34,7 @@ files:
|
|
34
34
|
- spec/h4_spec.rb
|
35
35
|
- spec/h5_spec.rb
|
36
36
|
- spec/h6_spec.rb
|
37
|
+
- spec/img_spec.rb
|
37
38
|
- spec/indentation_spec.rb
|
38
39
|
- spec/integration_spec.rb
|
39
40
|
- spec/internal_link_spec.rb
|