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/lib/kwartz/defun.rb
CHANGED
data/lib/kwartz/error.rb
CHANGED
data/lib/kwartz/helper/rails.rb
CHANGED
data/lib/kwartz/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
|
|
@@ -9,6 +9,7 @@ require 'kwartz'
|
|
9
9
|
require 'kwartz/binding/eruby'
|
10
10
|
require 'kwartz/binding/ruby'
|
11
11
|
require 'kwartz/binding/php'
|
12
|
+
require 'kwartz/binding/perl'
|
12
13
|
require 'kwartz/binding/eperl'
|
13
14
|
require 'kwartz/binding/rails'
|
14
15
|
require 'kwartz/binding/jstl'
|
@@ -66,7 +67,7 @@ module Kwartz
|
|
66
67
|
end
|
67
68
|
|
68
69
|
def _find_entry(key)
|
69
|
-
if key.is_a?(Fixnum)
|
70
|
+
if key.is_a?(Fixnum) || (key.is_a?(String) && key.length == 1)
|
70
71
|
return @_option_table.find { |row| row[0] == key }
|
71
72
|
else
|
72
73
|
key = key.to_s.intern unless key.is_a?(Symbol)
|
@@ -76,7 +77,7 @@ module Kwartz
|
|
76
77
|
private :_find_entry
|
77
78
|
|
78
79
|
def [](key)
|
79
|
-
if key.is_a?(Fixnum)
|
80
|
+
if key.is_a?(Fixnum) || (key.is_a?(String) && key.length == 1)
|
80
81
|
entry = _find_entry(key) or return
|
81
82
|
key = entry[1]
|
82
83
|
end
|
data/lib/kwartz/node.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
|
|
@@ -144,7 +144,7 @@ module Kwartz
|
|
144
144
|
class ExpandStatement < Statement
|
145
145
|
|
146
146
|
|
147
|
-
def initialize(kind, name)
|
147
|
+
def initialize(kind, name=nil)
|
148
148
|
@kind = kind # symbol
|
149
149
|
@name = name # string
|
150
150
|
end
|
@@ -200,67 +200,62 @@ module Kwartz
|
|
200
200
|
|
201
201
|
|
202
202
|
##
|
203
|
-
##
|
203
|
+
## ruleset in presentation logic file
|
204
204
|
##
|
205
205
|
class Ruleset
|
206
|
-
end
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
##
|
211
|
-
## represents '#name { ... }' entry in presentation logic file
|
212
|
-
##
|
213
|
-
class ElementRuleset < Ruleset
|
214
206
|
|
215
207
|
|
216
|
-
def initialize(
|
217
|
-
@
|
208
|
+
def initialize(selectors)
|
209
|
+
@selectors = selectors # list of string ('#id', '.class', or 'tagname')
|
218
210
|
end
|
211
|
+
attr_accessor :selectors
|
212
|
+
attr_accessor :stag, :cont, :etag, :elem # NativeExpression
|
213
|
+
attr_accessor :attrs # Hash(key: attribute name, value: NativeExpression)
|
214
|
+
attr_accessor :append # list of NativeExpression
|
215
|
+
attr_accessor :remove # list of attribute name
|
216
|
+
attr_accessor :tagname # string
|
217
|
+
attr_accessor :logic, :before, :after # block statement
|
219
218
|
|
220
219
|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
def set_stag(str, escape_flag=nil)
|
226
|
-
@stag = NativeExpression.new(str, escape_flag)
|
220
|
+
def set_stag(str, flag_escape=nil)
|
221
|
+
@stag = NativeExpression.new(str, flag_escape)
|
227
222
|
end
|
228
223
|
|
229
224
|
|
230
|
-
def set_cont(str,
|
231
|
-
@cont = NativeExpression.new(str,
|
225
|
+
def set_cont(str, flag_escape=nil)
|
226
|
+
@cont = NativeExpression.new(str, flag_escape)
|
232
227
|
end
|
233
228
|
|
234
229
|
|
235
|
-
def set_etag(str,
|
236
|
-
@etag = NativeExpression.new(str,
|
230
|
+
def set_etag(str, flag_escape=nil)
|
231
|
+
@etag = NativeExpression.new(str, flag_escape)
|
237
232
|
end
|
238
233
|
|
239
234
|
|
240
|
-
def set_elem(str,
|
241
|
-
@elem = NativeExpression.new(str,
|
235
|
+
def set_elem(str, flag_escape=nil)
|
236
|
+
@elem = NativeExpression.new(str, flag_escape)
|
242
237
|
end
|
243
238
|
|
244
239
|
|
245
|
-
def set_value(str,
|
246
|
-
set_cont(str,
|
240
|
+
def set_value(str, flag_escape=nil)
|
241
|
+
set_cont(str, flag_escape)
|
247
242
|
end
|
248
243
|
|
249
244
|
|
250
|
-
def set_attrs(hash,
|
251
|
-
hash.each do |
|
245
|
+
def set_attrs(hash, flag_escape=nil)
|
246
|
+
hash.each do |aname, expr_str|
|
252
247
|
next if !expr_str || expr_str.empty?
|
253
248
|
@attrs ||= {}
|
254
|
-
@attrs[
|
249
|
+
@attrs[aname] = NativeExpression.new(expr_str, flag_escape)
|
255
250
|
end if hash
|
256
251
|
end
|
257
252
|
|
258
253
|
|
259
|
-
def set_append(list,
|
254
|
+
def set_append(list, flag_escape=nil)
|
260
255
|
list.each do |expr_str|
|
261
256
|
next if !expr_str || expr_str.empty?
|
262
257
|
@append ||= []
|
263
|
-
@append << NativeExpression.new(expr_str,
|
258
|
+
@append << NativeExpression.new(expr_str, flag_escape)
|
264
259
|
end
|
265
260
|
end
|
266
261
|
|
@@ -276,13 +271,31 @@ module Kwartz
|
|
276
271
|
|
277
272
|
|
278
273
|
def set_logic(logic_str)
|
274
|
+
stmt_list = _parse_logic_str(logic_str)
|
275
|
+
@logic = stmt_list
|
276
|
+
end
|
277
|
+
|
278
|
+
|
279
|
+
def set_before(logic_str)
|
280
|
+
stmt_list = _parse_logic_str(logic_str)
|
281
|
+
@before = stmt_list
|
282
|
+
end
|
283
|
+
|
284
|
+
|
285
|
+
def set_after(logic_str)
|
286
|
+
stmt_list = _parse_logic_str(logic_str)
|
287
|
+
@after = stmt_list
|
288
|
+
end
|
289
|
+
|
290
|
+
|
291
|
+
def _parse_logic_str(logic_str)
|
279
292
|
return unless logic_str
|
280
293
|
stmt_list = []
|
281
294
|
logic_str.each_line do |line|
|
282
295
|
if line =~ /^\s*_(stag|cont|etag|elem)(?:\(\))?;?\s*(?:\#.*)?$/
|
283
296
|
kind = $1
|
284
|
-
stmt_list << ExpandStatement.new(kind.intern
|
285
|
-
elsif line =~ /^\s*(_(element|content)([()'"\w\s]*));?\s*(?:\#.*)?$/
|
297
|
+
stmt_list << ExpandStatement.new(kind.intern)
|
298
|
+
elsif line =~ /^\s*(_(element|content)([-()'"\w\s]*));?\s*(?:\#.*)?$/
|
286
299
|
str, kind, arg = $1, $2, $3
|
287
300
|
arg.strip!
|
288
301
|
if arg =~ /\A\((.*)\)\z/ then arg = $1 end
|
@@ -290,44 +303,63 @@ module Kwartz
|
|
290
303
|
raise parse_error("'#{str}': element name required.", nil)
|
291
304
|
end
|
292
305
|
case arg
|
293
|
-
when /\A"(.*)"\z/
|
294
|
-
when /\A'(.*)'\z/
|
295
|
-
when /\A(
|
306
|
+
when /\A"(.*)"\z/ ; name = $1
|
307
|
+
when /\A'(.*)'\z/ ; name = $1
|
308
|
+
when /\A([-\w]+)\z/ ; name = $1
|
296
309
|
else
|
297
310
|
raise parse_error("'#{str}': invalid pattern.", nil)
|
298
311
|
end
|
299
|
-
unless name =~ /\A
|
312
|
+
unless name =~ /\A[-\w]+\z/
|
300
313
|
raise parse_error("'#{name}': invalid #{kind} name.", nil)
|
301
314
|
end
|
302
315
|
stmt_list << ExpandStatement.new(kind.intern, name)
|
303
316
|
#elsif line =~ /^\s*print(?:\s+(\S+)|\((.+)\))\s*;?\s*(?:\#.*)?$/
|
304
|
-
elsif line =~ /^\s*print(?:\s+(.*?)|\((
|
317
|
+
elsif line =~ /^\s*print(?:\s+(.*?)|\((.*)\))\s*;?\s*$/
|
305
318
|
arg = $1 || $2
|
306
319
|
stmt_list << PrintStatement.new([NativeExpression.new(arg)])
|
307
320
|
else
|
308
321
|
stmt_list << NativeStatement.new(line.chomp, nil)
|
309
322
|
end
|
310
323
|
end
|
311
|
-
|
324
|
+
return stmt_list
|
312
325
|
end
|
313
326
|
|
314
327
|
|
315
|
-
def duplicate(
|
328
|
+
def duplicate()
|
316
329
|
ruleset = dup()
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
330
|
+
r = ruleset
|
331
|
+
r.selectors = nil
|
332
|
+
r.attrs = @attrs.dup() if @attrs
|
333
|
+
r.append = @append.dup() if @append
|
334
|
+
r.remove = @remove.dup() if @remove
|
335
|
+
r.logic = @logic.dup() if @logic
|
336
|
+
r.before = @before.dup() if @before
|
337
|
+
r.after = @after.dup() if @after
|
338
|
+
return r
|
339
|
+
end
|
340
|
+
|
341
|
+
|
342
|
+
def merge(ruleset)
|
343
|
+
r = ruleset
|
344
|
+
r2 = duplicate()
|
345
|
+
r2.stag = r.stag if r.stag
|
346
|
+
r2.etag = r.etag if r.etag
|
347
|
+
r2.cont = r.cont if r.cont
|
348
|
+
(r2.attrs ||= {}).update(r.attrs) if r.attrs
|
349
|
+
r2.append += r.append if r.append
|
350
|
+
r2.remove += r.remove if r.remove
|
351
|
+
r2.tagname = r.tagname if r.tagname
|
352
|
+
r2.logic = r.logic if r.logic
|
353
|
+
r2.before = r.before if r.before
|
354
|
+
r2.after = r.after if r.after
|
355
|
+
return r2
|
323
356
|
end
|
324
357
|
|
325
358
|
|
326
359
|
def _inspect(indent=0)
|
327
360
|
space = ' ' * indent
|
328
361
|
sb = []
|
329
|
-
sb << space << "-
|
330
|
-
#sb << space << " value: #{@value == nil ? '' : @value}\n"
|
362
|
+
sb << space << "- selectors: #{@selectors.inspect}\n"
|
331
363
|
sb << space << " stag: #{@stag.code}\n" unless @stag.nil?
|
332
364
|
sb << space << " cont: #{@cont.code}\n" unless @cont.nil?
|
333
365
|
sb << space << " etag: #{@etag.code}\n" unless @etag.nil?
|
@@ -357,6 +389,16 @@ module Kwartz
|
|
357
389
|
sb << space << " - " << stmt._inspect()
|
358
390
|
end if @logic
|
359
391
|
#
|
392
|
+
sb << space << " before:\n" if @before
|
393
|
+
@before.each do |stmt|
|
394
|
+
sb << space << " - " << stmt._inspect()
|
395
|
+
end if @before
|
396
|
+
#
|
397
|
+
sb << space << " after:\n" if @after
|
398
|
+
@after.each do |stmt|
|
399
|
+
sb << space << " - " << stmt._inspect()
|
400
|
+
end if @after
|
401
|
+
#
|
360
402
|
return sb.join
|
361
403
|
end
|
362
404
|
|
@@ -372,98 +414,4 @@ module Kwartz
|
|
372
414
|
end #class
|
373
415
|
|
374
416
|
|
375
|
-
|
376
|
-
##
|
377
|
-
## represents '#DOUMENT { ... }' entry in presentation logic file
|
378
|
-
##
|
379
|
-
class DocumentRuleset < Ruleset
|
380
|
-
|
381
|
-
|
382
|
-
def initialize(name='DOCUMENT')
|
383
|
-
@name = name
|
384
|
-
end
|
385
|
-
attr_accessor :name, :global, :local, :fixture, :begin, :end #:before, :after
|
386
|
-
|
387
|
-
def set_global(list)
|
388
|
-
@global = list if list
|
389
|
-
end
|
390
|
-
|
391
|
-
def set_local(list)
|
392
|
-
@local = list if list
|
393
|
-
end
|
394
|
-
|
395
|
-
def set_fixture(str)
|
396
|
-
@fixture = NativeStatement.new(str.chomp, nil) if str
|
397
|
-
end
|
398
|
-
|
399
|
-
def set_begin(str)
|
400
|
-
stmt_list = _parse_stmts(str)
|
401
|
-
@begin = stmt_list
|
402
|
-
end
|
403
|
-
|
404
|
-
def set_end(str)
|
405
|
-
stmt_list = _parse_stmts(str)
|
406
|
-
@end = stmt_list
|
407
|
-
end
|
408
|
-
|
409
|
-
|
410
|
-
private
|
411
|
-
|
412
|
-
|
413
|
-
def _parse_stmts(str)
|
414
|
-
return unless str
|
415
|
-
stmt_list = []
|
416
|
-
str.each_line do |line|
|
417
|
-
#if line =~ /^\s*print(?:\s+(.*?)|\((.+)\))\s*;?\s*(?:\#.*)?$/
|
418
|
-
if line =~ /^\s*print(?:\s+(.*?)|\((.+)\))\s*;?\s*$/
|
419
|
-
arg = $1 || $2
|
420
|
-
stmt_list << PrintStatement.new([NativeExpression.new(arg)])
|
421
|
-
else
|
422
|
-
stmt_list << NativeStatement.new(line.chomp, nil)
|
423
|
-
end
|
424
|
-
end
|
425
|
-
return stmt_list
|
426
|
-
end
|
427
|
-
|
428
|
-
|
429
|
-
public
|
430
|
-
|
431
|
-
|
432
|
-
def _inspect(indent=0)
|
433
|
-
space = ' ' * indent
|
434
|
-
sb = []
|
435
|
-
sb << space << "- name: #{@name}\n"
|
436
|
-
if @global
|
437
|
-
sb << space << " global:\n"
|
438
|
-
@global.each do |item|
|
439
|
-
sb << space << " - #{item}\n"
|
440
|
-
end
|
441
|
-
end
|
442
|
-
if @local
|
443
|
-
sb << space << " local:\n"
|
444
|
-
@local.each do |item|
|
445
|
-
sb << space << " - #{item}\n"
|
446
|
-
end
|
447
|
-
end
|
448
|
-
if @begin
|
449
|
-
sb << space << " begin:\n"
|
450
|
-
@begin.each do |stmt|
|
451
|
-
sb << space << " - #{stmt._inspect}"
|
452
|
-
end
|
453
|
-
end
|
454
|
-
if @end
|
455
|
-
sb << space << " end:\n"
|
456
|
-
@end.each do |stmt|
|
457
|
-
sb << space << " - #{stmt._inspect}"
|
458
|
-
end
|
459
|
-
end
|
460
|
-
#
|
461
|
-
return sb.join
|
462
|
-
end
|
463
|
-
|
464
|
-
|
465
|
-
end #class
|
466
|
-
|
467
|
-
|
468
|
-
|
469
417
|
end #module
|
data/lib/kwartz/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
|
|
@@ -95,7 +95,7 @@ module Kwartz
|
|
95
95
|
table[word.capitalize] = sym
|
96
96
|
table[word.upcase] = sym
|
97
97
|
end
|
98
|
-
%w[
|
98
|
+
%w[remove tagname logic before after begin end global local].each do |word|
|
99
99
|
table[word] = word.intern
|
100
100
|
end
|
101
101
|
PLOGIC_KEYWORDS = table
|
@@ -218,6 +218,7 @@ module Kwartz
|
|
218
218
|
#not_implemented
|
219
219
|
end
|
220
220
|
|
221
|
+
|
221
222
|
## .[abstract] detect parser-specific keywords
|
222
223
|
##
|
223
224
|
## return symbol if keyword is token, else return nil
|
@@ -225,6 +226,7 @@ module Kwartz
|
|
225
226
|
not_implemented
|
226
227
|
end
|
227
228
|
|
229
|
+
|
228
230
|
## scan token
|
229
231
|
def scan
|
230
232
|
## skip whitespaces
|
@@ -437,7 +439,7 @@ module Kwartz
|
|
437
439
|
def keywords(keyword)
|
438
440
|
return RUBYSTYLE_KEYWORDS[keyword]
|
439
441
|
end
|
440
|
-
RUBYSTYLE_KEYWORDS = { 'BEGIN'
|
442
|
+
RUBYSTYLE_KEYWORDS = { 'BEGIN'=>:BEGIN, 'END'=>:END, 'element'=>:element, 'document'=>:document }
|
441
443
|
|
442
444
|
|
443
445
|
def parse_document_ruleset
|
@@ -446,7 +448,7 @@ module Kwartz
|
|
446
448
|
unless @token == :'{'
|
447
449
|
raise parse_error("'#{@value}': document requires '{'.")
|
448
450
|
end
|
449
|
-
ruleset =
|
451
|
+
ruleset = Ruleset.new
|
450
452
|
while @token
|
451
453
|
scan()
|
452
454
|
case @token
|
@@ -583,8 +585,8 @@ module Kwartz
|
|
583
585
|
##
|
584
586
|
## example of presentation logic in css style:
|
585
587
|
##
|
586
|
-
##
|
587
|
-
## #
|
588
|
+
## /* comment */
|
589
|
+
## #idname, .classname, tagname {
|
588
590
|
## value: @var;
|
589
591
|
## attrs: "class" @classname, "bgcolro" color;
|
590
592
|
## append: @value==item['list'] ? ' checked' : '';
|
@@ -600,32 +602,50 @@ module Kwartz
|
|
600
602
|
class CssStyleParser < PresentationLogicParser
|
601
603
|
|
602
604
|
|
605
|
+
def initialize(*args)
|
606
|
+
super
|
607
|
+
@mode = :selector # :selector or :declaration
|
608
|
+
end
|
609
|
+
|
610
|
+
attr_accessor :mode
|
611
|
+
|
612
|
+
|
603
613
|
def parse(input, filename='')
|
604
614
|
reset(input, filename)
|
605
615
|
scan()
|
606
616
|
rulesets = []
|
607
|
-
while @token ==
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
if name == 'import'
|
617
|
+
while @token == :command # '@import'
|
618
|
+
command = @value
|
619
|
+
case command
|
620
|
+
when '@import'
|
612
621
|
imported_rulesets = parse_import_command()
|
613
622
|
rulesets += imported_rulesets
|
623
|
+
when '@from'
|
624
|
+
# TODO
|
625
|
+
when '@import_pdata'
|
626
|
+
# TODO
|
614
627
|
else
|
615
|
-
raise parse_error("
|
628
|
+
raise parse_error("#{command}: unsupported command.")
|
616
629
|
end
|
617
630
|
end
|
618
|
-
while @token ==
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
631
|
+
while @token == :selector
|
632
|
+
selectors = parse_selectors()
|
633
|
+
unless @token == :'{'
|
634
|
+
raise parse_error("'#{@value}': '{' is expected.") #'
|
635
|
+
end
|
636
|
+
@mode = :declaration
|
637
|
+
_linenum, _column = @linenum, @column
|
638
|
+
ruleset = Ruleset.new(selectors)
|
639
|
+
parse_declaration(ruleset)
|
640
|
+
unless @token
|
641
|
+
raise parse_error("'#{selectors.first}': is not closed by '}'.", _linenum, _column)
|
625
642
|
end
|
643
|
+
@mode = :selector
|
644
|
+
rulesets << ruleset
|
645
|
+
scan()
|
626
646
|
end
|
627
647
|
unless @token == nil
|
628
|
-
raise parse_error("'#{@value}':
|
648
|
+
raise parse_error("'#{@value}': selector is expected.")
|
629
649
|
end
|
630
650
|
return rulesets
|
631
651
|
end
|
@@ -665,22 +685,46 @@ module Kwartz
|
|
665
685
|
end #if
|
666
686
|
end #if
|
667
687
|
|
668
|
-
##
|
669
|
-
if
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
688
|
+
##
|
689
|
+
if @mode == :selector
|
690
|
+
# '#name' or '.name'
|
691
|
+
if c == ?# || c == ?.
|
692
|
+
start_char = c
|
693
|
+
name = ''
|
694
|
+
while is_identchar(c = getch()) || c == ?-
|
695
|
+
name << c
|
696
|
+
end
|
697
|
+
if name.empty?
|
698
|
+
@error = :invalid_char
|
699
|
+
@value = start_char.chr
|
700
|
+
return @token = :error
|
701
|
+
end
|
702
|
+
@value = start_char.chr + name
|
703
|
+
return @token = :selector
|
704
|
+
end
|
705
|
+
# 'tagname'
|
706
|
+
if is_identchar(c) || c == ?-
|
707
|
+
name = c.chr
|
708
|
+
while is_identchar(c = getch()) || c == ?- || c == ?:
|
709
|
+
name << c
|
710
|
+
end
|
711
|
+
@value = name
|
712
|
+
return @token = :selector
|
713
|
+
end
|
714
|
+
# '@import'
|
715
|
+
if c == ?@
|
716
|
+
name = ''
|
717
|
+
while is_identchar(c = getch())
|
718
|
+
name << c
|
719
|
+
end
|
720
|
+
if name.empty?
|
721
|
+
@error = :invalid_char
|
722
|
+
@value = '@'
|
723
|
+
return @token = :error
|
724
|
+
end
|
725
|
+
@value = '@' + name
|
726
|
+
return @token = :command
|
675
727
|
end
|
676
|
-
@value = '#'
|
677
|
-
return @token = ?#
|
678
|
-
end #if
|
679
|
-
|
680
|
-
## '@import "foo.plogic"'
|
681
|
-
if c == ?@
|
682
|
-
@value = '@'
|
683
|
-
return @token = ?@
|
684
728
|
end
|
685
729
|
|
686
730
|
return false
|
@@ -694,39 +738,6 @@ module Kwartz
|
|
694
738
|
CSSSTYLE_KEYWORDS = { 'begin'=>:begin, 'end'=>:end }
|
695
739
|
|
696
740
|
|
697
|
-
def parse_document_ruleset
|
698
|
-
assert unless @value == 'DOCUMENT'
|
699
|
-
start_linenum = @linenum
|
700
|
-
scan()
|
701
|
-
unless @token == :'{'
|
702
|
-
raise parse_error("'#{@value}': '{' is expected.")
|
703
|
-
end
|
704
|
-
ruleset = DocumentRuleset.new
|
705
|
-
while @token
|
706
|
-
scan()
|
707
|
-
case @token
|
708
|
-
when :'}' ; break
|
709
|
-
when :global ; has_colon?(); ruleset.set_global _parse_words()
|
710
|
-
when :local ; has_colon?(); ruleset.set_local _parse_words()
|
711
|
-
when :fixture ; has_colon?(); ruleset.set_fixture _parse_block()
|
712
|
-
when :begin ; has_colon?(); ruleset.set_begin _parse_block()
|
713
|
-
when :end ; has_colon?(); ruleset.set_end _parse_block()
|
714
|
-
#when :before ; has_colon?(); ruleset.set_before _parse_block()
|
715
|
-
#when :after ; has_colon?(); ruleset.set_after _parse_block()
|
716
|
-
else
|
717
|
-
unless @token
|
718
|
-
raise parse_error("'#DOCUMENT': is not closed by '}'.", start_linenum)
|
719
|
-
else
|
720
|
-
raise parse_error("'#{@value}': unexpected token.")
|
721
|
-
end
|
722
|
-
end
|
723
|
-
end
|
724
|
-
assert unless @token == :'}'
|
725
|
-
scan()
|
726
|
-
return ruleset
|
727
|
-
end
|
728
|
-
|
729
|
-
|
730
741
|
def has_colon?
|
731
742
|
unless @ch == ?:
|
732
743
|
raise parse_error("'#{@value}': ':' is required.")
|
@@ -735,57 +746,50 @@ module Kwartz
|
|
735
746
|
end
|
736
747
|
|
737
748
|
|
738
|
-
def
|
739
|
-
assert unless @token == :
|
749
|
+
def parse_selectors
|
750
|
+
assert unless @token == :selector
|
740
751
|
start_linenum = @linenum
|
741
|
-
|
742
|
-
#names = [name]
|
743
|
-
names = []
|
752
|
+
selectors = [ @value ]
|
744
753
|
scan()
|
745
754
|
while @token == :','
|
746
755
|
scan()
|
747
|
-
unless @token ==
|
748
|
-
raise parse_error("'#{@value}':
|
756
|
+
unless @token == :selector
|
757
|
+
raise parse_error("'#{@value}': selector is expected (or additional comma exists).") #'
|
749
758
|
end
|
750
|
-
|
751
|
-
names << @value
|
759
|
+
selectors << @value
|
752
760
|
scan()
|
753
761
|
end
|
754
|
-
|
755
|
-
|
756
|
-
end
|
762
|
+
return selectors
|
763
|
+
end
|
757
764
|
|
758
|
-
|
765
|
+
|
766
|
+
def parse_declaration(ruleset)
|
767
|
+
assert unless @token == :'{'
|
759
768
|
while true
|
760
769
|
scan()
|
761
770
|
flag_escape = escape?(@value)
|
762
771
|
case @token
|
763
772
|
when nil ; break
|
764
773
|
when :'}' ; break
|
765
|
-
when :stag ; has_colon?(); ruleset.set_stag
|
766
|
-
when :cont ; has_colon?(); ruleset.set_cont
|
767
|
-
when :etag ; has_colon?(); ruleset.set_etag
|
768
|
-
when :elem ; has_colon?(); ruleset.set_elem
|
769
|
-
when :value ; has_colon?(); ruleset.set_value
|
770
|
-
when :attrs ; has_colon?(); ruleset.set_attrs
|
771
|
-
when :append ; has_colon?(); ruleset.set_append
|
772
|
-
when :remove ; has_colon?(); ruleset.set_remove
|
774
|
+
when :stag ; has_colon?(); ruleset.set_stag _parse_expr() , flag_escape
|
775
|
+
when :cont ; has_colon?(); ruleset.set_cont _parse_expr() , flag_escape
|
776
|
+
when :etag ; has_colon?(); ruleset.set_etag _parse_expr() , flag_escape
|
777
|
+
when :elem ; has_colon?(); ruleset.set_elem _parse_expr() , flag_escape
|
778
|
+
when :value ; has_colon?(); ruleset.set_value _parse_expr() , flag_escape
|
779
|
+
when :attrs ; has_colon?(); ruleset.set_attrs _parse_pairs(), flag_escape
|
780
|
+
when :append ; has_colon?(); ruleset.set_append _parse_exprs(), flag_escape
|
781
|
+
when :remove ; has_colon?(); ruleset.set_remove _parse_strs()
|
773
782
|
when :tagname; has_colon?(); ruleset.set_tagname _parse_str()
|
774
|
-
when :logic ; has_colon?(); ruleset.set_logic
|
783
|
+
when :logic ; has_colon?(); ruleset.set_logic _parse_block()
|
784
|
+
when :before ; has_colon?(); ruleset.set_before _parse_block()
|
785
|
+
when :after ; has_colon?(); ruleset.set_after _parse_block()
|
786
|
+
when :begin ; has_colon?(); ruleset.set_before _parse_block()
|
787
|
+
when :end ; has_colon?(); ruleset.set_after _parse_block()
|
775
788
|
else
|
776
|
-
raise parse_error("'#{@value}': unexpected token.")
|
789
|
+
raise parse_error("'#{@value}': unexpected token.") #'
|
777
790
|
end
|
778
791
|
end
|
779
|
-
|
780
|
-
rulesets = [ruleset]
|
781
|
-
names.each do |name| rulesets << ruleset.duplicate(name) end
|
782
|
-
|
783
|
-
unless @token
|
784
|
-
raise parse_error("'##{name}': is not closed by '}'.", start_linenum)
|
785
|
-
end
|
786
|
-
assert "@token=#{@token.inspect}" unless @token == :'}'
|
787
|
-
scan()
|
788
|
-
return rulesets
|
792
|
+
return ruleset
|
789
793
|
end
|
790
794
|
|
791
795
|
|
@@ -800,13 +804,18 @@ module Kwartz
|
|
800
804
|
filename = dir + '/' + filename if dir != '.'
|
801
805
|
end
|
802
806
|
test(?f, filename) or raise parse_error("'#{filename}': import file not found.")
|
807
|
+
_linenum, _column = @linenum, @column
|
803
808
|
c = @ch
|
804
809
|
c = getch() while is_whitespace(c)
|
805
810
|
c == ?; or raise parse_error("';' required.")
|
806
811
|
c = getch()
|
807
812
|
scan()
|
808
813
|
parser = self.class.new(@properties)
|
809
|
-
|
814
|
+
begin
|
815
|
+
ruleset_list = parser.parse(File.read(filename), filename)
|
816
|
+
rescue => ex
|
817
|
+
parse_error(ex.message, _linenum, _column)
|
818
|
+
end
|
810
819
|
return ruleset_list
|
811
820
|
end
|
812
821
|
|