wikitext 1.8 → 1.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.
- data/ext/parser.c +27 -5
- data/lib/wikitext/nil_class.rb +1 -1
- data/lib/wikitext/version.rb +1 -1
- data/spec/internal_link_spec.rb +226 -0
- data/spec/nil_class_spec.rb +4 -0
- metadata +2 -2
data/ext/parser.c
CHANGED
@@ -1042,12 +1042,15 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
|
|
1042
1042
|
// process options hash
|
1043
1043
|
int base_indent = 0;
|
1044
1044
|
int base_heading_level = NUM2INT(rb_iv_get(self, "@base_heading_level"));
|
1045
|
+
VALUE link_proc = Qnil;
|
1045
1046
|
if (!NIL_P(options) && TYPE(options) == T_HASH)
|
1046
1047
|
{
|
1047
1048
|
// :indent => 0 (or more)
|
1048
|
-
|
1049
|
+
ID has_key = rb_intern("has_key?");
|
1050
|
+
ID id = ID2SYM(rb_intern("indent"));
|
1051
|
+
if (rb_funcall(options, has_key, 1, id) == Qtrue)
|
1049
1052
|
{
|
1050
|
-
VALUE indent = rb_hash_aref(options,
|
1053
|
+
VALUE indent = rb_hash_aref(options, id);
|
1051
1054
|
if (indent == Qfalse)
|
1052
1055
|
base_indent = -1; // indentation disabled
|
1053
1056
|
else
|
@@ -1059,8 +1062,14 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
|
|
1059
1062
|
}
|
1060
1063
|
|
1061
1064
|
// :base_heading_level => 0/1/2/3/4/5/6
|
1062
|
-
|
1063
|
-
|
1065
|
+
id = ID2SYM(rb_intern("base_heading_level"));
|
1066
|
+
if (rb_funcall(options, has_key, 1, id) == Qtrue)
|
1067
|
+
base_heading_level = NUM2INT(rb_hash_aref(options, id));
|
1068
|
+
|
1069
|
+
// :link_proc => lambda { |link_target| ... }
|
1070
|
+
id = ID2SYM(rb_intern("link_proc"));
|
1071
|
+
if (rb_funcall(options, has_key, 1, id) == Qtrue)
|
1072
|
+
link_proc = rb_hash_aref(options, id);
|
1064
1073
|
}
|
1065
1074
|
|
1066
1075
|
// normalize, regardless of whether this came from instance variable or override
|
@@ -2144,10 +2153,23 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
|
|
2144
2153
|
}
|
2145
2154
|
else
|
2146
2155
|
wiki_trim_link_text(parser);
|
2156
|
+
|
2157
|
+
// perform "redlink" check before manipulating link_target
|
2158
|
+
if (NIL_P(link_proc))
|
2159
|
+
j = Qnil;
|
2160
|
+
else
|
2161
|
+
{
|
2162
|
+
j = rb_funcall(link_proc, rb_intern("call"), 1, string_from_str(parser->link_target));
|
2163
|
+
if (!NIL_P(j))
|
2164
|
+
{
|
2165
|
+
VALUE l = j; // can't cast inside StringValue macro
|
2166
|
+
j = StringValue(l);
|
2167
|
+
}
|
2168
|
+
}
|
2147
2169
|
wiki_encode_link_target(parser);
|
2148
2170
|
wiki_pop_from_stack_up_to(parser, output, LINK_START, true);
|
2149
2171
|
parser->capture = NULL;
|
2150
|
-
wiki_append_hyperlink(parser, prefix, parser->link_target, parser->link_text,
|
2172
|
+
wiki_append_hyperlink(parser, prefix, parser->link_target, parser->link_text, j, false);
|
2151
2173
|
str_clear(parser->link_target);
|
2152
2174
|
str_clear(parser->link_text);
|
2153
2175
|
}
|
data/lib/wikitext/nil_class.rb
CHANGED
data/lib/wikitext/version.rb
CHANGED
data/spec/internal_link_spec.rb
CHANGED
@@ -114,6 +114,119 @@ describe Wikitext::Parser, 'internal links (space to underscore off)' do
|
|
114
114
|
@parser.parse('foo [[bar]] baz').should == expected # was a bug
|
115
115
|
end
|
116
116
|
|
117
|
+
describe '"red link" support' do
|
118
|
+
it 'should accept a Proc object via the optional "link_proc" parameter' do
|
119
|
+
@parser.parse('foo', :link_proc => Proc.new { }).should == %Q{<p>foo</p>\n}
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'should accept a lambda via the optional "link_proc" parameter' do
|
123
|
+
@parser.parse('foo', :link_proc => lambda { }).should == %Q{<p>foo</p>\n}
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should apply custom link CSS when supplied (Proc object version)' do
|
127
|
+
link_proc = Proc.new { |target| target == 'bar' ? 'redlink' : nil }
|
128
|
+
expected = %Q{<p><a href="/wiki/foo">foo</a> <a href="/wiki/bar" class="redlink">bar</a></p>\n}
|
129
|
+
@parser.parse('[[foo]] [[bar]]', :link_proc => link_proc).should == expected
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'should apply custom link CSS when supplied (lambda version)' do
|
133
|
+
link_proc = lambda { |target| target == 'bar' ? 'redlink' : nil }
|
134
|
+
expected = %Q{<p><a href="/wiki/foo">foo</a> <a href="/wiki/bar" class="redlink">bar</a></p>\n}
|
135
|
+
@parser.parse('[[foo]] [[bar]]', :link_proc => link_proc).should == expected
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'should apply no custom link CSS when supplied nil (Proc object version)' do
|
139
|
+
expected = %Q{<p><a href="/wiki/foo">foo</a></p>\n}
|
140
|
+
@parser.parse('[[foo]]', :link_proc => Proc.new { |target| nil }).should == expected
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'should apply no custom link CSS when supplied nil (lambda version)' do
|
144
|
+
expected = %Q{<p><a href="/wiki/foo">foo</a></p>\n}
|
145
|
+
@parser.parse('[[foo]]', :link_proc => lambda { |target| nil }).should == expected
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'should let exceptions bubble up from the link proc (Proc object version)' do
|
149
|
+
lambda { @parser.parse('[[foo]]', :link_proc => Proc.new { |target| raise 'bar' }) }.should raise_error(RuntimeError, /bar/)
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'should let exceptions bubble up from the link proc (lambda version)' do
|
153
|
+
lambda { @parser.parse('[[foo]]', :link_proc => lambda { |target| raise 'bar' }) }.should raise_error(RuntimeError, /bar/)
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'should complain if the link proc returns a non-stringy object (Proc object version)' do
|
157
|
+
lambda {
|
158
|
+
@parser.parse '[[foo]]', :link_proc => Proc.new { 1 }
|
159
|
+
}.should raise_error(TypeError, /can't convert/)
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'should complain if the link proc returns a non-stringy object (lambda version)' do
|
163
|
+
lambda {
|
164
|
+
@parser.parse '[[foo]]', :link_proc => lambda { 1 }
|
165
|
+
}.should raise_error(TypeError, /can't convert/)
|
166
|
+
end
|
167
|
+
|
168
|
+
# a couple of Ruby's idiosynchrasies: different behaviour of lambdas and Procs
|
169
|
+
it 'should not complain if the Proc object accepts too many arguments' do
|
170
|
+
lambda {
|
171
|
+
@parser.parse '[[foo]]', :link_proc => Proc.new { |a,b| }
|
172
|
+
}.should_not raise_error(ArgumentError, /wrong number/)
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should complain if the lambda accepts too many arguments' do
|
176
|
+
lambda {
|
177
|
+
@parser.parse '[[foo]]', :link_proc => lambda { |a,b| }
|
178
|
+
}.should raise_error(ArgumentError, /wrong number/)
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'should complain when "return" is used inside a "Proc.new" block' do
|
182
|
+
lambda {
|
183
|
+
@parser.parse '[[foo]]', :link_proc => Proc.new { return 'bar' }
|
184
|
+
}.should raise_error(LocalJumpError)
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'should not complain when "return" is used inside a lambda' do
|
188
|
+
lambda {
|
189
|
+
@parser.parse '[[foo]]', :link_proc => lambda { return 'bar' }
|
190
|
+
}.should_not raise_error(LocalJumpError)
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'should interact correctly with spaces in link targets (Proc object version)' do
|
194
|
+
link_proc = Proc.new { |target| target == 'bar b' ? 'redlink' : nil }
|
195
|
+
expected = %Q{<p><a href="/wiki/foo%20a">foo a</a> <a href="/wiki/bar%20b" class="redlink">bar b</a></p>\n}
|
196
|
+
@parser.parse('[[foo a]] [[bar b]]', :link_proc => link_proc).should == expected
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'should interact correctly with spaces in link targets (lambda version)' do
|
200
|
+
link_proc = lambda { |target| target == 'bar b' ? 'redlink' : nil }
|
201
|
+
expected = %Q{<p><a href="/wiki/foo%20a">foo a</a> <a href="/wiki/bar%20b" class="redlink">bar b</a></p>\n}
|
202
|
+
@parser.parse('[[foo a]] [[bar b]]', :link_proc => link_proc).should == expected
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'should interact correctly with explicit link text (Proc object version)' do
|
206
|
+
link_proc = Proc.new { |target| target == 'bar b' ? 'redlink' : nil }
|
207
|
+
expected = %Q{<p><a href="/wiki/foo%20a">hello</a> <a href="/wiki/bar%20b" class="redlink">world</a></p>\n}
|
208
|
+
@parser.parse('[[foo a|hello]] [[bar b|world]]', :link_proc => link_proc).should == expected
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'should interact correctly with explicit link text (lambda version)' do
|
212
|
+
link_proc = lambda { |target| target == 'bar b' ? 'redlink' : nil }
|
213
|
+
expected = %Q{<p><a href="/wiki/foo%20a">hello</a> <a href="/wiki/bar%20b" class="redlink">world</a></p>\n}
|
214
|
+
@parser.parse('[[foo a|hello]] [[bar b|world]]', :link_proc => link_proc).should == expected
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'should handle link targets with encoded parts (Proc object version)' do
|
218
|
+
link_proc = Proc.new { |target| target == 'información' ? 'redlink' : nil }
|
219
|
+
expected = %Q{<p><a href="/wiki/informaci%c3%b3n" class="redlink">información</a> <a href="/wiki/bar">bar</a></p>\n}
|
220
|
+
@parser.parse('[[información]] [[bar]]', :link_proc => link_proc).should == expected
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'should handle link targets with encoded parts (lambda version)' do
|
224
|
+
link_proc = lambda { |target| target == 'información' ? 'redlink' : nil }
|
225
|
+
expected = %Q{<p><a href="/wiki/informaci%c3%b3n" class="redlink">información</a> <a href="/wiki/bar">bar</a></p>\n}
|
226
|
+
@parser.parse('[[información]] [[bar]]', :link_proc => link_proc).should == expected
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
117
230
|
describe 'custom link text' do
|
118
231
|
it 'should recognize link text placed after the separator' do
|
119
232
|
@parser.parse('[[foo|bar]]').should == %Q{<p><a href="/wiki/foo">bar</a></p>\n}
|
@@ -541,6 +654,119 @@ describe Wikitext::Parser, 'internal links (space to underscore on)' do
|
|
541
654
|
@parser.parse('foo [[bar]] baz').should == expected # was a bug
|
542
655
|
end
|
543
656
|
|
657
|
+
describe '"red link" support' do
|
658
|
+
it 'should accept a Proc object via the optional "link_proc" parameter' do
|
659
|
+
@parser.parse('foo', :link_proc => Proc.new { }).should == %Q{<p>foo</p>\n}
|
660
|
+
end
|
661
|
+
|
662
|
+
it 'should accept a lambda via the optional "link_proc" parameter' do
|
663
|
+
@parser.parse('foo', :link_proc => lambda { }).should == %Q{<p>foo</p>\n}
|
664
|
+
end
|
665
|
+
|
666
|
+
it 'should apply custom link CSS when supplied (Proc object version)' do
|
667
|
+
link_proc = Proc.new { |target| target == 'bar' ? 'redlink' : nil }
|
668
|
+
expected = %Q{<p><a href="/wiki/foo">foo</a> <a href="/wiki/bar" class="redlink">bar</a></p>\n}
|
669
|
+
@parser.parse('[[foo]] [[bar]]', :link_proc => link_proc).should == expected
|
670
|
+
end
|
671
|
+
|
672
|
+
it 'should apply custom link CSS when supplied (lambda version)' do
|
673
|
+
link_proc = lambda { |target| target == 'bar' ? 'redlink' : nil }
|
674
|
+
expected = %Q{<p><a href="/wiki/foo">foo</a> <a href="/wiki/bar" class="redlink">bar</a></p>\n}
|
675
|
+
@parser.parse('[[foo]] [[bar]]', :link_proc => link_proc).should == expected
|
676
|
+
end
|
677
|
+
|
678
|
+
it 'should apply no custom link CSS when supplied nil (Proc object version)' do
|
679
|
+
expected = %Q{<p><a href="/wiki/foo">foo</a></p>\n}
|
680
|
+
@parser.parse('[[foo]]', :link_proc => Proc.new { |target| nil }).should == expected
|
681
|
+
end
|
682
|
+
|
683
|
+
it 'should apply no custom link CSS when supplied nil (lambda version)' do
|
684
|
+
expected = %Q{<p><a href="/wiki/foo">foo</a></p>\n}
|
685
|
+
@parser.parse('[[foo]]', :link_proc => lambda { |target| nil }).should == expected
|
686
|
+
end
|
687
|
+
|
688
|
+
it 'should let exceptions bubble up from the link proc (Proc object version)' do
|
689
|
+
lambda { @parser.parse('[[foo]]', :link_proc => Proc.new { |target| raise 'bar' }) }.should raise_error(RuntimeError, /bar/)
|
690
|
+
end
|
691
|
+
|
692
|
+
it 'should let exceptions bubble up from the link proc (lambda version)' do
|
693
|
+
lambda { @parser.parse('[[foo]]', :link_proc => lambda { |target| raise 'bar' }) }.should raise_error(RuntimeError, /bar/)
|
694
|
+
end
|
695
|
+
|
696
|
+
it 'should complain if the link proc returns a non-stringy object (Proc object version)' do
|
697
|
+
lambda {
|
698
|
+
@parser.parse '[[foo]]', :link_proc => Proc.new { 1 }
|
699
|
+
}.should raise_error(TypeError, /can't convert/)
|
700
|
+
end
|
701
|
+
|
702
|
+
it 'should complain if the link proc returns a non-stringy object (lambda version)' do
|
703
|
+
lambda {
|
704
|
+
@parser.parse '[[foo]]', :link_proc => lambda { 1 }
|
705
|
+
}.should raise_error(TypeError, /can't convert/)
|
706
|
+
end
|
707
|
+
|
708
|
+
# a couple of Ruby's idiosynchrasies: different behaviour of lambdas and Procs
|
709
|
+
it 'should not complain if the Proc object accepts too many arguments' do
|
710
|
+
lambda {
|
711
|
+
@parser.parse '[[foo]]', :link_proc => Proc.new { |a,b| }
|
712
|
+
}.should_not raise_error(ArgumentError, /wrong number/)
|
713
|
+
end
|
714
|
+
|
715
|
+
it 'should complain if the lambda accepts too many arguments' do
|
716
|
+
lambda {
|
717
|
+
@parser.parse '[[foo]]', :link_proc => lambda { |a,b| }
|
718
|
+
}.should raise_error(ArgumentError, /wrong number/)
|
719
|
+
end
|
720
|
+
|
721
|
+
it 'should complain when "return" is used inside a "Proc.new" block' do
|
722
|
+
lambda {
|
723
|
+
@parser.parse '[[foo]]', :link_proc => Proc.new { return 'bar' }
|
724
|
+
}.should raise_error(LocalJumpError)
|
725
|
+
end
|
726
|
+
|
727
|
+
it 'should not complain when "return" is used inside a lambda' do
|
728
|
+
lambda {
|
729
|
+
@parser.parse '[[foo]]', :link_proc => lambda { return 'bar' }
|
730
|
+
}.should_not raise_error(LocalJumpError)
|
731
|
+
end
|
732
|
+
|
733
|
+
it 'should interact correctly with spaces in link targets (Proc object version)' do
|
734
|
+
link_proc = Proc.new { |target| target == 'bar b' ? 'redlink' : nil }
|
735
|
+
expected = %Q{<p><a href="/wiki/foo_a">foo a</a> <a href="/wiki/bar_b" class="redlink">bar b</a></p>\n}
|
736
|
+
@parser.parse('[[foo a]] [[bar b]]', :link_proc => link_proc).should == expected
|
737
|
+
end
|
738
|
+
|
739
|
+
it 'should interact correctly with spaces in link targets (lambda version)' do
|
740
|
+
link_proc = lambda { |target| target == 'bar b' ? 'redlink' : nil }
|
741
|
+
expected = %Q{<p><a href="/wiki/foo_a">foo a</a> <a href="/wiki/bar_b" class="redlink">bar b</a></p>\n}
|
742
|
+
@parser.parse('[[foo a]] [[bar b]]', :link_proc => link_proc).should == expected
|
743
|
+
end
|
744
|
+
|
745
|
+
it 'should interact correctly with explicit link text (Proc object version)' do
|
746
|
+
link_proc = Proc.new { |target| target == 'bar b' ? 'redlink' : nil }
|
747
|
+
expected = %Q{<p><a href="/wiki/foo_a">hello</a> <a href="/wiki/bar_b" class="redlink">world</a></p>\n}
|
748
|
+
@parser.parse('[[foo a|hello]] [[bar b|world]]', :link_proc => link_proc).should == expected
|
749
|
+
end
|
750
|
+
|
751
|
+
it 'should interact correctly with explicit link text (lambda version)' do
|
752
|
+
link_proc = lambda { |target| target == 'bar b' ? 'redlink' : nil }
|
753
|
+
expected = %Q{<p><a href="/wiki/foo_a">hello</a> <a href="/wiki/bar_b" class="redlink">world</a></p>\n}
|
754
|
+
@parser.parse('[[foo a|hello]] [[bar b|world]]', :link_proc => link_proc).should == expected
|
755
|
+
end
|
756
|
+
|
757
|
+
it 'should handle link targets with encoded parts (Proc object version)' do
|
758
|
+
link_proc = Proc.new { |target| target == 'información' ? 'redlink' : nil }
|
759
|
+
expected = %Q{<p><a href="/wiki/informaci%c3%b3n" class="redlink">información</a> <a href="/wiki/bar">bar</a></p>\n}
|
760
|
+
@parser.parse('[[información]] [[bar]]', :link_proc => link_proc).should == expected
|
761
|
+
end
|
762
|
+
|
763
|
+
it 'should handle link targets with encoded parts (lambda version)' do
|
764
|
+
link_proc = lambda { |target| target == 'información' ? 'redlink' : nil }
|
765
|
+
expected = %Q{<p><a href="/wiki/informaci%c3%b3n" class="redlink">información</a> <a href="/wiki/bar">bar</a></p>\n}
|
766
|
+
@parser.parse('[[información]] [[bar]]', :link_proc => link_proc).should == expected
|
767
|
+
end
|
768
|
+
end
|
769
|
+
|
544
770
|
describe 'custom link text' do
|
545
771
|
it 'should recognize link text placed after the separator' do
|
546
772
|
@parser.parse('[[foo|bar]]').should == %Q{<p><a href="/wiki/foo">bar</a></p>\n}
|
data/spec/nil_class_spec.rb
CHANGED
@@ -33,4 +33,8 @@ describe NilClass, 'wikitext extensions' do
|
|
33
33
|
it 'should provide a w method on the nil singleton' do
|
34
34
|
nil.w.should == ''
|
35
35
|
end
|
36
|
+
|
37
|
+
it 'should accept and ignore an optional options hash' do
|
38
|
+
lambda { nil.w :base_heading_level => 3 }.should_not raise_error
|
39
|
+
end
|
36
40
|
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: "1.
|
4
|
+
version: "1.9"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wincent Colaiuta
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-08-06 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|