kwartz 3.1.2 → 3.2.0

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 (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 = [