kwartz 3.0.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 (169) hide show
  1. data/COPYING +340 -0
  2. data/ChangeLog +103 -0
  3. data/README.txt +37 -0
  4. data/bin/kwartz +12 -0
  5. data/doc-api/classes/Kwartz.html +218 -0
  6. data/doc-api/classes/Kwartz/Assertion.html +140 -0
  7. data/doc-api/classes/Kwartz/AssertionError.html +148 -0
  8. data/doc-api/classes/Kwartz/AttrInfo.html +320 -0
  9. data/doc-api/classes/Kwartz/BaseError.html +206 -0
  10. data/doc-api/classes/Kwartz/BaseTranslator.html +331 -0
  11. data/doc-api/classes/Kwartz/CharacterType.html +212 -0
  12. data/doc-api/classes/Kwartz/CommandOptionError.html +154 -0
  13. data/doc-api/classes/Kwartz/CommandOptions.html +374 -0
  14. data/doc-api/classes/Kwartz/Config.html +150 -0
  15. data/doc-api/classes/Kwartz/ConvertError.html +191 -0
  16. data/doc-api/classes/Kwartz/Converter.html +252 -0
  17. data/doc-api/classes/Kwartz/CssStyleParser.html +483 -0
  18. data/doc-api/classes/Kwartz/DocumentRuleset.html +369 -0
  19. data/doc-api/classes/Kwartz/ElementExpander.html +325 -0
  20. data/doc-api/classes/Kwartz/ElementInfo.html +312 -0
  21. data/doc-api/classes/Kwartz/ElementRuleset.html +582 -0
  22. data/doc-api/classes/Kwartz/EperlHandler.html +338 -0
  23. data/doc-api/classes/Kwartz/EperlTranslator.html +167 -0
  24. data/doc-api/classes/Kwartz/ErubisHandler.html +113 -0
  25. data/doc-api/classes/Kwartz/ErubisTranslator.html +168 -0
  26. data/doc-api/classes/Kwartz/ErubyHandler.html +337 -0
  27. data/doc-api/classes/Kwartz/ErubyTranslator.html +167 -0
  28. data/doc-api/classes/Kwartz/ExpandStatement.html +227 -0
  29. data/doc-api/classes/Kwartz/Expression.html +119 -0
  30. data/doc-api/classes/Kwartz/Handler.html +558 -0
  31. data/doc-api/classes/Kwartz/JstlHandler.html +657 -0
  32. data/doc-api/classes/Kwartz/JstlTranslator.html +226 -0
  33. data/doc-api/classes/Kwartz/KwartzError.html +146 -0
  34. data/doc-api/classes/Kwartz/Main.html +384 -0
  35. data/doc-api/classes/Kwartz/NativeExpression.html +236 -0
  36. data/doc-api/classes/Kwartz/NativeStatement.html +254 -0
  37. data/doc-api/classes/Kwartz/Node.html +156 -0
  38. data/doc-api/classes/Kwartz/ParseError.html +148 -0
  39. data/doc-api/classes/Kwartz/PhpHandler.html +333 -0
  40. data/doc-api/classes/Kwartz/PhpTranslator.html +194 -0
  41. data/doc-api/classes/Kwartz/PresentationLogicParser.html +830 -0
  42. data/doc-api/classes/Kwartz/PrintStatement.html +221 -0
  43. data/doc-api/classes/Kwartz/RailsHandler.html +587 -0
  44. data/doc-api/classes/Kwartz/RailsTranslator.html +167 -0
  45. data/doc-api/classes/Kwartz/RubyStyleParser.html +558 -0
  46. data/doc-api/classes/Kwartz/Ruleset.html +117 -0
  47. data/doc-api/classes/Kwartz/Statement.html +119 -0
  48. data/doc-api/classes/Kwartz/StrutsTranslator.html +190 -0
  49. data/doc-api/classes/Kwartz/TagInfo.html +314 -0
  50. data/doc-api/classes/Kwartz/TextConverter.html +270 -0
  51. data/doc-api/classes/Kwartz/Translator.html +318 -0
  52. data/doc-api/classes/Test.html +107 -0
  53. data/doc-api/classes/Test/Unit.html +101 -0
  54. data/doc-api/created.rid +1 -0
  55. data/doc-api/files/__/README_txt.html +150 -0
  56. data/doc-api/files/kwartz/assert_rb.html +114 -0
  57. data/doc-api/files/kwartz/binding/eperl_rb.html +116 -0
  58. data/doc-api/files/kwartz/binding/erubis_rb.html +116 -0
  59. data/doc-api/files/kwartz/binding/eruby_rb.html +115 -0
  60. data/doc-api/files/kwartz/binding/jstl_rb.html +116 -0
  61. data/doc-api/files/kwartz/binding/php_rb.html +116 -0
  62. data/doc-api/files/kwartz/binding/rails_rb.html +115 -0
  63. data/doc-api/files/kwartz/binding/struts_rb.html +117 -0
  64. data/doc-api/files/kwartz/config_rb.html +107 -0
  65. data/doc-api/files/kwartz/converter_rb.html +119 -0
  66. data/doc-api/files/kwartz/error_rb.html +107 -0
  67. data/doc-api/files/kwartz/main_rb.html +124 -0
  68. data/doc-api/files/kwartz/node_rb.html +114 -0
  69. data/doc-api/files/kwartz/parser_rb.html +117 -0
  70. data/doc-api/files/kwartz/translator_rb.html +115 -0
  71. data/doc-api/files/kwartz/util/assert-text-equal_rb.html +115 -0
  72. data/doc-api/files/kwartz/util/testcase-helper_rb.html +115 -0
  73. data/doc-api/files/kwartz_rb.html +120 -0
  74. data/doc-api/fr_class_index.html +75 -0
  75. data/doc-api/fr_file_index.html +45 -0
  76. data/doc-api/fr_method_index.html +216 -0
  77. data/doc-api/index.html +24 -0
  78. data/doc-api/rdoc-style.css +208 -0
  79. data/doc/docstyle.css +188 -0
  80. data/doc/p-pattern.html +1207 -0
  81. data/doc/reference.html +3396 -0
  82. data/doc/users-guide.html +1670 -0
  83. data/examples/breadcrumbs1/Makefile +15 -0
  84. data/examples/breadcrumbs1/breadcrumbs.eruby.plogic +27 -0
  85. data/examples/breadcrumbs1/breadcrumbs.html +12 -0
  86. data/examples/breadcrumbs1/breadcrumbs.jstl.plogic +28 -0
  87. data/examples/breadcrumbs1/breadcrumbs.php.plogic +26 -0
  88. data/examples/breadcrumbs1/main.php +12 -0
  89. data/examples/breadcrumbs1/main.rb +12 -0
  90. data/examples/breadcrumbs2/Makefile +15 -0
  91. data/examples/breadcrumbs2/breadcrumbs.eruby.plogic +22 -0
  92. data/examples/breadcrumbs2/breadcrumbs.html +14 -0
  93. data/examples/breadcrumbs2/breadcrumbs.jstl.plogic +24 -0
  94. data/examples/breadcrumbs2/breadcrumbs.php.plogic +23 -0
  95. data/examples/breadcrumbs2/main.php +12 -0
  96. data/examples/breadcrumbs2/main.rb +12 -0
  97. data/examples/pagelayout/Makefile +47 -0
  98. data/examples/pagelayout/content.eruby.plogic +44 -0
  99. data/examples/pagelayout/content.jstl.plogic +36 -0
  100. data/examples/pagelayout/content.php.plogic +37 -0
  101. data/examples/pagelayout/content1.html +36 -0
  102. data/examples/pagelayout/content2.html +29 -0
  103. data/examples/pagelayout/design.css +40 -0
  104. data/examples/pagelayout/layout.html +50 -0
  105. data/examples/pagelayout/main.php +55 -0
  106. data/examples/pagelayout/main.rb +77 -0
  107. data/examples/pagelayout/menu.eruby.plogic +14 -0
  108. data/examples/pagelayout/menu.html +13 -0
  109. data/examples/pagelayout/menu.jstl.plogic +14 -0
  110. data/examples/pagelayout/menu.php.plogic +14 -0
  111. data/examples/rails1/Makefile +36 -0
  112. data/examples/rails1/README +19 -0
  113. data/examples/rails1/application_helper.rb +31 -0
  114. data/examples/rails1/edit.html +28 -0
  115. data/examples/rails1/edit.plogic +10 -0
  116. data/examples/rails1/form.html +52 -0
  117. data/examples/rails1/form.plogic +33 -0
  118. data/examples/rails1/layout.plogic +15 -0
  119. data/examples/rails1/link_to.plogic +19 -0
  120. data/examples/rails1/list.html +48 -0
  121. data/examples/rails1/list.plogic +28 -0
  122. data/examples/rails1/new.html +27 -0
  123. data/examples/rails1/new.plogic +10 -0
  124. data/examples/rails1/reader.plogic +29 -0
  125. data/examples/rails1/show.html +40 -0
  126. data/examples/rails1/show.plogic +4 -0
  127. data/examples/rails1/writer.plogic +8 -0
  128. data/examples/table1/Makefile +15 -0
  129. data/examples/table1/main.php +11 -0
  130. data/examples/table1/main.rb +11 -0
  131. data/examples/table1/table1.eruby.plogic +21 -0
  132. data/examples/table1/table1.html +16 -0
  133. data/examples/table1/table1.jstl.plogic +21 -0
  134. data/examples/table1/table1.php.plogic +22 -0
  135. data/kwartz.gemspec +55 -0
  136. data/lib/kwartz.rb +13 -0
  137. data/lib/kwartz/assert.rb +31 -0
  138. data/lib/kwartz/binding/eperl.rb +166 -0
  139. data/lib/kwartz/binding/erubis.rb +61 -0
  140. data/lib/kwartz/binding/eruby.rb +164 -0
  141. data/lib/kwartz/binding/jstl.rb +334 -0
  142. data/lib/kwartz/binding/php.rb +167 -0
  143. data/lib/kwartz/binding/rails.rb +295 -0
  144. data/lib/kwartz/binding/struts.rb +109 -0
  145. data/lib/kwartz/config.rb +28 -0
  146. data/lib/kwartz/converter.rb +920 -0
  147. data/lib/kwartz/error.rb +41 -0
  148. data/lib/kwartz/main.rb +464 -0
  149. data/lib/kwartz/node.rb +454 -0
  150. data/lib/kwartz/parser.rb +903 -0
  151. data/lib/kwartz/translator.rb +153 -0
  152. data/lib/kwartz/util/assert-text-equal.rb +44 -0
  153. data/lib/kwartz/util/testcase-helper.rb +112 -0
  154. data/setup.rb +1331 -0
  155. data/test/test-compile.rb +36 -0
  156. data/test/test-compile.yaml +178 -0
  157. data/test/test-converter.rb +34 -0
  158. data/test/test-converter.yaml +127 -0
  159. data/test/test-directives.rb +32 -0
  160. data/test/test-directives.yaml +1411 -0
  161. data/test/test-main.rb +464 -0
  162. data/test/test-parser.rb +54 -0
  163. data/test/test-parser.yaml +394 -0
  164. data/test/test-rails.rb +28 -0
  165. data/test/test-rails.yaml +301 -0
  166. data/test/test-ruleset.rb +36 -0
  167. data/test/test-ruleset.yaml +804 -0
  168. data/test/test.rb +44 -0
  169. metadata +236 -0
@@ -0,0 +1,21 @@
1
+ #row {
2
+ attrs: "bgcolor" color;
3
+ logic: {
4
+ <c:forEach var="item" items="${list}" varStatus="loop">
5
+ <c:set var="color" value="${loop.index % 2 == 0 ? '#FFCCCC' : '#CCCCFF'}"/>
6
+ _elem
7
+ </c:forEach>
8
+ }
9
+ }
10
+
11
+ #name {
12
+ value: item.name;
13
+ }
14
+
15
+ #mail {
16
+ value: item.mail;
17
+ }
18
+
19
+ #dummy1 {
20
+ logic: { } /* ignore this element */
21
+ }
@@ -0,0 +1,22 @@
1
+ #row {
2
+ attrs: "bgcolor" $color;
3
+ logic: {
4
+ $i = 0;
5
+ foreach ($list as $item) {
6
+ $color = ++$i % 2 == 0 ? '#FFCCCC' : '#CCCCFF';
7
+ _elem();
8
+ }
9
+ }
10
+ }
11
+
12
+ #name {
13
+ value: $item['name'];
14
+ }
15
+
16
+ #mail {
17
+ value: $item['mail'];
18
+ }
19
+
20
+ #dummy1 {
21
+ logic: { } /* ignore this element */
22
+ }
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/ruby
2
+
3
+ ###
4
+ ### RubyGems Specification file for Kwartz-ruby
5
+ ###
6
+ ### $Rev: 117 $
7
+ ### $Release: 3.0.0 $
8
+ ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
9
+ ###
10
+
11
+ require 'rubygems'
12
+
13
+ spec = Gem::Specification.new do |s|
14
+ ## package information
15
+ s.name = 'kwartz'
16
+ s.author = 'Makoto Kuwata'
17
+ s.version = ("$Release: 3.0.0 $" =~ /[\.\d]+/) && $&
18
+ s.platform = Gem::Platform::RUBY
19
+ s.homepage = 'http://www.kuwata-lab.com/kwartz'
20
+ s.summary = "a template system for Ruby, PHP, and Java"
21
+ s.description = <<-'END'
22
+ Kwartz is a template system which realized the concept
23
+ 'Independence of Presentation Logic'(IoPL).
24
+ It means that Kwartz can separates presentation logics from
25
+ both business logics (= main program) and presentation data
26
+ file (= HTML file), thus HTML design is not breaded at all.
27
+ In addition, Kwartz supports eRuby, PHP, JSP, and ePerl.
28
+ END
29
+
30
+ ## files
31
+ files = []
32
+ files += Dir.glob('lib/**/*')
33
+ files += Dir.glob('bin/**/*')
34
+ files += Dir.glob('examples/**/*')
35
+ files += Dir.glob('test/**/*')
36
+ #files += Dir.glob('man/**/*')
37
+ files += [ "doc/users-guide.html",
38
+ "doc/reference.html",
39
+ "doc/p-pattern.html",
40
+ "doc/docstyle.css",
41
+ #"doc/design.css", "doc/design.html",
42
+ ]
43
+ files += Dir.glob('doc-api/**/*')
44
+ files += %w[README.txt ChangeLog COPYING setup.rb kwartz.gemspec]
45
+ s.files = files
46
+ s.executables = ["kwartz"]
47
+ s.bindir = "bin"
48
+ s.test_file = 'test/test.rb'
49
+ s.add_dependency('abstract', ['>= 1.0.0'])
50
+ end
51
+
52
+ if $0 == __FILE__
53
+ Gem::manage_gems
54
+ Gem::Builder.new(spec).build
55
+ end
@@ -0,0 +1,13 @@
1
+ ###
2
+ ### $Rev: 103 $
3
+ ### $Release: 3.0.0 $
4
+ ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
+ ###
6
+
7
+ require 'kwartz/config'
8
+ require 'kwartz/error'
9
+ require 'kwartz/assert'
10
+ require 'kwartz/node'
11
+ require 'kwartz/parser'
12
+ require 'kwartz/converter'
13
+ require 'kwartz/translator'
@@ -0,0 +1,31 @@
1
+ ####
2
+ #### $Rev: 103 $
3
+ #### $Release: 3.0.0 $
4
+ #### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
+ ####
6
+
7
+
8
+ require 'kwartz/error'
9
+
10
+
11
+ module Kwartz
12
+
13
+
14
+ class AssertionError < KwartzError
15
+ def initialize(message)
16
+ super(message)
17
+ end
18
+ end
19
+
20
+
21
+ module Assertion
22
+
23
+ def assert(message="")
24
+ raise AssertionError.new("*** assertion failed: #{message}")
25
+ end
26
+
27
+ module_function :assert
28
+ end
29
+
30
+
31
+ end
@@ -0,0 +1,166 @@
1
+ ###
2
+ ### $Rev: 117 $
3
+ ### $Release: 3.0.0 $
4
+ ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
+ ###
6
+
7
+ require 'kwartz/assert'
8
+ require 'kwartz/converter'
9
+ require 'kwartz/translator'
10
+
11
+
12
+
13
+ module Kwartz
14
+
15
+
16
+
17
+ ##
18
+ ## directive handler for ePerl
19
+ ##
20
+ class EperlHandler < Handler
21
+
22
+
23
+ PERL_DIRECTIVE_PATTERN = /\A(\w+)(?:\s*\(\s*(.*)\))?\z/
24
+
25
+ def directive_pattern
26
+ return PERL_DIRECTIVE_PATTERN
27
+ end
28
+
29
+
30
+ PERL_MAPPING_PATTERN = /\A'([-:\w]+)',\s*(.*)\z/
31
+
32
+ def mapping_pattern
33
+ return PERL_MAPPING_PATTERN
34
+ end
35
+
36
+
37
+ PERL_DIRECTIVE_FORMAT = '%s(%s)'
38
+
39
+ def directive_format
40
+ return PERL_DIRECTIVE_FORMAT
41
+ end
42
+
43
+
44
+ def handle(directive_name, directive_arg, directive_str, stag_info, etag_info, cont_stmts, attr_info, append_exprs, stmt_list)
45
+ ret = super
46
+ return ret if ret
47
+
48
+ d_name = directive_name
49
+ d_arg = directive_arg
50
+ d_str = directive_str
51
+
52
+ case directive_name
53
+
54
+ when :foreach, :Foreach, :FOREACH, :list, :List, :LIST
55
+ is_foreach = d_name == :foreach || d_name == :Foreach || d_name == :FOREACH
56
+ unless d_arg =~ /\A(\$\w+)(?:,\s*(\$\w+))?\s+in\s+(.*)\z/
57
+ raise convert_error("'#{d_str}': invalid argument.", stag_info.linenum)
58
+ end
59
+ loopvar = $1 ; loopval = $2 ; looplist = $3
60
+ counter = d_name == :foreach || d_name == :list ? nil : "#{loopvar}_ctr"
61
+ toggle = d_name != :FOREACH && d_name != :LIST ? nil : "#{loopvar}_tgl"
62
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs) if !is_foreach
63
+ stmt_list << NativeStatement.new("my #{counter} = 0;") if counter
64
+ if loopval
65
+ stmt_list << NativeStatement.new("foreach my #{loopvar} (keys #{looplist}) {", :foreach)
66
+ stmt_list << NativeStatement.new(" my #{loopval} = #{looplist.sub(/\A%/,'$')}{#{loopvar}};")
67
+ else
68
+ stmt_list << NativeStatement.new("foreach my #{loopvar} (#{looplist}) {", :foreach)
69
+ end
70
+ stmt_list << NativeStatement.new(" #{counter}++;") if counter
71
+ stmt_list << NativeStatement.new(" my #{toggle} = #{counter}%2==0 ? #{self.even} : #{self.odd};") if toggle
72
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs) if is_foreach
73
+ stmt_list.concat(cont_stmts)
74
+ stmt_list << build_print_stmt(etag_info, nil, nil) if is_foreach
75
+ stmt_list << NativeStatement.new("}", :foreach)
76
+ stmt_list << build_print_stmt(etag_info, nil, nil) if !is_foreach
77
+
78
+ when :while, :loop
79
+ is_while = d_name == :while
80
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs) if !is_while
81
+ stmt_list << NativeStatement.new("while (#{d_arg}) {", :while)
82
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs) if is_while
83
+ stmt_list.concat(cont_stmts)
84
+ stmt_list << build_print_stmt(etag_info, nil, nil) if is_while
85
+ stmt_list << NativeStatement.new("}", :while)
86
+ stmt_list << build_print_stmt(etag_info, nil, nil) if !is_while
87
+
88
+ when :set
89
+ stmt_list << NativeStatement.new("#{d_arg};", :set)
90
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs)
91
+ stmt_list.concat(cont_stmts)
92
+ stmt_list << build_print_stmt(etag_info, nil, nil)
93
+
94
+ when :if
95
+ stmt_list << NativeStatement.new("if (#{d_arg}) {", :if)
96
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs)
97
+ stmt_list.concat(cont_stmts)
98
+ stmt_list << build_print_stmt(etag_info, nil, nil)
99
+ stmt_list << NativeStatement.new("}", :if)
100
+
101
+ when :elsif, :else
102
+ unless !stmt_list.empty? && (st=stmt_list[-1]).is_a?(NativeStatement) && (st.kind == :if || st.kind == :elseif)
103
+ raise convert_error("'#{d_str}': previous statement should be 'if' or 'elsif'.", stag_info.linenum)
104
+ end
105
+ stmt_list.pop # delete 'end'
106
+ if d_name == :else
107
+ kind = :else
108
+ stmt_list << NativeStatement.new("} else {", :else)
109
+ else
110
+ kind = :elseif
111
+ stmt_list << NativeStatement.new("} elsif (#{d_arg}) {", :elseif)
112
+ end
113
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs)
114
+ stmt_list.concat(cont_stmts)
115
+ stmt_list << build_print_stmt(etag_info, nil, nil)
116
+ stmt_list << NativeStatement.new("}", kind)
117
+
118
+ when :default, :Default, :DEFAULT
119
+ error_if_empty_tag(stag_info, etag_info, d_name, d_arg)
120
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs)
121
+ stmt_list << NativeStatement.new_without_newline("if (#{d_arg}) {", :if)
122
+ flag_escape = d_name == :default ? nil : (d_name == :Default)
123
+ stmt_list << PrintStatement.new([ NativeExpression.new(d_arg, flag_escape) ])
124
+ stmt_list << NativeStatement.new_without_newline("} else {", :else)
125
+ stmt_list.concat(cont_stmts)
126
+ stmt_list << NativeStatement.new_without_newline("}", :else)
127
+ stmt_list << build_print_stmt(etag_info, nil, nil)
128
+
129
+ else
130
+ return false
131
+
132
+ end #case
133
+ return true
134
+
135
+ end #def
136
+
137
+
138
+ end #class
139
+ Handler.register_class('eperl', EperlHandler)
140
+
141
+
142
+
143
+ ##
144
+ ## translator for ePerl
145
+ ##
146
+ class EperlTranslator < BaseTranslator
147
+
148
+
149
+ EPERL_EMBED_PATTERNS = [
150
+ '<? ', ' !>', # statement
151
+ '<?= ', ' !>', # expression
152
+ '<?= encode_entities(', ') !>' # escaped expression
153
+ ]
154
+
155
+
156
+ def initialize(properties={})
157
+ super(EPERL_EMBED_PATTERNS, properties)
158
+ end
159
+
160
+
161
+ end
162
+ Translator.register_class('eperl', EperlTranslator)
163
+
164
+
165
+
166
+ end #module
@@ -0,0 +1,61 @@
1
+ ###
2
+ ### $Rev: 110 $
3
+ ### $Release: 3.0.0 $
4
+ ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
+ ###
6
+
7
+ require 'kwartz/converter'
8
+ require 'kwartz/translator'
9
+ require 'kwartz/binding/eruby'
10
+
11
+
12
+
13
+ module Kwartz
14
+
15
+
16
+
17
+ class ErubisHandler < ErubyHandler
18
+
19
+
20
+ end #class
21
+ Handler.register_class('erubis', ErubisHandler)
22
+
23
+
24
+
25
+ ##
26
+ ## translator for Erubis
27
+ ##
28
+ class ErubisTranslator < BaseTranslator
29
+
30
+
31
+ ERUBIS_EMBED_PATTERNS = [
32
+ '<% ', ' %>', # statement
33
+ '<%= ', ' %>', # expression
34
+ '<%== ', ' %>', # escaped expression
35
+ ]
36
+
37
+
38
+ def initialize(properties={})
39
+ super(ERUBIS_EMBED_PATTERNS, properties)
40
+ @escape = true if @escape == nil
41
+ end
42
+
43
+
44
+ #def translate_native_expr(expr)
45
+ # assert unless expr.is_a?(NativeExpression)
46
+ # flag_escape = expr.escape?
47
+ # flag_escape = @escape if flag_escape == nil
48
+ # if flag_escape == false
49
+ # @sb << @expr_l << expr.code << @expr_r # ex. <%== expr %>
50
+ # else
51
+ # @sb << @escape_l << expr.code << @escape_r # ex. <%= expr %>
52
+ # end
53
+ #end
54
+
55
+
56
+ end
57
+ Translator.register_class('erubis', ErubisTranslator)
58
+
59
+
60
+
61
+ end #module
@@ -0,0 +1,164 @@
1
+ ###
2
+ ### $Rev: 111 $
3
+ ### $Release: 3.0.0 $
4
+ ### copyright(c) 2004-2006 kuwata-lab.com all rights reserved
5
+ ###
6
+
7
+ require 'kwartz/converter'
8
+ require 'kwartz/translator'
9
+
10
+
11
+
12
+ module Kwartz
13
+
14
+
15
+
16
+ ##
17
+ ## directive handler for eRuby
18
+ ##
19
+ class ErubyHandler < Handler
20
+
21
+
22
+ ERUBY_DIRECTIVE_PATTERN = /\A(\w+)(?:[:\s]\s*(.*))?\z/
23
+
24
+ def directive_pattern
25
+ return ERUBY_DIRECTIVE_PATTERN
26
+ end
27
+
28
+
29
+ ERUBY_MAPPING_PATTERN = /\A'([-:\w]+)'\s+(.*)\z/
30
+
31
+ def mapping_pattern
32
+ return ERUBY_MAPPING_PATTERN
33
+ end
34
+
35
+
36
+ ERUBY_DIRECTIVE_FORMAT = '%s: %s'
37
+
38
+ def directive_format
39
+ return ERUBY_DIRECTIVE_FORMAT
40
+ end
41
+
42
+
43
+ def handle(directive_name, directive_arg, directive_str, stag_info, etag_info, cont_stmts, attr_info, append_exprs, stmt_list)
44
+ ret = super
45
+ return ret if ret
46
+
47
+ d_name = directive_name
48
+ d_arg = directive_arg
49
+ d_str = directive_str
50
+
51
+ case directive_name
52
+
53
+ when :for, :For, :FOR, :list, :List, :LIST
54
+ unless d_arg =~ /\A(\w+)(?:,\s*(\w+))?\s+in\s+(.*)\z/ || d_arg =~ /\A(\w+)(?:,(\w+))?\s*[:=]\s*(.*)\z/
55
+ raise convert_error("#'{d_str}': invalid argument.", stag_info.linenum)
56
+ end
57
+ loopvar = $1 ; loopval = $2 ; looplist = $3
58
+ is_foreach = d_name == :for || d_name == :For || d_name == :FOR
59
+ counter = d_name == :for || d_name == :list ? nil : "#{loopvar}_ctr"
60
+ toggle = d_name != :FOR && d_name != :LIST ? nil : "#{loopvar}_tgl"
61
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs) if !is_foreach
62
+ stmt_list << NativeStatement.new("#{counter} = 0") if counter
63
+ if loopval
64
+ stmt_list << NativeStatement.new("#{looplist}.each do |#{loopvar}, #{loopval}|", :foreach)
65
+ else
66
+ stmt_list << NativeStatement.new("for #{loopvar} in #{looplist} do", :foreach)
67
+ end
68
+ stmt_list << NativeStatement.new(" #{counter} += 1") if counter
69
+ stmt_list << NativeStatement.new(" #{toggle} = #{counter}%2==0 ? #{self.even} : #{self.odd}") if toggle
70
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs) if is_foreach
71
+ stmt_list.concat(cont_stmts)
72
+ stmt_list << build_print_stmt(etag_info, nil, nil) if is_foreach
73
+ stmt_list << NativeStatement.new("end", :foreach)
74
+ stmt_list << build_print_stmt(etag_info, nil, nil) if !is_foreach
75
+
76
+ when :while, :loop
77
+ is_while = d_name == :while
78
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs) if !is_while
79
+ stmt_list << NativeStatement.new("while #{d_arg} do", :while)
80
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs) if is_while
81
+ stmt_list.concat(cont_stmts)
82
+ stmt_list << build_print_stmt(etag_info, nil, nil) if is_while
83
+ stmt_list << NativeStatement.new("end", :while)
84
+ stmt_list << build_print_stmt(etag_info, nil, nil) if !is_while
85
+
86
+ when :set
87
+ stmt_list << NativeStatement.new(d_arg, :set)
88
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs)
89
+ stmt_list.concat(cont_stmts)
90
+ stmt_list << build_print_stmt(etag_info, nil, nil)
91
+
92
+ when :if
93
+ stmt_list << NativeStatement.new("if #{d_arg} then", :if)
94
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs)
95
+ stmt_list.concat(cont_stmts)
96
+ stmt_list << build_print_stmt(etag_info, nil, nil)
97
+ stmt_list << NativeStatement.new("end", :if)
98
+
99
+ when :elsif, :else
100
+ unless !stmt_list.empty? && (st=stmt_list[-1]).is_a?(NativeStatement) && (st.kind == :if || st.kind == :elseif)
101
+ raise convert_error("'#{d_str}': previous statement should be 'if' or 'elsif'.", stag_info.linenum)
102
+ end
103
+ stmt_list.pop # delete 'end'
104
+ if d_name == :else
105
+ kind = :else
106
+ stmt_list << NativeStatement.new("else", :else)
107
+ else
108
+ kind = :elseif
109
+ stmt_list << NativeStatement.new("elsif #{d_arg} then", :elseif)
110
+ end
111
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs)
112
+ stmt_list.concat(cont_stmts)
113
+ stmt_list << build_print_stmt(etag_info, nil, nil)
114
+ stmt_list << NativeStatement.new("end", kind)
115
+
116
+ when :default, :Default, :DEFAULT
117
+ error_if_empty_tag(stag_info, etag_info, d_name, d_arg)
118
+ stmt_list << build_print_stmt(stag_info, attr_info, append_exprs)
119
+ stmt_list << NativeStatement.new_without_newline("if (#{d_arg}) && !(#{d_arg}).to_s.empty? then", :if)
120
+ flag_escape = d_name == :default ? nil : (d_name == :Default)
121
+ stmt_list << PrintStatement.new([ NativeExpression.new(d_arg, flag_escape) ])
122
+ stmt_list << NativeStatement.new_without_newline("else", :else)
123
+ stmt_list.concat(cont_stmts)
124
+ stmt_list << NativeStatement.new_without_newline("end", :else)
125
+ stmt_list << build_print_stmt(etag_info, nil, nil)
126
+
127
+ else
128
+ return false
129
+
130
+ end #case
131
+ return true
132
+
133
+ end #def
134
+
135
+
136
+ end #class
137
+ Handler.register_class('eruby', ErubyHandler)
138
+
139
+
140
+
141
+ ##
142
+ ## translator for eRuby
143
+ ##
144
+ class ErubyTranslator < BaseTranslator
145
+
146
+
147
+ ERUBY_EMBED_PATTERNS = [
148
+ '<% ', ' %>', # statement
149
+ '<%= ', ' %>', # expression
150
+ '<%=h ', ' %>', # escaped expression
151
+ ]
152
+
153
+
154
+ def initialize(properties={})
155
+ super(ERUBY_EMBED_PATTERNS, properties)
156
+ end
157
+
158
+
159
+ end #class
160
+ Translator.register_class('eruby', ErubyTranslator)
161
+
162
+
163
+
164
+ end #module