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