kwartz 3.1.2 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|