kwartz 3.0.0 → 3.1.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 (179) hide show
  1. data/ChangeLog +36 -1
  2. data/LGPL +504 -0
  3. data/README.txt +16 -2
  4. data/bin/kwartz +1 -1
  5. data/doc-api/classes/Kwartz.html +47 -1
  6. data/doc-api/classes/Kwartz/Assertion.html +6 -6
  7. data/doc-api/classes/Kwartz/AssertionError.html +6 -6
  8. data/doc-api/classes/Kwartz/AttrInfo.html +42 -42
  9. data/doc-api/classes/Kwartz/BaseError.html +12 -12
  10. data/doc-api/classes/Kwartz/BaseTranslator.html +210 -43
  11. data/doc-api/classes/Kwartz/CharacterType.html +24 -24
  12. data/doc-api/classes/Kwartz/CommandOptionError.html +7 -7
  13. data/doc-api/classes/Kwartz/CommandOptions.html +49 -49
  14. data/doc-api/classes/Kwartz/Config.html +6 -1
  15. data/doc-api/classes/Kwartz/ConvertError.html +14 -14
  16. data/doc-api/classes/Kwartz/Converter.html +31 -30
  17. data/doc-api/classes/Kwartz/CssStyleParser.html +79 -57
  18. data/doc-api/classes/Kwartz/Defun.html +313 -0
  19. data/doc-api/classes/Kwartz/DocumentRuleset.html +58 -58
  20. data/doc-api/classes/Kwartz/ElementExpander.html +32 -32
  21. data/doc-api/classes/Kwartz/ElementInfo.html +29 -29
  22. data/doc-api/classes/Kwartz/ElementRuleset.html +126 -96
  23. data/doc-api/classes/Kwartz/EperlHandler.html +108 -84
  24. data/doc-api/classes/Kwartz/EperlTranslator.html +7 -7
  25. data/doc-api/classes/Kwartz/ErubisHandler.html +2 -2
  26. data/doc-api/classes/Kwartz/ErubisTranslator.html +8 -8
  27. data/doc-api/classes/Kwartz/ErubyHandler.html +2 -220
  28. data/doc-api/classes/Kwartz/ErubyTranslator.html +7 -7
  29. data/doc-api/classes/Kwartz/ExpandStatement.html +20 -20
  30. data/doc-api/classes/Kwartz/Handler.html +122 -117
  31. data/doc-api/classes/Kwartz/HandlerArgument.html +215 -0
  32. data/doc-api/classes/Kwartz/Helper.html +112 -0
  33. data/doc-api/classes/Kwartz/Helper/ActionViewHelper.html +221 -0
  34. data/doc-api/classes/Kwartz/Helper/RailsTemplate.html +630 -0
  35. data/doc-api/classes/Kwartz/JstlHandler.html +208 -193
  36. data/doc-api/classes/Kwartz/JstlTranslator.html +15 -15
  37. data/doc-api/classes/Kwartz/KwartzError.html +6 -6
  38. data/doc-api/classes/Kwartz/Main.html +39 -23
  39. data/doc-api/classes/Kwartz/NativeExpression.html +18 -18
  40. data/doc-api/classes/Kwartz/NativeStatement.html +25 -25
  41. data/doc-api/classes/Kwartz/Node.html +6 -6
  42. data/doc-api/classes/Kwartz/PIErubisHandler.html +113 -0
  43. data/doc-api/classes/Kwartz/PIErubisTranslator.html +200 -0
  44. data/doc-api/classes/Kwartz/ParseError.html +6 -6
  45. data/doc-api/classes/Kwartz/PhpHandler.html +102 -83
  46. data/doc-api/classes/Kwartz/PhpTranslator.html +14 -14
  47. data/doc-api/classes/Kwartz/PresentationLogicParser.html +136 -128
  48. data/doc-api/classes/Kwartz/PrintStatement.html +19 -19
  49. data/doc-api/classes/Kwartz/RailsHandler.html +121 -118
  50. data/doc-api/classes/Kwartz/RailsTranslator.html +7 -7
  51. data/doc-api/classes/Kwartz/RubyHandler.html +349 -0
  52. data/doc-api/classes/Kwartz/RubyStyleParser.html +85 -85
  53. data/doc-api/classes/Kwartz/RubyTranslator.html +218 -0
  54. data/doc-api/classes/Kwartz/StatementHelper.html +479 -0
  55. data/doc-api/classes/Kwartz/StrutsTranslator.html +12 -12
  56. data/doc-api/classes/Kwartz/TagInfo.html +28 -28
  57. data/doc-api/classes/Kwartz/TextConverter.html +28 -28
  58. data/doc-api/classes/Kwartz/Translator.html +42 -42
  59. data/doc-api/classes/Kwartz/Util.html +284 -0
  60. data/doc-api/created.rid +1 -1
  61. data/doc-api/files/__/README_txt.html +30 -3
  62. data/doc-api/files/kwartz/assert_rb.html +1 -1
  63. data/doc-api/files/kwartz/binding/eperl_rb.html +2 -2
  64. data/doc-api/files/kwartz/binding/erubis_rb.html +3 -3
  65. data/doc-api/files/kwartz/binding/eruby_rb.html +3 -2
  66. data/doc-api/files/kwartz/binding/jstl_rb.html +2 -2
  67. data/doc-api/files/kwartz/binding/php_rb.html +2 -2
  68. data/doc-api/files/kwartz/binding/pierubis_rb.html +116 -0
  69. data/doc-api/files/kwartz/binding/rails_rb.html +2 -2
  70. data/doc-api/files/kwartz/binding/ruby_rb.html +115 -0
  71. data/doc-api/files/kwartz/binding/struts_rb.html +1 -1
  72. data/doc-api/files/kwartz/config_rb.html +2 -2
  73. data/doc-api/files/kwartz/converter_rb.html +3 -2
  74. data/doc-api/files/kwartz/defun_rb.html +116 -0
  75. data/doc-api/files/kwartz/error_rb.html +1 -1
  76. data/doc-api/files/kwartz/helper/rails_rb.html +123 -0
  77. data/doc-api/files/kwartz/main_rb.html +5 -2
  78. data/doc-api/files/kwartz/node_rb.html +2 -2
  79. data/doc-api/files/kwartz/parser_rb.html +2 -2
  80. data/doc-api/files/kwartz/translator_rb.html +2 -2
  81. data/doc-api/files/kwartz/util/assert-text-equal_rb.html +1 -1
  82. data/doc-api/files/kwartz/util/testcase-helper_rb.html +2 -2
  83. data/doc-api/files/kwartz/util_rb.html +107 -0
  84. data/doc-api/files/kwartz_rb.html +3 -2
  85. data/doc-api/fr_class_index.html +11 -0
  86. data/doc-api/fr_file_index.html +5 -0
  87. data/doc-api/fr_method_index.html +242 -190
  88. data/doc/p-pattern.html +94 -94
  89. data/doc/reference.html +847 -612
  90. data/doc/users-guide.html +744 -241
  91. data/examples/rails1/README +2 -2
  92. data/examples/rails1/application_helper.rb +2 -27
  93. data/examples/rails1/link_to.plogic +5 -5
  94. data/examples/rails1/list.plogic +2 -2
  95. data/examples/rails2/app/controllers/application.rb +14 -0
  96. data/examples/rails2/app/controllers/groups_controller.rb +47 -0
  97. data/examples/rails2/app/controllers/members_controller.rb +56 -0
  98. data/examples/rails2/app/helpers/application_helper.rb +6 -0
  99. data/examples/rails2/app/helpers/groups_helper.rb +2 -0
  100. data/examples/rails2/app/helpers/members_helper.rb +2 -0
  101. data/examples/rails2/app/models/group.rb +2 -0
  102. data/examples/rails2/app/models/member.rb +3 -0
  103. data/examples/rails2/app/views/groups/_form.html +30 -0
  104. data/examples/rails2/app/views/groups/_form.plogic +11 -0
  105. data/examples/rails2/app/views/groups/_link.plogic +19 -0
  106. data/examples/rails2/app/views/groups/_read.plogic +7 -0
  107. data/examples/rails2/app/views/groups/edit.cfg.yaml +2 -0
  108. data/examples/rails2/app/views/groups/edit.html +26 -0
  109. data/examples/rails2/app/views/groups/edit.plogic +9 -0
  110. data/examples/rails2/app/views/groups/list.html +48 -0
  111. data/examples/rails2/app/views/groups/list.plogic +32 -0
  112. data/examples/rails2/app/views/groups/new.cfg.yaml +2 -0
  113. data/examples/rails2/app/views/groups/new.html +27 -0
  114. data/examples/rails2/app/views/groups/new.plogic +9 -0
  115. data/examples/rails2/app/views/groups/show.html +27 -0
  116. data/examples/rails2/app/views/groups/show.plogic +2 -0
  117. data/examples/rails2/app/views/layouts/groups.html +23 -0
  118. data/examples/rails2/app/views/layouts/groups.plogic +11 -0
  119. data/examples/rails2/app/views/layouts/members.html +23 -0
  120. data/examples/rails2/app/views/layouts/members.plogic +11 -0
  121. data/examples/rails2/app/views/layouts/members2.html +24 -0
  122. data/examples/rails2/app/views/layouts/members2.plogic +11 -0
  123. data/examples/rails2/app/views/members/_form.plogic +27 -0
  124. data/examples/rails2/app/views/members/_link.plogic +19 -0
  125. data/examples/rails2/app/views/members/_read.plogic +29 -0
  126. data/examples/rails2/app/views/members/edit.cfg.yaml +6 -0
  127. data/examples/rails2/app/views/members/edit.html +27 -0
  128. data/examples/rails2/app/views/members/edit.plogic +10 -0
  129. data/examples/rails2/app/views/members/list.html +53 -0
  130. data/examples/rails2/app/views/members/list.plogic +32 -0
  131. data/examples/rails2/app/views/members/new.html +61 -0
  132. data/examples/rails2/app/views/members/new.plogic +17 -0
  133. data/examples/rails2/app/views/members/show.html +41 -0
  134. data/examples/rails2/app/views/members/show.plogic +3 -0
  135. data/examples/rails2/db/create-tables.mysql.sql +27 -0
  136. data/examples/rails2/db/create-tables.pgsql.sql +27 -0
  137. data/examples/rails2/db/insert-data.sql +21 -0
  138. data/examples/rails2/db/tabledef.yaml +51 -0
  139. data/kwartz.gemspec +4 -4
  140. data/lib/kwartz.rb +10 -2
  141. data/lib/kwartz/assert.rb +1 -1
  142. data/lib/kwartz/binding/eperl.rb +85 -61
  143. data/lib/kwartz/binding/erubis.rb +6 -8
  144. data/lib/kwartz/binding/eruby.rb +5 -120
  145. data/lib/kwartz/binding/jstl.rb +116 -101
  146. data/lib/kwartz/binding/php.rb +79 -60
  147. data/lib/kwartz/binding/pierubis.rb +58 -0
  148. data/lib/kwartz/binding/rails.rb +45 -42
  149. data/lib/kwartz/binding/ruby.rb +193 -0
  150. data/lib/kwartz/binding/struts.rb +1 -1
  151. data/lib/kwartz/config.rb +4 -3
  152. data/lib/kwartz/converter.rb +231 -68
  153. data/lib/kwartz/defun.rb +126 -0
  154. data/lib/kwartz/error.rb +1 -1
  155. data/lib/kwartz/helper/rails.rb +437 -0
  156. data/lib/kwartz/main.rb +30 -38
  157. data/lib/kwartz/node.rb +46 -31
  158. data/lib/kwartz/parser.rb +43 -15
  159. data/lib/kwartz/translator.rb +104 -6
  160. data/lib/kwartz/util.rb +113 -0
  161. data/lib/kwartz/util/assert-text-equal.rb +1 -1
  162. data/lib/kwartz/util/testcase-helper.rb +26 -8
  163. data/test/test-compile.rb +3 -3
  164. data/test/test-compile.yaml +135 -5
  165. data/test/test-converter.rb +16 -8
  166. data/test/test-converter.yaml +307 -76
  167. data/test/test-directives.rb +1 -1
  168. data/test/test-directives.yaml +964 -979
  169. data/test/test-main.rb +61 -146
  170. data/test/test-main.yaml +235 -0
  171. data/test/test-parser.rb +10 -12
  172. data/test/test-parser.yaml +484 -326
  173. data/test/test-rails.rb +1 -1
  174. data/test/test-rails.yaml +37 -37
  175. data/test/test-ruleset.rb +1 -1
  176. data/test/test-ruleset.yaml +34 -40
  177. data/test/test.rb +1 -1
  178. metadata +82 -3
  179. data/COPYING +0 -340
@@ -1,18 +1,21 @@
1
1
  ###
2
- ### $Rev: 113 $
3
- ### $Release: 3.0.0 $
2
+ ### $Rev: 136 $
3
+ ### $Release: 3.1.0 $
4
4
  ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ###
6
6
 
7
7
 
8
8
  require 'kwartz'
9
9
  require 'kwartz/binding/eruby'
10
+ require 'kwartz/binding/ruby'
10
11
  require 'kwartz/binding/php'
11
12
  require 'kwartz/binding/eperl'
12
13
  require 'kwartz/binding/rails'
13
14
  require 'kwartz/binding/jstl'
14
15
  require 'kwartz/binding/struts'
15
16
  require 'kwartz/binding/erubis'
17
+ require 'kwartz/binding/pierubis'
18
+ require 'kwartz/util'
16
19
 
17
20
 
18
21
 
@@ -190,8 +193,10 @@ module Kwartz
190
193
  [ ?D, :debug, nil ],
191
194
  [ ?t, :untabify, nil ],
192
195
  [ ?S, :intern, nil ],
196
+ [ ?N, :notext, nil ],
193
197
  [ ?l, :lang, 'lang name' ],
194
198
  [ ?k, :kanji, 'kanji code' ],
199
+ [ ?a, :action, 'action name' ],
195
200
  [ ?r, :requires, 'library name' ],
196
201
  [ ?p, :plogics, 'file name' ],
197
202
  [ ?P, :pstyle, 'parser style' ],
@@ -327,8 +332,24 @@ module Kwartz
327
332
  properties[:nl] ||= "\r\n"
328
333
  end
329
334
  translator = translator_class.new(properties)
335
+ if options.notext
336
+ translator.extend(Kwartz::NoTextEnhancer)
337
+ end
330
338
  output = translator.translate(stmt_list)
331
339
 
340
+ ## action
341
+ if options.action
342
+ case options.action
343
+ when 'compile'
344
+ # nothing
345
+ when 'defun'
346
+ basename = File.basename(pdata_filenames.first).sub(/\.\w+/, '')
347
+ output = Kwartz::Defun.defun(basename, output, lang, properties)
348
+ else
349
+ option_error("-#{options.chr(:action)} #{options.aciton}: invalid action.")
350
+ end
351
+ end
352
+
332
353
  ## load YAML file and evaluate eRuby script
333
354
  if options.yamlfile
334
355
  eruby_script = output
@@ -351,14 +372,14 @@ module Kwartz
351
372
  raise option_error("#{s}: file not found.")
352
373
  end
353
374
  str = File.read(options.yamlfile)
354
- str = untabify(str) if options.untabify
375
+ str = Kwartz::Util.untabify(str) if options.untabify
355
376
  require 'yaml'
356
377
  ydoc = YAML.load(str)
357
378
  unless ydoc.is_a?(Hash)
358
379
  s = "-#{options.chr(:yamlfile)} #{options.yamlfile}"
359
380
  raise option_error("#{s}: not a mapping.")
360
381
  end
361
- intern_hash_keys(ydoc) if options.intern
382
+ Kwartz::Util.intern_hash_keys(ydoc) if options.intern
362
383
  context = Object.new
363
384
  ydoc.each do |key, val|
364
385
  context.instance_variable_set("@#{key}", val)
@@ -379,12 +400,13 @@ module Kwartz
379
400
  sb = []
380
401
  sb << "kwartz - a template system which realized 'Independence of Presentation Logic'\n"
381
402
  sb << "Usage: #{@command} [..options..] [-p plogic] file.html [file2.html ...]\n"
382
- sb << " -h : help\n"
403
+ sb << " -h, --help : help\n"
383
404
  sb << " -v : version\n"
384
405
  #sb << " -D : debug mode\n"
385
406
  sb << " -e : alias of '--escape=true'\n"
386
- sb << " -l lang : eruby/php/eperl/rails/jstl (default 'eruby')\n"
407
+ sb << " -l lang : eruby/ruby/rails/php/jstl/eperl/erubis/pierubis (default 'eruby')\n"
387
408
  sb << " -k kanji : euc/sjis/utf8 (default nil)\n"
409
+ sb << " -a action : compile/defun (default 'compile')\n"
388
410
  sb << " -r library,... : require libraries\n"
389
411
  sb << " -p plogic,... : presentation logic files\n"
390
412
  sb << " -i pdata,... : import presentation data files\n"
@@ -394,6 +416,7 @@ module Kwartz
394
416
  sb << " -f yamlfile : YAML file for context values\n"
395
417
  sb << " -t : expand tab character in YAML file\n"
396
418
  sb << " -S : convert mapping key from string to symbol in YAML file\n"
419
+ sb << " -N : print only program code (text is ignored)\n"
397
420
  #sb << " -P style : style of presentation logic (css/ruby/yaml)\n"
398
421
  sb << " --dattr=str : directive attribute name\n"
399
422
  sb << " --odd=value : odd value for FOREACH/LOOP directive (default \"'odd'\")\n"
@@ -409,8 +432,7 @@ module Kwartz
409
432
 
410
433
 
411
434
  def version
412
- v = ('$Release: 3.0.0 $' =~ /[.\d]+/) && $&
413
- return v
435
+ return RELEASE
414
436
  end
415
437
 
416
438
 
@@ -419,36 +441,6 @@ module Kwartz
419
441
  end
420
442
 
421
443
 
422
- def untabify(str, width=8)
423
- sb = ''
424
- str.scan(/(.*?)\t/m) do |s, |
425
- len = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
426
- sb << s << (" " * (width - len % width))
427
- end
428
- return $' ? (sb << $') : str
429
- end
430
-
431
-
432
- def intern_hash_keys(obj, done={})
433
- return if done.key?(obj.__id__)
434
- case obj
435
- when Hash
436
- done[obj.__id__] = obj
437
- obj.keys.each do |key|
438
- obj[key.intern] = obj.delete(key) if key.is_a?(String)
439
- end
440
- obj.values.each do |val|
441
- intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array)
442
- end
443
- when Array
444
- done[obj.__id__] = obj
445
- obj.each do |val|
446
- intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array)
447
- end
448
- end
449
- end
450
-
451
-
452
444
  end #class
453
445
 
454
446
 
@@ -1,6 +1,6 @@
1
1
  ####
2
- #### $Rev: 117 $
3
- #### $Release: 3.0.0 $
2
+ #### $Rev: 122 $
3
+ #### $Release: 3.1.0 $
4
4
  #### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ####
6
6
 
@@ -125,7 +125,7 @@ module Kwartz
125
125
 
126
126
 
127
127
  def _inspect(indent=0)
128
- return @code.inspect
128
+ return "<%#{@code}%>\n"
129
129
  end
130
130
 
131
131
 
@@ -154,9 +154,9 @@ module Kwartz
154
154
 
155
155
  def _inspect(indent=0)
156
156
  if @kind == :element || @kind == :content
157
- return "_#{@kind}(#{@name.inspect})"
157
+ return "_#{@kind}(#{@name})\n"
158
158
  else
159
- return "_#{@kind}"
159
+ return "_#{@kind}\n"
160
160
  end
161
161
  end
162
162
 
@@ -186,7 +186,7 @@ module Kwartz
186
186
  list = @args.collect { |arg|
187
187
  arg.is_a?(NativeExpression) ? "<%=#{arg.code}%>" : arg.inspect
188
188
  }
189
- return "[ " + list.join(', ') + "]"
189
+ return "print(" + list.join(', ') + ")\n"
190
190
  end
191
191
 
192
192
 
@@ -312,38 +312,49 @@ module Kwartz
312
312
  end
313
313
 
314
314
 
315
+ def duplicate(name)
316
+ 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
323
+ end
324
+
325
+
315
326
  def _inspect(indent=0)
316
327
  space = ' ' * indent
317
328
  sb = []
318
- sb << space << "name: #{@name.inspect}\n"
319
- #sb << space << "value: #{@value == nil ? '' : @value.inspect}\n"
320
- sb << space << "stag: #{@stag.code.inspect}\n" unless @stag.nil?
321
- sb << space << "cont: #{@cont.code.inspect}\n" unless @cont.nil?
322
- sb << space << "etag: #{@etag.code.inspect}\n" unless @etag.nil?
323
- sb << space << "elem: #{@elem.code.inspect}\n" unless @elem.nil?
329
+ sb << space << "- name: #{@name}\n"
330
+ #sb << space << " value: #{@value == nil ? '' : @value}\n"
331
+ sb << space << " stag: #{@stag.code}\n" unless @stag.nil?
332
+ sb << space << " cont: #{@cont.code}\n" unless @cont.nil?
333
+ sb << space << " etag: #{@etag.code}\n" unless @etag.nil?
334
+ sb << space << " elem: #{@elem.code}\n" unless @elem.nil?
324
335
  #
325
- sb << space << "attrs:\n" if @attrs
336
+ sb << space << " attrs:\n" if @attrs
326
337
  @attrs.keys.sort.each do |key|
327
338
  val = @attrs[key]
328
- sb << space << " - name: #{key.inspect}\n"
329
- sb << space << " value: #{val.code.inspect}\n"
339
+ sb << space << " - name: #{key}\n"
340
+ sb << space << " value: #{val.code}\n"
330
341
  end if @attrs
331
342
  #
332
- sb << space << "append:\n" if @append
343
+ sb << space << " append:\n" if @append
333
344
  @append.each do |expr|
334
- sb << space << " - #{expr.code.inspect}\n"
345
+ sb << space << " - #{expr.code}\n"
335
346
  end if @append
336
347
  #
337
- sb << space << "remove:\n" if @remove
348
+ sb << space << " remove:\n" if @remove
338
349
  @remove.each do |name|
339
- sb << space << " - #{name.inspect}\n"
350
+ sb << space << " - #{name}\n"
340
351
  end if @remove
341
352
  #
342
- sb << space << "tagname: #{@tagname.inspect}\n" unless @tagname.nil?
353
+ sb << space << " tagname: #{@tagname}\n" unless @tagname.nil?
343
354
  #
344
- sb << space << "logic:\n" if @logic
355
+ sb << space << " logic:\n" if @logic
345
356
  @logic.each do |stmt|
346
- sb << space << " - " << stmt._inspect() << "\n"
357
+ sb << space << " - " << stmt._inspect()
347
358
  end if @logic
348
359
  #
349
360
  return sb.join
@@ -395,8 +406,10 @@ module Kwartz
395
406
  @end = stmt_list
396
407
  end
397
408
 
409
+
398
410
  private
399
411
 
412
+
400
413
  def _parse_stmts(str)
401
414
  return unless str
402
415
  stmt_list = []
@@ -412,34 +425,36 @@ module Kwartz
412
425
  return stmt_list
413
426
  end
414
427
 
428
+
415
429
  public
416
430
 
431
+
417
432
  def _inspect(indent=0)
418
433
  space = ' ' * indent
419
434
  sb = []
420
- sb << space << "name: #{@name.inspect}\n"
435
+ sb << space << "- name: #{@name}\n"
421
436
  if @global
422
- sb << space << "global:\n"
437
+ sb << space << " global:\n"
423
438
  @global.each do |item|
424
- sb << space << " - #{item}\n"
439
+ sb << space << " - #{item}\n"
425
440
  end
426
441
  end
427
442
  if @local
428
- sb << space << "local:\n"
443
+ sb << space << " local:\n"
429
444
  @local.each do |item|
430
- sb << space << " - #{item}\n"
445
+ sb << space << " - #{item}\n"
431
446
  end
432
447
  end
433
448
  if @begin
434
- sb << space << "begin:\n"
449
+ sb << space << " begin:\n"
435
450
  @begin.each do |stmt|
436
- sb << space << " - #{stmt._inspect}\n"
451
+ sb << space << " - #{stmt._inspect}"
437
452
  end
438
453
  end
439
454
  if @end
440
- sb << space << "end:\n"
455
+ sb << space << " end:\n"
441
456
  @end.each do |stmt|
442
- sb << space << " - #{stmt._inspect}\n"
457
+ sb << space << " - #{stmt._inspect}"
443
458
  end
444
459
  end
445
460
  #
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 117 $
3
- ### $Release: 3.0.0 $
2
+ ### $Rev: 124 $
3
+ ### $Release: 3.1.0 $
4
4
  ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
5
  ###
6
6
 
@@ -69,6 +69,7 @@ module Kwartz
69
69
 
70
70
  ## called from parse() and initialize parser object
71
71
  def reset(input, filename='')
72
+ input or raise ArgumentError.new("#{self.class.name}#reset() requires string argument.")
72
73
  @input = input
73
74
  @filename = filename
74
75
  @linenum = 1 # 1 start
@@ -212,7 +213,7 @@ module Kwartz
212
213
  end
213
214
 
214
215
 
215
- ## called from scan()
216
+ ## called from scan(), return false when not hooked
216
217
  def scan_hook
217
218
  #not_implemented
218
219
  end
@@ -240,7 +241,7 @@ module Kwartz
240
241
 
241
242
  ## scan hook
242
243
  ret = scan_hook() # scan_hook() is overrided in subclass
243
- return ret if ret
244
+ return ret if ret != false
244
245
 
245
246
  ## keyword or identifer
246
247
  if is_identchar(c)
@@ -273,6 +274,13 @@ module Kwartz
273
274
  return @token = :'}'
274
275
  end
275
276
 
277
+ ## ','
278
+ if c == ?,
279
+ @value = ","
280
+ getch()
281
+ return @token = :','
282
+ end
283
+
276
284
  ##
277
285
  @value = c.chr
278
286
  @error = :invalid_char
@@ -349,8 +357,8 @@ module Kwartz
349
357
  assert("@error=#{@error}")
350
358
  end
351
359
  end
352
- @value.sub!(/\A\s*\n/, '')
353
- @value.sub!(/^\s+\z/, '')
360
+ @value.sub!(/\A[ \t]*\n/, '')
361
+ @value.sub!(/^[ \t]+\z/, '')
354
362
  return @value
355
363
  end
356
364
 
@@ -422,7 +430,7 @@ module Kwartz
422
430
  scan_line
423
431
  return scan()
424
432
  end
425
- return nil
433
+ return false
426
434
  end
427
435
 
428
436
 
@@ -611,11 +619,10 @@ module Kwartz
611
619
  scan_ident()
612
620
  name = @value
613
621
  if name == 'DOCUMENT'
614
- ruleset = parse_document_ruleset()
622
+ rulesets << parse_document_ruleset()
615
623
  else
616
- ruleset = parse_element_ruleset()
624
+ rulesets += parse_element_ruleset()
617
625
  end
618
- rulesets << ruleset
619
626
  end
620
627
  unless @token == nil
621
628
  raise parse_error("'#{@value}': '#name' is expected.")
@@ -627,6 +634,7 @@ module Kwartz
627
634
  protected
628
635
 
629
636
 
637
+ ## return false when not hooked
630
638
  def scan_hook
631
639
  ## comment
632
640
  c = @ch
@@ -675,7 +683,7 @@ module Kwartz
675
683
  return @token = ?@
676
684
  end
677
685
 
678
- return nil
686
+ return false
679
687
 
680
688
  end #def
681
689
 
@@ -701,8 +709,8 @@ module Kwartz
701
709
  when :global ; has_colon?(); ruleset.set_global _parse_words()
702
710
  when :local ; has_colon?(); ruleset.set_local _parse_words()
703
711
  when :fixture ; has_colon?(); ruleset.set_fixture _parse_block()
704
- when :begin ; has_colon?(); ruleset.set_begin _parse_block()
705
- when :end ; has_colon?(); ruleset.set_end _parse_block()
712
+ when :begin ; has_colon?(); ruleset.set_begin _parse_block()
713
+ when :end ; has_colon?(); ruleset.set_end _parse_block()
706
714
  #when :before ; has_colon?(); ruleset.set_before _parse_block()
707
715
  #when :after ; has_colon?(); ruleset.set_after _parse_block()
708
716
  else
@@ -731,10 +739,22 @@ module Kwartz
731
739
  assert unless @token == :ident
732
740
  start_linenum = @linenum
733
741
  name = @value
742
+ #names = [name]
743
+ names = []
734
744
  scan()
745
+ while @token == :','
746
+ scan()
747
+ unless @token == ?#
748
+ raise parse_error("'#{@value}': '#name' is expected.")
749
+ end
750
+ scan_ident()
751
+ names << @value
752
+ scan()
753
+ end
735
754
  unless @token == :'{'
736
755
  raise parse_error("'#{@value}': '{' is expected.")
737
756
  end
757
+
738
758
  ruleset = ElementRuleset.new(name)
739
759
  while true
740
760
  scan()
@@ -750,18 +770,22 @@ module Kwartz
750
770
  when :attrs ; has_colon?(); ruleset.set_attrs _parse_pairs(), flag_escape
751
771
  when :append ; has_colon?(); ruleset.set_append _parse_exprs(), flag_escape
752
772
  when :remove ; has_colon?(); ruleset.set_remove _parse_strs()
753
- when :tagname; has_colon?(); ruleset.set_tagname _parse_str()
773
+ when :tagname; has_colon?(); ruleset.set_tagname _parse_str()
754
774
  when :logic ; has_colon?(); ruleset.set_logic _parse_block()
755
775
  else
756
776
  raise parse_error("'#{@value}': unexpected token.")
757
777
  end
758
778
  end
779
+ ## build rulesets
780
+ rulesets = [ruleset]
781
+ names.each do |name| rulesets << ruleset.duplicate(name) end
782
+
759
783
  unless @token
760
784
  raise parse_error("'##{name}': is not closed by '}'.", start_linenum)
761
785
  end
762
786
  assert "@token=#{@token.inspect}" unless @token == :'}'
763
787
  scan()
764
- return ruleset
788
+ return rulesets
765
789
  end
766
790
 
767
791
 
@@ -771,6 +795,10 @@ module Kwartz
771
795
  t = scan_string()
772
796
  t == :string or raise parse_error("@import: requires filename.")
773
797
  filename = @value
798
+ if @filename && !@filename.empty?
799
+ dir = File.dirname(@filename)
800
+ filename = dir + '/' + filename if dir != '.'
801
+ end
774
802
  test(?f, filename) or raise parse_error("'#{filename}': import file not found.")
775
803
  c = @ch
776
804
  c = getch() while is_whitespace(c)