kwartz 3.1.2 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. data/CHANGES +444 -0
  2. data/README.txt +4 -1
  3. data/bin/kwartz +2 -2
  4. data/doc-api/classes/Kwartz.html +16 -7
  5. data/doc-api/classes/Kwartz/Assertion.html +6 -6
  6. data/doc-api/classes/Kwartz/AssertionError.html +6 -6
  7. data/doc-api/classes/Kwartz/AttrInfo.html +71 -61
  8. data/doc-api/classes/Kwartz/BaseError.html +12 -12
  9. data/doc-api/classes/Kwartz/BaseTranslator.html +104 -74
  10. data/doc-api/classes/Kwartz/CharacterType.html +24 -24
  11. data/doc-api/classes/Kwartz/CommandOptionError.html +7 -7
  12. data/doc-api/classes/Kwartz/CommandOptions.html +50 -50
  13. data/doc-api/classes/Kwartz/Config.html +5 -0
  14. data/doc-api/classes/Kwartz/ConvertError.html +12 -12
  15. data/doc-api/classes/Kwartz/Converter.html +31 -33
  16. data/doc-api/classes/Kwartz/CssStyleParser.html +207 -168
  17. data/doc-api/classes/Kwartz/Defun.html +32 -31
  18. data/doc-api/classes/Kwartz/{HandlerArgument.html → Directive.html} +27 -53
  19. data/doc-api/classes/Kwartz/ElementInfo.html +68 -53
  20. data/doc-api/classes/Kwartz/EperlExpressionParser.html +185 -0
  21. data/doc-api/classes/Kwartz/EperlHandler.html +65 -58
  22. data/doc-api/classes/Kwartz/EperlTranslator.html +14 -7
  23. data/doc-api/classes/Kwartz/ErubisTranslator.html +14 -7
  24. data/doc-api/classes/Kwartz/ErubyTranslator.html +14 -7
  25. data/doc-api/classes/Kwartz/ExpandStatement.html +20 -20
  26. data/doc-api/classes/Kwartz/Expander.html +358 -0
  27. data/doc-api/classes/Kwartz/Handler.html +287 -157
  28. data/doc-api/classes/Kwartz/{StatementHelper.html → HandlerHelper.html} +307 -112
  29. data/doc-api/classes/Kwartz/Helper/ActionViewHelper.html +23 -23
  30. data/doc-api/classes/Kwartz/Helper/RailsTemplate.html +96 -96
  31. data/doc-api/classes/Kwartz/JstlExpressionParser.html +181 -0
  32. data/doc-api/classes/Kwartz/JstlHandler.html +134 -126
  33. data/doc-api/classes/Kwartz/JstlTranslator.html +21 -14
  34. data/doc-api/classes/Kwartz/KwartzError.html +6 -6
  35. data/doc-api/classes/Kwartz/Main.html +4 -4
  36. data/doc-api/classes/Kwartz/NativeExpression.html +19 -19
  37. data/doc-api/classes/Kwartz/NativeStatement.html +24 -24
  38. data/doc-api/classes/Kwartz/Node.html +7 -7
  39. data/doc-api/classes/Kwartz/PIErubisTranslator.html +21 -14
  40. data/doc-api/classes/Kwartz/ParseError.html +6 -6
  41. data/doc-api/classes/Kwartz/PerlExpressionParser.html +185 -0
  42. data/doc-api/classes/Kwartz/PerlHandler.html +353 -0
  43. data/doc-api/classes/Kwartz/PerlTranslator.html +226 -0
  44. data/doc-api/classes/Kwartz/PhpExpressionParser.html +185 -0
  45. data/doc-api/classes/Kwartz/PhpHandler.html +63 -56
  46. data/doc-api/classes/Kwartz/PhpTranslator.html +21 -14
  47. data/doc-api/classes/Kwartz/PresentationLogicParser.html +126 -123
  48. data/doc-api/classes/Kwartz/PrintStatement.html +18 -18
  49. data/doc-api/classes/Kwartz/RailsHandler.html +84 -85
  50. data/doc-api/classes/Kwartz/RailsTranslator.html +13 -6
  51. data/doc-api/classes/Kwartz/RubyExpressionParser.html +180 -0
  52. data/doc-api/classes/Kwartz/RubyHandler.html +73 -69
  53. data/doc-api/classes/Kwartz/RubyStyleParser.html +86 -86
  54. data/doc-api/classes/Kwartz/RubyTranslator.html +28 -21
  55. data/doc-api/classes/Kwartz/Ruleset.html +622 -1
  56. data/doc-api/classes/Kwartz/StrutsTranslator.html +14 -14
  57. data/doc-api/classes/Kwartz/TagInfo.html +52 -27
  58. data/doc-api/classes/Kwartz/TextConverter.html +75 -37
  59. data/doc-api/classes/Kwartz/Translator.html +54 -53
  60. data/doc-api/classes/Kwartz/Util.html +25 -25
  61. data/doc-api/created.rid +1 -1
  62. data/doc-api/files/__/README_txt.html +7 -2
  63. data/doc-api/files/kwartz/assert_rb.html +2 -2
  64. data/doc-api/files/kwartz/binding/eperl_rb.html +2 -2
  65. data/doc-api/files/kwartz/binding/erubis_rb.html +2 -2
  66. data/doc-api/files/kwartz/binding/eruby_rb.html +2 -2
  67. data/doc-api/files/kwartz/binding/jstl_rb.html +2 -2
  68. data/doc-api/files/kwartz/binding/perl_rb.html +115 -0
  69. data/doc-api/files/kwartz/binding/php_rb.html +2 -2
  70. data/doc-api/files/kwartz/binding/pierubis_rb.html +2 -2
  71. data/doc-api/files/kwartz/binding/rails_rb.html +2 -2
  72. data/doc-api/files/kwartz/binding/ruby_rb.html +2 -2
  73. data/doc-api/files/kwartz/binding/struts_rb.html +2 -2
  74. data/doc-api/files/kwartz/config_rb.html +2 -2
  75. data/doc-api/files/kwartz/converter_rb.html +2 -2
  76. data/doc-api/files/kwartz/defun_rb.html +2 -2
  77. data/doc-api/files/kwartz/error_rb.html +2 -2
  78. data/doc-api/files/kwartz/helper/rails_rb.html +2 -2
  79. data/doc-api/files/kwartz/main_rb.html +3 -2
  80. data/doc-api/files/kwartz/node_rb.html +2 -2
  81. data/doc-api/files/kwartz/parser_rb.html +2 -2
  82. data/doc-api/files/kwartz/translator_rb.html +2 -2
  83. data/doc-api/files/kwartz/util/assert-text-equal_rb.html +2 -2
  84. data/doc-api/files/kwartz/util/testcase-helper_rb.html +2 -2
  85. data/doc-api/files/kwartz/util_rb.html +2 -2
  86. data/doc-api/files/kwartz_rb.html +2 -2
  87. data/doc-api/fr_class_index.html +10 -5
  88. data/doc-api/fr_file_index.html +1 -0
  89. data/doc-api/fr_method_index.html +268 -239
  90. data/doc/docstyle.css +9 -3
  91. data/doc/img/fig05.png +0 -0
  92. data/doc/introduction-to-kwartz.html +3040 -0
  93. data/doc/pattern-catalog.html +5 -3
  94. data/doc/reference.html +680 -26
  95. data/doc/users-guide.html +222 -67
  96. data/kwartz.gemspec +4 -4
  97. data/lib/kwartz.rb +3 -3
  98. data/lib/kwartz/assert.rb +2 -2
  99. data/lib/kwartz/binding/eperl.rb +71 -31
  100. data/lib/kwartz/binding/erubis.rb +3 -2
  101. data/lib/kwartz/binding/eruby.rb +3 -2
  102. data/lib/kwartz/binding/jstl.rb +66 -29
  103. data/lib/kwartz/binding/perl.rb +230 -0
  104. data/lib/kwartz/binding/php.rb +69 -29
  105. data/lib/kwartz/binding/pierubis.rb +3 -2
  106. data/lib/kwartz/binding/rails.rb +18 -18
  107. data/lib/kwartz/binding/ruby.rb +74 -42
  108. data/lib/kwartz/binding/struts.rb +22 -21
  109. data/lib/kwartz/config.rb +4 -4
  110. data/lib/kwartz/converter.rb +465 -345
  111. data/lib/kwartz/defun.rb +2 -2
  112. data/lib/kwartz/error.rb +2 -2
  113. data/lib/kwartz/helper/rails.rb +2 -2
  114. data/lib/kwartz/main.rb +5 -4
  115. data/lib/kwartz/node.rb +92 -144
  116. data/lib/kwartz/parser.rb +112 -103
  117. data/lib/kwartz/translator.rb +14 -6
  118. data/lib/kwartz/util.rb +2 -2
  119. data/lib/kwartz/util/assert-text-equal.rb +2 -2
  120. data/lib/kwartz/util/testcase-helper.rb +1 -1
  121. data/test/test-compile.rb +2 -2
  122. data/test/test-compile.yaml +81 -0
  123. data/test/test-converter.rb +4 -8
  124. data/test/test-converter.yaml +152 -3
  125. data/test/test-directives.rb +2 -2
  126. data/test/test-directives.yaml +222 -0
  127. data/test/test-main.rb +6 -4
  128. data/test/test-main.yaml +66 -1
  129. data/test/test-parser.rb +12 -3
  130. data/test/test-parser.yaml +64 -51
  131. data/test/test-rails.rb +2 -2
  132. data/test/test-ruleset.rb +2 -2
  133. data/test/test-ruleset.yaml +465 -4
  134. data/test/test.log +6 -0
  135. data/test/test.rb +2 -2
  136. metadata +116 -106
  137. data/ChangeLog +0 -156
  138. data/doc-api/classes/Kwartz/DocumentRuleset.html +0 -369
  139. data/doc-api/classes/Kwartz/ElementExpander.html +0 -325
  140. data/doc-api/classes/Kwartz/ElementRuleset.html +0 -612
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 136 $
3
- ### $Release: 3.1.2 $
2
+ ### $Rev$
3
+ ### $Release: 3.2.0 $
4
4
  ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ###
6
6
 
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 112 $
3
- ### $Release: 3.1.2 $
2
+ ### $Rev$
3
+ ### $Release: 3.2.0 $
4
4
  ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ###
6
6
 
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 148 $
3
- ### $Release: 3.1.2 $
2
+ ### $Rev$
3
+ ### $Release: 3.2.0 $
4
4
  ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ###
6
6
 
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 141 $
3
- ### $Release: 3.1.2 $
2
+ ### $Rev$
3
+ ### $Release: 3.2.0 $
4
4
  ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ###
6
6
 
@@ -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
@@ -1,6 +1,6 @@
1
1
  ####
2
- #### $Rev: 122 $
3
- #### $Release: 3.1.2 $
2
+ #### $Rev$
3
+ #### $Release: 3.2.0 $
4
4
  #### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ####
6
6
 
@@ -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
- ## .[abstract] ruleset entry in presentation logic file
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(name)
217
- @name = name
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
- attr_accessor :name, :stag, :cont, :etag, :elem
222
- attr_accessor :value, :attrs, :append, :remove, :tagname, :logic
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, escape_flag=nil)
231
- @cont = NativeExpression.new(str, escape_flag)
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, escape_flag=nil)
236
- @etag = NativeExpression.new(str, escape_flag)
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, escape_flag=nil)
241
- @elem = NativeExpression.new(str, escape_flag)
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, escape_flag=nil)
246
- set_cont(str, escape_flag)
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, escape_flag=nil)
251
- hash.each do |name, expr_str|
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[name] = NativeExpression.new(expr_str, escape_flag)
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, escape_flag=nil)
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, escape_flag)
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, @name)
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/ ; name = $1
294
- when /\A'(.*)'\z/ ; name = $1
295
- when /\A(\w+)\z/ ; name = $1
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\w+\z/
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+(.*?)|\((.+)\))\s*;?\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
- @logic = stmt_list
324
+ return stmt_list
312
325
  end
313
326
 
314
327
 
315
- def duplicate(name)
328
+ def duplicate()
316
329
  ruleset = dup()
317
- ruleset.name = name
318
- ruleset.attrs = @attrs.dup() if @attrs
319
- ruleset.append = @append.dup() if @append
320
- ruleset.remove = @remove.dup() if @remove
321
- ruleset.logic = @logic.dup() if @logic
322
- return ruleset
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 << "- name: #{@name}\n"
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
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 124 $
3
- ### $Release: 3.1.2 $
2
+ ### $Rev$
3
+ ### $Release: 3.2.0 $
4
4
  ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ###
6
6
 
@@ -95,7 +95,7 @@ module Kwartz
95
95
  table[word.capitalize] = sym
96
96
  table[word.upcase] = sym
97
97
  end
98
- %w[element remove tagname logic document global local fixture before after].each do |word|
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' => :BEGIN, 'END' => :END }
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 = DocumentRuleset.new
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
- ## // comment
587
- ## #list {
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
- c = getch();
609
- scan_ident()
610
- name = @value
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("@#{name}: unsupported command.")
628
+ raise parse_error("#{command}: unsupported command.")
616
629
  end
617
630
  end
618
- while @token == ?#
619
- scan_ident()
620
- name = @value
621
- if name == 'DOCUMENT'
622
- rulesets << parse_document_ruleset()
623
- else
624
- rulesets += parse_element_ruleset()
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}': '#name' is expected.")
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
- ## '#mark'
669
- if c == ?#
670
- c = getch()
671
- unless is_alpha(c)
672
- @error = :invalid_char
673
- @value = '#'
674
- return @token = :error
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 parse_element_ruleset
739
- assert unless @token == :ident
749
+ def parse_selectors
750
+ assert unless @token == :selector
740
751
  start_linenum = @linenum
741
- name = @value
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}': '#name' is expected.")
756
+ unless @token == :selector
757
+ raise parse_error("'#{@value}': selector is expected (or additional comma exists).") #'
749
758
  end
750
- scan_ident()
751
- names << @value
759
+ selectors << @value
752
760
  scan()
753
761
  end
754
- unless @token == :'{'
755
- raise parse_error("'#{@value}': '{' is expected.")
756
- end
762
+ return selectors
763
+ end
757
764
 
758
- ruleset = ElementRuleset.new(name)
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 _parse_expr() , flag_escape
766
- when :cont ; has_colon?(); ruleset.set_cont _parse_expr() , flag_escape
767
- when :etag ; has_colon?(); ruleset.set_etag _parse_expr() , flag_escape
768
- when :elem ; has_colon?(); ruleset.set_elem _parse_expr() , flag_escape
769
- when :value ; has_colon?(); ruleset.set_value _parse_expr() , flag_escape
770
- when :attrs ; has_colon?(); ruleset.set_attrs _parse_pairs(), flag_escape
771
- when :append ; has_colon?(); ruleset.set_append _parse_exprs(), flag_escape
772
- when :remove ; has_colon?(); ruleset.set_remove _parse_strs()
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 _parse_block()
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
- ## build rulesets
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
- ruleset_list = parser.parse(File.read(filename), filename)
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