trac-wiki 0.3.29 → 0.3.30
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/trac-wiki/parser.rb +74 -18
- data/lib/trac-wiki/version.rb +1 -1
- data/test/parser_test.rb +60 -10
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 107e539c3fae535e4b91d514bf1029e2a4ff4ab7
|
4
|
+
data.tar.gz: 58eecadc0308900fadb9da7aff1bd4a087265966
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25571b19eaf7b3aeb17c8ecb82a02921bd810605109ff6d47790db88ac391fdbfe4773ab27def6efd8b20f3809563a0584b7543c959917801ca0542f96a00739
|
7
|
+
data.tar.gz: fff67c49f1eecc16441bacd85cd4bac4bdff762ed71dd102ce7f3e6f402f547d1aa8e930f7158211a09c18d311f3497323cfbeb85ac29e5fe4d9847fafc332f6
|
data/Gemfile.lock
CHANGED
data/lib/trac-wiki/parser.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
require 'cgi'
|
3
3
|
require 'uri'
|
4
4
|
require 'yaml'
|
5
|
+
require 'base64'
|
6
|
+
require 'digest/sha2'
|
5
7
|
require 'unicode_utils/compatibility_decomposition'
|
6
8
|
|
7
9
|
# :main: TracWiki
|
@@ -131,10 +133,10 @@ module TracWiki
|
|
131
133
|
|
132
134
|
# macro {{$var}} | {{#comment}} | {{!cmd}} | {{template}} | {{/template}}
|
133
135
|
# string begins with macro
|
134
|
-
MACRO_BEG_REX = /\A\{\{ ( \$[
|
135
|
-
MACRO_BEG_INSIDE_REX = /\A(.*?) (?<!\{|!|!\{) \{\{ ( \$[
|
136
|
+
MACRO_BEG_REX = /\A\{\{ ( \$[#\$\.\w]+ | [\#!\/]\w* |\w+ ) /x
|
137
|
+
MACRO_BEG_INSIDE_REX = /\A(.*?) (?<!\{|!|!\{) \{\{ ( \$[#\$\.\w]+ | [\#!\/]\w* | \w+ ) /xm
|
136
138
|
# find end of marcro or begin of inner macro
|
137
|
-
MACRO_END_REX = /\A(.*?) ( \}\} | \{\{ ( \$[
|
139
|
+
MACRO_END_REX = /\A(.*?) ( \}\} | \{\{ ( \$[#\$\.\w]+ | [\#!\/]\w* | \w+) )/mx
|
138
140
|
|
139
141
|
# Create a new Parser instance.
|
140
142
|
def initialize(options = {})
|
@@ -227,29 +229,83 @@ module TracWiki
|
|
227
229
|
pat = Regexp.new(pat[1..-2]) if pat =~ /\A\/.*\/\Z/
|
228
230
|
env.expand_arg(0).gsub(pat, env.expand_arg(2))
|
229
231
|
},
|
230
|
-
'!macpos'
|
232
|
+
'!macpos'=> proc { |env| "#{env.at('lineno')}.#{env.at('offset')}-#{env.at('elineno')}.#{env.at('eoffset')}" },
|
233
|
+
# in macro {{arg {{$i}}} -> i=4 => ctyry
|
234
|
+
'!arg' => proc { |env|
|
235
|
+
#print "arg: #{env.arg(0)}, #{env} }"
|
236
|
+
"#{env.at(env.expand(env.arg(0)))}"
|
237
|
+
},
|
238
|
+
|
239
|
+
# {{!forargs i|3|i:{$$i}}}} -> 0,1,2
|
240
|
+
# {{!forargs i||i:{$$i}}}} -> 0,1,2
|
241
|
+
'!sprintf' => proc { |env|
|
242
|
+
fmt = env.arg(0)
|
243
|
+
args = (1 .. env.arg_count ).map{ |i| env.expand_arg(i)}
|
244
|
+
begin
|
245
|
+
sprintf fmt, *args
|
246
|
+
rescue Exception => e
|
247
|
+
"(sprintf error:`#{e}`)"
|
248
|
+
end
|
249
|
+
},
|
250
|
+
'!digest' => proc { |env| Base64.urlsafe_encode64(Digest::SHA256.digest(env.expand_arg(0))) },
|
251
|
+
'!base64' => proc { |env| Base64.urlsafe_encode64(env.expand_arg(0)) },
|
252
|
+
'!tt' => proc { |env| "`#{env.expand_arg(0)}`" },
|
253
|
+
'!forargs' => proc { |env| i_name = env.arg(0)
|
254
|
+
i_name = env.arg(0)
|
255
|
+
start = env.arg(1).to_i # side efect '' => 0
|
256
|
+
start = 1 if start < 1
|
257
|
+
template = env.arg(2)
|
258
|
+
argcount =
|
259
|
+
(start .. env.arg_count ).map do |i|
|
260
|
+
env.atput(i_name, i.to_s)
|
261
|
+
env.expand(template)
|
262
|
+
end.join('')
|
263
|
+
},
|
264
|
+
# {{!for i|1,3|i:{$$i}}}} -> 0,1,2
|
265
|
+
# {{!for i|1,3,data|i:{$$i}}}} -> data[1,2,3]
|
266
|
+
# {{!for i|data|i:{$$i}}}} -> vsechny data
|
267
|
+
# {{!for i|1|i:{$$i}}}} -> vsechny data
|
231
268
|
'!for' => proc { |env| i_name = env.arg(0)
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
269
|
+
|
270
|
+
raise "!for takes exactly 3 argumentsif not #{env.arg_count}" if env.arg_count != 3
|
271
|
+
|
272
|
+
i_name = env.arg(0)
|
273
|
+
range = env.expand_arg(1)
|
274
|
+
templ = env.arg(2)
|
275
|
+
|
276
|
+
arange = range.split(/,/)
|
277
|
+
arange = [ nil, nil, arange[0]] if arange.size == 1
|
278
|
+
|
279
|
+
bot = arange[0]
|
280
|
+
top = arange[1]
|
281
|
+
var = arange[2]
|
282
|
+
|
283
|
+
if var.nil?
|
284
|
+
set = (bot.to_i||1 .. top.to_i)
|
237
285
|
else
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
286
|
+
obj = env.at(var, nil, false)
|
287
|
+
|
288
|
+
if obj.is_a?(Hash)
|
289
|
+
set = obj.keys.sort
|
290
|
+
elsif obj.is_a?(Array)
|
291
|
+
#print "ble:#{bot} #{bot}, #{obj.size}\n"
|
292
|
+
set = (bot||0 .. obj.size-1)
|
293
|
+
elsif obj.nil?
|
244
294
|
set = []
|
245
295
|
else
|
246
|
-
|
247
|
-
raise "Error in {{!for #{i_name}|#{top}|#{tmpl}}} $#{top}.class=#{set.class}(#{set.to_s})"
|
296
|
+
raise "Error: wrong arg #{obj} class='#{obj.class}'"
|
248
297
|
end
|
249
298
|
end
|
299
|
+
#set.select! { |x| x >= bot } if bot
|
300
|
+
#set.select! { |x| x <= top } if top
|
301
|
+
|
302
|
+
#print "for set#{set} tmpl#{templ||"nic"}\n"
|
303
|
+
|
250
304
|
set.map do |i|
|
305
|
+
#print "for#{i} #{templ}\n"
|
251
306
|
env[i_name] = i.to_s
|
252
|
-
env.
|
307
|
+
env.atput(i_name, i.to_s)
|
308
|
+
env.expand(templ)
|
253
309
|
end.join('')
|
254
310
|
},
|
255
311
|
}
|
data/lib/trac-wiki/version.rb
CHANGED
data/test/parser_test.rb
CHANGED
@@ -72,9 +72,19 @@ class Bacon::Context
|
|
72
72
|
"off:{{$offset}}"
|
73
73
|
when '/slash'
|
74
74
|
"slash/slash"
|
75
|
+
when 'argcount'
|
76
|
+
"{{$#}},{{$##}}"
|
77
|
+
when 'argi'
|
78
|
+
"{{$i}}:{{!arg {{$i}}}}."
|
79
|
+
when 'forargs'
|
80
|
+
"{{!forargs i||{{$i}}:{{!arg {{$i}}}},}}"
|
81
|
+
when 'forargs2'
|
82
|
+
"{{!forargs i|2|{{$i}}:{{!arg {{$i}}}},}}"
|
75
83
|
when 'unkmacro'
|
76
84
|
#"UNKNOWN-MACRO:!{{!.{{$0}}}}."
|
77
85
|
"UNKNOWN-MACRO:!{{!.{{$1}}}}."
|
86
|
+
when 'digesttest'
|
87
|
+
"({{$00}}:{{!digest blabla{{$00}}}})"
|
78
88
|
else
|
79
89
|
nil
|
80
90
|
#"UNK_TEMPL(#{tname})"
|
@@ -1063,20 +1073,27 @@ eos
|
|
1063
1073
|
tc "<p>,2</p>\n", "{{!yset ahoj|data: [1,2]\ndesc: malo}},{{$ahoj.data.1}}"
|
1064
1074
|
tc "<p>AHOJ,dve</p>\n", "{{ytest2 \nahoj: AHOJ\nbhoj: [ jedna, dve ]\n}}"
|
1065
1075
|
tc "<p>,,BHOJ</p>\n", "{{!set ahoj|AHOJ}},{{!set AHOJ|BHOJ}},{{$$ahoj}}"
|
1066
|
-
tc "<p>(0),(1),(2),</p>\n", "{{!for i|3|({{$i}}),}}", allow_html: true
|
1067
|
-
tc "<p>(0),(1),(2),(3),</p>\n", "{{!for i|4|({{$i}}),}}", allow_html: true
|
1068
|
-
tc "<p>,(ALFA),(BETA),</p>\n", "{{!yset data|[ALFA,BETA]}},{{!for i|data|({{$data.$i}}),}}"
|
1069
|
-
tc "<p>,(1),(2),</p>\n", "{{!yset data|[1,2]}},{{!for i|data|({{$data.$i}}),}}"
|
1070
|
-
tc "<p>,(alfa:ALFA),(beta:BETA),</p>\n", "{{!yset data|beta: BETA\nalfa: ALFA\n}},{{!for i|data|({{$i}}:{{$data.$i}}),}}"
|
1071
|
-
tc "<p>,(0:1),(1:2),</p>\n", "{{!yset data|[ 1,2 ]\n}},{{!for i|data|({{$i}}:{{$data.$i}}),}}"
|
1072
|
-
tc "<p>,</p>\n", "{{!yset data|[ ]\n}},{{!for i|data|({{$i}}:{{$data.$i}}),}}"
|
1073
1076
|
|
1074
1077
|
tc "<p>,FALSE</p>\n", "{{!yset data|[1,2]}},{{!ifdef data.55|TRUE|FALSE}}"
|
1075
1078
|
tc "<p>,TRUE</p>\n", "{{!yset data|[1,2]}},{{!ifdef data.1|TRUE|FALSE}}"
|
1076
1079
|
tc "<p>,TRUE</p>\n", "{{!yset data|{a: 1, b: 2} }},{{!ifdef data.a|TRUE|FALSE}}"
|
1077
1080
|
tc "<p>,FALSE</p>\n", "{{!yset data|{a: 1, b: 2} }},{{!ifdef data.q|TRUE|FALSE}}"
|
1078
1081
|
end
|
1079
|
-
|
1082
|
+
it 'should parse !for' do
|
1083
|
+
tc "<p>(1),(2),(3),</p>\n", "{{!for i|1,3|({{$i}}),}}", allow_html: true
|
1084
|
+
tc "<p>(2),(3),</p>\n", "{{!for i|2,3|({{$i}}),}}", allow_html: true
|
1085
|
+
tc "<p>(3),</p>\n", "{{!for i|3,3|({{$i}}),}}", allow_html: true
|
1086
|
+
tc "<p>(0),(1),(2),(3),(4),</p>\n", "{{!for i|,4|({{$i}}),}}", allow_html: true
|
1087
|
+
tc "<p>,(ALFA),(BETA),</p>\n", "{{!yset data|[ALFA,BETA]}},{{!for i|data|({{$data.$i}}),}}"
|
1088
|
+
tc "<p>,(1),(2),</p>\n", "{{!yset data|[1,2]}},{{!for i|data|({{$data.$i}}),}}"
|
1089
|
+
tc "<p>,(alfa:ALFA),(beta:BETA),</p>\n", "{{!yset data|beta: BETA\nalfa: ALFA\n}},{{!for i|data|({{$i}}:{{$data.$i}}),}}"
|
1090
|
+
tc "<p>,(0:1),(1:2),</p>\n", "{{!yset data|[ 1,2 ]\n}},{{!for i|data|({{$i}}:{{$data.$i}}),}}"
|
1091
|
+
tc "<p>,</p>\n", "{{!yset data|[ ]\n}},{{!for i|data|({{$i}}:{{$data.$i}}),}}"
|
1092
|
+
end
|
1093
|
+
it 'should parse argi' do
|
1094
|
+
tc "<p>1:one.</p>\n", "{{argi one|two|i=1}}"
|
1095
|
+
tc "<p>2:two.</p>\n", "{{argi one|two|i=2}}"
|
1096
|
+
end
|
1080
1097
|
it 'should parse html' do
|
1081
1098
|
tc "<p>alert(666)</p>\n", "<script>alert(666)</script>", allow_html: true
|
1082
1099
|
tc "<p><b>T</b>E</p>\n", "<p><b>T</b>E</p>", allow_html: true
|
@@ -1114,8 +1131,8 @@ eos
|
|
1114
1131
|
tc "<p>d<strong>e</strong></p>\n", "{{!ifeq a|b|c|d*\\\n*e**}}"
|
1115
1132
|
tc "<p>d<strong>e</strong></p>\n", "{{!ifeq a|b|c|d*\\\r\n*e**}}"
|
1116
1133
|
tc "<p>e</p>\n", "{{!ifeq a|b|c|\\\r\ne}}"
|
1117
|
-
tc "<p>
|
1118
|
-
tc "<p>
|
1134
|
+
tc "<p>a1a2a3</p>\n", "{{!for i|1,3|a\\\n{{$i}}}}"
|
1135
|
+
tc "<p>a0a1a2a3</p>\n", "{{!for i|0,3|a\\\n {{$i}}}}"
|
1119
1136
|
end
|
1120
1137
|
it 'should parse offset' do
|
1121
1138
|
tc "<p>0</p>\n", "{{$offset}}"
|
@@ -1260,6 +1277,13 @@ eos
|
|
1260
1277
|
tc "<p>meow</p>\n", "{{$UNKVAR|meow}}\n"
|
1261
1278
|
tc "<p>cat:</p>\n", "cat:{{$UNKVAR}}\n"
|
1262
1279
|
end
|
1280
|
+
it 'should argcount ' do
|
1281
|
+
tc "<p>0,0</p>\n", "{{argcount}}"
|
1282
|
+
tc "<p>1,1</p>\n", "{{argcount one}}"
|
1283
|
+
tc "<p>2,2</p>\n", "{{argcount one|two}}"
|
1284
|
+
tc "<p>2,3</p>\n", "{{argcount one|two|blaf=haf}}"
|
1285
|
+
tc "<p>0,3</p>\n", "{{argcount one=1|two=2|blaf=haf}}"
|
1286
|
+
end
|
1263
1287
|
it 'should parse data-* ' do
|
1264
1288
|
tc "<div data-coffie=\"tea\">TEST</div>\n", "<div data-coffie=\"tea\">TEST</div>\n", allow_html: true
|
1265
1289
|
tc "<div data-coffie-break=\"tea\">TEST</div>\n", "<div data-coffie-break=\"tea\">TEST</div>\n", allow_html: true
|
@@ -1267,5 +1291,31 @@ eos
|
|
1267
1291
|
|
1268
1292
|
tc "<p><div data-coffie-break="tea">TEST</div></p>\n", "<div data-coffie-break=\"tea\">TEST</div>\n", allow_html: false
|
1269
1293
|
end
|
1294
|
+
it 'should forargs' do
|
1295
|
+
tc "<p>1:jedna,2:dva,3:tri,</p>\n", "{{forargs jedna|dva|tri}}", allow_html: true
|
1296
|
+
tc "<p>2:dva,3:tri,</p>\n", "{{forargs2 jedna|dva|tri}}", allow_html: true
|
1297
|
+
end
|
1298
|
+
it 'should parse digest' do
|
1299
|
+
tc "<p>wFNeS-K3n_2TKRMFQ2v4iTFOSj-uwF7P_Lt98xrZ5Ro=</p>\n", "{{!digest Hello world!}}"
|
1300
|
+
tc "<p>wFNeS-K3n_2TKRMFQ2v4iTFOSj-uwF7P_Lt98xrZ5Ro=</p>\n", "{{!digest Hello world!}}"
|
1301
|
+
tc "<p>wFNeS-K3n_2TKRMFQ2v4iTFOSj-uwF7P_Lt98xrZ5Ro=</p>\n", "{{!set ahoj|Hello world!}}{{!digest {{$ahoj}}}}"
|
1302
|
+
tc "<p>qj7BbmrMgJ2LKBhmInYlar_S8bRBy1FXSTPz1L0RXRE=</p>\n", "{{!set ahoj|Hello world.}}{{!digest {{$ahoj}}}}"
|
1303
|
+
end
|
1304
|
+
it 'should parse sprintf' do
|
1305
|
+
tc "<p>001</p>\n", "{{!sprintf %03i|1}}"
|
1306
|
+
tc "<p>0001-3.14</p>\n", "{{!sprintf %04i-%.2f|1|3.1415}}"
|
1307
|
+
tc "<p><tt> ahoj</tt></p>\n", "{{!sprintf `%7s`|ahoj}}"
|
1308
|
+
tc "<p><tt>ahoj </tt></p>\n", "{{!sprintf `%-7s`|ahoj}}"
|
1309
|
+
tc "<p>(sprintf error:<tt>malformed format string - %*[0-9]</tt>)</p>\n", "{{!sprintf %03|1}}"
|
1310
|
+
end
|
1311
|
+
it 'should parse sprintf' do
|
1312
|
+
tc "<p><tt>ahoj</tt></p>\n", "{{!tt ahoj}}"
|
1313
|
+
tc "<p>YWhvanRl</p>\n", "{{!base64 ahojte}}"
|
1314
|
+
tc "<p>(ahojte:FuVx_SBpN3croY9zm4j14xVw19yIHsyZIzErSffwPpY=)</p>\n", "{{digesttest ahojte}}"
|
1315
|
+
tc "<p>(bhojte:iwqSnWkQXpGogNtIXpDr8TYIcwJFQTKOLQgG7b9VFVg=)</p>\n", "{{digesttest bhojte}}"
|
1316
|
+
tc "<p>(bhojte|ahoj=qhoj:6o2F88ZwLtQadp-8O6ArYIPcePy8_h_rg_2Fsa0EUv0=)</p>\n", "{{digesttest bhojte|ahoj=qhoj}}"
|
1317
|
+
tc "<p>(bhojte|ahoj=dhoj:m8afmveEhG78gsv5Pt-gJ56idfKCR10JNPr-G72Fttc=)</p>\n", "{{digesttest bhojte|ahoj=dhoj}}"
|
1318
|
+
tc "<p><tt>ah!@\#$%^&*()[]oj</tt></p>\n", "{{!tt ah!@\#$%^&*()[]oj}}"
|
1319
|
+
end
|
1270
1320
|
end
|
1271
1321
|
# vim: tw=0
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trac-wiki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.30
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vitas Stradal
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bacon
|