kwartz 3.1.2 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. data/CHANGES +444 -0
  2. data/README.txt +4 -1
  3. data/bin/kwartz +2 -2
  4. data/doc-api/classes/Kwartz.html +16 -7
  5. data/doc-api/classes/Kwartz/Assertion.html +6 -6
  6. data/doc-api/classes/Kwartz/AssertionError.html +6 -6
  7. data/doc-api/classes/Kwartz/AttrInfo.html +71 -61
  8. data/doc-api/classes/Kwartz/BaseError.html +12 -12
  9. data/doc-api/classes/Kwartz/BaseTranslator.html +104 -74
  10. data/doc-api/classes/Kwartz/CharacterType.html +24 -24
  11. data/doc-api/classes/Kwartz/CommandOptionError.html +7 -7
  12. data/doc-api/classes/Kwartz/CommandOptions.html +50 -50
  13. data/doc-api/classes/Kwartz/Config.html +5 -0
  14. data/doc-api/classes/Kwartz/ConvertError.html +12 -12
  15. data/doc-api/classes/Kwartz/Converter.html +31 -33
  16. data/doc-api/classes/Kwartz/CssStyleParser.html +207 -168
  17. data/doc-api/classes/Kwartz/Defun.html +32 -31
  18. data/doc-api/classes/Kwartz/{HandlerArgument.html → Directive.html} +27 -53
  19. data/doc-api/classes/Kwartz/ElementInfo.html +68 -53
  20. data/doc-api/classes/Kwartz/EperlExpressionParser.html +185 -0
  21. data/doc-api/classes/Kwartz/EperlHandler.html +65 -58
  22. data/doc-api/classes/Kwartz/EperlTranslator.html +14 -7
  23. data/doc-api/classes/Kwartz/ErubisTranslator.html +14 -7
  24. data/doc-api/classes/Kwartz/ErubyTranslator.html +14 -7
  25. data/doc-api/classes/Kwartz/ExpandStatement.html +20 -20
  26. data/doc-api/classes/Kwartz/Expander.html +358 -0
  27. data/doc-api/classes/Kwartz/Handler.html +287 -157
  28. data/doc-api/classes/Kwartz/{StatementHelper.html → HandlerHelper.html} +307 -112
  29. data/doc-api/classes/Kwartz/Helper/ActionViewHelper.html +23 -23
  30. data/doc-api/classes/Kwartz/Helper/RailsTemplate.html +96 -96
  31. data/doc-api/classes/Kwartz/JstlExpressionParser.html +181 -0
  32. data/doc-api/classes/Kwartz/JstlHandler.html +134 -126
  33. data/doc-api/classes/Kwartz/JstlTranslator.html +21 -14
  34. data/doc-api/classes/Kwartz/KwartzError.html +6 -6
  35. data/doc-api/classes/Kwartz/Main.html +4 -4
  36. data/doc-api/classes/Kwartz/NativeExpression.html +19 -19
  37. data/doc-api/classes/Kwartz/NativeStatement.html +24 -24
  38. data/doc-api/classes/Kwartz/Node.html +7 -7
  39. data/doc-api/classes/Kwartz/PIErubisTranslator.html +21 -14
  40. data/doc-api/classes/Kwartz/ParseError.html +6 -6
  41. data/doc-api/classes/Kwartz/PerlExpressionParser.html +185 -0
  42. data/doc-api/classes/Kwartz/PerlHandler.html +353 -0
  43. data/doc-api/classes/Kwartz/PerlTranslator.html +226 -0
  44. data/doc-api/classes/Kwartz/PhpExpressionParser.html +185 -0
  45. data/doc-api/classes/Kwartz/PhpHandler.html +63 -56
  46. data/doc-api/classes/Kwartz/PhpTranslator.html +21 -14
  47. data/doc-api/classes/Kwartz/PresentationLogicParser.html +126 -123
  48. data/doc-api/classes/Kwartz/PrintStatement.html +18 -18
  49. data/doc-api/classes/Kwartz/RailsHandler.html +84 -85
  50. data/doc-api/classes/Kwartz/RailsTranslator.html +13 -6
  51. data/doc-api/classes/Kwartz/RubyExpressionParser.html +180 -0
  52. data/doc-api/classes/Kwartz/RubyHandler.html +73 -69
  53. data/doc-api/classes/Kwartz/RubyStyleParser.html +86 -86
  54. data/doc-api/classes/Kwartz/RubyTranslator.html +28 -21
  55. data/doc-api/classes/Kwartz/Ruleset.html +622 -1
  56. data/doc-api/classes/Kwartz/StrutsTranslator.html +14 -14
  57. data/doc-api/classes/Kwartz/TagInfo.html +52 -27
  58. data/doc-api/classes/Kwartz/TextConverter.html +75 -37
  59. data/doc-api/classes/Kwartz/Translator.html +54 -53
  60. data/doc-api/classes/Kwartz/Util.html +25 -25
  61. data/doc-api/created.rid +1 -1
  62. data/doc-api/files/__/README_txt.html +7 -2
  63. data/doc-api/files/kwartz/assert_rb.html +2 -2
  64. data/doc-api/files/kwartz/binding/eperl_rb.html +2 -2
  65. data/doc-api/files/kwartz/binding/erubis_rb.html +2 -2
  66. data/doc-api/files/kwartz/binding/eruby_rb.html +2 -2
  67. data/doc-api/files/kwartz/binding/jstl_rb.html +2 -2
  68. data/doc-api/files/kwartz/binding/perl_rb.html +115 -0
  69. data/doc-api/files/kwartz/binding/php_rb.html +2 -2
  70. data/doc-api/files/kwartz/binding/pierubis_rb.html +2 -2
  71. data/doc-api/files/kwartz/binding/rails_rb.html +2 -2
  72. data/doc-api/files/kwartz/binding/ruby_rb.html +2 -2
  73. data/doc-api/files/kwartz/binding/struts_rb.html +2 -2
  74. data/doc-api/files/kwartz/config_rb.html +2 -2
  75. data/doc-api/files/kwartz/converter_rb.html +2 -2
  76. data/doc-api/files/kwartz/defun_rb.html +2 -2
  77. data/doc-api/files/kwartz/error_rb.html +2 -2
  78. data/doc-api/files/kwartz/helper/rails_rb.html +2 -2
  79. data/doc-api/files/kwartz/main_rb.html +3 -2
  80. data/doc-api/files/kwartz/node_rb.html +2 -2
  81. data/doc-api/files/kwartz/parser_rb.html +2 -2
  82. data/doc-api/files/kwartz/translator_rb.html +2 -2
  83. data/doc-api/files/kwartz/util/assert-text-equal_rb.html +2 -2
  84. data/doc-api/files/kwartz/util/testcase-helper_rb.html +2 -2
  85. data/doc-api/files/kwartz/util_rb.html +2 -2
  86. data/doc-api/files/kwartz_rb.html +2 -2
  87. data/doc-api/fr_class_index.html +10 -5
  88. data/doc-api/fr_file_index.html +1 -0
  89. data/doc-api/fr_method_index.html +268 -239
  90. data/doc/docstyle.css +9 -3
  91. data/doc/img/fig05.png +0 -0
  92. data/doc/introduction-to-kwartz.html +3040 -0
  93. data/doc/pattern-catalog.html +5 -3
  94. data/doc/reference.html +680 -26
  95. data/doc/users-guide.html +222 -67
  96. data/kwartz.gemspec +4 -4
  97. data/lib/kwartz.rb +3 -3
  98. data/lib/kwartz/assert.rb +2 -2
  99. data/lib/kwartz/binding/eperl.rb +71 -31
  100. data/lib/kwartz/binding/erubis.rb +3 -2
  101. data/lib/kwartz/binding/eruby.rb +3 -2
  102. data/lib/kwartz/binding/jstl.rb +66 -29
  103. data/lib/kwartz/binding/perl.rb +230 -0
  104. data/lib/kwartz/binding/php.rb +69 -29
  105. data/lib/kwartz/binding/pierubis.rb +3 -2
  106. data/lib/kwartz/binding/rails.rb +18 -18
  107. data/lib/kwartz/binding/ruby.rb +74 -42
  108. data/lib/kwartz/binding/struts.rb +22 -21
  109. data/lib/kwartz/config.rb +4 -4
  110. data/lib/kwartz/converter.rb +465 -345
  111. data/lib/kwartz/defun.rb +2 -2
  112. data/lib/kwartz/error.rb +2 -2
  113. data/lib/kwartz/helper/rails.rb +2 -2
  114. data/lib/kwartz/main.rb +5 -4
  115. data/lib/kwartz/node.rb +92 -144
  116. data/lib/kwartz/parser.rb +112 -103
  117. data/lib/kwartz/translator.rb +14 -6
  118. data/lib/kwartz/util.rb +2 -2
  119. data/lib/kwartz/util/assert-text-equal.rb +2 -2
  120. data/lib/kwartz/util/testcase-helper.rb +1 -1
  121. data/test/test-compile.rb +2 -2
  122. data/test/test-compile.yaml +81 -0
  123. data/test/test-converter.rb +4 -8
  124. data/test/test-converter.yaml +152 -3
  125. data/test/test-directives.rb +2 -2
  126. data/test/test-directives.yaml +222 -0
  127. data/test/test-main.rb +6 -4
  128. data/test/test-main.yaml +66 -1
  129. data/test/test-parser.rb +12 -3
  130. data/test/test-parser.yaml +64 -51
  131. data/test/test-rails.rb +2 -2
  132. data/test/test-ruleset.rb +2 -2
  133. data/test/test-ruleset.yaml +465 -4
  134. data/test/test.log +6 -0
  135. data/test/test.rb +2 -2
  136. metadata +116 -106
  137. data/ChangeLog +0 -156
  138. data/doc-api/classes/Kwartz/DocumentRuleset.html +0 -369
  139. data/doc-api/classes/Kwartz/ElementExpander.html +0 -325
  140. data/doc-api/classes/Kwartz/ElementRuleset.html +0 -612
@@ -1,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