kwartz 3.0.0 → 3.1.0

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