kwartz 3.1.2 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. data/CHANGES +444 -0
  2. data/README.txt +4 -1
  3. data/bin/kwartz +2 -2
  4. data/doc-api/classes/Kwartz.html +16 -7
  5. data/doc-api/classes/Kwartz/Assertion.html +6 -6
  6. data/doc-api/classes/Kwartz/AssertionError.html +6 -6
  7. data/doc-api/classes/Kwartz/AttrInfo.html +71 -61
  8. data/doc-api/classes/Kwartz/BaseError.html +12 -12
  9. data/doc-api/classes/Kwartz/BaseTranslator.html +104 -74
  10. data/doc-api/classes/Kwartz/CharacterType.html +24 -24
  11. data/doc-api/classes/Kwartz/CommandOptionError.html +7 -7
  12. data/doc-api/classes/Kwartz/CommandOptions.html +50 -50
  13. data/doc-api/classes/Kwartz/Config.html +5 -0
  14. data/doc-api/classes/Kwartz/ConvertError.html +12 -12
  15. data/doc-api/classes/Kwartz/Converter.html +31 -33
  16. data/doc-api/classes/Kwartz/CssStyleParser.html +207 -168
  17. data/doc-api/classes/Kwartz/Defun.html +32 -31
  18. data/doc-api/classes/Kwartz/{HandlerArgument.html → Directive.html} +27 -53
  19. data/doc-api/classes/Kwartz/ElementInfo.html +68 -53
  20. data/doc-api/classes/Kwartz/EperlExpressionParser.html +185 -0
  21. data/doc-api/classes/Kwartz/EperlHandler.html +65 -58
  22. data/doc-api/classes/Kwartz/EperlTranslator.html +14 -7
  23. data/doc-api/classes/Kwartz/ErubisTranslator.html +14 -7
  24. data/doc-api/classes/Kwartz/ErubyTranslator.html +14 -7
  25. data/doc-api/classes/Kwartz/ExpandStatement.html +20 -20
  26. data/doc-api/classes/Kwartz/Expander.html +358 -0
  27. data/doc-api/classes/Kwartz/Handler.html +287 -157
  28. data/doc-api/classes/Kwartz/{StatementHelper.html → HandlerHelper.html} +307 -112
  29. data/doc-api/classes/Kwartz/Helper/ActionViewHelper.html +23 -23
  30. data/doc-api/classes/Kwartz/Helper/RailsTemplate.html +96 -96
  31. data/doc-api/classes/Kwartz/JstlExpressionParser.html +181 -0
  32. data/doc-api/classes/Kwartz/JstlHandler.html +134 -126
  33. data/doc-api/classes/Kwartz/JstlTranslator.html +21 -14
  34. data/doc-api/classes/Kwartz/KwartzError.html +6 -6
  35. data/doc-api/classes/Kwartz/Main.html +4 -4
  36. data/doc-api/classes/Kwartz/NativeExpression.html +19 -19
  37. data/doc-api/classes/Kwartz/NativeStatement.html +24 -24
  38. data/doc-api/classes/Kwartz/Node.html +7 -7
  39. data/doc-api/classes/Kwartz/PIErubisTranslator.html +21 -14
  40. data/doc-api/classes/Kwartz/ParseError.html +6 -6
  41. data/doc-api/classes/Kwartz/PerlExpressionParser.html +185 -0
  42. data/doc-api/classes/Kwartz/PerlHandler.html +353 -0
  43. data/doc-api/classes/Kwartz/PerlTranslator.html +226 -0
  44. data/doc-api/classes/Kwartz/PhpExpressionParser.html +185 -0
  45. data/doc-api/classes/Kwartz/PhpHandler.html +63 -56
  46. data/doc-api/classes/Kwartz/PhpTranslator.html +21 -14
  47. data/doc-api/classes/Kwartz/PresentationLogicParser.html +126 -123
  48. data/doc-api/classes/Kwartz/PrintStatement.html +18 -18
  49. data/doc-api/classes/Kwartz/RailsHandler.html +84 -85
  50. data/doc-api/classes/Kwartz/RailsTranslator.html +13 -6
  51. data/doc-api/classes/Kwartz/RubyExpressionParser.html +180 -0
  52. data/doc-api/classes/Kwartz/RubyHandler.html +73 -69
  53. data/doc-api/classes/Kwartz/RubyStyleParser.html +86 -86
  54. data/doc-api/classes/Kwartz/RubyTranslator.html +28 -21
  55. data/doc-api/classes/Kwartz/Ruleset.html +622 -1
  56. data/doc-api/classes/Kwartz/StrutsTranslator.html +14 -14
  57. data/doc-api/classes/Kwartz/TagInfo.html +52 -27
  58. data/doc-api/classes/Kwartz/TextConverter.html +75 -37
  59. data/doc-api/classes/Kwartz/Translator.html +54 -53
  60. data/doc-api/classes/Kwartz/Util.html +25 -25
  61. data/doc-api/created.rid +1 -1
  62. data/doc-api/files/__/README_txt.html +7 -2
  63. data/doc-api/files/kwartz/assert_rb.html +2 -2
  64. data/doc-api/files/kwartz/binding/eperl_rb.html +2 -2
  65. data/doc-api/files/kwartz/binding/erubis_rb.html +2 -2
  66. data/doc-api/files/kwartz/binding/eruby_rb.html +2 -2
  67. data/doc-api/files/kwartz/binding/jstl_rb.html +2 -2
  68. data/doc-api/files/kwartz/binding/perl_rb.html +115 -0
  69. data/doc-api/files/kwartz/binding/php_rb.html +2 -2
  70. data/doc-api/files/kwartz/binding/pierubis_rb.html +2 -2
  71. data/doc-api/files/kwartz/binding/rails_rb.html +2 -2
  72. data/doc-api/files/kwartz/binding/ruby_rb.html +2 -2
  73. data/doc-api/files/kwartz/binding/struts_rb.html +2 -2
  74. data/doc-api/files/kwartz/config_rb.html +2 -2
  75. data/doc-api/files/kwartz/converter_rb.html +2 -2
  76. data/doc-api/files/kwartz/defun_rb.html +2 -2
  77. data/doc-api/files/kwartz/error_rb.html +2 -2
  78. data/doc-api/files/kwartz/helper/rails_rb.html +2 -2
  79. data/doc-api/files/kwartz/main_rb.html +3 -2
  80. data/doc-api/files/kwartz/node_rb.html +2 -2
  81. data/doc-api/files/kwartz/parser_rb.html +2 -2
  82. data/doc-api/files/kwartz/translator_rb.html +2 -2
  83. data/doc-api/files/kwartz/util/assert-text-equal_rb.html +2 -2
  84. data/doc-api/files/kwartz/util/testcase-helper_rb.html +2 -2
  85. data/doc-api/files/kwartz/util_rb.html +2 -2
  86. data/doc-api/files/kwartz_rb.html +2 -2
  87. data/doc-api/fr_class_index.html +10 -5
  88. data/doc-api/fr_file_index.html +1 -0
  89. data/doc-api/fr_method_index.html +268 -239
  90. data/doc/docstyle.css +9 -3
  91. data/doc/img/fig05.png +0 -0
  92. data/doc/introduction-to-kwartz.html +3040 -0
  93. data/doc/pattern-catalog.html +5 -3
  94. data/doc/reference.html +680 -26
  95. data/doc/users-guide.html +222 -67
  96. data/kwartz.gemspec +4 -4
  97. data/lib/kwartz.rb +3 -3
  98. data/lib/kwartz/assert.rb +2 -2
  99. data/lib/kwartz/binding/eperl.rb +71 -31
  100. data/lib/kwartz/binding/erubis.rb +3 -2
  101. data/lib/kwartz/binding/eruby.rb +3 -2
  102. data/lib/kwartz/binding/jstl.rb +66 -29
  103. data/lib/kwartz/binding/perl.rb +230 -0
  104. data/lib/kwartz/binding/php.rb +69 -29
  105. data/lib/kwartz/binding/pierubis.rb +3 -2
  106. data/lib/kwartz/binding/rails.rb +18 -18
  107. data/lib/kwartz/binding/ruby.rb +74 -42
  108. data/lib/kwartz/binding/struts.rb +22 -21
  109. data/lib/kwartz/config.rb +4 -4
  110. data/lib/kwartz/converter.rb +465 -345
  111. data/lib/kwartz/defun.rb +2 -2
  112. data/lib/kwartz/error.rb +2 -2
  113. data/lib/kwartz/helper/rails.rb +2 -2
  114. data/lib/kwartz/main.rb +5 -4
  115. data/lib/kwartz/node.rb +92 -144
  116. data/lib/kwartz/parser.rb +112 -103
  117. data/lib/kwartz/translator.rb +14 -6
  118. data/lib/kwartz/util.rb +2 -2
  119. data/lib/kwartz/util/assert-text-equal.rb +2 -2
  120. data/lib/kwartz/util/testcase-helper.rb +1 -1
  121. data/test/test-compile.rb +2 -2
  122. data/test/test-compile.yaml +81 -0
  123. data/test/test-converter.rb +4 -8
  124. data/test/test-converter.yaml +152 -3
  125. data/test/test-directives.rb +2 -2
  126. data/test/test-directives.yaml +222 -0
  127. data/test/test-main.rb +6 -4
  128. data/test/test-main.yaml +66 -1
  129. data/test/test-parser.rb +12 -3
  130. data/test/test-parser.yaml +64 -51
  131. data/test/test-rails.rb +2 -2
  132. data/test/test-ruleset.rb +2 -2
  133. data/test/test-ruleset.yaml +465 -4
  134. data/test/test.log +6 -0
  135. data/test/test.rb +2 -2
  136. metadata +116 -106
  137. data/ChangeLog +0 -156
  138. data/doc-api/classes/Kwartz/DocumentRuleset.html +0 -369
  139. data/doc-api/classes/Kwartz/ElementExpander.html +0 -325
  140. data/doc-api/classes/Kwartz/ElementRuleset.html +0 -612
@@ -0,0 +1,230 @@
1
+ ###
2
+ ### $Rev$
3
+ ### $Release: 3.2.0 $
4
+ ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
+ ###
6
+
7
+ require 'kwartz/converter'
8
+ require 'kwartz/translator'
9
+
10
+
11
+ module Kwartz
12
+
13
+
14
+ module PerlExpressionParser
15
+
16
+
17
+ def parse_expr_str(expr_str, linenum)
18
+ case expr_str
19
+ when /\A(\w+)\z/ # variable
20
+ expr = '$'+$1
21
+ when /\A(\w+)\.(\w+)\z/ # object.property
22
+ expr = "$#{$1}->{#{$2}}"
23
+ when /\A(\w+)\[(.*?'|".*?"|:\w+)\]\z/ # hash
24
+ key = $2[0] == ?: ? "'#{$2[1..-1]}'" : $2
25
+ expr = "$#{$1}{#{key}}"
26
+ when /\A(\w+)\[(\w+)\]\z/ # array or hash
27
+ begin
28
+ expr = "$#{$1}[#{Integer($2)}]"
29
+ rescue ArgumentError
30
+ expr = "$#{$1}[$#{$2}]"
31
+ end
32
+ else
33
+ raise convert_error("'#{expr_str}': invalid expression.", linenum)
34
+ end
35
+ return expr
36
+ end
37
+
38
+
39
+ def parse_expr_str!(expr_str)
40
+ begin
41
+ return parse_expr_str(expr_str, -1)
42
+ rescue
43
+ return expr_str
44
+ end
45
+ end
46
+
47
+
48
+ end
49
+
50
+
51
+
52
+
53
+ ##
54
+ ## directive handler for Perl
55
+ ##
56
+ class PerlHandler < Handler
57
+ include PerlExpressionParser
58
+
59
+
60
+ PERL_DIRECTIVE_PATTERN = /\A(\w+)(?:\s*\(\s*(.*)\))?\z/
61
+
62
+ def directive_pattern
63
+ return PERL_DIRECTIVE_PATTERN
64
+ end
65
+
66
+
67
+ PERL_MAPPING_PATTERN = /\A'([-:\w]+)',\s*(.*)\z/
68
+
69
+ def mapping_pattern
70
+ return PERL_MAPPING_PATTERN
71
+ end
72
+
73
+
74
+ PERL_DIRECTIVE_FORMAT = '%s(%s)'
75
+
76
+ def directive_format
77
+ return PERL_DIRECTIVE_FORMAT
78
+ end
79
+
80
+
81
+ def handle(directive, elem_info, stmt_list)
82
+ ret = super
83
+ return ret if ret
84
+
85
+ d_name = directive.name
86
+ d_arg = directive.arg
87
+ d_str = directive.str
88
+ e = elem_info
89
+
90
+ case d_name
91
+
92
+ when :for, :For, :FOR, :list, :List, :LIST
93
+ unless d_arg =~ /\A(\w+)(?:,\s*(\w+))?\s+in\s+(.*)\z/ \
94
+ || d_arg =~ /\A(\w+)(?:,(\w+))?\s*[:=]\s*(.*)\z/
95
+ raise convert_error("'#{d_str}': invalid argument.", e.stag_info.linenum)
96
+ end
97
+ loopvar = $1 ; loopval = $2 ; looplist = $3
98
+ is_foreach = d_name == :for || d_name == :For || d_name == :FOR
99
+ counter = d_name == :for || d_name == :list ? nil : "#{loopvar}_ctr"
100
+ toggle = d_name != :FOR && d_name != :LIST ? nil : "#{loopvar}_tgl"
101
+ foreach_code = loopval ? "#{looplist}.each do |#{loopvar}, #{loopval}|" \
102
+ : "for #{loopvar} in #{looplist} do"
103
+ code = []
104
+ code << "#{counter} = 0" if counter
105
+ code << foreach_code
106
+ code << " #{counter} += 1" if counter
107
+ code << " #{toggle} = #{counter}%2==0 ? #{@even} : #{@odd}" if toggle
108
+ if is_foreach
109
+ wrap_element_with_native_stmt(elem_info, stmt_list, code, "end", :foreach)
110
+ else
111
+ wrap_content_with_native_stmt(elem_info, stmt_list, code, "end", :foreach)
112
+ end
113
+
114
+ when :while
115
+ wrap_element_with_native_stmt(elem_info, stmt_list, "while #{d_arg} do", "end", :while)
116
+ #stmt_list << NativeStatement.new("while #{d_arg} do", :while)
117
+ #stmt_list << stag_stmt(elem_info)
118
+ #stmt_list.concat(e.cont_stmts)
119
+ #stmt_list << etag_stmt(elem_info)
120
+ #stmt_list << NativeStatement.new("end", :while)
121
+
122
+ when :loop
123
+ error_if_empty_tag(elem_info, d_str)
124
+ wrap_content_with_native_stmt(elem_info, stmt_list, "while #{d_arg} do", "end", :while)
125
+ #stmt_list << stag_stmt(elem_info)
126
+ #stmt_list << NativeStatement.new("while #{d_arg} do", :while)
127
+ #stmt_list.concat(e.cont_stmts)
128
+ #stmt_list << NativeStatement.new("end", :while)
129
+ #stmt_list << etag_stmt(elem_info)
130
+
131
+ when :set
132
+ wrap_element_with_native_stmt(elem_info, stmt_list, d_arg, nil, :set)
133
+ #stmt_list << NativeStatement.new(d_arg, :set)
134
+ #stmt_list << stag_stmt(elem_info)
135
+ #stmt_list.concat(e.cont_stmts)
136
+ #stmt_list << etag_stmt(elem_info)
137
+
138
+ when :if
139
+ wrap_element_with_native_stmt(elem_info, stmt_list, "if #{d_arg} then", "end", :if)
140
+ #stmt_list << NativeStatement.new("if #{d_arg} then", :if)
141
+ #stmt_list << stag_stmt(elem_info)
142
+ #stmt_list.concat(e.cont_stmts)
143
+ #stmt_list << etag_stmt(elem_info)
144
+ #stmt_list << NativeStatement.new("end", :if)
145
+
146
+ when :elsif, :else
147
+ error_when_last_stmt_is_not_if(elem_info, d_str, stmt_list)
148
+ stmt_list.pop # delete 'end'
149
+ kind = d_name == :else ? :else : :elseif
150
+ code = d_name == :else ? "else" : "elsif #{d_arg} then"
151
+ wrap_element_with_native_stmt(elem_info, stmt_list, code, "end", kind)
152
+ #stmt_list << NativeStatement.new(code, kind)
153
+ #stmt_list << stag_stmt(elem_info)
154
+ #stmt_list.concat(e.cont_stmts)
155
+ #stmt_list << etag_stmt(elem_info)
156
+ #stmt_list << NativeStatement.new("end", kind)
157
+
158
+ when :default, :Default, :DEFAULT
159
+ error_if_empty_tag(elem_info, d_str)
160
+ expr_str = directive.dattr == 'id' ? parse_expr_str(d_arg, e.stag_info.linenum) : d_arg
161
+ flag_escape = d_name == :default ? nil : (d_name == :Default)
162
+ add_native_expr_with_default(elem_info, stmt_list, expr_str, flag_escape,
163
+ "if (#{expr_str}) && !(#{d_arg}).to_s.empty? then",
164
+ "else", "end")
165
+ #stmt_list << stag_stmt(elem_info)
166
+ #stmt_list << NativeStatement.new_without_newline("if (#{d_arg}) && !(#{d_arg}).to_s.empty? then", :if)
167
+ #flag_escape = d_name == :default ? nil : (d_name == :Default)
168
+ #stmt_list << PrintStatement.new([ NativeExpression.new(d_arg, flag_escape) ])
169
+ #stmt_list << NativeStatement.new_without_newline("else", :else)
170
+ #stmt_list.concat(e.cont_stmts)
171
+ #stmt_list << NativeStatement.new_without_newline("end", :else)
172
+ #stmt_list << etag_stmt(elem_info)
173
+
174
+ else
175
+ return false
176
+
177
+ end #case
178
+ return true
179
+
180
+ end #def
181
+
182
+
183
+ end #class
184
+ Handler.register_class('perl', PerlHandler)
185
+
186
+
187
+
188
+ ##
189
+ ## translator for Perl
190
+ ##
191
+ class PerlTranslator < BaseTranslator
192
+ include PerlExpressionParser
193
+
194
+
195
+ def initialize(properties={})
196
+ escapefunc = properties[:escapefunc] || 'encode_entities'
197
+ marks = ['', '', 'push(@_buf, ', '); ', "push(@_buf, #{escapefunc}(", ')); ']
198
+ super(marks, properties)
199
+ @header = 'my @_buf = (); ' unless @header == false
200
+ @footer = "join('', @_buf);" + @nl unless @footer == false
201
+ end
202
+
203
+
204
+ def translate_string(str)
205
+ return if str.nil? || str.empty?
206
+ #str.gsub!(/['\\]/, '\\\\\&')
207
+ #@sb << "_buf << '#{str}'; "
208
+ str.gsub!(/[`\\]/, '\\\\\&')
209
+ @sb << "push(@_buf, q`#{str}`); "
210
+ #if str[-1] == ?\n
211
+ # str.chomp!
212
+ # @sb << "push(@_buf, q`#{str}`, #{@nl.inspect});" << @nl
213
+ #else
214
+ # @sb << "push(@_buf, q`#{str}`); "
215
+ #end
216
+ end
217
+
218
+
219
+ def translate(stmt_list)
220
+ stmt_list2 = optimize_print_stmts(stmt_list)
221
+ return super(stmt_list2)
222
+ end
223
+
224
+
225
+ end #class
226
+ Translator.register_class('perl', PerlTranslator)
227
+
228
+
229
+
230
+ end #module
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 123 $
3
- ### $Release: 3.1.2 $
2
+ ### $Rev$
3
+ ### $Release: 3.2.0 $
4
4
  ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ###
6
6
 
@@ -14,10 +14,49 @@ module Kwartz
14
14
 
15
15
 
16
16
 
17
+ module PhpExpressionParser
18
+
19
+
20
+ def parse_expr_str(expr_str, linenum)
21
+ case expr_str
22
+ when /\A(\w+)\z/ # variable
23
+ expr = '$' + $1
24
+ when /\A(\w+)\.(\w+)\z/ # object.property
25
+ expr = "$#{$1}->#{$2}"
26
+ when /\A(\w+)\[('.*?'|".*?"|:\w+)\]\z/ # hash
27
+ key = $2[0] == ?: ? "'#{$2[1..-1]}'" : $2
28
+ expr = "$#{$1}[#{key}]"
29
+ when /\A(\w+)\[(\w+)\]\z/ # array or hash
30
+ begin
31
+ expr = "$#{$1}[#{Integer($2)}]"
32
+ rescue
33
+ expr = "$#{$1}[$#{$2}]"
34
+ end
35
+ else
36
+ raise convert_error("'#{expr_str}': invalid expression.", linenum)
37
+ end
38
+ return expr
39
+ end
40
+
41
+
42
+ def parse_expr_str!(expr_str)
43
+ begin
44
+ return parse_expr_str(expr_str, 0)
45
+ rescue
46
+ return expr_str
47
+ end
48
+ end
49
+
50
+
51
+ end
52
+
53
+
54
+
17
55
  ##
18
56
  ## directive handler for PHP
19
57
  ##
20
58
  class PhpHandler < Handler
59
+ include PhpExpressionParser
21
60
 
22
61
 
23
62
  PHP_DIRECTIVE_PATTERN = /\A(\w+)(?:\s*\(\s*(.*)\))?\z/
@@ -41,21 +80,21 @@ module Kwartz
41
80
  end
42
81
 
43
82
 
44
- def handle(stmt_list, handler_arg)
83
+ def handle(directive, elem_info, stmt_list)
45
84
  ret = super
46
85
  return ret if ret
47
86
 
48
- arg = handler_arg
49
- d_name = arg.directive_name
50
- d_arg = arg.directive_arg
51
- d_str = arg.directive_str
87
+ d_name = directive.name
88
+ d_arg = directive.arg
89
+ d_str = directive.str
90
+ e = elem_info
52
91
 
53
92
  case d_name
54
93
 
55
94
  when :foreach, :Foreach, :FOREACH, :list, :List, :LIST
56
95
  is_foreach = d_name == :foreach || d_name == :Foreach || d_name == :FOREACH
57
96
  unless d_arg =~ /\A.*\s+as\s+(\$\w+)(?:\s*=>\s*\$\w+)?\z/
58
- raise convert_error("'#{d_str}': invalid argument.", arg.stag_info.linenum)
97
+ raise convert_error("'#{d_str}': invalid argument.", elem_info.stag_info.linenum)
59
98
  end
60
99
  loopvar = $1
61
100
  counter = d_name == :foreach || d_name == :list ? nil : "#{loopvar}_ctr"
@@ -66,23 +105,23 @@ module Kwartz
66
105
  code << " #{counter}++;" if counter
67
106
  code << " #{toggle} = #{counter}%2==0 ? #{@even} : #{@odd};" if toggle
68
107
  if is_foreach
69
- wrap_element_with_native_stmt(stmt_list, arg, code, "}", :foeach)
108
+ wrap_element_with_native_stmt(elem_info, stmt_list, code, "}", :foeach)
70
109
  else
71
- wrap_content_with_native_stmt(stmt_list, arg, code, "}", :foeach)
110
+ wrap_content_with_native_stmt(elem_info, stmt_list, code, "}", :foeach)
72
111
  end
73
- #stmt_list << stag_stmt(arg) if !is_foreach
112
+ #stmt_list << stag_stmt(elem_info) if !is_foreach
74
113
  #stmt_list << NativeStatement.new("#{counter} = 0;") if counter
75
114
  #stmt_list << NativeStatement.new("foreach (#{d_arg}) {", :foreach)
76
115
  #stmt_list << NativeStatement.new(" #{counter}++;") if counter
77
116
  #stmt_list << NativeStatement.new(" #{toggle} = #{counter}%2==0 ? #{self.even} : #{self.odd};") if toggle
78
- #stmt_list << stag_stmt(arg) if is_foreach
79
- #stmt_list.concat(arg.cont_stmts)
80
- #stmt_list << etag_stmt(arg) if is_foreach
117
+ #stmt_list << stag_stmt(elem_info) if is_foreach
118
+ #stmt_list.concat(elem_info.cont_stmts)
119
+ #stmt_list << etag_stmt(elem_info) if is_foreach
81
120
  #stmt_list << NativeStatement.new("}", :foreach)
82
- #stmt_list << etag_stmt(arg) if !is_foreach
121
+ #stmt_list << etag_stmt(elem_info) if !is_foreach
83
122
 
84
123
  when :while
85
- wrap_element_with_native_stmt(stmt_list, arg, "while (#{d_arg}) {", "}", :while)
124
+ wrap_element_with_native_stmt(elem_info, stmt_list, "while (#{d_arg}) {", "}", :while)
86
125
  #stmt_list << NativeStatement.new("while (#{d_arg}) {", :while)
87
126
  #stmt_list << stag_stmt
88
127
  #stmt_list.concat(cont_stmts)
@@ -90,8 +129,8 @@ module Kwartz
90
129
  #stmt_list << NativeStatement.new("}", :while)
91
130
 
92
131
  when :loop
93
- error_if_empty_tag(arg)
94
- wrap_content_with_native_stmt(stmt_list, arg, "while (#{d_arg}) {", "}", :while)
132
+ error_if_empty_tag(elem_info, d_str)
133
+ wrap_content_with_native_stmt(elem_info, stmt_list, "while (#{d_arg}) {", "}", :while)
95
134
  #stmt_list << stag_stmt
96
135
  #stmt_list << NativeStatement.new("while (#{d_arg}) {", :while)
97
136
  #stmt_list.concat(cont_stmts)
@@ -99,14 +138,14 @@ module Kwartz
99
138
  #stmt_list << etag_stmt
100
139
 
101
140
  when :set
102
- wrap_element_with_native_stmt(stmt_list, arg, "#{d_arg};", nil, :set)
141
+ wrap_element_with_native_stmt(elem_info, stmt_list, "#{d_arg};", nil, :set)
103
142
  #stmt_list << NativeStatement.new("#{d_arg};", :set)
104
143
  #stmt_list << stag_stmt
105
144
  #stmt_list.concat(cont_stmts)
106
145
  #stmt_list << etag_stmt
107
146
 
108
147
  when :if
109
- wrap_element_with_native_stmt(stmt_list, arg, "if (#{d_arg}) {", "}", :if)
148
+ wrap_element_with_native_stmt(elem_info, stmt_list, "if (#{d_arg}) {", "}", :if)
110
149
  #stmt_list << NativeStatement.new("if (#{d_arg}) {", :if)
111
150
  #stmt_list << stag_stmt
112
151
  #stmt_list.concat(cont_stmts)
@@ -114,11 +153,11 @@ module Kwartz
114
153
  #stmt_list << NativeStatement.new("}", :if)
115
154
 
116
155
  when :elseif, :else
117
- error_when_last_stmt_is_not_if(stmt_list, arg)
156
+ error_when_last_stmt_is_not_if(elem_info, d_str, stmt_list)
118
157
  stmt_list.pop # delete '}'
119
158
  kind = d_name == :else ? :else : :elseif
120
159
  code = d_name == :else ? "} else {" : "} elseif (#{d_arg}) {"
121
- wrap_element_with_native_stmt(stmt_list, arg, code, "}", kind)
160
+ wrap_element_with_native_stmt(elem_info, stmt_list, code, "}", kind)
122
161
  #stmt_list << NativeStatement.new(code, kind)
123
162
  #stmt_list << stag_stmt
124
163
  #stmt_list.concat(cont_stmts)
@@ -126,19 +165,19 @@ module Kwartz
126
165
  #stmt_list << NativeStatement.new("}", kind)
127
166
 
128
167
  when :default, :Default, :DEFAULT
129
- error_if_empty_tag(arg)
130
- expr_code = d_arg
168
+ error_if_empty_tag(elem_info, d_str)
169
+ expr_str = directive.dattr == 'id' ? parse_expr_str(d_arg, e.stag_info.linenum) : d_arg
131
170
  flag_escape = d_name == :default ? nil : (d_name == :Default)
132
- add_native_expr_with_default(stmt_list, arg, expr_code, flag_escape,
133
- "if (#{d_arg}) {", "} else {", "}")
134
- #stmt_list << stag_stmt(arg)
171
+ add_native_expr_with_default(elem_info, stmt_list, expr_str, flag_escape,
172
+ "if (#{expr_str}) {", "} else {", "}")
173
+ #stmt_list << stag_stmt(elem_info)
135
174
  #stmt_list << NativeStatement.new_without_newline("if (#{d_arg}) {", :if)
136
175
  #flag_escape = d_name == :default ? nil : (d_name == :Default)
137
176
  #stmt_list << PrintStatement.new([ NativeExpression.new(d_arg, flag_escape) ])
138
177
  #stmt_list << NativeStatement.new_without_newline("} else {", :else)
139
- #stmt_list.concat(arg.cont_stmts)
178
+ #stmt_list.concat(elem_info.cont_stmts)
140
179
  #stmt_list << NativeStatement.new_without_newline("}", :else)
141
- #stmt_list << etag_stmt(arg)
180
+ #stmt_list << etag_stmt(elem_info)
142
181
 
143
182
  else
144
183
  return false
@@ -158,6 +197,7 @@ module Kwartz
158
197
  ## translator for php
159
198
  ##
160
199
  class PhpTranslator < BaseTranslator
200
+ include PhpExpressionParser
161
201
 
162
202
 
163
203
  PHP_EMBED_PATTERNS = [
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 137 $
3
- ### $Release: 3.1.2 $
2
+ ### $Rev$
3
+ ### $Release: 3.2.0 $
4
4
  ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ###
6
6
 
@@ -24,6 +24,7 @@ module Kwartz
24
24
  ## translator for Erubis
25
25
  ##
26
26
  class PIErubisTranslator < BaseTranslator
27
+ include RubyExpressionParser
27
28
 
28
29
 
29
30
  PIERUBIS_EMBED_PATTERNS = [
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 135 $
3
- ### $Release: 3.1.2 $
2
+ ### $Rev$
3
+ ### $Release: 3.2.0 $
4
4
  ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ###
6
6
 
@@ -93,15 +93,15 @@ module Kwartz
93
93
  ##
94
94
  ## everytime return true whenever directive name is unknown.
95
95
  ##
96
- def handle(stmt_list, handler_arg)
96
+ def handle(directive, elem_info, stmt_list)
97
97
  ret = super
98
98
  return ret if ret
99
99
 
100
- arg = handler_arg
101
- d_name = arg.directive_name
102
- d_arg = arg.directive_arg
103
- d_str = arg.directive_str
104
- attr_info = arg.attr_info
100
+ d_name = directive.name
101
+ d_arg = directive.arg
102
+ d_str = directive.str
103
+ e = elem_info
104
+ attr_info = e.attr_info
105
105
 
106
106
  ## parse 'name="user[name]"' or 'id="user_name"'
107
107
  case d_name.to_s
@@ -126,13 +126,13 @@ module Kwartz
126
126
  add_directive_integer_option(d_arg, 'size', attr_info['size'])
127
127
 
128
128
  when :link_to, :link_to_remote, :link_to_unless_current
129
- add_directive_content_as_arg(d_arg, arg.cont_stmts)
129
+ add_directive_content_as_arg(d_arg, elem_info.cont_stmts)
130
130
 
131
131
  when :anchor, :anchor_remote
132
132
  replace_elem = false
133
133
 
134
134
  when :mail_to
135
- add_directive_content_as_arg(d_arg, arg.cont_stmts)
135
+ add_directive_content_as_arg(d_arg, elem_info.cont_stmts)
136
136
  add_directive_attr_as_arg(d_arg, attr_info, 'href')
137
137
  d_arg.sub!(/\A\'mailto:/, "'")
138
138
 
@@ -170,7 +170,7 @@ module Kwartz
170
170
  end #case
171
171
 
172
172
  ##
173
- print_directive(stmt_list, arg, replace_elem)
173
+ print_directive(elem_info, stmt_list, d_name, d_arg, replace_elem)
174
174
 
175
175
  return true # everytime return true
176
176
 
@@ -251,18 +251,17 @@ module Kwartz
251
251
  end
252
252
 
253
253
 
254
- def print_directive(stmt_list, handler_arg, replace_elem=true)
255
- arg = handler_arg
256
- head_space = arg.stag_info.head_space
257
- tail_space = (arg.etag_info || arg.stag_info).tail_space
254
+ def print_directive(elem_info, stmt_list, directive_name, directive_arg, replace_elem=true)
255
+ head_space = elem_info.stag_info.head_space
256
+ tail_space = (elem_info.etag_info || elem_info.stag_info).tail_space
258
257
  pargs = []
259
258
  pargs << head_space if head_space
260
- pargs << NativeExpression.new("#{arg.directive_name} #{arg.directive_arg}")
259
+ pargs << NativeExpression.new("#{directive_name} #{directive_arg}")
261
260
  pargs << tail_space if tail_space
262
261
  stmt_list << PrintStatement.new(pargs)
263
262
  unless replace_elem
264
- stmt_list.concat(arg.cont_stmts)
265
- stmt_list << PrintStatement.new([arg.etag_info.tag_text])
263
+ stmt_list.concat(elem_info.cont_stmts)
264
+ stmt_list << PrintStatement.new([elem_info.etag_info.tag_text])
266
265
  end
267
266
  end
268
267
 
@@ -276,6 +275,7 @@ module Kwartz
276
275
  ## translator for rails
277
276
  ##
278
277
  class RailsTranslator < BaseTranslator
278
+ include RubyExpressionParser
279
279
 
280
280
 
281
281
  RAILS_EMBED_PATTERNS = [