PageTemplate 2.1.0 → 2.1.1
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/Changes +12 -0
- data/Rakefile +1 -1
- data/lib/PageTemplate/case.rb +1 -1
- data/lib/PageTemplate/commands.rb +9 -4
- data/lib/PageTemplate/parser.rb +63 -35
- data/lib/PageTemplate.rb +1 -0
- data/test.rb +15 -1
- metadata +14 -12
data/Changes
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
CVS:
|
2
|
+
Bugfixes:
|
3
|
+
'else' no longer crashes with CaseCommand. Patch by Jeremy Apthorp
|
4
|
+
Wrong regexp for modifier in parser.rb fixed. Report by anonymous.
|
5
|
+
modifiers are correctly reset when coming out of StackableCommands.
|
6
|
+
(report by Jeremy Apthorp)
|
7
|
+
Parser:
|
8
|
+
Added: Caching capability. If a Source returns a Command, it is used
|
9
|
+
instead of trying to compile it. After every compile,
|
10
|
+
Source#cache(filename,cmds) is called.
|
11
|
+
FileSource has caching, now.
|
12
|
+
|
1
13
|
2.1
|
2
14
|
Commands:
|
3
15
|
Changed: IfCommand now accepts elseif, elsif, else if.
|
data/Rakefile
CHANGED
data/lib/PageTemplate/case.rb
CHANGED
@@ -67,7 +67,7 @@ class PageTemplate
|
|
67
67
|
DefaultGlossary.define(/^case (\w+(?:\.\w+)*)$/) { |match,parser|
|
68
68
|
CaseCommand.new(match[1])
|
69
69
|
}
|
70
|
-
if PageTemplate.constants.include?
|
70
|
+
if PageTemplate.constants.include?('HTGlossary')
|
71
71
|
HTGlossary.define(/^tmpl_case (?:NAME=)?(\w+(?:\.\w+\?)*)$/) { |m,parser|
|
72
72
|
CaseCommand.new(m[1])
|
73
73
|
}
|
@@ -485,15 +485,20 @@ class PageTemplate
|
|
485
485
|
# We don't use parser.compile because we need to know when something
|
486
486
|
# doesn't exist.
|
487
487
|
parser = namespace.parser
|
488
|
-
|
488
|
+
fn = @value
|
489
|
+
body = parser.source.get(fn)
|
489
490
|
unless body
|
490
491
|
fn = namespace.get(@value)
|
491
492
|
body = parser.source.get(fn) if fn
|
492
493
|
end
|
493
|
-
if body
|
494
|
-
|
494
|
+
if body.is_a?(Command)
|
495
|
+
body.output(namespace)
|
496
|
+
elsif body
|
497
|
+
cmds = parser.parse(body)
|
498
|
+
parser.source.cache(fn,cmds)
|
499
|
+
cmds.output(namespace)
|
495
500
|
else
|
496
|
-
"[ Template '#{fn
|
501
|
+
"[ Template '#{fn}' not found ]"
|
497
502
|
end
|
498
503
|
end
|
499
504
|
end
|
data/lib/PageTemplate/parser.rb
CHANGED
@@ -170,22 +170,34 @@ class PageTemplate
|
|
170
170
|
@paths = @args['include_paths']
|
171
171
|
@paths ||= [@args['include_path']].compact
|
172
172
|
@paths = [Dir.getwd,'/'] if @paths.empty?
|
173
|
+
@cache = Hash.new(nil)
|
174
|
+
@mtime = Hash.new(0)
|
173
175
|
end
|
174
176
|
|
175
177
|
# Return the contents of the file +name+, which must be within the
|
176
178
|
# include_paths.
|
177
179
|
def get(name)
|
180
|
+
fn = get_filename(name)
|
178
181
|
begin
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
+
case
|
183
|
+
when fn.nil?
|
184
|
+
nil
|
185
|
+
when @cache.has_key?(fn) && (@mtime[fn] > File.mtime(fn).to_i)
|
186
|
+
cmds = @cache[fn]
|
187
|
+
cmds.clear_cache
|
188
|
+
cmds
|
182
189
|
else
|
183
|
-
|
190
|
+
IO.read(fn)
|
184
191
|
end
|
185
192
|
rescue Exception => er
|
186
|
-
return "[ Unable to open file #{fn} ]"
|
193
|
+
return "[ Unable to open file #{fn} because of #{er.message} ]"
|
187
194
|
end
|
188
195
|
end
|
196
|
+
def cache(name,cmds)
|
197
|
+
fn = get_filename(name)
|
198
|
+
@cache[fn] = cmds.dup
|
199
|
+
@mtime[fn] = Time.now.to_i
|
200
|
+
end
|
189
201
|
def get_filename(file)
|
190
202
|
file = file.gsub(/\.\.\//,'')
|
191
203
|
file.untaint
|
@@ -301,7 +313,7 @@ class PageTemplate
|
|
301
313
|
# Command#else's expect only to be called
|
302
314
|
modifier(:else) { |cmd,command|
|
303
315
|
case command
|
304
|
-
when /^else|no|empty$/i
|
316
|
+
when /^(else|no|empty)$/i
|
305
317
|
cmd.else
|
306
318
|
true
|
307
319
|
else
|
@@ -341,7 +353,7 @@ class PageTemplate
|
|
341
353
|
cmd.when($1)
|
342
354
|
true
|
343
355
|
when /^else$/i
|
344
|
-
cmd.else
|
356
|
+
cmd.else
|
345
357
|
true
|
346
358
|
else
|
347
359
|
false
|
@@ -353,34 +365,41 @@ class PageTemplate
|
|
353
365
|
# A preprocessor is used to process or otherwise prepare output for
|
354
366
|
# printing by Valuecommand
|
355
367
|
#
|
356
|
-
# Preprocessors must be
|
357
|
-
# some form.
|
368
|
+
# Preprocessors must be objects, that take a string to convert in
|
369
|
+
# some form. Typically singletons.
|
358
370
|
class Preprocessor
|
359
371
|
end
|
360
372
|
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
373
|
+
class DefaultPreprocessor
|
374
|
+
class << self
|
375
|
+
# Default, unescaped string.
|
376
|
+
def unescaped(str)
|
377
|
+
str
|
378
|
+
end
|
379
|
+
# :process, for backwards compatability.
|
380
|
+
alias_method :process, :unescaped
|
381
|
+
# Reverse the string. Don't see any use for this :D.
|
382
|
+
def reverse(str)
|
383
|
+
str.reverse
|
384
|
+
end
|
385
|
+
# escape URIs into %20-style escapes.
|
386
|
+
def escapeURI(string)
|
387
|
+
string.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
|
374
388
|
'%' + $1.unpack('H2' * $1.size).join('%').upcase
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
389
|
+
end.tr(' ', '+')
|
390
|
+
end
|
391
|
+
# Escape all HTML
|
392
|
+
def escapeHTML(string)
|
393
|
+
str = string.gsub(/&/n, '&')
|
394
|
+
str.gsub!(/\"/n, '"')
|
395
|
+
str.gsub!(/>/n, '>')
|
396
|
+
str.gsub!(/</n, '<')
|
397
|
+
str
|
398
|
+
end
|
399
|
+
# Escape HTML, but also turn newlines into <br />s
|
400
|
+
def simple(str)
|
401
|
+
escapeHTML(str).gsub(/\r\n|\n/,"<br />\n")
|
402
|
+
end
|
384
403
|
end
|
385
404
|
end
|
386
405
|
|
@@ -431,7 +450,7 @@ class PageTemplate
|
|
431
450
|
@parent = args['namespace'] || nil
|
432
451
|
@glossary = args['glossary'] || DefaultGlossary
|
433
452
|
@preprocessor = args['preprocessor'] || DefaultPreprocessor
|
434
|
-
@default_processor = args['default_processor'] || :
|
453
|
+
@default_processor = args['default_processor'] || :unescaped
|
435
454
|
@source = (args['source'] || FileSource).new(@args)
|
436
455
|
@commands = nil
|
437
456
|
end
|
@@ -443,10 +462,17 @@ class PageTemplate
|
|
443
462
|
# Load +name+ from a template, but do not save it.
|
444
463
|
def compile(name)
|
445
464
|
body = @source.get(name)
|
446
|
-
|
447
|
-
|
465
|
+
case
|
466
|
+
when body.is_a?(Command)
|
467
|
+
body
|
468
|
+
when body
|
469
|
+
cmds = parse(body)
|
470
|
+
@source.cache(name,cmds) if @source.respond_to?(:cache)
|
471
|
+
cmds
|
448
472
|
else
|
449
|
-
|
473
|
+
cmds = Template.new(self)
|
474
|
+
cmds.add TextCommand.new("[ Template '#{name}' not found ]")
|
475
|
+
cmds
|
450
476
|
end
|
451
477
|
end
|
452
478
|
# Compile a Template (BlockCommand) from a string. Does not save
|
@@ -478,6 +504,8 @@ class PageTemplate
|
|
478
504
|
cmd = stack.pop
|
479
505
|
last = stack.last
|
480
506
|
last.add(cmd)
|
507
|
+
modifier = last.class.modifier
|
508
|
+
closer = last.class.closer
|
481
509
|
next
|
482
510
|
end
|
483
511
|
|
data/lib/PageTemplate.rb
CHANGED
data/test.rb
CHANGED
@@ -508,6 +508,20 @@ module TestPageTemplate
|
|
508
508
|
assert_equal(true, @@ns.true?("dude"),
|
509
509
|
"If a flag is set to pretty much anything but false, then Namespace#true? returns true.")
|
510
510
|
end
|
511
|
+
class Foo
|
512
|
+
def initialize(str)
|
513
|
+
@str = str
|
514
|
+
end
|
515
|
+
def bar
|
516
|
+
@str
|
517
|
+
end
|
518
|
+
end
|
519
|
+
def test_deep_true_eh
|
520
|
+
@@ns['foo'] = Foo.new('fizbit')
|
521
|
+
assert(@@ns.true?('foo.bar'),"foo.bar must be true")
|
522
|
+
assert(@@ns.true?('foo.bar.reverse'))
|
523
|
+
assert_equal(@@ns.get('foo.bar.reverse'),'tibzif')
|
524
|
+
end
|
511
525
|
end
|
512
526
|
|
513
527
|
class TestParser < Test::Unit::TestCase
|
@@ -536,7 +550,7 @@ module TestPageTemplate
|
|
536
550
|
end
|
537
551
|
|
538
552
|
def test_default_processor
|
539
|
-
assert_equal(:
|
553
|
+
assert_equal(:unescaped, @@p.default_processor)
|
540
554
|
end
|
541
555
|
|
542
556
|
def test_load
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.8.
|
2
|
+
rubygems_version: 0.8.11
|
3
3
|
specification_version: 1
|
4
4
|
name: PageTemplate
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 2.1.
|
7
|
-
date: 2005-
|
6
|
+
version: 2.1.1
|
7
|
+
date: 2005-07-30 00:00:00 -07:00
|
8
8
|
summary: A simple templating system for Web sites.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -24,25 +24,27 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
24
24
|
version: 0.0.0
|
25
25
|
version:
|
26
26
|
platform: ruby
|
27
|
+
signing_key:
|
28
|
+
cert_chain:
|
27
29
|
authors:
|
28
30
|
- Brian Wisti
|
29
31
|
files:
|
30
|
-
- README.txt
|
31
|
-
- setup.rb
|
32
|
-
- MANIFEST
|
33
|
-
- lib
|
34
|
-
- Changes
|
35
|
-
- setup-usage.txt
|
36
32
|
- test-install.rb
|
33
|
+
- test.rb
|
34
|
+
- setup-usage.txt
|
35
|
+
- Changes
|
36
|
+
- MANIFEST
|
37
|
+
- setup.rb
|
38
|
+
- README.txt
|
37
39
|
- Rakefile
|
40
|
+
- lib
|
38
41
|
- tdata
|
39
|
-
- test.rb
|
40
|
-
- lib/PageTemplate.rb
|
41
42
|
- lib/PageTemplate
|
42
|
-
- lib/PageTemplate
|
43
|
+
- lib/PageTemplate.rb
|
43
44
|
- lib/PageTemplate/case.rb
|
44
45
|
- lib/PageTemplate/commands.rb
|
45
46
|
- lib/PageTemplate/htglossary.rb
|
47
|
+
- lib/PageTemplate/parser.rb
|
46
48
|
- tdata/dummy.txt
|
47
49
|
test_files:
|
48
50
|
- test.rb
|