erubis-bmp 2.7.0.bmp

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.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES.txt +828 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.txt +10 -0
  5. data/benchmark/bench.rb +313 -0
  6. data/benchmark/bench_context.yaml +141 -0
  7. data/benchmark/mybench2.rb +266 -0
  8. data/benchmark/pibench.rb +163 -0
  9. data/benchmark/templates/_footer.html +4 -0
  10. data/benchmark/templates/_header.html +52 -0
  11. data/benchmark/templates/bench_erb.rhtml +29 -0
  12. data/benchmark/templates/bench_erubis.rhtml +29 -0
  13. data/benchmark/templates/bench_eruby.rhtml +29 -0
  14. data/bin/erubis +10 -0
  15. data/contrib/erubis-run.rb +132 -0
  16. data/doc/Rookbook.yaml +106 -0
  17. data/doc/docstyle.css +209 -0
  18. data/doc/users-guide.html +3551 -0
  19. data/doc/users-guide.txt +3631 -0
  20. data/examples/basic/Makefile +58 -0
  21. data/examples/basic/example.ec +42 -0
  22. data/examples/basic/example.ecpp +33 -0
  23. data/examples/basic/example.ejava +45 -0
  24. data/examples/basic/example.ejs +16 -0
  25. data/examples/basic/example.eperl +16 -0
  26. data/examples/basic/example.ephp +17 -0
  27. data/examples/basic/example.eruby +15 -0
  28. data/examples/basic/example.escheme +26 -0
  29. data/examples/pi-xhtml/ExamplePage.xhtml +80 -0
  30. data/examples/pi-xhtml/Makefile +17 -0
  31. data/examples/pi-xhtml/my/User.java +19 -0
  32. data/examples/pi-xhtml/my/Util.java +54 -0
  33. data/examples/pi/Makefile +54 -0
  34. data/examples/pi/example.ec +42 -0
  35. data/examples/pi/example.ejava +45 -0
  36. data/examples/pi/example.ejs +16 -0
  37. data/examples/pi/example.eperl +16 -0
  38. data/examples/pi/example.ephp +17 -0
  39. data/examples/pi/example.eruby +15 -0
  40. data/examples/pi/example.escheme +26 -0
  41. data/lib/erubis.rb +73 -0
  42. data/lib/erubis/context.rb +83 -0
  43. data/lib/erubis/converter.rb +357 -0
  44. data/lib/erubis/engine.rb +120 -0
  45. data/lib/erubis/engine/ec.rb +117 -0
  46. data/lib/erubis/engine/ecpp.rb +113 -0
  47. data/lib/erubis/engine/ejava.rb +110 -0
  48. data/lib/erubis/engine/ejavascript.rb +119 -0
  49. data/lib/erubis/engine/enhanced.rb +126 -0
  50. data/lib/erubis/engine/eperl.rb +95 -0
  51. data/lib/erubis/engine/ephp.rb +99 -0
  52. data/lib/erubis/engine/eruby.rb +125 -0
  53. data/lib/erubis/engine/escheme.rb +114 -0
  54. data/lib/erubis/engine/optimized.rb +127 -0
  55. data/lib/erubis/enhancer.rb +723 -0
  56. data/lib/erubis/error.rb +23 -0
  57. data/lib/erubis/evaluator.rb +88 -0
  58. data/lib/erubis/generator.rb +85 -0
  59. data/lib/erubis/helper.rb +47 -0
  60. data/lib/erubis/helpers/rails_form_helper.rb +197 -0
  61. data/lib/erubis/helpers/rails_helper.rb +353 -0
  62. data/lib/erubis/local-setting.rb +9 -0
  63. data/lib/erubis/main.rb +516 -0
  64. data/lib/erubis/preprocessing.rb +58 -0
  65. data/lib/erubis/tiny.rb +144 -0
  66. data/lib/erubis/util.rb +22 -0
  67. data/setup.rb +1331 -0
  68. data/test/Rookbook.yaml +42 -0
  69. data/test/assert-text-equal.rb +44 -0
  70. data/test/test-engines.rb +425 -0
  71. data/test/test-enhancers.rb +646 -0
  72. data/test/test-erubis.rb +887 -0
  73. data/test/test-index-cgi.rb +191 -0
  74. data/test/test-main.rb +752 -0
  75. data/test/test-users-guide.rb +73 -0
  76. data/test/test.rb +45 -0
  77. data/test/testutil.rb +111 -0
  78. metadata +121 -0
@@ -0,0 +1,120 @@
1
+ ##
2
+ ## $Release:$
3
+ ## $Copyright$
4
+ ##
5
+
6
+
7
+ require 'erubis/generator'
8
+ require 'erubis/converter'
9
+ require 'erubis/evaluator'
10
+ require 'erubis/context'
11
+
12
+
13
+ module Erubis
14
+
15
+
16
+ ##
17
+ ## (abstract) abstract engine class.
18
+ ## subclass must include evaluator and converter module.
19
+ ##
20
+ class Engine
21
+ #include Evaluator
22
+ #include Converter
23
+ #include Generator
24
+
25
+ def initialize(input=nil, properties={})
26
+ #@input = input
27
+ init_generator(properties)
28
+ init_converter(properties)
29
+ init_evaluator(properties)
30
+ @src = convert(input) if input
31
+ end
32
+
33
+
34
+ ##
35
+ ## convert input string and set it to @src
36
+ ##
37
+ def convert!(input)
38
+ @src = convert(input)
39
+ end
40
+
41
+
42
+ ##
43
+ ## load file, write cache file, and return engine object.
44
+ ## this method create code cache file automatically.
45
+ ## cachefile name can be specified with properties[:cachename],
46
+ ## or filname + 'cache' is used as default.
47
+ ##
48
+ def self.load_file(filename, properties={})
49
+ cachename = properties[:cachename] || (filename + '.cache')
50
+ properties[:filename] = filename
51
+ timestamp = File.mtime(filename)
52
+ if test(?f, cachename) && timestamp == File.mtime(cachename)
53
+ engine = self.new(nil, properties)
54
+ engine.src = File.read(cachename)
55
+ else
56
+ input = File.open(filename, 'rb') {|f| f.read }
57
+ engine = self.new(input, properties)
58
+ tmpname = cachename + rand().to_s[1,8]
59
+ File.open(tmpname, 'wb') {|f| f.write(engine.src) }
60
+ File.rename(tmpname, cachename)
61
+ File.utime(timestamp, timestamp, cachename)
62
+ end
63
+ engine.src.untaint # ok?
64
+ return engine
65
+ end
66
+
67
+
68
+ ##
69
+ ## helper method to convert and evaluate input text with context object.
70
+ ## context may be Binding, Hash, or Object.
71
+ ##
72
+ def process(input, context=nil, filename=nil)
73
+ code = convert(input)
74
+ filename ||= '(erubis)'
75
+ if context.is_a?(Binding)
76
+ return eval(code, context, filename)
77
+ else
78
+ context = Context.new(context) if context.is_a?(Hash)
79
+ return context.instance_eval(code, filename)
80
+ end
81
+ end
82
+
83
+
84
+ ##
85
+ ## helper method evaluate Proc object with contect object.
86
+ ## context may be Binding, Hash, or Object.
87
+ ##
88
+ def process_proc(proc_obj, context=nil, filename=nil)
89
+ if context.is_a?(Binding)
90
+ filename ||= '(erubis)'
91
+ return eval(proc_obj, context, filename)
92
+ else
93
+ context = Context.new(context) if context.is_a?(Hash)
94
+ return context.instance_eval(&proc_obj)
95
+ end
96
+ end
97
+
98
+
99
+ end # end of class Engine
100
+
101
+
102
+ ##
103
+ ## (abstract) base engine class for Eruby, Eperl, Ejava, and so on.
104
+ ## subclass must include generator.
105
+ ##
106
+ class Basic::Engine < Engine
107
+ include Evaluator
108
+ include Basic::Converter
109
+ include Generator
110
+ end
111
+
112
+
113
+ class PI::Engine < Engine
114
+ include Evaluator
115
+ include PI::Converter
116
+ include Generator
117
+ end
118
+
119
+
120
+ end
@@ -0,0 +1,117 @@
1
+ ##
2
+ ## $Release:$
3
+ ## $Copyright$
4
+ ##
5
+
6
+ require 'erubis/engine'
7
+ require 'erubis/enhancer'
8
+
9
+
10
+ module Erubis
11
+
12
+
13
+ module CGenerator
14
+ include Generator
15
+
16
+ def self.supported_properties() # :nodoc:
17
+ return [
18
+ [:indent, '', "indent spaces (ex. ' ')"],
19
+ [:out, 'stdout', "output file pointer name"],
20
+ ]
21
+ end
22
+
23
+ def init_generator(properties={})
24
+ super
25
+ @escapefunc ||= "escape"
26
+ @indent = properties[:indent] || ''
27
+ @out = properties[:out] || 'stdout'
28
+ end
29
+
30
+ def add_preamble(src)
31
+ src << "#line 1 \"#{self.filename}\"\n" if self.filename
32
+ end
33
+
34
+ def escape_text(text)
35
+ @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" }
36
+ text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] }
37
+ return text
38
+ end
39
+
40
+ def escaped_expr(code)
41
+ return "#{@escapefunc}(#{code.strip}, #{@out})"
42
+ end
43
+
44
+ def add_text(src, text)
45
+ return if text.empty?
46
+ src << (src.empty? || src[-1] == ?\n ? @indent : ' ')
47
+ src << "fputs("
48
+ i = 0
49
+ text.each_line do |line|
50
+ src << "\n" << @indent << ' ' if i > 0
51
+ i += 1
52
+ src << '"' << escape_text(line) << '"'
53
+ end
54
+ src << ", #{@out});" #<< (text[-1] == ?\n ? "\n" : "")
55
+ src << "\n" if text[-1] == ?\n
56
+ end
57
+
58
+ def add_stmt(src, code)
59
+ src << code
60
+ end
61
+
62
+ def add_expr_literal(src, code)
63
+ src << @indent if src.empty? || src[-1] == ?\n
64
+ src << " fprintf(#{@out}, " << code.strip << ');'
65
+ end
66
+
67
+ def add_expr_escaped(src, code)
68
+ src << @indent if src.empty? || src[-1] == ?\n
69
+ src << ' ' << escaped_expr(code) << ';'
70
+ end
71
+
72
+ def add_expr_debug(src, code)
73
+ code.strip!
74
+ s = nil
75
+ if code =~ /\A\".*?\"\s*,\s*(.*)/
76
+ s = $1.gsub(/[%"]/, '\\\1') + '='
77
+ end
78
+ src << @indent if src.empty? || src[-1] == ?\n
79
+ src << " fprintf(stderr, \"*** debug: #{s}\" #{code});"
80
+ end
81
+
82
+ def add_postamble(src)
83
+ # empty
84
+ end
85
+
86
+ end
87
+
88
+
89
+ ##
90
+ ## engine for C
91
+ ##
92
+ class Ec < Basic::Engine
93
+ include CGenerator
94
+ end
95
+
96
+
97
+ class EscapedEc < Ec
98
+ include EscapeEnhancer
99
+ end
100
+
101
+
102
+ #class XmlEc < Ec
103
+ # include EscapeEnhancer
104
+ #end
105
+
106
+ class PI::Ec < PI::Engine
107
+ include CGenerator
108
+
109
+ def init_converter(properties={})
110
+ @pi = 'c'
111
+ super(properties)
112
+ end
113
+
114
+ end
115
+
116
+
117
+ end
@@ -0,0 +1,113 @@
1
+ ##
2
+ ## $Release:$
3
+ ## $Copyright$
4
+ ##
5
+
6
+ require 'erubis/engine'
7
+ require 'erubis/enhancer'
8
+
9
+
10
+ module Erubis
11
+
12
+
13
+ module CppGenerator
14
+ include Generator
15
+
16
+ def self.supported_properties() # :nodoc:
17
+ return [
18
+ [:indent, '', "indent spaces (ex. ' ')"],
19
+ [:bufvar, '_buf', "buffer variable name"],
20
+ ]
21
+ end
22
+
23
+ def init_generator(properties={})
24
+ super
25
+ @escapefunc ||= "escape"
26
+ @indent = properties[:indent] || ''
27
+ @bufvar = properties[:bufvar] || '_buf'
28
+ end
29
+
30
+ def add_preamble(src)
31
+ src << "#line 1 \"#{self.filename}\"\n" if self.filename
32
+ end
33
+
34
+ def escape_text(text)
35
+ @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" }
36
+ text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] }
37
+ return text
38
+ end
39
+
40
+ def escaped_expr(code)
41
+ return "#{@escapefunc}(#{code.strip})"
42
+ end
43
+
44
+ def add_text(src, text)
45
+ return if text.empty?
46
+ src << (src.empty? || src[-1] == ?\n ? @indent : ' ')
47
+ src << "_buf << "
48
+ i = 0
49
+ text.each_line do |line|
50
+ src << "\n" << @indent << " " if i > 0
51
+ i += 1
52
+ src << '"' << escape_text(line) << '"'
53
+ end
54
+ src << ";" #<< (text[-1] == ?\n ? "\n" : "")
55
+ src << "\n" if text[-1] == ?\n
56
+ end
57
+
58
+ def add_stmt(src, code)
59
+ src << code
60
+ end
61
+
62
+ def add_expr_literal(src, code)
63
+ src << @indent if src.empty? || src[-1] == ?\n
64
+ src << " _buf << (" << code.strip << ");"
65
+ end
66
+
67
+ def add_expr_escaped(src, code)
68
+ src << @indent if src.empty? || src[-1] == ?\n
69
+ src << ' ' << escaped_expr(code) << ';'
70
+ end
71
+
72
+ def add_expr_debug(src, code)
73
+ code.strip!
74
+ src << @indent if src.empty? || src[-1] == ?\n
75
+ src << " std::cerr << \"*** debug: #{code.gsub(/(")/, '\\\&')}=\" << (#{code});"
76
+ end
77
+
78
+ def add_postamble(src)
79
+ # empty
80
+ end
81
+
82
+ end
83
+
84
+
85
+ ##
86
+ ## engine for C
87
+ ##
88
+ class Ecpp < Basic::Engine
89
+ include CppGenerator
90
+ end
91
+
92
+
93
+ class EscapedEcpp < Ecpp
94
+ include EscapeEnhancer
95
+ end
96
+
97
+
98
+ #class XmlEcpp < Ecpp
99
+ # include EscapeEnhancer
100
+ #end
101
+
102
+ class PI::Ecpp < PI::Engine
103
+ include CppGenerator
104
+
105
+ def init_converter(properties={})
106
+ @pi = 'cpp'
107
+ super(properties)
108
+ end
109
+
110
+ end
111
+
112
+
113
+ end
@@ -0,0 +1,110 @@
1
+ ##
2
+ ## $Release:$
3
+ ## $Copyright$
4
+ ##
5
+
6
+ require 'erubis/engine'
7
+ require 'erubis/enhancer'
8
+
9
+
10
+ module Erubis
11
+
12
+
13
+ module JavaGenerator
14
+ include Generator
15
+
16
+ def self.supported_properties() # :nodoc:
17
+ return [
18
+ [:indent, '', "indent spaces (ex. ' ')"],
19
+ [:bufvar, '_buf', "output buffer variable name"],
20
+ [:bufclass, 'StringBuffer', "output buffer class (ex. 'StringBuilder')"],
21
+ ]
22
+ end
23
+
24
+ def init_generator(properties={})
25
+ super
26
+ @escapefunc ||= 'escape'
27
+ @indent = properties[:indent] || ''
28
+ @bufvar = properties[:bufvar] || '_buf'
29
+ @bufclass = properties[:bufclass] || 'StringBuffer'
30
+ end
31
+
32
+ def add_preamble(src)
33
+ src << "#{@indent}#{@bufclass} #{@bufvar} = new #{@bufclass}();"
34
+ end
35
+
36
+ def escape_text(text)
37
+ @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" }
38
+ return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text
39
+ end
40
+
41
+ def add_text(src, text)
42
+ return if text.empty?
43
+ src << (src.empty? || src[-1] == ?\n ? @indent : ' ')
44
+ src << @bufvar << ".append("
45
+ i = 0
46
+ text.each_line do |line|
47
+ src << "\n" << @indent << ' + ' if i > 0
48
+ i += 1
49
+ src << '"' << escape_text(line) << '"'
50
+ end
51
+ src << ");" << (text[-1] == ?\n ? "\n" : "")
52
+ end
53
+
54
+ def add_stmt(src, code)
55
+ src << code
56
+ end
57
+
58
+ def add_expr_literal(src, code)
59
+ src << @indent if src.empty? || src[-1] == ?\n
60
+ code.strip!
61
+ src << " #{@bufvar}.append(#{code});"
62
+ end
63
+
64
+ def add_expr_escaped(src, code)
65
+ add_expr_literal(src, escaped_expr(code))
66
+ end
67
+
68
+ def add_expr_debug(src, code)
69
+ code.strip!
70
+ src << @indent if src.empty? || src[-1] == ?\n
71
+ src << " System.err.println(\"*** debug: #{code}=\"+(#{code}));"
72
+ end
73
+
74
+ def add_postamble(src)
75
+ src << "\n" if src[-1] == ?;
76
+ src << @indent << "return " << @bufvar << ".toString();\n"
77
+ #src << @indent << "System.out.print(" << @bufvar << ".toString());\n"
78
+ end
79
+
80
+ end
81
+
82
+
83
+ ##
84
+ ## engine for Java
85
+ ##
86
+ class Ejava < Basic::Engine
87
+ include JavaGenerator
88
+ end
89
+
90
+
91
+ class EscapedEjava < Ejava
92
+ include EscapeEnhancer
93
+ end
94
+
95
+
96
+ #class XmlEjava < Ejava
97
+ # include EscapeEnhancer
98
+ #end
99
+
100
+ class PI::Ejava < PI::Engine
101
+ include JavaGenerator
102
+
103
+ def init_converter(properties={})
104
+ @pi = 'java'
105
+ super(properties)
106
+ end
107
+
108
+ end
109
+
110
+ end