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.
- data/CHANGES +444 -0
- data/README.txt +4 -1
- data/bin/kwartz +2 -2
- data/doc-api/classes/Kwartz.html +16 -7
- data/doc-api/classes/Kwartz/Assertion.html +6 -6
- data/doc-api/classes/Kwartz/AssertionError.html +6 -6
- data/doc-api/classes/Kwartz/AttrInfo.html +71 -61
- data/doc-api/classes/Kwartz/BaseError.html +12 -12
- data/doc-api/classes/Kwartz/BaseTranslator.html +104 -74
- data/doc-api/classes/Kwartz/CharacterType.html +24 -24
- data/doc-api/classes/Kwartz/CommandOptionError.html +7 -7
- data/doc-api/classes/Kwartz/CommandOptions.html +50 -50
- data/doc-api/classes/Kwartz/Config.html +5 -0
- data/doc-api/classes/Kwartz/ConvertError.html +12 -12
- data/doc-api/classes/Kwartz/Converter.html +31 -33
- data/doc-api/classes/Kwartz/CssStyleParser.html +207 -168
- data/doc-api/classes/Kwartz/Defun.html +32 -31
- data/doc-api/classes/Kwartz/{HandlerArgument.html → Directive.html} +27 -53
- data/doc-api/classes/Kwartz/ElementInfo.html +68 -53
- data/doc-api/classes/Kwartz/EperlExpressionParser.html +185 -0
- data/doc-api/classes/Kwartz/EperlHandler.html +65 -58
- data/doc-api/classes/Kwartz/EperlTranslator.html +14 -7
- data/doc-api/classes/Kwartz/ErubisTranslator.html +14 -7
- data/doc-api/classes/Kwartz/ErubyTranslator.html +14 -7
- data/doc-api/classes/Kwartz/ExpandStatement.html +20 -20
- data/doc-api/classes/Kwartz/Expander.html +358 -0
- data/doc-api/classes/Kwartz/Handler.html +287 -157
- data/doc-api/classes/Kwartz/{StatementHelper.html → HandlerHelper.html} +307 -112
- data/doc-api/classes/Kwartz/Helper/ActionViewHelper.html +23 -23
- data/doc-api/classes/Kwartz/Helper/RailsTemplate.html +96 -96
- data/doc-api/classes/Kwartz/JstlExpressionParser.html +181 -0
- data/doc-api/classes/Kwartz/JstlHandler.html +134 -126
- data/doc-api/classes/Kwartz/JstlTranslator.html +21 -14
- data/doc-api/classes/Kwartz/KwartzError.html +6 -6
- data/doc-api/classes/Kwartz/Main.html +4 -4
- data/doc-api/classes/Kwartz/NativeExpression.html +19 -19
- data/doc-api/classes/Kwartz/NativeStatement.html +24 -24
- data/doc-api/classes/Kwartz/Node.html +7 -7
- data/doc-api/classes/Kwartz/PIErubisTranslator.html +21 -14
- data/doc-api/classes/Kwartz/ParseError.html +6 -6
- data/doc-api/classes/Kwartz/PerlExpressionParser.html +185 -0
- data/doc-api/classes/Kwartz/PerlHandler.html +353 -0
- data/doc-api/classes/Kwartz/PerlTranslator.html +226 -0
- data/doc-api/classes/Kwartz/PhpExpressionParser.html +185 -0
- data/doc-api/classes/Kwartz/PhpHandler.html +63 -56
- data/doc-api/classes/Kwartz/PhpTranslator.html +21 -14
- data/doc-api/classes/Kwartz/PresentationLogicParser.html +126 -123
- data/doc-api/classes/Kwartz/PrintStatement.html +18 -18
- data/doc-api/classes/Kwartz/RailsHandler.html +84 -85
- data/doc-api/classes/Kwartz/RailsTranslator.html +13 -6
- data/doc-api/classes/Kwartz/RubyExpressionParser.html +180 -0
- data/doc-api/classes/Kwartz/RubyHandler.html +73 -69
- data/doc-api/classes/Kwartz/RubyStyleParser.html +86 -86
- data/doc-api/classes/Kwartz/RubyTranslator.html +28 -21
- data/doc-api/classes/Kwartz/Ruleset.html +622 -1
- data/doc-api/classes/Kwartz/StrutsTranslator.html +14 -14
- data/doc-api/classes/Kwartz/TagInfo.html +52 -27
- data/doc-api/classes/Kwartz/TextConverter.html +75 -37
- data/doc-api/classes/Kwartz/Translator.html +54 -53
- data/doc-api/classes/Kwartz/Util.html +25 -25
- data/doc-api/created.rid +1 -1
- data/doc-api/files/__/README_txt.html +7 -2
- data/doc-api/files/kwartz/assert_rb.html +2 -2
- data/doc-api/files/kwartz/binding/eperl_rb.html +2 -2
- data/doc-api/files/kwartz/binding/erubis_rb.html +2 -2
- data/doc-api/files/kwartz/binding/eruby_rb.html +2 -2
- data/doc-api/files/kwartz/binding/jstl_rb.html +2 -2
- data/doc-api/files/kwartz/binding/perl_rb.html +115 -0
- data/doc-api/files/kwartz/binding/php_rb.html +2 -2
- data/doc-api/files/kwartz/binding/pierubis_rb.html +2 -2
- data/doc-api/files/kwartz/binding/rails_rb.html +2 -2
- data/doc-api/files/kwartz/binding/ruby_rb.html +2 -2
- data/doc-api/files/kwartz/binding/struts_rb.html +2 -2
- data/doc-api/files/kwartz/config_rb.html +2 -2
- data/doc-api/files/kwartz/converter_rb.html +2 -2
- data/doc-api/files/kwartz/defun_rb.html +2 -2
- data/doc-api/files/kwartz/error_rb.html +2 -2
- data/doc-api/files/kwartz/helper/rails_rb.html +2 -2
- data/doc-api/files/kwartz/main_rb.html +3 -2
- data/doc-api/files/kwartz/node_rb.html +2 -2
- data/doc-api/files/kwartz/parser_rb.html +2 -2
- data/doc-api/files/kwartz/translator_rb.html +2 -2
- data/doc-api/files/kwartz/util/assert-text-equal_rb.html +2 -2
- data/doc-api/files/kwartz/util/testcase-helper_rb.html +2 -2
- data/doc-api/files/kwartz/util_rb.html +2 -2
- data/doc-api/files/kwartz_rb.html +2 -2
- data/doc-api/fr_class_index.html +10 -5
- data/doc-api/fr_file_index.html +1 -0
- data/doc-api/fr_method_index.html +268 -239
- data/doc/docstyle.css +9 -3
- data/doc/img/fig05.png +0 -0
- data/doc/introduction-to-kwartz.html +3040 -0
- data/doc/pattern-catalog.html +5 -3
- data/doc/reference.html +680 -26
- data/doc/users-guide.html +222 -67
- data/kwartz.gemspec +4 -4
- data/lib/kwartz.rb +3 -3
- data/lib/kwartz/assert.rb +2 -2
- data/lib/kwartz/binding/eperl.rb +71 -31
- data/lib/kwartz/binding/erubis.rb +3 -2
- data/lib/kwartz/binding/eruby.rb +3 -2
- data/lib/kwartz/binding/jstl.rb +66 -29
- data/lib/kwartz/binding/perl.rb +230 -0
- data/lib/kwartz/binding/php.rb +69 -29
- data/lib/kwartz/binding/pierubis.rb +3 -2
- data/lib/kwartz/binding/rails.rb +18 -18
- data/lib/kwartz/binding/ruby.rb +74 -42
- data/lib/kwartz/binding/struts.rb +22 -21
- data/lib/kwartz/config.rb +4 -4
- data/lib/kwartz/converter.rb +465 -345
- data/lib/kwartz/defun.rb +2 -2
- data/lib/kwartz/error.rb +2 -2
- data/lib/kwartz/helper/rails.rb +2 -2
- data/lib/kwartz/main.rb +5 -4
- data/lib/kwartz/node.rb +92 -144
- data/lib/kwartz/parser.rb +112 -103
- data/lib/kwartz/translator.rb +14 -6
- data/lib/kwartz/util.rb +2 -2
- data/lib/kwartz/util/assert-text-equal.rb +2 -2
- data/lib/kwartz/util/testcase-helper.rb +1 -1
- data/test/test-compile.rb +2 -2
- data/test/test-compile.yaml +81 -0
- data/test/test-converter.rb +4 -8
- data/test/test-converter.yaml +152 -3
- data/test/test-directives.rb +2 -2
- data/test/test-directives.yaml +222 -0
- data/test/test-main.rb +6 -4
- data/test/test-main.yaml +66 -1
- data/test/test-parser.rb +12 -3
- data/test/test-parser.yaml +64 -51
- data/test/test-rails.rb +2 -2
- data/test/test-ruleset.rb +2 -2
- data/test/test-ruleset.yaml +465 -4
- data/test/test.log +6 -0
- data/test/test.rb +2 -2
- metadata +116 -106
- data/ChangeLog +0 -156
- data/doc-api/classes/Kwartz/DocumentRuleset.html +0 -369
- data/doc-api/classes/Kwartz/ElementExpander.html +0 -325
- data/doc-api/classes/Kwartz/ElementRuleset.html +0 -612
data/test/test-main.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
###
|
2
|
-
### $Rev
|
3
|
-
### $Release: 3.
|
2
|
+
### $Rev$
|
3
|
+
### $Release: 3.2.0 $
|
4
4
|
### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
|
5
5
|
###
|
6
6
|
|
@@ -21,7 +21,9 @@ YAML_DATA = ydoc['yamldata']
|
|
21
21
|
YAML_OUTPUT = ydoc['yamloutput']
|
22
22
|
NOTEXT_ERUBY = ydoc['notext*']['eruby']
|
23
23
|
NOTEXT_RUBY = ydoc['notext*']['ruby']
|
24
|
-
DEFUN_ERUBY = ydoc['defun*']['eruby']
|
24
|
+
#DEFUN_ERUBY = ydoc['defun*']['eruby']
|
25
|
+
key = RUBY_VERSION >= '1.9' ? 'eruby19' : RUBY_VERSION >= '1.8.7' ? 'eruby187' : 'eruby186'
|
26
|
+
DEFUN_ERUBY = ydoc['defun*'][key]
|
25
27
|
DEFUN_PHP = ydoc['defun*']['php']
|
26
28
|
|
27
29
|
class File
|
@@ -39,7 +41,7 @@ class MainTest < Test::Unit::TestCase
|
|
39
41
|
|
40
42
|
|
41
43
|
def _test
|
42
|
-
@name = (caller()[0] =~ /in `test_(.*?)'/) && $1
|
44
|
+
@name = (caller()[0] =~ /in `(?:block in )?test_(.*?)'/) && $1
|
43
45
|
return if ENV['TEST'] && ENV['TEST'] != @name
|
44
46
|
begin
|
45
47
|
File.write("#{@name}.pdata", @pdata) if @pdata
|
data/test/test-main.yaml
CHANGED
@@ -175,7 +175,7 @@ yamloutput: |
|
|
175
175
|
</html>
|
176
176
|
|
177
177
|
defun*:
|
178
|
-
|
178
|
+
eruby186: |
|
179
179
|
module View
|
180
180
|
|
181
181
|
(@@proc_table ||= {})['defun1'] = proc do
|
@@ -207,6 +207,71 @@ defun*:
|
|
207
207
|
|
208
208
|
end
|
209
209
|
|
210
|
+
eruby187: |
|
211
|
+
module View
|
212
|
+
|
213
|
+
(@@proc_table ||= {})['defun1'] = proc do
|
214
|
+
_erbout = ''; _erbout.concat "<html>\n"
|
215
|
+
; _erbout.concat " <body>\n"
|
216
|
+
; _erbout.concat " <h1>"; _erbout.concat(( @title ).to_s); _erbout.concat "</h1>\n"
|
217
|
+
; _erbout.concat " <table id=\"content\">\n"
|
218
|
+
; for item in @list
|
219
|
+
_erbout.concat " <tr>\n"
|
220
|
+
; _erbout.concat " <td>"; _erbout.concat((h item ).to_s); _erbout.concat "</td>\n"
|
221
|
+
; _erbout.concat " </tr>\n"
|
222
|
+
; end
|
223
|
+
_erbout.concat " </table>\n"
|
224
|
+
; _erbout.concat " </body>\n"
|
225
|
+
; _erbout.concat "</html>\n"
|
226
|
+
; _erbout
|
227
|
+
end#proc
|
228
|
+
|
229
|
+
module_function
|
230
|
+
def expand_defun1(context={})
|
231
|
+
if context.is_a?(Hash)
|
232
|
+
hash = context
|
233
|
+
context = Object.new
|
234
|
+
hash.each { |key, val| context.instance_variable_set("@#{key}", val) }
|
235
|
+
end
|
236
|
+
proc_obj = @@proc_table['defun1']
|
237
|
+
context.instance_eval(&proc_obj)
|
238
|
+
end
|
239
|
+
|
240
|
+
end
|
241
|
+
|
242
|
+
eruby19: |
|
243
|
+
module View
|
244
|
+
|
245
|
+
(@@proc_table ||= {})['defun1'] = proc do
|
246
|
+
#coding:US-ASCII
|
247
|
+
_erbout = ''; _erbout.concat "<html>\n"
|
248
|
+
; _erbout.concat " <body>\n"
|
249
|
+
; _erbout.concat " <h1>"; _erbout.concat(( @title ).to_s); _erbout.concat "</h1>\n"
|
250
|
+
; _erbout.concat " <table id=\"content\">\n"
|
251
|
+
; for item in @list
|
252
|
+
_erbout.concat " <tr>\n"
|
253
|
+
; _erbout.concat " <td>"; _erbout.concat((h item ).to_s); _erbout.concat "</td>\n"
|
254
|
+
; _erbout.concat " </tr>\n"
|
255
|
+
; end
|
256
|
+
_erbout.concat " </table>\n"
|
257
|
+
; _erbout.concat " </body>\n"
|
258
|
+
; _erbout.concat "</html>\n"
|
259
|
+
; _erbout.force_encoding(__ENCODING__)
|
260
|
+
end#proc
|
261
|
+
|
262
|
+
module_function
|
263
|
+
def expand_defun1(context={})
|
264
|
+
if context.is_a?(Hash)
|
265
|
+
hash = context
|
266
|
+
context = Object.new
|
267
|
+
hash.each { |key, val| context.instance_variable_set("@#{key}", val) }
|
268
|
+
end
|
269
|
+
proc_obj = @@proc_table['defun1']
|
270
|
+
context.instance_eval(&proc_obj)
|
271
|
+
end
|
272
|
+
|
273
|
+
end
|
274
|
+
|
210
275
|
php: |
|
211
276
|
<?php
|
212
277
|
function print_view_defun2($context) {
|
data/test/test-parser.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
###
|
2
|
-
### $Rev
|
3
|
-
### $Release: 3.
|
2
|
+
### $Rev$
|
3
|
+
### $Release: 3.2.0 $
|
4
4
|
### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
|
5
5
|
###
|
6
6
|
|
@@ -25,7 +25,8 @@ class ParserTest < Test::Unit::TestCase
|
|
25
25
|
def __test
|
26
26
|
case @style
|
27
27
|
when 'ruby'
|
28
|
-
parser = Kwartz::RubyStyleParser.new()
|
28
|
+
#parser = Kwartz::RubyStyleParser.new()
|
29
|
+
return
|
29
30
|
when 'css'
|
30
31
|
parser = Kwartz::CssStyleParser.new()
|
31
32
|
else
|
@@ -34,9 +35,17 @@ class ParserTest < Test::Unit::TestCase
|
|
34
35
|
if @name =~ /scan/
|
35
36
|
actual = ''
|
36
37
|
parser.__send__ :reset, @plogic
|
38
|
+
ctr = 0
|
37
39
|
while (ret = parser.scan()) != nil
|
38
40
|
actual << "#{parser.linenum}:#{parser.column}:"
|
39
41
|
actual << " token=#{parser.token.inspect}, value=#{parser.value.inspect}\n"
|
42
|
+
if parser.token == :'{'
|
43
|
+
ctr += 1
|
44
|
+
parser.mode = :declaration if ctr == 1
|
45
|
+
elsif parser.token == :'}'
|
46
|
+
ctr -= 1
|
47
|
+
parser.mode = :selector if ctr == 0
|
48
|
+
end
|
40
49
|
break if ret == :error
|
41
50
|
end
|
42
51
|
else
|
data/test/test-parser.yaml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
## $Rev
|
2
|
-
## $Release: 3.
|
1
|
+
## $Rev$
|
2
|
+
## $Release: 3.2.0 $
|
3
3
|
## copyright(c) 2004-2006 kuwata-lab.com all rights reserved
|
4
4
|
|
5
5
|
###
|
@@ -16,8 +16,7 @@
|
|
16
16
|
}
|
17
17
|
expected*:
|
18
18
|
ruby: |
|
19
|
-
2:
|
20
|
-
2:6: token=:ident, value="list"
|
19
|
+
2:6: token=:selector, value="#list"
|
21
20
|
2:8: token=:"{", value="{"
|
22
21
|
3:8: token=:value, value="value"
|
23
22
|
4:8: token=:attrs, value="attrs"
|
@@ -26,6 +25,16 @@
|
|
26
25
|
6:10: token=:"{", value="{"
|
27
26
|
7:4: token=:"}", value="}"
|
28
27
|
8:2: token=:"}", value="}"
|
28
|
+
# 2:2: token=35, value="#"
|
29
|
+
# 2:6: token=:ident, value="list"
|
30
|
+
# 2:8: token=:"{", value="{"
|
31
|
+
# 3:8: token=:value, value="value"
|
32
|
+
# 4:8: token=:attrs, value="attrs"
|
33
|
+
# 5:9: token=:append, value="append"
|
34
|
+
# 6:8: token=:logic, value="logic"
|
35
|
+
# 6:10: token=:"{", value="{"
|
36
|
+
# 7:4: token=:"}", value="}"
|
37
|
+
# 8:2: token=:"}", value="}"
|
29
38
|
php: |
|
30
39
|
2:2: token=#, value="#"
|
31
40
|
2:6: token=:ident, value="list"
|
@@ -68,7 +77,7 @@
|
|
68
77
|
#list {
|
69
78
|
}
|
70
79
|
expected: &elem1|
|
71
|
-
-
|
80
|
+
- selectors: ["#list"]
|
72
81
|
|
73
82
|
- name: parse_elem1_ruby
|
74
83
|
style: ruby
|
@@ -86,7 +95,7 @@
|
|
86
95
|
value: @user['name'];
|
87
96
|
}
|
88
97
|
expected: &value1|
|
89
|
-
-
|
98
|
+
- selectors: ["#list"]
|
90
99
|
cont: @user['name']
|
91
100
|
|
92
101
|
- name: parse_value_part1_ruby
|
@@ -107,7 +116,7 @@
|
|
107
116
|
'color' @prop[:color];
|
108
117
|
}
|
109
118
|
expected: &attrs1|
|
110
|
-
-
|
119
|
+
- selectors: ["#list"]
|
111
120
|
attrs:
|
112
121
|
- name: class
|
113
122
|
value: @class
|
@@ -134,11 +143,11 @@
|
|
134
143
|
append: aaa, bbb,ccc;
|
135
144
|
}
|
136
145
|
expected: &append1|
|
137
|
-
-
|
146
|
+
- selectors: ["#list1"]
|
138
147
|
append:
|
139
148
|
- @name==item['name'] ? " checked='checked'" : ''
|
140
149
|
- chk(@name)
|
141
|
-
-
|
150
|
+
- selectors: ["#list2"]
|
142
151
|
append:
|
143
152
|
- aaa, bbb,ccc
|
144
153
|
|
@@ -152,11 +161,11 @@
|
|
152
161
|
append aaa, bbb,ccc
|
153
162
|
}
|
154
163
|
expected: |
|
155
|
-
-
|
164
|
+
- selectors: ["#list1"]
|
156
165
|
append:
|
157
166
|
- @name==item['name'] ? " checked='checked'" : ''
|
158
167
|
- chk(@name)
|
159
|
-
-
|
168
|
+
- selectors: ["#list2"]
|
160
169
|
append:
|
161
170
|
- aaa
|
162
171
|
- bbb,ccc
|
@@ -169,7 +178,7 @@
|
|
169
178
|
remove: "foo", "bar", 'baz';
|
170
179
|
}
|
171
180
|
expected: &remove1|
|
172
|
-
-
|
181
|
+
- selectors: ["#list"]
|
173
182
|
remove:
|
174
183
|
- foo
|
175
184
|
- bar
|
@@ -191,7 +200,7 @@
|
|
191
200
|
tagname: 'html:html';
|
192
201
|
}
|
193
202
|
expected: &tagname1|
|
194
|
-
-
|
203
|
+
- selectors: ["#list"]
|
195
204
|
tagname: html:html
|
196
205
|
|
197
206
|
- name: parse_tagname_part1_ruby
|
@@ -216,7 +225,7 @@
|
|
216
225
|
}
|
217
226
|
}
|
218
227
|
expected: &logic1|
|
219
|
-
-
|
228
|
+
- selectors: ["#list"]
|
220
229
|
logic:
|
221
230
|
- <% @list.each { |item|%>
|
222
231
|
- _stag
|
@@ -254,7 +263,7 @@
|
|
254
263
|
}
|
255
264
|
}
|
256
265
|
expected: &logic2|
|
257
|
-
-
|
266
|
+
- selectors: ["#list"]
|
258
267
|
logic:
|
259
268
|
- <% @list.each_with_index { |item, i|%>
|
260
269
|
- <% if i % 2 == 0%>
|
@@ -280,6 +289,25 @@
|
|
280
289
|
}
|
281
290
|
expected: *logic2
|
282
291
|
|
292
|
+
###
|
293
|
+
- name: parse_beforeafter_css
|
294
|
+
style: css
|
295
|
+
plogic: |
|
296
|
+
#list {
|
297
|
+
before: {
|
298
|
+
print "-- start --\n"
|
299
|
+
}
|
300
|
+
after: {
|
301
|
+
print "-- end --\n"
|
302
|
+
}
|
303
|
+
}
|
304
|
+
expected: |
|
305
|
+
- selectors: ["#list"]
|
306
|
+
before:
|
307
|
+
- print(<%="-- start --\n"%>)
|
308
|
+
after:
|
309
|
+
- print(<%="-- end --\n"%>)
|
310
|
+
|
283
311
|
###
|
284
312
|
- name: parse_import_command1_css
|
285
313
|
style: css
|
@@ -289,7 +317,7 @@
|
|
289
317
|
value: item;
|
290
318
|
}
|
291
319
|
expected: |
|
292
|
-
-
|
320
|
+
- selectors: ["#page_link"]
|
293
321
|
cont: page.label
|
294
322
|
attrs:
|
295
323
|
- name: href
|
@@ -298,7 +326,7 @@
|
|
298
326
|
- <% if page%>
|
299
327
|
- _elem
|
300
328
|
- <% end%>
|
301
|
-
-
|
329
|
+
- selectors: ["#item"]
|
302
330
|
cont: item
|
303
331
|
setup*:
|
304
332
|
ruby: |
|
@@ -339,7 +367,7 @@
|
|
339
367
|
- name: parse_multi_selector_css
|
340
368
|
style: css
|
341
369
|
plogic: |
|
342
|
-
#
|
370
|
+
#id, .class, tag::name {
|
343
371
|
value: $item;
|
344
372
|
logic: {
|
345
373
|
foreach ($list as $item) {
|
@@ -350,23 +378,7 @@
|
|
350
378
|
}
|
351
379
|
}
|
352
380
|
expected: |
|
353
|
-
-
|
354
|
-
cont: $item
|
355
|
-
logic:
|
356
|
-
- <% foreach ($list as $item) {%>
|
357
|
-
- _stag
|
358
|
-
- _cont
|
359
|
-
- _etag
|
360
|
-
- <% }%>
|
361
|
-
- name: item2
|
362
|
-
cont: $item
|
363
|
-
logic:
|
364
|
-
- <% foreach ($list as $item) {%>
|
365
|
-
- _stag
|
366
|
-
- _cont
|
367
|
-
- _etag
|
368
|
-
- <% }%>
|
369
|
-
- name: item3
|
381
|
+
- selectors: ["#id", ".class", "tag::name"]
|
370
382
|
cont: $item
|
371
383
|
logic:
|
372
384
|
- <% foreach ($list as $item) {%>
|
@@ -380,8 +392,6 @@
|
|
380
392
|
style: css
|
381
393
|
plogic: |
|
382
394
|
#DOCUMENT {
|
383
|
-
local: i, item, title, list;
|
384
|
-
global: _context;
|
385
395
|
begin: {
|
386
396
|
title = _context[:title]
|
387
397
|
list = _context[:list]
|
@@ -393,23 +403,26 @@
|
|
393
403
|
end
|
394
404
|
}
|
395
405
|
}
|
406
|
+
# local: i, item, title, list;
|
407
|
+
# global: _context;
|
396
408
|
expected: |
|
397
|
-
-
|
398
|
-
|
399
|
-
- _context
|
400
|
-
local:
|
401
|
-
- i
|
402
|
-
- item
|
403
|
-
- title
|
404
|
-
- list
|
405
|
-
begin:
|
409
|
+
- selectors: ["#DOCUMENT"]
|
410
|
+
before:
|
406
411
|
- <% title = _context[:title]%>
|
407
412
|
- <% list = _context[:list]%>
|
408
|
-
|
413
|
+
after:
|
409
414
|
- print(<%="*** debug:\n"%>)
|
410
415
|
- <% _context.each do |key, value|%>
|
411
416
|
- print(<%="*** key=#{key}, value=#{value.inspect}"%>)
|
412
417
|
- <% end%>
|
418
|
+
# global:
|
419
|
+
# - _context
|
420
|
+
# local:
|
421
|
+
# - i
|
422
|
+
# - item
|
423
|
+
# - title
|
424
|
+
# - list
|
425
|
+
|
413
426
|
###
|
414
427
|
- name: parse_comment1_css
|
415
428
|
style: css
|
@@ -423,7 +436,7 @@
|
|
423
436
|
}
|
424
437
|
/* tail comment may cause parse error! */
|
425
438
|
expected: |
|
426
|
-
-
|
439
|
+
- selectors: ["#foo"]
|
427
440
|
cont: foo
|
428
441
|
|
429
442
|
- name: parse_comment2_css
|
@@ -444,7 +457,7 @@
|
|
444
457
|
}
|
445
458
|
}
|
446
459
|
expected: |
|
447
|
-
-
|
460
|
+
- selectors: ["#foo"]
|
448
461
|
cont: item
|
449
462
|
logic:
|
450
463
|
- _elem
|
@@ -475,7 +488,7 @@
|
|
475
488
|
}
|
476
489
|
}
|
477
490
|
expected: &all1 |
|
478
|
-
-
|
491
|
+
- selectors: ["#item"]
|
479
492
|
stag: start_link_tag('user', 'name')
|
480
493
|
cont: $item
|
481
494
|
etag: end_link()
|
@@ -524,7 +537,7 @@
|
|
524
537
|
}
|
525
538
|
}
|
526
539
|
expected: |
|
527
|
-
-
|
540
|
+
- selectors: ["#item"]
|
528
541
|
stag: start_link_tag('user', 'name')
|
529
542
|
cont: item
|
530
543
|
etag: end_link()
|
data/test/test-rails.rb
CHANGED
data/test/test-ruleset.rb
CHANGED
data/test/test-ruleset.yaml
CHANGED
@@ -652,14 +652,303 @@
|
|
652
652
|
{{*<? } !>*}}
|
653
653
|
</ul>
|
654
654
|
|
655
|
+
###
|
656
|
+
- name: before
|
657
|
+
title: before, after
|
658
|
+
desc: |
|
659
|
+
{{,before:,}} and {{,after:,}} property represents the prework and postwork
|
660
|
+
of each element's presentation logics.
|
661
|
+
These properties enables to share or reuse presentation logics.
|
662
|
+
.#These properties takes target code block and are available only with
|
663
|
+
.#'#DOCUMENT' selector.
|
664
|
+
|
665
|
+
pdata: |
|
666
|
+
<!-- Groups -->
|
667
|
+
<ul id="mark:groups">
|
668
|
+
<li class="item"></li>
|
669
|
+
</ul>
|
670
|
+
|
671
|
+
<!-- Members -->
|
672
|
+
<ol id="mark:members">
|
673
|
+
<li class="item"></li>
|
674
|
+
</ol>
|
675
|
+
|
676
|
+
plogic*:
|
677
|
+
eruby: |
|
678
|
+
#groups {
|
679
|
+
{{*before:*}} {
|
680
|
+
{{*list = @groups*}}
|
681
|
+
}
|
682
|
+
{{*after:*}} {
|
683
|
+
{{*group_count = count*}}
|
684
|
+
}
|
685
|
+
}
|
686
|
+
#members {
|
687
|
+
{{*before:*}} {
|
688
|
+
{{*list = @members*}}
|
689
|
+
}
|
690
|
+
{{*after:*}} {
|
691
|
+
{{*member_count = count*}}
|
692
|
+
}
|
693
|
+
}
|
694
|
+
|
695
|
+
/* common 'logic:' part */
|
696
|
+
#groups, #members {
|
697
|
+
logic: {
|
698
|
+
count = 0
|
699
|
+
_stag
|
700
|
+
for item in list
|
701
|
+
unless item.obsolete?
|
702
|
+
count += 1
|
703
|
+
_cont
|
704
|
+
end
|
705
|
+
end
|
706
|
+
_etag
|
707
|
+
}
|
708
|
+
}
|
709
|
+
|
710
|
+
.item {
|
711
|
+
value: item.name;
|
712
|
+
}
|
713
|
+
|
714
|
+
php: |
|
715
|
+
#groups {
|
716
|
+
{{*before:*}} {
|
717
|
+
{{*$list = $groups;*}}
|
718
|
+
}
|
719
|
+
{{*after:*}} {
|
720
|
+
{{*$group_count = $count;*}}
|
721
|
+
}
|
722
|
+
}
|
723
|
+
#members {
|
724
|
+
{{*before:*}} {
|
725
|
+
{{*$list = $members;*}}
|
726
|
+
}
|
727
|
+
{{*after:*}} {
|
728
|
+
{{*$member_count = $count;*}}
|
729
|
+
}
|
730
|
+
}
|
731
|
+
|
732
|
+
/* common 'logic:' part */
|
733
|
+
#groups, #members {
|
734
|
+
logic: {
|
735
|
+
$count = 0;
|
736
|
+
_stag();
|
737
|
+
foreach ($list as $item) {
|
738
|
+
if (! $item->obsolete) {
|
739
|
+
$count++;
|
740
|
+
_cont();
|
741
|
+
}
|
742
|
+
}
|
743
|
+
_etag();
|
744
|
+
}
|
745
|
+
}
|
746
|
+
|
747
|
+
.item {
|
748
|
+
value: $item->name;
|
749
|
+
}
|
750
|
+
|
751
|
+
jstl: |
|
752
|
+
#groups {
|
753
|
+
{{*before:*}} {
|
754
|
+
{{*<c:set var="list" value="${groups}" />*}}
|
755
|
+
}
|
756
|
+
{{*after:*}} {
|
757
|
+
{{*<c:set var="group_count" value="${count}" />*}}
|
758
|
+
}
|
759
|
+
}
|
760
|
+
#members {
|
761
|
+
{{*before:*}} {
|
762
|
+
{{*<c:set var="list" value="${members}" />*}}
|
763
|
+
}
|
764
|
+
{{*after:*}} {
|
765
|
+
{{*<c:set var="members_count" value="${count}" />*}}
|
766
|
+
}
|
767
|
+
}
|
768
|
+
|
769
|
+
/* common 'logic:' part */
|
770
|
+
#groups, #members {
|
771
|
+
logic: {
|
772
|
+
<c:set var="count" value="${0}" />
|
773
|
+
_stag()
|
774
|
+
<c:forEach var="item" items="${list}" />
|
775
|
+
<c:if test="${not item.obsolete}" />
|
776
|
+
<c:set var="count" value="${count+1}" />
|
777
|
+
_cont()
|
778
|
+
</c:if>
|
779
|
+
</c:forEach>
|
780
|
+
_etag()
|
781
|
+
}
|
782
|
+
}
|
783
|
+
|
784
|
+
.item {
|
785
|
+
value: item.name;
|
786
|
+
}
|
787
|
+
|
788
|
+
eperl: |
|
789
|
+
#groups {
|
790
|
+
{{*before:*}} {
|
791
|
+
{{*@list = @groups;*}}
|
792
|
+
}
|
793
|
+
{{*after:*}} {
|
794
|
+
{{*$group_count = $count;*}}
|
795
|
+
}
|
796
|
+
}
|
797
|
+
#members {
|
798
|
+
{{*before:*}} {
|
799
|
+
{{*@list = @members;*}}
|
800
|
+
}
|
801
|
+
{{*after:*}} {
|
802
|
+
{{*$member_count = $count;*}}
|
803
|
+
}
|
804
|
+
}
|
805
|
+
|
806
|
+
/* common 'logic:' part */
|
807
|
+
#groups, #members {
|
808
|
+
logic: {
|
809
|
+
$count = 0;
|
810
|
+
_stag();
|
811
|
+
foreach $item (@list) {
|
812
|
+
if (! $item['obsolete']) {
|
813
|
+
$count++;
|
814
|
+
_cont();
|
815
|
+
}
|
816
|
+
}
|
817
|
+
_etag();
|
818
|
+
}
|
819
|
+
}
|
820
|
+
|
821
|
+
.item {
|
822
|
+
value: $item['name'];
|
823
|
+
}
|
824
|
+
|
825
|
+
expected*:
|
826
|
+
eruby: |
|
827
|
+
<!-- Groups -->
|
828
|
+
<% {{*list = @groups*}} %>
|
829
|
+
<% count = 0 %>
|
830
|
+
<ul>
|
831
|
+
<% for item in list %>
|
832
|
+
<% unless item.obsolete? %>
|
833
|
+
<% count += 1 %>
|
834
|
+
<li class="item"><%= item.name %></li>
|
835
|
+
<% end %>
|
836
|
+
<% end %>
|
837
|
+
</ul>
|
838
|
+
<% {{*group_count = count*}} %>
|
839
|
+
|
840
|
+
<!-- Members -->
|
841
|
+
<% {{*list = @members*}} %>
|
842
|
+
<% count = 0 %>
|
843
|
+
<ol>
|
844
|
+
<% for item in list %>
|
845
|
+
<% unless item.obsolete? %>
|
846
|
+
<% count += 1 %>
|
847
|
+
<li class="item"><%= item.name %></li>
|
848
|
+
<% end %>
|
849
|
+
<% end %>
|
850
|
+
</ol>
|
851
|
+
<% {{*member_count = count*}} %>
|
852
|
+
|
853
|
+
php: |
|
854
|
+
<!-- Groups -->
|
855
|
+
<?php {{*$list = $groups;*}} ?>
|
856
|
+
<?php $count = 0; ?>
|
857
|
+
<ul>
|
858
|
+
<?php foreach ($list as $item) { ?>
|
859
|
+
<?php if (! $item->obsolete) { ?>
|
860
|
+
<?php $count++; ?>
|
861
|
+
<li class="item"><?php echo $item->name; ?></li>
|
862
|
+
<?php } ?>
|
863
|
+
<?php } ?>
|
864
|
+
</ul>
|
865
|
+
<?php {{*$group_count = $count;*}} ?>
|
866
|
+
|
867
|
+
<!-- Members -->
|
868
|
+
<?php {{*$list = $members;*}} ?>
|
869
|
+
<?php $count = 0; ?>
|
870
|
+
<ol>
|
871
|
+
<?php foreach ($list as $item) { ?>
|
872
|
+
<?php if (! $item->obsolete) { ?>
|
873
|
+
<?php $count++; ?>
|
874
|
+
<li class="item"><?php echo $item->name; ?></li>
|
875
|
+
<?php } ?>
|
876
|
+
<?php } ?>
|
877
|
+
</ol>
|
878
|
+
<?php {{*$member_count = $count;*}} ?>
|
879
|
+
|
880
|
+
jstl: |
|
881
|
+
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
882
|
+
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
883
|
+
<!-- Groups -->
|
884
|
+
{{*<c:set var="list" value="${groups}" />*}}
|
885
|
+
<c:set var="count" value="${0}" />
|
886
|
+
<ul>
|
887
|
+
<c:forEach var="item" items="${list}" />
|
888
|
+
<c:if test="${not item.obsolete}" />
|
889
|
+
<c:set var="count" value="${count+1}" />
|
890
|
+
<li class="item">${item.name}</li>
|
891
|
+
</c:if>
|
892
|
+
</c:forEach>
|
893
|
+
</ul>
|
894
|
+
{{*<c:set var="group_count" value="${count}" />*}}
|
895
|
+
|
896
|
+
<!-- Members -->
|
897
|
+
{{*<c:set var="list" value="${members}" />*}}
|
898
|
+
<c:set var="count" value="${0}" />
|
899
|
+
<ol>
|
900
|
+
<c:forEach var="item" items="${list}" />
|
901
|
+
<c:if test="${not item.obsolete}" />
|
902
|
+
<c:set var="count" value="${count+1}" />
|
903
|
+
<li class="item">${item.name}</li>
|
904
|
+
</c:if>
|
905
|
+
</c:forEach>
|
906
|
+
</ol>
|
907
|
+
{{*<c:set var="members_count" value="${count}" />*}}
|
908
|
+
|
909
|
+
eperl: |
|
910
|
+
<!-- Groups -->
|
911
|
+
<? {{*@list = @groups;*}} !>
|
912
|
+
<? $count = 0; !>
|
913
|
+
<ul>
|
914
|
+
<? foreach $item (@list) { !>
|
915
|
+
<? if (! $item['obsolete']) { !>
|
916
|
+
<? $count++; !>
|
917
|
+
<li class="item"><?= $item['name'] !></li>
|
918
|
+
<? } !>
|
919
|
+
<? } !>
|
920
|
+
</ul>
|
921
|
+
<? {{*$group_count = $count;*}} !>
|
922
|
+
|
923
|
+
<!-- Members -->
|
924
|
+
<? {{*@list = @members;*}} !>
|
925
|
+
<? $count = 0; !>
|
926
|
+
<ol>
|
927
|
+
<? foreach $item (@list) { !>
|
928
|
+
<? if (! $item['obsolete']) { !>
|
929
|
+
<? $count++; !>
|
930
|
+
<li class="item"><?= $item['name'] !></li>
|
931
|
+
<? } !>
|
932
|
+
<? } !>
|
933
|
+
</ol>
|
934
|
+
<? {{*$member_count = $count;*}} !>
|
935
|
+
|
936
|
+
|
655
937
|
###
|
656
938
|
- name: begin
|
657
939
|
title: begin, end
|
658
940
|
desc: |
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
941
|
+
{{,begin:,}} and {{,end:,}} properties are equal to {{,before:,}} and {{,after:,}}.
|
942
|
+
{{*These are obsolete and leaved for compatibility*}}.
|
943
|
+
|
944
|
+
{{,begin:,}} and {{,end:,}} were aimed to add prework and postwork of document,
|
945
|
+
and restricted to be available only with '#DOCUMENT' selector.
|
946
|
+
Currently {{,before:,}} and {{,after:,}} are available with '#DOCUMENT' selector,
|
947
|
+
so you should use these properties instead of {{,begin:,}} and {{,end:,}}.
|
948
|
+
.#{{,begin:,}} and {{,end:,}} property represents the prework and postwork
|
949
|
+
.#of document respectively.
|
950
|
+
.#These properties takes target code block and are available only with
|
951
|
+
.#'#DOCUMENT' selector.
|
663
952
|
|
664
953
|
pdata: |
|
665
954
|
<p>Hello <span id="mark:username">world</span>!</p>
|
@@ -796,3 +1085,175 @@
|
|
796
1085
|
<? } !>
|
797
1086
|
</ul>
|
798
1087
|
{{*<?= "<!-- document end -->\n" !>*}}
|
1088
|
+
|
1089
|
+
|
1090
|
+
###
|
1091
|
+
- name: attrvar
|
1092
|
+
title: Attribute Variable
|
1093
|
+
desc: |
|
1094
|
+
Attribute variable is a notation such as '$(attrname)' which represents attribute value.
|
1095
|
+
Attribute variable allows presentation logic to refer attribute value in presentation data.
|
1096
|
+
|
1097
|
+
pdata: |
|
1098
|
+
<form action="create" {{*method="post"*}}>
|
1099
|
+
Username: <input type="text" id="comment_username" {{*size="30"*}}><br>
|
1100
|
+
Comment: <textarea id="comment_text" {{*rows="3"*}} {{*cols="50"*}}></textarea><br>
|
1101
|
+
<input id="mark:submit" type="submit" {{*value="Send comment"*}}>
|
1102
|
+
</form>
|
1103
|
+
|
1104
|
+
plogic*:
|
1105
|
+
eruby: |
|
1106
|
+
form {
|
1107
|
+
stag: start_form_tag :action=>'{{*$(action)*}}';
|
1108
|
+
}
|
1109
|
+
#comment_username {
|
1110
|
+
elem: text_field 'comment', 'username', :size=>{{*$(size)*}};
|
1111
|
+
}
|
1112
|
+
#comment_text {
|
1113
|
+
elem: text_area 'comment', 'text', :rows=>{{*$(rows)*}}, :cols=>{{*$(cols)*}};
|
1114
|
+
}
|
1115
|
+
#submit {
|
1116
|
+
elem: submit_tag '{{*$(value)*}}';
|
1117
|
+
}
|
1118
|
+
|
1119
|
+
php: |
|
1120
|
+
form {
|
1121
|
+
stag: form_tag('comment/{{*$(action)*}}');
|
1122
|
+
}
|
1123
|
+
#comment_username {
|
1124
|
+
elem: text_field('comment', 'username', array('size'=>{{*$(size)*}}));
|
1125
|
+
}
|
1126
|
+
#comment_text {
|
1127
|
+
elem: text_area('comment', 'text', array('rows'=>{{*$(rows)*}}, 'cols'=>{{*$(cols)*}}));
|
1128
|
+
}
|
1129
|
+
#submit {
|
1130
|
+
elem: submit_tag('{{*$(value)*}}');
|
1131
|
+
}
|
1132
|
+
|
1133
|
+
jstl: |
|
1134
|
+
form {
|
1135
|
+
logic: {
|
1136
|
+
<form:form action="{{*$(action)*}}.do">
|
1137
|
+
_cont
|
1138
|
+
</form:form>
|
1139
|
+
}
|
1140
|
+
}
|
1141
|
+
#comment_username {
|
1142
|
+
logic: {
|
1143
|
+
<form:textfield name="username" size="{{*$(size)*}}"/>
|
1144
|
+
}
|
1145
|
+
}
|
1146
|
+
#comment_text {
|
1147
|
+
logic: {
|
1148
|
+
<form:textarea name="text", rows="{{*$(rows)*}}" cols="{{*$(cols)*}}"/>
|
1149
|
+
}
|
1150
|
+
}
|
1151
|
+
#submit {
|
1152
|
+
logic: {
|
1153
|
+
<form:submit value="{{*$(value)*}}"/>
|
1154
|
+
}
|
1155
|
+
}
|
1156
|
+
|
1157
|
+
eperl: |
|
1158
|
+
form {
|
1159
|
+
stag: &form_tag({'action'=>'{{*$(action)*}}'});
|
1160
|
+
}
|
1161
|
+
#comment_username {
|
1162
|
+
elem: &text_field('comment', 'username', {'size'=>{{*$(size)*}}});
|
1163
|
+
}
|
1164
|
+
#comment_text {
|
1165
|
+
elem: &text_area('comment', 'text', {'rows'=>{{*$(rows)*}}, 'cols'=>{{*$(cols)*}}});
|
1166
|
+
}
|
1167
|
+
#submit {
|
1168
|
+
elem: &submit_tag('{{*$(value)*}}');
|
1169
|
+
}
|
1170
|
+
|
1171
|
+
expected*:
|
1172
|
+
|
1173
|
+
eruby: |
|
1174
|
+
<%= start_form_tag :action=>'{{*create*}}' %>
|
1175
|
+
Username: <%= text_field 'comment', 'username', :size=>{{*30*}} %><br>
|
1176
|
+
Comment: <%= text_area 'comment', 'text', :rows=>{{*3*}}, :cols=>{{*50*}} %><br>
|
1177
|
+
<%= submit_tag '{{*Send comment*}}' %>
|
1178
|
+
</form>
|
1179
|
+
|
1180
|
+
php: |
|
1181
|
+
<?php echo form_tag('comment/{{*create*}}'); ?>
|
1182
|
+
Username: <?php echo text_field('comment', 'username', array('size'=>{{*30*}})); ?><br>
|
1183
|
+
Comment: <?php echo text_area('comment', 'text', array('rows'=>{{*3*}}, 'cols'=>{{*50*}})); ?><br>
|
1184
|
+
<?php echo submit_tag('{{*Send comment*}}'); ?>
|
1185
|
+
</form>
|
1186
|
+
|
1187
|
+
eperl: |
|
1188
|
+
<?= &form_tag({'action'=>'{{*create*}}'}) !>
|
1189
|
+
Username: <?= &text_field('comment', 'username', {'size'=>{{*30*}}}) !><br>
|
1190
|
+
Comment: <?= &text_area('comment', 'text', {'rows'=>{{*3*}}, 'cols'=>{{*50*}}}) !><br>
|
1191
|
+
<?= &submit_tag('{{*Send comment*}}') !>
|
1192
|
+
</form>
|
1193
|
+
|
1194
|
+
jstl: |
|
1195
|
+
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
1196
|
+
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
1197
|
+
<form:form action="{{*create*}}.do">
|
1198
|
+
Username: <form:textfield name="username" size="{{*30*}}"/>
|
1199
|
+
<br>
|
1200
|
+
Comment: <form:textarea name="text", rows="{{*3*}}" cols="{{*50*}}"/>
|
1201
|
+
<br>
|
1202
|
+
<form:submit value="{{*Send comment*}}"/>
|
1203
|
+
</form:form>
|
1204
|
+
|
1205
|
+
|
1206
|
+
###
|
1207
|
+
- name: attrvar2
|
1208
|
+
hide: yes
|
1209
|
+
title: Attribute Variable2
|
1210
|
+
pdata: |
|
1211
|
+
<h1 class="section">...title...</h1>
|
1212
|
+
|
1213
|
+
plogic*:
|
1214
|
+
eruby: |
|
1215
|
+
h1 {
|
1216
|
+
attrs: 'title' escape('$(class)');
|
1217
|
+
value: 'class:$(class)';
|
1218
|
+
append: flag ? ' klass="$(class)"' : '';
|
1219
|
+
}
|
1220
|
+
|
1221
|
+
php: |
|
1222
|
+
h1 {
|
1223
|
+
attrs: 'title' escape('$(class)');
|
1224
|
+
value: 'class:$(class)';
|
1225
|
+
append: flag ? ' klass="$(class)"' : '';
|
1226
|
+
}
|
1227
|
+
|
1228
|
+
jstl: |
|
1229
|
+
h1 {
|
1230
|
+
attrs: 'title' escape('$(class)');
|
1231
|
+
value: 'class:$(class)';
|
1232
|
+
append: flag ? ' klass="$(class)"' : '';
|
1233
|
+
}
|
1234
|
+
|
1235
|
+
eperl: |
|
1236
|
+
h1 {
|
1237
|
+
attrs: 'title' escape('$(class)');
|
1238
|
+
value: 'class:$(class)';
|
1239
|
+
append: flag ? ' klass="$(class)"' : '';
|
1240
|
+
}
|
1241
|
+
|
1242
|
+
expected*:
|
1243
|
+
|
1244
|
+
eruby: |
|
1245
|
+
<h1 class="section" title="<%= escape('section') %>"<%= flag ? ' klass="section"' : '' %>><%= 'class:section' %></h1>
|
1246
|
+
|
1247
|
+
php: |
|
1248
|
+
<h1 class="section" title="<?php echo escape('section'); ?>"<?php echo flag ? ' klass="section"' : ''; ?>><?php echo 'class:section'; ?></h1>
|
1249
|
+
|
1250
|
+
eperl: |
|
1251
|
+
<h1 class="section" title="<?= escape('section') !>"<?= flag ? ' klass="section"' : '' !>><?= 'class:section' !></h1>
|
1252
|
+
|
1253
|
+
jstl: |
|
1254
|
+
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
1255
|
+
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
1256
|
+
<h1 class="section" title="${escape('section')}"${flag ? ' klass="section"' : ''}>class:section</h1>
|
1257
|
+
# <h1 class="section" title="${escape('section')}"${flag ? ' klass="section"' : ''}>${'class:section'}</h1>
|
1258
|
+
|
1259
|
+
|