trac-wiki 0.3.29 → 0.3.30
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.
- 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
|