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
@@ -1,13 +1,13 @@
1
1
  ###
2
- ### $Rev: 136 $
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
 
7
7
 
8
8
  module Kwartz
9
9
 
10
- RELEASE = ('$Release: 3.1.2 $' =~ /\$Release: (\S+)\s*\$/) && $1
10
+ RELEASE = ('$Release: 3.2.0 $' =~ /\$Release: (\S+)\s*\$/) && $1
11
11
 
12
12
  end
13
13
 
@@ -1,6 +1,6 @@
1
1
  ####
2
- #### $Rev: 103 $
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
 
@@ -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 EperlExpressionParser
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 ArgumentError
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, -1)
45
+ rescue
46
+ return expr_str
47
+ end
48
+ end
49
+
50
+
51
+ end
52
+
53
+
54
+
17
55
  ##
18
56
  ## directive handler for ePerl
19
57
  ##
20
58
  class EperlHandler < Handler
59
+ include EperlExpressionParser
21
60
 
22
61
 
23
62
  PERL_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(\$\w+)(?:,\s*(\$\w+))?\s+in\s+(.*)\z/
58
- raise convert_error("'#{d_str}': invalid argument.", stag_info.linenum)
97
+ raise convert_error("'#{d_str}': invalid argument.", e.stag_info.linenum)
59
98
  end
60
99
  loopvar = $1 ; loopval = $2 ; looplist = $3
61
100
  counter = d_name == :foreach || d_name == :list ? nil : "#{loopvar}_ctr"
@@ -71,11 +110,11 @@ module Kwartz
71
110
  code << " #{counter}++;" if counter
72
111
  code << " my #{toggle} = #{counter}%2==0 ? #{self.even} : #{self.odd};" if toggle
73
112
  if is_foreach
74
- wrap_element_with_native_stmt(stmt_list, arg, code, "}", :foreach)
113
+ wrap_element_with_native_stmt(elem_info, stmt_list, code, "}", :foreach)
75
114
  else
76
- wrap_content_with_native_stmt(stmt_list, arg, code, "}", :foreach)
115
+ wrap_content_with_native_stmt(elem_info, stmt_list, code, "}", :foreach)
77
116
  end
78
- #stmt_list << stag_stmt(arg) if !is_foreach
117
+ #stmt_list << stag_stmt(elem_info) if !is_foreach
79
118
  #stmt_list << NativeStatement.new("my #{counter} = 0;") if counter
80
119
  #if loopval
81
120
  # stmt_list << NativeStatement.new("foreach my #{loopvar} (keys #{looplist}) {", :foreach)
@@ -85,23 +124,23 @@ module Kwartz
85
124
  #end
86
125
  #stmt_list << NativeStatement.new(" #{counter}++;") if counter
87
126
  #stmt_list << NativeStatement.new(" my #{toggle} = #{counter}%2==0 ? #{self.even} : #{self.odd};") if toggle
88
- #stmt_list << stag_stmt(arg) if is_foreach
89
- #stmt_list.concat(arg.cont_stmts)
90
- #stmt_list << etag_stmt(arg) if is_foreach
127
+ #stmt_list << stag_stmt(elem_info) if is_foreach
128
+ #stmt_list.concat(elem_info.cont_stmts)
129
+ #stmt_list << etag_stmt(elem_info) if is_foreach
91
130
  #stmt_list << NativeStatement.new("}", :foreach)
92
- #stmt_list << etag_stmt(arg) if !is_foreach
131
+ #stmt_list << etag_stmt(elem_info) if !is_foreach
93
132
 
94
133
  when :while
95
- wrap_element_with_native_stmt(stmt_list, arg, "while (#{d_arg}) {", "}", :while)
134
+ wrap_element_with_native_stmt(elem_info, stmt_list, "while (#{d_arg}) {", "}", :while)
96
135
  #stmt_list << NativeStatement.new("while (#{d_arg}) {", :while)
97
- #stmt_list << stag_stmt(arg)
136
+ #stmt_list << stag_stmt(elem_info)
98
137
  #stmt_list.concat(cont_stmts)
99
- #stmt_list << etag_stmt(arg)
138
+ #stmt_list << etag_stmt(elem_info)
100
139
  #stmt_list << NativeStatement.new("}", :while)
101
140
 
102
141
  when :loop
103
- error_if_empty_tag(arg)
104
- wrap_content_with_native_stmt(stmt_list, arg, "while (#{d_arg}) {", "}", :while)
142
+ error_if_empty_tag(elem_info, d_str)
143
+ wrap_content_with_native_stmt(elem_info, stmt_list, "while (#{d_arg}) {", "}", :while)
105
144
  #stmt_list << stag_stmt
106
145
  #stmt_list << NativeStatement.new("while (#{d_arg}) {", :while)
107
146
  #stmt_list.concat(cont_stmts)
@@ -109,14 +148,14 @@ module Kwartz
109
148
  #stmt_list << etag_stmt
110
149
 
111
150
  when :set
112
- wrap_element_with_native_stmt(stmt_list, arg, "#{d_arg};", nil, :set)
151
+ wrap_element_with_native_stmt(elem_info, stmt_list, "#{d_arg};", nil, :set)
113
152
  #stmt_list << NativeStatement.new("#{d_arg};", :set)
114
153
  #stmt_list << stag_stmt
115
154
  #stmt_list.concat(cont_stmts)
116
155
  #stmt_list << etag_stmt
117
156
 
118
157
  when :if
119
- wrap_element_with_native_stmt(stmt_list, arg, "if (#{d_arg}) {", "}", :if)
158
+ wrap_element_with_native_stmt(elem_info, stmt_list, "if (#{d_arg}) {", "}", :if)
120
159
  #stmt_list << NativeStatement.new("if (#{d_arg}) {", :if)
121
160
  #stmt_list << stag_stmt
122
161
  #stmt_list.concat(cont_stmts)
@@ -124,11 +163,11 @@ module Kwartz
124
163
  #stmt_list << NativeStatement.new("}", :if)
125
164
 
126
165
  when :elsif, :else
127
- error_when_last_stmt_is_not_if(stmt_list, arg)
166
+ error_when_last_stmt_is_not_if(elem_info, d_str, stmt_list)
128
167
  stmt_list.pop # delete '}'
129
168
  kind = d_name == :else ? :else : :elseif
130
169
  code = d_name == :else ? "} else {" : "} elsif (#{d_arg}) {"
131
- wrap_element_with_native_stmt(stmt_list, arg, code, "}", kind)
170
+ wrap_element_with_native_stmt(elem_info, stmt_list, code, "}", kind)
132
171
  #stmt_list << NativeStatement.new(code, kind)
133
172
  #stmt_list << stag_stmt
134
173
  #stmt_list.concat(cont_stmts)
@@ -136,19 +175,19 @@ module Kwartz
136
175
  #stmt_list << NativeStatement.new("}", kind)
137
176
 
138
177
  when :default, :Default, :DEFAULT
139
- error_if_empty_tag(arg)
140
- expr_code = d_arg
178
+ error_if_empty_tag(elem_info, d_str)
179
+ expr_str = directive.dattr == 'id' ? parse_expr_str(d_arg, e.stag_info.linenum) : d_arg
141
180
  flag_escape = d_name == :default ? nil : (d_name == :Default)
142
- add_native_expr_with_default(stmt_list, arg, expr_code, flag_escape,
143
- "if (#{d_arg}) {", "} else {", "}")
144
- #stmt_list << stag_stmt(arg)
181
+ add_native_expr_with_default(elem_info, stmt_list, expr_str, flag_escape,
182
+ "if (#{expr_str}) {", "} else {", "}")
183
+ #stmt_list << stag_stmt(elem_info)
145
184
  #stmt_list << NativeStatement.new_without_newline("if (#{d_arg}) {", :if)
146
185
  #flag_escape = d_name == :default ? nil : (d_name == :Default)
147
186
  #stmt_list << PrintStatement.new([ NativeExpression.new(d_arg, flag_escape) ])
148
187
  #stmt_list << NativeStatement.new_without_newline("} else {", :else)
149
- #stmt_list.concat(arg.cont_stmts)
188
+ #stmt_list.concat(elem_info.cont_stmts)
150
189
  #stmt_list << NativeStatement.new_without_newline("}", :else)
151
- #stmt_list << etag_stmt(arg)
190
+ #stmt_list << etag_stmt(elem_info)
152
191
 
153
192
  else
154
193
  return false
@@ -168,6 +207,7 @@ module Kwartz
168
207
  ## translator for ePerl
169
208
  ##
170
209
  class EperlTranslator < BaseTranslator
210
+ include EperlExpressionParser
171
211
 
172
212
 
173
213
  EPERL_EMBED_PATTERNS = [
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 124 $
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 ErubisTranslator < BaseTranslator
27
+ include RubyExpressionParser
27
28
 
28
29
 
29
30
  ERUBIS_EMBED_PATTERNS = [
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 124 $
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
 
@@ -27,6 +27,7 @@ module Kwartz
27
27
  ## translator for eRuby
28
28
  ##
29
29
  class ErubyTranslator < BaseTranslator
30
+ include RubyExpressionParser
30
31
 
31
32
 
32
33
  ERUBY_EMBED_PATTERNS = [
@@ -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,45 @@ module Kwartz
14
14
 
15
15
 
16
16
 
17
+ module JstlExpressionParser
18
+
19
+
20
+ def parse_expr_str(expr_str, linenum)
21
+ case expr_str
22
+ when /\A(\w+)\z/ # variable
23
+ expr = expr_str
24
+ when /\A(\w+)\.(\w+)\z/ # object.property
25
+ expr = expr_str
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
+ expr = "#{$1}[#{$2}]"
31
+ else
32
+ raise convert_error("'#{expr_str}': invalid expression.", linenum)
33
+ end
34
+ return expr
35
+ end
36
+
37
+
38
+ def parse_expr_str!(expr_str)
39
+ begin
40
+ return parse_expr_str(expr_str, 0)
41
+ rescue
42
+ return expr_str
43
+ end
44
+ end
45
+
46
+
47
+ end
48
+
49
+
50
+
17
51
  ##
18
52
  ## directive handler for JSTL
19
53
  ##
20
54
  class JstlHandler < Handler
55
+ include JstlExpressionParser
21
56
 
22
57
 
23
58
  def initialize(elem_rulesets=[], properties={})
@@ -47,22 +82,22 @@ module Kwartz
47
82
  end
48
83
 
49
84
 
50
- def handle(stmt_list, handler_arg)
85
+ def handle(directive, elem_info, stmt_list)
51
86
  ret = super
52
87
  return ret if ret
53
88
 
54
- arg = handler_arg
55
- d_name = arg.directive_name
56
- d_arg = arg.directive_arg
57
- d_str = arg.directive_str
89
+ d_name = directive.name
90
+ d_arg = directive.arg
91
+ d_str = directive.str
92
+ e = elem_info
58
93
 
59
94
  case d_name
60
95
 
61
96
  when :for, :For, :FOR, :list, :List, :LIST
62
97
  is_foreach = d_name == :for || d_name == :For || d_name == :FOR
63
- error_if_empty_tag(arg) unless is_foreach
98
+ error_if_empty_tag(elem_info, d_str) unless is_foreach
64
99
  unless d_arg =~ /\A(\w+)\s*:\s*(.*)\z/
65
- raise convert_error("'#{d_str}': invalid argument.", arg.stag_info.linenum)
100
+ raise convert_error("'#{d_str}': invalid argument.", elem_info.stag_info.linenum)
66
101
  end
67
102
  loopvar = $1 ; looplist = $2
68
103
  counter = d_name == :for || d_name == :list ? nil : "#{loopvar}_ctr"
@@ -87,40 +122,40 @@ module Kwartz
87
122
  end
88
123
  end_code = "</c:forEach>"
89
124
  if is_foreach
90
- wrap_element_with_native_stmt(stmt_list, arg, code, end_code, :set)
125
+ wrap_element_with_native_stmt(elem_info, stmt_list, code, end_code, :set)
91
126
  else
92
- wrap_content_with_native_stmt(stmt_list, arg, code, end_code, :set)
127
+ wrap_content_with_native_stmt(elem_info, stmt_list, code, end_code, :set)
93
128
  end
94
129
 
95
130
  when :while, :loop
96
131
  msg = "'#{d_str}': jstl doesn't support '#{d_arg}' directive."
97
- raise convert_error(msg, arg.stag_info.linenum)
132
+ raise convert_error(msg, elem_info.stag_info.linenum)
98
133
 
99
134
  when :set
100
135
  unless d_arg =~ /\A(\S+)\s*=\s*(.*)\z/
101
- raise convert_error("'#{d_str}': invalid argument.", arg.stag_info.linenum)
136
+ raise convert_error("'#{d_str}': invalid argument.", elem_info.stag_info.linenum)
102
137
  end
103
138
  lhs = $1; rhs = $2
104
139
  code = "<c:set var=\"#{lhs}\" value=\"${#{rhs}}\"/>"
105
- wrap_element_with_native_stmt(stmt_list, arg, code, nil, :set)
140
+ wrap_element_with_native_stmt(elem_info, stmt_list, code, nil, :set)
106
141
  #code = "<c:set var=\"#{lhs}\" value=\"${#{rhs}}\"/>"
107
142
  #stmt_list << NativeStatement.new(code, :set)
108
- #stmt_list << stag_stmt(arg)
143
+ #stmt_list << stag_stmt(elem_info)
109
144
  #stmt_list.concat(cont_stmts)
110
- #stmt_list << etag_stmt(arg)
145
+ #stmt_list << etag_stmt(elem_info)
111
146
 
112
147
  when :if
113
148
  start_code = "<c:choose><c:when test=\"${#{d_arg}}\">"
114
149
  end_code = "</c:when></c:choose>"
115
- wrap_element_with_native_stmt(stmt_list, arg, start_code, end_code, :if)
150
+ wrap_element_with_native_stmt(elem_info, stmt_list, start_code, end_code, :if)
116
151
  #stmt_list << NativeStatement.new(start_code, :if)
117
- #stmt_list << stag_stmt(arg)
152
+ #stmt_list << stag_stmt(elem_info)
118
153
  #stmt_list.concat(cont_stmts)
119
- #stmt_list << etag_stmt(arg)
154
+ #stmt_list << etag_stmt(elem_info)
120
155
  #stmt_list << NativeStatement.new(end, :if)
121
156
 
122
157
  when :elseif, :else
123
- error_when_last_stmt_is_not_if(stmt_list, arg)
158
+ error_when_last_stmt_is_not_if(elem_info, d_str, stmt_list)
124
159
  stmt_list.pop # delete '</c:when></c:choose>'
125
160
  if d_name == :else
126
161
  kind = :else
@@ -131,7 +166,7 @@ module Kwartz
131
166
  start_code = "</c:when><c:when test=\"${#{d_arg}}\">"
132
167
  end_code = "</c:when></c:choose>"
133
168
  end
134
- wrap_element_with_native_stmt(stmt_list, arg, start_code, end_code, kind)
169
+ wrap_element_with_native_stmt(elem_info, stmt_list, start_code, end_code, kind)
135
170
  #stmt_list << NativeStatement.new(start_code, kind)
136
171
  #stmt_list << stag_stmt
137
172
  #stmt_list.concat(cont_stmts)
@@ -139,31 +174,32 @@ module Kwartz
139
174
  #stmt_list << NativeStatement.new(end_code, kind)
140
175
 
141
176
  when :default, :Default, :DEFAULT
142
- error_if_empty_tag(arg)
143
- stmt_list << stag_stmt(arg)
177
+ error_if_empty_tag(elem_info, d_str)
178
+ stmt_list << stag_stmt(elem_info)
144
179
  flag_escape = d_name == :default ? nil : (d_name == :Default)
145
- argstr = arg.cont_stmts[0].args[0]
146
- code = "<c:out value=\"${#{d_arg}}\""
180
+ argstr = elem_info.cont_stmts[0].args[0]
181
+ expr_str = directive.dattr == 'id' ? parse_expr_str(d_arg, e.stag_info.linenum) : d_arg
182
+ code = "<c:out value=\"${#{expr_str}}\""
147
183
  code << " escapeXml=\"#{flag_escape}\"" unless flag_escape == nil
148
184
  code << " default=\"#{argstr}\"/>"
149
185
  stmt_list << NativeStatement.new_without_newline(code)
150
- stmt_list << etag_stmt(arg)
186
+ stmt_list << etag_stmt(elem_info)
151
187
 
152
188
  when :catch
153
189
  if d_arg && !d_arg.empty? && d_arg !~ /\A\w+\z/
154
- raise convert_error("'#{d_str}': invalid varname.", arg.stag_info.linenum)
190
+ raise convert_error("'#{d_str}': invalid varname.", elem_info.stag_info.linenum)
155
191
  end
156
192
  code = "<c:catch"
157
193
  code << " var=\"#{d_arg}\"" if d_arg && !d_arg.empty?
158
194
  code << ">"
159
195
  stmt_list << NativeStatement.new(code)
160
- stmt_list.concat(arg.cont_stmts)
196
+ stmt_list.concat(elem_info.cont_stmts)
161
197
  stmt_list << NativeStatement.new("</c:catch>")
162
198
 
163
199
  when :forEach, :forTokens
164
200
  options = eval "{ #{d_arg} }"
165
201
  stag, etag = self.__send__ "handle_jstl_#{d_name}", options
166
- wrap_element_with_native_stmt(stmt_list, arg, stag, etag, nil)
202
+ wrap_element_with_native_stmt(elem_info, stmt_list, stag, etag, nil)
167
203
  #stmt_list << NativeStatement.new(stag)
168
204
  #stmt_list << stag_stmt
169
205
  #stmt_list.concat(cont_stmts)
@@ -287,6 +323,7 @@ module Kwartz
287
323
  ## translator for php
288
324
  ##
289
325
  class JstlTranslator < BaseTranslator
326
+ include JstlExpressionParser
290
327
 
291
328
 
292
329
  JSTL11_EMBED_PATTERNS = [