malt 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. data/.ruby +156 -0
  2. data/Assembly +28 -0
  3. data/COPYING.rdoc +33 -0
  4. data/Gemfile +10 -0
  5. data/HISTORY.rdoc +102 -0
  6. data/README.rdoc +16 -10
  7. data/Reapfile +4 -0
  8. data/lib/malt.rb +36 -8
  9. data/lib/malt.yml +156 -0
  10. data/lib/malt/conversions.rb +42 -0
  11. data/lib/malt/core_ext.rb +81 -3
  12. data/lib/malt/engines/abstract.rb +259 -50
  13. data/lib/malt/engines/bluecloth.rb +19 -9
  14. data/lib/malt/engines/builder.rb +93 -32
  15. data/lib/malt/engines/coffee.rb +46 -0
  16. data/lib/malt/engines/creole.rb +60 -0
  17. data/lib/malt/engines/erb.rb +69 -44
  18. data/lib/malt/engines/erector.rb +61 -30
  19. data/lib/malt/engines/erubis.rb +41 -31
  20. data/lib/malt/engines/haml.rb +13 -37
  21. data/lib/malt/engines/kramdown.rb +40 -15
  22. data/lib/malt/engines/less.rb +15 -14
  23. data/lib/malt/engines/liquid.rb +24 -14
  24. data/lib/malt/engines/markaby.rb +44 -22
  25. data/lib/malt/engines/maruku.rb +89 -0
  26. data/lib/malt/engines/mustache.rb +20 -14
  27. data/lib/malt/engines/nokogiri.rb +89 -0
  28. data/lib/malt/engines/radius.rb +72 -34
  29. data/lib/malt/engines/ragtag.rb +26 -18
  30. data/lib/malt/engines/rdiscount.rb +18 -11
  31. data/lib/malt/engines/rdoc.rb +21 -15
  32. data/lib/malt/engines/redcarpet.rb +137 -0
  33. data/lib/malt/engines/redcloth.rb +15 -7
  34. data/lib/malt/engines/ruby.rb +13 -12
  35. data/lib/malt/engines/sass.rb +30 -17
  36. data/lib/malt/engines/string.rb +36 -0
  37. data/lib/malt/engines/tenjin.rb +70 -27
  38. data/lib/malt/engines/wikicloth.rb +48 -0
  39. data/lib/malt/formats/abstract.rb +90 -29
  40. data/lib/malt/formats/abstract_template.rb +10 -8
  41. data/lib/malt/formats/builder.rb +39 -13
  42. data/lib/malt/formats/coffee.rb +54 -0
  43. data/lib/malt/formats/css.rb +3 -3
  44. data/lib/malt/formats/erb.rb +31 -66
  45. data/lib/malt/formats/haml.rb +8 -8
  46. data/lib/malt/formats/html.rb +1 -7
  47. data/lib/malt/formats/javascript.rb +27 -0
  48. data/lib/malt/formats/latex.rb +1 -1
  49. data/lib/malt/formats/less.rb +13 -11
  50. data/lib/malt/formats/liquid.rb +7 -7
  51. data/lib/malt/formats/markdown.rb +43 -44
  52. data/lib/malt/formats/mediawiki.rb +70 -0
  53. data/lib/malt/formats/mustache.rb +5 -5
  54. data/lib/malt/formats/pdf.rb +1 -7
  55. data/lib/malt/formats/radius.rb +5 -4
  56. data/lib/malt/formats/ragtag.rb +14 -13
  57. data/lib/malt/formats/rbhtml.rb +28 -20
  58. data/lib/malt/formats/rdoc.rb +5 -4
  59. data/lib/malt/formats/rhtml.rb +19 -43
  60. data/lib/malt/formats/ruby.rb +11 -45
  61. data/lib/malt/formats/sass.rb +16 -24
  62. data/lib/malt/formats/scss.rb +13 -30
  63. data/lib/malt/formats/string.rb +61 -0
  64. data/lib/malt/formats/tenjin.rb +4 -4
  65. data/lib/malt/formats/text.rb +1 -1
  66. data/lib/malt/formats/textile.rb +7 -19
  67. data/lib/malt/kernel.rb +1 -2
  68. data/lib/malt/machine.rb +83 -13
  69. data/lib/malt/tilted.rb +216 -0
  70. data/lib/malt/version.rb +21 -0
  71. data/test/helper.rb +15 -0
  72. data/test/unit/engines/case_engine_bluecloth.rb +40 -0
  73. data/test/unit/engines/case_engine_builder.rb +30 -0
  74. data/test/unit/engines/case_engine_coffee.rb +30 -0
  75. data/test/unit/engines/case_engine_creole.rb +35 -0
  76. data/test/unit/engines/case_engine_erb.rb +28 -0
  77. data/test/unit/engines/case_engine_erector.rb +36 -0
  78. data/test/unit/engines/case_engine_erubis.rb +28 -0
  79. data/test/unit/engines/case_engine_haml.rb +30 -0
  80. data/test/unit/engines/case_engine_kramdown.rb +30 -0
  81. data/test/unit/engines/case_engine_less.rb +40 -0
  82. data/test/unit/engines/case_engine_liquid.rb +28 -0
  83. data/test/unit/engines/case_engine_markaby.rb +20 -0
  84. data/test/unit/engines/case_engine_maruku.rb +30 -0
  85. data/test/unit/engines/case_engine_mustache.rb +28 -0
  86. data/test/unit/engines/case_engine_nokogiri.rb +30 -0
  87. data/test/unit/engines/case_engine_radius.rb +30 -0
  88. data/test/unit/engines/case_engine_ragtag.rb +40 -0
  89. data/test/unit/engines/case_engine_rdiscount.rb +30 -0
  90. data/test/unit/engines/case_engine_rdoc.rb +31 -0
  91. data/test/unit/engines/case_engine_redcarpet.rb +30 -0
  92. data/test/unit/engines/case_engine_redcloth.rb +31 -0
  93. data/test/unit/engines/case_engine_ruby.rb +28 -0
  94. data/test/unit/engines/case_engine_sass.rb +36 -0
  95. data/test/unit/engines/case_engine_string.rb +28 -0
  96. data/test/unit/engines/case_engine_tenjin.rb +28 -0
  97. data/test/unit/engines/case_engine_wikicloth.rb +25 -0
  98. data/test/unit/machine.rb +27 -0
  99. data/test/unit/malt.rb +12 -0
  100. metadata +364 -266
  101. data/History.rdoc +0 -64
  102. data/License.txt +0 -205
  103. data/Syckfile +0 -80
  104. data/features/consistent_rendering.feature +0 -36
  105. data/features/samples/sample.erb +0 -1
  106. data/features/samples/sample.erubis +0 -1
  107. data/features/samples/sample.liquid +0 -1
  108. data/features/samples/sample.mustache +0 -1
  109. data/features/samples/sample.radius +0 -1
  110. data/features/step_definitions/engine_steps.rb +0 -49
  111. data/features/support/loadpath.rb +0 -1
  112. data/features/support/sample_class.rb +0 -8
  113. data/lib/malt/formats/erector.rb +0 -53
  114. data/lib/malt/formats/markaby.rb +0 -53
  115. data/lib/malt/meta/data.rb +0 -26
  116. data/lib/malt/meta/package +0 -21
  117. data/lib/malt/meta/profile +0 -21
  118. data/meta/data.rb +0 -26
  119. data/meta/package +0 -21
  120. data/meta/profile +0 -21
  121. data/qed/01_overview.rdoc +0 -8
  122. data/qed/02_formats.rdoc +0 -39
  123. data/qed/03_formats/01_overview.rdoc +0 -7
  124. data/qed/03_formats/02_rdoc.rdoc +0 -83
  125. data/qed/03_formats/03_textile.rdoc +0 -48
  126. data/qed/03_formats/04_markdown.rdoc +0 -66
  127. data/qed/03_formats/05_erb.rdoc +0 -65
  128. data/qed/03_formats/06_liquid.rdoc +0 -54
  129. data/qed/03_formats/07_haml.rdoc +0 -44
  130. data/qed/03_formats/08_ragtag.rdoc +0 -19
  131. data/qed/03_formats/09_radius.rdoc +0 -43
  132. data/qed/03_formats/11_tenjin.rdoc +0 -47
  133. data/qed/03_formats/12_rbhtml.rdoc +0 -55
  134. data/qed/03_formats/13_sass.rdoc +0 -55
  135. data/qed/03_formats/14_scss.rdoc +0 -58
  136. data/qed/03_formats/15_less.rdoc +0 -46
  137. data/qed/03_formats/16_ruby.rdoc +0 -48
  138. data/qed/03_formats/17_markaby.rdoc +0 -50
  139. data/qed/03_formats/18_builder.rb +0 -50
  140. data/qed/03_formats/19_erector.rb +0 -50
  141. data/qed/03_formats/20_mustache.rdoc +0 -54
  142. data/qed/05_machine/01_limited_formats.rdoc +0 -29
  143. data/qed/05_machine/02_prioritized_engines.rdoc +0 -34
  144. data/qed/applique/malt.rb +0 -13
  145. data/qed/samples/data.yml +0 -4
  146. data/qed/samples/output-erb.txt +0 -1
  147. data/qed/samples/output-liquid.txt +0 -1
  148. data/qed/samples/output-mustache.txt +0 -1
  149. data/qed/samples/output-radius.txt +0 -1
  150. data/qed/samples/sample.erb +0 -1
  151. data/qed/samples/sample.liquid +0 -1
  152. data/qed/samples/sample.markdown +0 -308
  153. data/qed/samples/sample.mustache +0 -1
  154. data/qed/samples/sample.radius +0 -1
  155. data/qed/samples/sample.rdoc +0 -8
@@ -0,0 +1,36 @@
1
+ require 'malt/engines/abstract'
2
+
3
+ module Malt::Engine
4
+
5
+ # Ruby strings as template engine.
6
+ #
7
+ # @see http://ruby-lang.org
8
+ #
9
+ class String < Abstract
10
+
11
+ default :str
12
+
13
+ #
14
+ def render(params={}, &content)
15
+ text, file, scope, locals = parameters(params, :text, :file, :scope, :locals)
16
+
17
+ bind = make_binding(scope, locals, &content)
18
+ eval("%{#{text}}", bind, file || '(eval)')
19
+ end
20
+
21
+ # Ruby compiles to Ruby. How odd. ;)
22
+ def compile(params)
23
+ text = parameters(params, :text)
24
+ "%{#{text}}"
25
+ end
26
+
27
+ private
28
+
29
+ #
30
+ def require_engine
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
@@ -4,55 +4,98 @@ module Malt::Engine
4
4
 
5
5
  # Tenjin
6
6
  #
7
- # http://www.kuwata-lab.com/tenjin/
7
+ # @see http://www.kuwata-lab.com/tenjin/
8
8
  #
9
- # options
10
- # :escapefunc=>'CGI.escapeHTML'
9
+ # Let to it's own designs, Tenjin renders data as template instance variables.
10
+ # But that will not work for Malt, so use regular variables instead.
11
11
  #
12
12
  class Tenjin < Abstract
13
13
 
14
14
  default :tenjin, :rbhtml
15
15
 
16
+ # Render Tenjin.
16
17
  #
17
- def render(params, &yld)
18
- text = params[:text]
19
- file = params[:file]
20
- data = params[:data]
21
- type = params[:type]
22
- into = params[:to] || :html
18
+ # @option params [String] :escapefunc
19
+ # Defaults to 'CGI.escapeHTML'.
20
+ #
21
+ def render(params, &content)
22
+ into, text, file, type, scope, locals = parameters(params, :to, :text, :file, :type, :scope, :locals)
23
+
24
+ into ||= :html
23
25
 
24
- return super(params, &yld) if type == :rbhtml && into != :html
26
+ if type == :rbhtml && into != :html
27
+ super(params, &content)
28
+ else
29
+ scope, locals = make_ready(scope, locals, &content)
25
30
 
26
- data = make_hash(data, &yld)
27
- template = intermediate(params)
28
- template.convert(text, file)
31
+ engine = prepare_engine(params)
29
32
 
30
- template.render(data)
33
+ engine.call(scope, locals)
34
+ end
31
35
  end
32
36
 
37
+ # TODO: is there a way to split this out to a #compile method?
38
+
33
39
  #
34
- def compile(params)
35
- text = params[:text]
36
- file = params[:file]
37
- intermediate(params).convert(text, file)
40
+ def prepare_engine(params={}, &content)
41
+ text, file = parameters(params, :text, :file)
42
+
43
+ file ||= "(tenjin)"
44
+
45
+ engine = create_engine(params)
46
+ script = engine.convert(text, file)
47
+
48
+ lambda do |scope, locals|
49
+ vars, vals = [], []
50
+ locals.each do |k,v|
51
+ vars << k
52
+ vals << v
53
+ end
54
+
55
+ code = %{
56
+ lambda do |#{vars.join(',')}|
57
+ _buf = ''
58
+ #{script}
59
+ _buf
60
+ end
61
+ }
62
+
63
+ eval(code, scope.to_binding, file, 2).call(*vals)
64
+ end
38
65
  end
39
66
 
40
- private
67
+ #
68
+ def create_engine(params={})
69
+ file, text = parameters(params, :file, :text)
70
+
71
+ opts = engine_options(params)
72
+
73
+ opts[:escapefunc] ||= 'CGI.escapeHTML'
41
74
 
42
- def intermediate(params)
43
- ::Tenjin::Template.new(nil, engine_options(params))
75
+ cached(text, file, opts) do
76
+ ::Tenjin::Template.new(nil, opts)
77
+ end
44
78
  end
45
79
 
46
- # Load Liquid library if not already loaded.
47
- def initialize_engine
80
+ # Compile Tenjin document into Ruby source code.
81
+ #def compile(params)
82
+ # text, file = parameters(params, :text, :file)
83
+ # code = intermediate(params).convert(text, file)
84
+ # "_buf = ''\n#{code}\n_buf"
85
+ #end
86
+
87
+ private
88
+
89
+ # Load Tenjin library if not already loaded.
90
+ def require_engine
48
91
  return if defined? ::Tenjin::Engine
49
92
  require_library 'tenjin'
93
+ require 'cgi'
50
94
  end
51
95
 
52
- def engine_options(params)
53
- opts = {}
54
- opts[:escapefunc] = params[:escapefunc] || settings[:escapefunc]
55
- opts
96
+ #
97
+ def engine_option_names
98
+ [:escapefunc]
56
99
  end
57
100
 
58
101
  end
@@ -0,0 +1,48 @@
1
+ require 'malt/engines/abstract'
2
+
3
+ module Malt::Engine
4
+
5
+ # WikiCloth is a MediaWiki format for Ruby. Unlike Creole, WikiCloth
6
+ # also supports variable interpolation.
7
+ #
8
+ #@see http://code.google.com/p/wikicloth/
9
+
10
+ class WikiCloth < Abstract
11
+
12
+ default :wiki, :mediawiki, :mw
13
+
14
+ #
15
+ def render(params={}, &content)
16
+ scope, locals = parameters(params, :scope, :locals)
17
+
18
+ data = make_hash(scope, locals, &content)
19
+
20
+ case params[:to]
21
+ when :html, nil
22
+ prepare_engine(params).to_html(:params => data)
23
+ else
24
+ super(params)
25
+ end
26
+ end
27
+
28
+ #
29
+ def create_engine(params={})
30
+ text = parameters(params, :text)
31
+
32
+ cached(text) do
33
+ ::WikiCloth::WikiCloth.new(:data => text)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ # Load `wikicloth` library if not already loaded.
40
+ def require_engine
41
+ return if defined? ::WikiCloth
42
+ require_library 'wikicloth'
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
@@ -27,8 +27,8 @@ module Format
27
27
  include Malt::Kernel
28
28
 
29
29
  # Register the class to an extension type.
30
- def self.register(*exts)
31
- @extensions = exts
30
+ def self.file_extension(*exts)
31
+ @file_extensions = exts
32
32
  Malt::Format.register(self, *exts)
33
33
 
34
34
  #exts.each do |ext|
@@ -40,9 +40,14 @@ module Format
40
40
  #end
41
41
  end
42
42
 
43
+ # @deprecated
44
+ def self.register(*exts)
45
+ self.file_extension(*exts)
46
+ end
47
+
43
48
  #
44
49
  def self.extensions
45
- @extensions
50
+ @file_extensions
46
51
  end
47
52
 
48
53
  #--
@@ -53,37 +58,47 @@ module Format
53
58
  @engine
54
59
  end
55
60
 
56
- private
61
+ private
57
62
 
58
63
  #
59
64
  def initialize(options={})
60
65
  @options = options.rekey
61
- @type = @options[:type]
62
- initialize_engine
63
- end
64
66
 
65
- # Override this method to load rendering engine library.
66
- def initialize_engine
67
+ @file = @options[:file]
68
+ @text = @options[:text] || file_read(@file)
69
+ @type = @options[:type] || file_type(@file)
67
70
  end
68
71
 
69
- public
72
+ public
70
73
 
71
74
  # Access to the options given to the initializer.
72
75
  attr :options
73
76
 
77
+ # Change options on the fly.
78
+ def with(options={})
79
+ alt = dup
80
+ alt.with!(options)
81
+ end
82
+
83
+ # Change options in-place.
84
+ def with!(options)
85
+ @options.update(options.rekey)
86
+ self
87
+ end
88
+
74
89
  # Document source text.
75
90
  def text
76
- @text ||= options[:text] || File.read(file)
91
+ @text
77
92
  end
78
93
 
79
94
  # File name of document.
80
95
  def file
81
- @file ||= options[:file].to_s
96
+ @file
82
97
  end
83
98
 
84
99
  # File extension (with prefixed dot).
85
100
  def type
86
- @type ||= File.extname(file)
101
+ @type
87
102
  end
88
103
 
89
104
  # Specified engine to use for rendering.
@@ -95,25 +110,37 @@ module Format
95
110
  end
96
111
 
97
112
  #
98
- def to(type, data=nil, &yld)
99
- __send__("to_#{type}", data, &yld)
113
+ def to(type, *data, &yld)
114
+ __send__("to_#{type}", *data, &yld)
100
115
  end
101
116
 
102
117
  # Render to default or given format.
103
118
  #
104
119
  # If the first argument is a Symbol it is considered the format, otherwise
105
- # it is taken to be the database for rendering template variables.
120
+ # it is taken to be the data for rendering template variables.
106
121
  def render(*type_and_data, &yld)
107
- type, data = parse_type_and_data(type_and_data)
122
+ type, data = parse_type_from_data(*type_and_data)
108
123
  meth = method(type || default)
109
124
  #__send__(type || default, data, &yld)
110
- meth.arity == 0 ? meth.call(&yld) : meth.call(data, &yld)
125
+ meth.arity == 0 ? meth.call(&yld) : meth.call(*data, &yld)
111
126
  end
112
127
 
113
128
  #
114
- #def render_to(format, db=nil, &yld)
115
- # render_engine.render(format, text, file, db, &yld)
116
- #end
129
+ def render_into(into, *data, &content)
130
+ parameters = rendering_parameters(into, data)
131
+ Malt.render(parameters, &content)
132
+ end
133
+
134
+ #
135
+ def rendering_parameters(into, data)
136
+ opts = options.merge(
137
+ :to => into,
138
+ :data => data,
139
+ :text => text,
140
+ :file => file,
141
+ :engine => engine
142
+ )
143
+ end
117
144
 
118
145
  #
119
146
  # def method_missing(s, *a, &b)
@@ -152,7 +179,7 @@ module Format
152
179
  if type
153
180
  type = type.to_s.sub(/^\./,'')
154
181
  fext = self.class.extensions.find{|e| file.end_with?(e)}
155
- new_file = file.chomp(fext) + type
182
+ new_file = file.chomp(fext) + '.' + type
156
183
  else
157
184
  fext = self.class.extensions.find{|e| file.end_with?(e)}
158
185
  new_file = file.chomp('.'+fext)
@@ -179,8 +206,8 @@ module Format
179
206
  end
180
207
 
181
208
  #
182
- def to_default(data=nil, &yld)
183
- to(default, data, &yld)
209
+ def to_default(*data, &yld)
210
+ to(default, *data, &yld)
184
211
  end
185
212
 
186
213
  # Default rendering type is +:html+. Override if it
@@ -190,17 +217,51 @@ module Format
190
217
  end
191
218
 
192
219
  #
193
- def parse_type_and_data(type_and_data)
194
- if Symbol === type_and_data.first
195
- type = type_and_data.first
196
- data = type_and_data.last
220
+ def parse_type_from_data(*data)
221
+ if Symbol === data.first
222
+ type = data.shift
197
223
  else
198
224
  type = nil
199
- data = type_and_data.first
200
225
  end
201
226
  return type, data
202
227
  end
203
228
 
229
+ ##
230
+ #def parse_type_scope_data(*data)
231
+ # if Symbol === data.first
232
+ # type = data.shift
233
+ # else
234
+ # type = nil
235
+ # end
236
+ # scope, data = scope_vs_data(*data)
237
+ # return type, scope, data
238
+ #end
239
+
240
+ # @deprecate
241
+ def scope_vs_data(scope, data=nil)
242
+ if scope && !data
243
+ if scope.respond_to?(:to_hash)
244
+ data = scope
245
+ scope = nil
246
+ end
247
+ end
248
+ return scope, data
249
+ end
250
+
251
+ #
252
+ def file_read(file)
253
+ File.read(file)
254
+ end
255
+
256
+ #
257
+ def file_type(file)
258
+ if file
259
+ File.extname(file)
260
+ else
261
+ nil
262
+ end
263
+ end
264
+
204
265
  end
205
266
 
206
267
  # TODO: Is this needed anymore, if so where?
@@ -9,19 +9,21 @@ module Format
9
9
  class AbstractTemplate < Abstract
10
10
 
11
11
  #
12
- def to(type, data=nil, &yld)
12
+ def to(type, *data, &yld)
13
13
  new_class = Malt::Format.registry[type.to_sym] # TODO: Malt.machine.format?
14
- new_text = render(type, data, &yld)
14
+ new_text = render_into(type, *data, &yld)
15
15
  new_file = refile(type)
16
16
  new_options = options.merge(:text=>new_text, :file=>new_file, :type=>type)
17
17
  new_class.new(new_options)
18
18
  end
19
-
19
+
20
20
  #
21
- def render(*type_and_data, &yld)
22
- type, data = parse_type_and_data(type_and_data)
23
- opts = options.merge(:format=>type, :text=>text, :file=>file, :data=>data)
24
- render_engine.render(opts, &yld)
21
+ def render(*type_and_data, &content)
22
+ type, data = parse_type_from_data(*type_and_data)
23
+ #opts = options.merge(:to=>type, :text=>text, :file=>file, :data=>data)
24
+ render_into(type, *data, &content)
25
+
26
+ #render_engine.render(opts, &yld)
25
27
  #opts = options.merge(:format=>type, :text=>text, :file=>file, :data=>data, :engine=>engine)
26
28
  #Malt.render(opts, &yld)
27
29
  end
@@ -29,7 +31,7 @@ module Format
29
31
  # ERB templates can be any type.
30
32
  def method_missing(sym, *args, &yld)
31
33
  if Malt::Format.registry.key?(sym) # TODO: Malt.machine.format?
32
- return render(sym, *args, &yld).to_s
34
+ return render_into(sym, *args, &yld) #.to_s
33
35
  elsif md = /^to_/.match(sym.to_s)
34
36
  type = md.post_match.to_sym
35
37
  if Malt::Format.registry.key?(type) # TODO: Malt.machine.format?