PageTemplate 2.1.2 → 2.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/Changes CHANGED
@@ -1,3 +1,16 @@
1
+ 2.1.3:
2
+ Bugfixes:
3
+ HTGlossary didn't survive the change from 2.0 to 2.1. I've
4
+ added unit tests and fixed the HTGlossary bugs. Whoops.
5
+ setup.rb attempted to chmod every directory in its path on install.
6
+ Report and fix by: Lars Olsson
7
+ Changes:
8
+ If a glossary directive has multiple captures, PT will use
9
+ the first non-nil one.
10
+ Namespaces now use parser.method_separator. Defined on creation
11
+ by PageTemplate.new('method_separator' => <regex>).
12
+ Inspired by Jeremy Apthorp and YAML paths.
13
+
1
14
  2.1.2:
2
15
  Bugfixes:
3
16
  Added File.chmod statements to setup.rb to fix rake install.
data/Rakefile CHANGED
@@ -54,7 +54,7 @@ end
54
54
 
55
55
  spec = Gem::Specification.new do |s|
56
56
  s.name = "PageTemplate"
57
- s.version = "2.1.2"
57
+ s.version = "2.1.3"
58
58
  s.author = "Brian Wisti"
59
59
  s.email = "brianwisti@rubyforge.org"
60
60
  s.homepage = "http://coolnamehere.com/products/pagetemplate"
@@ -413,6 +413,7 @@ class PageTemplate
413
413
  ns['__FIRST__'] = (i == 1) ? true : false
414
414
  ns['__LAST__'] = (i == len) ? true : false
415
415
  ns['__ODD__'] = odd
416
+ ns['__INDEX__'] = i-1
416
417
  odd = ! odd
417
418
  i += 1
418
419
  @commands.output(ns)
@@ -426,6 +427,7 @@ class PageTemplate
426
427
  ns['__FIRST__'] = (i == 1) ? true : false
427
428
  ns['__LAST__'] = (i == len) ? true : false
428
429
  ns['__ODD__'] = odd
430
+ ns['__INDEX__'] = i-1
429
431
  odd = ! odd
430
432
  ns[iterator] = item
431
433
  i += 1
@@ -437,6 +439,7 @@ class PageTemplate
437
439
  ns['__FIRST__'] = (i == 1) ? true : false
438
440
  ns['__LAST__'] = (i == len) ? true : false
439
441
  ns['__ODD__'] = odd
442
+ ns['__INDEX__'] = i-1
440
443
  @iterators.each_with_index do |iterator,index|
441
444
  ns[iterator] = list[index]
442
445
  end
@@ -7,39 +7,49 @@
7
7
 
8
8
  class PageTemplate
9
9
  class HTGlossary < SyntaxGlossary
10
- @directive = /<!--(.+?)-->/m
10
+ # @directive = /<(?:!--\s*(tmpl.+?)\s*--|(TMPL.+?)(?:\/)?)>/mi
11
+ @directive = /(?:<\s*((?:\/?)TMPL_.*?)>|<!--\s*((?:\/?)TMPL.+?)\s*-->)/i
11
12
 
12
- default { |command,parser|
13
- TextCommand.new("<!--#{command}-->",parser)
13
+ default { |command|
14
+ puts "default: #{command}"
15
+ TextCommand.new("<!--#{command}-->")
14
16
  }
15
17
 
16
18
  define(/^tmpl_var (?:name=)?"?((?:\w+)(?:\.\w+\??)*)"?(?:\s+processor="?(\w+)"?)?$/i) {
17
- |match,parser|
19
+ |match|
18
20
  # Value, Preprocessor, Parser
19
- ValueCommand.new(match[1],match[2],parser)
21
+ ValueCommand.new(match[1],match[2])
20
22
  }
21
23
 
22
24
  define(/^(tmpl_if|tmpl_unless) (?:name=)?"?((\w+)(\.\w+\??)*)"?$/i) {
23
- |match,parser|
25
+ |match|
24
26
  # Called_As, Value, parser
25
- IfCommand.new(match[1],match[2],parser)
27
+ IfCommand.new(match[1],match[2])
26
28
  }
27
29
 
28
30
  define(/^(tmpl_loop) (?:name=)"?(\w+(?:\.\w+\??)*)"?(?:\s+iterators?="?((?:\s*\w+)+)"?)?$/i) {
29
- |match,parser|
31
+ |match|
30
32
  # Called_As, Value, Iterators
31
33
  LoopCommand.new(match[1],match[2],match[3])
32
34
  }
33
35
 
34
36
  define(/^tmpl_include (?:name=|file=)?"?((\w+)(?:\.\w+\??)*)"?$/i) {
35
- |match,parser|
37
+ |match|
36
38
  # Value, parser
37
- IncludeCommand.new(match[1],parser)
39
+ IncludeCommand.new(match[1])
38
40
  }
39
41
 
40
42
  # Command#else's expect only to be called
43
+ modifier(:elsif) { |cmd,command|
44
+ if command =~ /^\s*tmpl_else\s*$/i
45
+ cmd.else
46
+ true
47
+ else
48
+ false
49
+ end
50
+ }
41
51
  modifier(:else) { |cmd,command|
42
- if command =~ /^tmpl_else$/i
52
+ if command =~ /^\s*tmpl_else\s*$/i
43
53
  cmd.else
44
54
  true
45
55
  else
@@ -47,7 +57,7 @@ class PageTemplate
47
57
  end
48
58
  }
49
59
  modifier(:end) { |cmd,command|
50
- if command =~ /^\/\s*#{cmd.called_as}$/i
60
+ if command =~ /^\s*\/\s*#{cmd.called_as}\s*$/i
51
61
  cmd.end
52
62
  true
53
63
  else
@@ -53,41 +53,52 @@ class PageTemplate
53
53
  # (and further results) to premit accessing attributes of objects.
54
54
  def get(val,clean_rescue=true)
55
55
  args = parser.args
56
- clean_rescue = !args['raise_on_error'] if clean_rescue
57
56
  @values ||= {}
58
57
  @object ||= nil
59
- # Is it ours, or is it cached?
60
- key, rest = val.split(/\./,2)
58
+
59
+ clean_rescue = !args['raise_on_error'] if clean_rescue
60
+
61
+ val.gsub!(/[#{Regexp.escape(parser.method_separators)}]/,'.')
62
+
63
+ key, rest = val.split(/\./, 2)
64
+
61
65
  value = case
62
66
  when @values.has_key?(key)
63
67
  @values[key]
64
- when @object.respond_to?(:has_key?) && @object.has_key?(key)
68
+ when !@object
69
+ return @parent.get(val) if @parent
70
+ return nil
71
+ when @object.respond_to?(:has_key?)
65
72
  @values[key] = @object[key]
66
- when @object.respond_to?(key.to_sym)
67
- # This sets the cache and returns the value, too!
68
- @values[key] = @object.send(key)
69
- when @object && key == '__ITEM__'
73
+ when @object.respond_to?(sym = key.to_sym)
74
+ @values[key] = @object.send(sym)
75
+ when key == '__ITEM__'
70
76
  @object
71
- when @parent
72
- # Return what the parent gets
73
- return @parent.get(val)
74
77
  else
75
- # We're the global namespace
76
78
  nil
77
79
  end
78
80
 
79
81
  if rest
82
+ names = [key]
80
83
  rest.split(/\./).each do |i|
84
+ names << i
85
+ name = names.join('.')
81
86
  begin
82
- value = case
83
- when value.respond_to?(:has_key?) && value.has_key?(i)
84
- value[i]
85
- when value.respond_to?(:[]) && i =~ /^\d+$/
86
- value[i.to_i]
87
- when value.respond_to?(i)
88
- value.send(i)
87
+ value = if @values.has_key?(name)
88
+ @values[name]
89
89
  else
90
- nil
90
+ @values[name] = value = case
91
+ when @values.has_key?(name)
92
+ @values[name]
93
+ when value.respond_to?(:has_key?) # Hash
94
+ value[i]
95
+ when value.respond_to?(:[]) && i =~ /^\d+$/ # Array
96
+ value[i.to_i]
97
+ when value.respond_to?(i) # Just a method
98
+ value.send(i)
99
+ else
100
+ nil
101
+ end
91
102
  end
92
103
  rescue NoMethodError => er
93
104
  return nil
@@ -193,11 +204,15 @@ class PageTemplate
193
204
  return "[ Unable to open file #{fn} because of #{er.message} ]"
194
205
  end
195
206
  end
207
+
196
208
  def cache(name,cmds)
197
209
  fn = get_filename(name)
198
210
  @cache[fn] = cmds.dup
199
211
  @mtime[fn] = Time.now.to_i
200
212
  end
213
+
214
+ # Return the absolute pathname of the first name +file+
215
+ # found in the include_paths.
201
216
  def get_filename(file)
202
217
  file = file.gsub(/\.\.\//,'')
203
218
  file.untaint
@@ -312,6 +327,7 @@ class PageTemplate
312
327
 
313
328
  # Command#else's expect only to be called
314
329
  modifier(:else) { |cmd,command|
330
+ puts "Uh, whoops? #{command}" if command =~ /tmpl/mi
315
331
  case command
316
332
  when /^(else|no|empty)$/i
317
333
  cmd.else
@@ -428,7 +444,7 @@ class PageTemplate
428
444
  class Parser
429
445
  attr_reader :preprocessor, :default_processor
430
446
  attr_reader :glossary, :namespace, :source
431
- attr_reader :args, :commands
447
+ attr_reader :args, :commands, :method_separators
432
448
 
433
449
  # This is corny, but recent_parser returns the most recently created
434
450
  # Parser.
@@ -451,6 +467,7 @@ class PageTemplate
451
467
  @glossary = args['glossary'] || DefaultGlossary
452
468
  @preprocessor = args['preprocessor'] || DefaultPreprocessor
453
469
  @default_processor = args['default_processor'] || :unescaped
470
+ @method_separators = args['method_separators'] || './'
454
471
  @source = (args['source'] || FileSource).new(@args)
455
472
  @commands = nil
456
473
  end
@@ -486,7 +503,7 @@ class PageTemplate
486
503
  closer = nil
487
504
  while (m = rx.match(body))
488
505
  pre = m.pre_match
489
- command = m[1].strip.gsub(/\s+/,' ')
506
+ command = m[1..-1].compact.first.strip.gsub(/\s+/,' ')
490
507
  body = m.post_match
491
508
 
492
509
  # Convert all pre-text to a TextCommand
data/lib/PageTemplate.rb CHANGED
@@ -21,7 +21,6 @@
21
21
  ############################################################
22
22
 
23
23
  require 'PageTemplate/parser'
24
- require 'PageTemplate/preprocessor'
25
24
  require 'PageTemplate/commands'
26
25
 
27
26
  # PageTemplate is just the namespace for all of its real code, so as
data/setup-usage.txt CHANGED
@@ -4,7 +4,7 @@ Installing Programs with setup.rb
4
4
  Quick Start
5
5
  -----------
6
6
 
7
- Type this (You might needs super user previledge):
7
+ Type this (You might needs super user privilege):
8
8
 
9
9
  ($ su)
10
10
  # ruby setup.rb
data/setup.rb CHANGED
@@ -452,8 +452,10 @@ module FileOperations
452
452
  end
453
453
  dirs.each_index do |idx|
454
454
  path = dirs[0..idx].join('')
455
- Dir.mkdir path unless File.dir?(path)
456
- File.chmod(0755,path)
455
+ unless File.dir?(path)
456
+ Dir.mkdir path
457
+ File.chmod(0755,path)
458
+ end
457
459
  end
458
460
  end
459
461
 
@@ -1012,12 +1014,16 @@ class ToplevelInstallerMulti < ToplevelInstaller
1012
1014
  #
1013
1015
 
1014
1016
  def each_selected_installers
1015
- Dir.mkdir 'packages' unless File.dir?('packages')
1016
- File.chmod(0755,'packages')
1017
+ unless File.dir?('packages')
1018
+ Dir.mkdir 'packages'
1019
+ File.chmod(0755,'packages')
1020
+ end
1017
1021
  @selected.each do |pack|
1018
1022
  $stderr.puts "Processing the package `#{pack}' ..." if @options['verbose']
1019
- Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
1020
- File.chmod(0755,"packages/#{pack}")
1023
+ unless File.dir?("packages/#{pack}")
1024
+ Dir.mkdir "packages/#{pack}"
1025
+ File.chmod(0755,"packages/#{pack}")
1026
+ end
1021
1027
  Dir.chdir "packages/#{pack}"
1022
1028
  yield @installers[pack]
1023
1029
  Dir.chdir '../..'
@@ -1333,8 +1339,10 @@ class Installer
1333
1339
  return unless File.dir?("#{@srcdir}/#{rel}")
1334
1340
 
1335
1341
  dir = File.basename(rel)
1336
- Dir.mkdir dir unless File.dir?(dir)
1337
- File.chmod(0755,dir)
1342
+ unless File.dir?(dir)
1343
+ Dir.mkdir dir
1344
+ File.chmod(0755,dir)
1345
+ end
1338
1346
  prevdir = Dir.pwd
1339
1347
  Dir.chdir dir
1340
1348
  $stderr.puts '---> ' + rel if verbose?
data/test.rb CHANGED
@@ -654,6 +654,40 @@ module TestPageTemplate
654
654
  end
655
655
  end
656
656
 
657
+ class TestHTGlossary < Test::Unit::TestCase
658
+ def setup
659
+ begin
660
+ require 'PageTemplate/htglossary'
661
+ @parser = PageTemplate::Parser.new('glossary' => PageTemplate::HTGlossary)
662
+ rescue Exception => er
663
+ puts "error: #{er}"
664
+ @parser = nil
665
+ end
666
+ end
667
+ def test_comment_style
668
+ assert(@parser,'HTGlossary parser was not created')
669
+ tmpl = @parser.parse('<!-- TMPL_VAR foo -->')
670
+ tmpl['foo'] = 'bar'
671
+ assert_equal('bar',tmpl.output,'A TMPL_VAR command by itself')
672
+ tmpl = @parser.parse('<!-- TMPL_IF foo -->foo<!--TMPL_ELSE-->bar<!-- /TMPL_IF -->')
673
+ tmpl['foo'] = true
674
+ assert_equal('foo',tmpl.output,'TMPL_IF does not work in comment style')
675
+ tmpl['foo'] = false
676
+ assert_equal('bar',tmpl.output,'TMPL_IF does not work in comment style')
677
+ end
678
+ def test_tag_style
679
+ assert(@parser,'HTGlossary parser was not created')
680
+ tmpl = @parser.parse('<TMPL_VAR foo>')
681
+ tmpl['foo'] = 'bar'
682
+ assert_equal('bar',tmpl.output,'A TMPL_VAR command by itself')
683
+ tmpl = @parser.parse('<TMPL_IF foo>foo<TMPL_ELSE>bar</TMPL_IF>')
684
+ tmpl['foo'] = true
685
+ assert_equal('foo',tmpl.output,'TMPL_IF does not work in comment style')
686
+ tmpl['foo'] = false
687
+ assert_equal('bar',tmpl.output,'TMPL_IF does not work in comment style')
688
+ end
689
+ end
690
+
657
691
  class TestValueCommand < Test::Unit::TestCase
658
692
  def test_output
659
693
  p = PageTemplate::Parser.new()
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.10
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.2
7
- date: 2005-08-04
6
+ version: 2.1.3
7
+ date: 2005-10-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:
32
+ - Changes
30
33
  - lib
31
- - setup-usage.txt
34
+ - MANIFEST
32
35
  - Rakefile
33
- - tdata
34
- - Changes
35
- - test.rb
36
36
  - README.txt
37
+ - setup-usage.txt
37
38
  - setup.rb
38
- - MANIFEST
39
+ - tdata
39
40
  - test-install.rb
41
+ - test.rb
40
42
  - lib/PageTemplate
41
43
  - lib/PageTemplate.rb
42
- - lib/PageTemplate/parser.rb
44
+ - lib/PageTemplate/case.rb
43
45
  - lib/PageTemplate/commands.rb
44
46
  - lib/PageTemplate/htglossary.rb
45
- - lib/PageTemplate/case.rb
47
+ - lib/PageTemplate/parser.rb
46
48
  - tdata/dummy.txt
47
49
  test_files:
48
50
  - test.rb