malt 0.3.0 → 0.4.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.
- data/.ruby +156 -0
- data/Assembly +28 -0
- data/COPYING.rdoc +33 -0
- data/Gemfile +10 -0
- data/HISTORY.rdoc +102 -0
- data/README.rdoc +16 -10
- data/Reapfile +4 -0
- data/lib/malt.rb +36 -8
- data/lib/malt.yml +156 -0
- data/lib/malt/conversions.rb +42 -0
- data/lib/malt/core_ext.rb +81 -3
- data/lib/malt/engines/abstract.rb +259 -50
- data/lib/malt/engines/bluecloth.rb +19 -9
- data/lib/malt/engines/builder.rb +93 -32
- data/lib/malt/engines/coffee.rb +46 -0
- data/lib/malt/engines/creole.rb +60 -0
- data/lib/malt/engines/erb.rb +69 -44
- data/lib/malt/engines/erector.rb +61 -30
- data/lib/malt/engines/erubis.rb +41 -31
- data/lib/malt/engines/haml.rb +13 -37
- data/lib/malt/engines/kramdown.rb +40 -15
- data/lib/malt/engines/less.rb +15 -14
- data/lib/malt/engines/liquid.rb +24 -14
- data/lib/malt/engines/markaby.rb +44 -22
- data/lib/malt/engines/maruku.rb +89 -0
- data/lib/malt/engines/mustache.rb +20 -14
- data/lib/malt/engines/nokogiri.rb +89 -0
- data/lib/malt/engines/radius.rb +72 -34
- data/lib/malt/engines/ragtag.rb +26 -18
- data/lib/malt/engines/rdiscount.rb +18 -11
- data/lib/malt/engines/rdoc.rb +21 -15
- data/lib/malt/engines/redcarpet.rb +137 -0
- data/lib/malt/engines/redcloth.rb +15 -7
- data/lib/malt/engines/ruby.rb +13 -12
- data/lib/malt/engines/sass.rb +30 -17
- data/lib/malt/engines/string.rb +36 -0
- data/lib/malt/engines/tenjin.rb +70 -27
- data/lib/malt/engines/wikicloth.rb +48 -0
- data/lib/malt/formats/abstract.rb +90 -29
- data/lib/malt/formats/abstract_template.rb +10 -8
- data/lib/malt/formats/builder.rb +39 -13
- data/lib/malt/formats/coffee.rb +54 -0
- data/lib/malt/formats/css.rb +3 -3
- data/lib/malt/formats/erb.rb +31 -66
- data/lib/malt/formats/haml.rb +8 -8
- data/lib/malt/formats/html.rb +1 -7
- data/lib/malt/formats/javascript.rb +27 -0
- data/lib/malt/formats/latex.rb +1 -1
- data/lib/malt/formats/less.rb +13 -11
- data/lib/malt/formats/liquid.rb +7 -7
- data/lib/malt/formats/markdown.rb +43 -44
- data/lib/malt/formats/mediawiki.rb +70 -0
- data/lib/malt/formats/mustache.rb +5 -5
- data/lib/malt/formats/pdf.rb +1 -7
- data/lib/malt/formats/radius.rb +5 -4
- data/lib/malt/formats/ragtag.rb +14 -13
- data/lib/malt/formats/rbhtml.rb +28 -20
- data/lib/malt/formats/rdoc.rb +5 -4
- data/lib/malt/formats/rhtml.rb +19 -43
- data/lib/malt/formats/ruby.rb +11 -45
- data/lib/malt/formats/sass.rb +16 -24
- data/lib/malt/formats/scss.rb +13 -30
- data/lib/malt/formats/string.rb +61 -0
- data/lib/malt/formats/tenjin.rb +4 -4
- data/lib/malt/formats/text.rb +1 -1
- data/lib/malt/formats/textile.rb +7 -19
- data/lib/malt/kernel.rb +1 -2
- data/lib/malt/machine.rb +83 -13
- data/lib/malt/tilted.rb +216 -0
- data/lib/malt/version.rb +21 -0
- data/test/helper.rb +15 -0
- data/test/unit/engines/case_engine_bluecloth.rb +40 -0
- data/test/unit/engines/case_engine_builder.rb +30 -0
- data/test/unit/engines/case_engine_coffee.rb +30 -0
- data/test/unit/engines/case_engine_creole.rb +35 -0
- data/test/unit/engines/case_engine_erb.rb +28 -0
- data/test/unit/engines/case_engine_erector.rb +36 -0
- data/test/unit/engines/case_engine_erubis.rb +28 -0
- data/test/unit/engines/case_engine_haml.rb +30 -0
- data/test/unit/engines/case_engine_kramdown.rb +30 -0
- data/test/unit/engines/case_engine_less.rb +40 -0
- data/test/unit/engines/case_engine_liquid.rb +28 -0
- data/test/unit/engines/case_engine_markaby.rb +20 -0
- data/test/unit/engines/case_engine_maruku.rb +30 -0
- data/test/unit/engines/case_engine_mustache.rb +28 -0
- data/test/unit/engines/case_engine_nokogiri.rb +30 -0
- data/test/unit/engines/case_engine_radius.rb +30 -0
- data/test/unit/engines/case_engine_ragtag.rb +40 -0
- data/test/unit/engines/case_engine_rdiscount.rb +30 -0
- data/test/unit/engines/case_engine_rdoc.rb +31 -0
- data/test/unit/engines/case_engine_redcarpet.rb +30 -0
- data/test/unit/engines/case_engine_redcloth.rb +31 -0
- data/test/unit/engines/case_engine_ruby.rb +28 -0
- data/test/unit/engines/case_engine_sass.rb +36 -0
- data/test/unit/engines/case_engine_string.rb +28 -0
- data/test/unit/engines/case_engine_tenjin.rb +28 -0
- data/test/unit/engines/case_engine_wikicloth.rb +25 -0
- data/test/unit/machine.rb +27 -0
- data/test/unit/malt.rb +12 -0
- metadata +364 -266
- data/History.rdoc +0 -64
- data/License.txt +0 -205
- data/Syckfile +0 -80
- data/features/consistent_rendering.feature +0 -36
- data/features/samples/sample.erb +0 -1
- data/features/samples/sample.erubis +0 -1
- data/features/samples/sample.liquid +0 -1
- data/features/samples/sample.mustache +0 -1
- data/features/samples/sample.radius +0 -1
- data/features/step_definitions/engine_steps.rb +0 -49
- data/features/support/loadpath.rb +0 -1
- data/features/support/sample_class.rb +0 -8
- data/lib/malt/formats/erector.rb +0 -53
- data/lib/malt/formats/markaby.rb +0 -53
- data/lib/malt/meta/data.rb +0 -26
- data/lib/malt/meta/package +0 -21
- data/lib/malt/meta/profile +0 -21
- data/meta/data.rb +0 -26
- data/meta/package +0 -21
- data/meta/profile +0 -21
- data/qed/01_overview.rdoc +0 -8
- data/qed/02_formats.rdoc +0 -39
- data/qed/03_formats/01_overview.rdoc +0 -7
- data/qed/03_formats/02_rdoc.rdoc +0 -83
- data/qed/03_formats/03_textile.rdoc +0 -48
- data/qed/03_formats/04_markdown.rdoc +0 -66
- data/qed/03_formats/05_erb.rdoc +0 -65
- data/qed/03_formats/06_liquid.rdoc +0 -54
- data/qed/03_formats/07_haml.rdoc +0 -44
- data/qed/03_formats/08_ragtag.rdoc +0 -19
- data/qed/03_formats/09_radius.rdoc +0 -43
- data/qed/03_formats/11_tenjin.rdoc +0 -47
- data/qed/03_formats/12_rbhtml.rdoc +0 -55
- data/qed/03_formats/13_sass.rdoc +0 -55
- data/qed/03_formats/14_scss.rdoc +0 -58
- data/qed/03_formats/15_less.rdoc +0 -46
- data/qed/03_formats/16_ruby.rdoc +0 -48
- data/qed/03_formats/17_markaby.rdoc +0 -50
- data/qed/03_formats/18_builder.rb +0 -50
- data/qed/03_formats/19_erector.rb +0 -50
- data/qed/03_formats/20_mustache.rdoc +0 -54
- data/qed/05_machine/01_limited_formats.rdoc +0 -29
- data/qed/05_machine/02_prioritized_engines.rdoc +0 -34
- data/qed/applique/malt.rb +0 -13
- data/qed/samples/data.yml +0 -4
- data/qed/samples/output-erb.txt +0 -1
- data/qed/samples/output-liquid.txt +0 -1
- data/qed/samples/output-mustache.txt +0 -1
- data/qed/samples/output-radius.txt +0 -1
- data/qed/samples/sample.erb +0 -1
- data/qed/samples/sample.liquid +0 -1
- data/qed/samples/sample.markdown +0 -308
- data/qed/samples/sample.mustache +0 -1
- data/qed/samples/sample.radius +0 -1
- data/qed/samples/sample.rdoc +0 -8
data/lib/malt/formats/ruby.rb
CHANGED
@@ -1,70 +1,36 @@
|
|
1
1
|
require 'malt/formats/abstract'
|
2
|
-
require 'malt/formats/html'
|
3
2
|
require 'malt/engines/erb'
|
4
3
|
|
5
4
|
module Malt::Format
|
6
5
|
|
7
6
|
# Yes, pure Ruby as a template format.
|
8
7
|
#
|
9
|
-
# The ruby code is run through eval and whatever
|
8
|
+
# The ruby code is run through eval and whatever it returns is given
|
10
9
|
# as the rendering.
|
11
10
|
#
|
12
11
|
# The Ruby format is a *polyglot* format --it accepts all conversion
|
13
12
|
# types and assumes the end-user knows it will be the result.
|
14
13
|
#
|
15
|
-
#
|
16
|
-
# as ERB.
|
14
|
+
# In the future, the Ruby type might also used for "precompiling" other
|
15
|
+
# formats such as ERB.
|
17
16
|
#
|
18
|
-
class Ruby <
|
17
|
+
class Ruby < AbstractTemplate
|
19
18
|
|
20
|
-
|
19
|
+
file_extension 'rb'
|
21
20
|
|
22
21
|
#
|
23
|
-
def rb(*)
|
24
|
-
|
25
|
-
|
26
|
-
#
|
27
|
-
def to_rb(*) ; self ; end
|
28
|
-
alias_method :to_ruby, :to_rb
|
29
|
-
|
30
|
-
#
|
31
|
-
def to(type, data=nil, &yld)
|
32
|
-
new_class = Malt::Format.registry[type.to_sym] # TODO: Malt.machine.format?
|
33
|
-
new_text = render(data, &yld)
|
34
|
-
new_file = refile(type)
|
35
|
-
new_options = options.merge(:text=>new_text, :file=>new_file)
|
36
|
-
new_class.new(new_options)
|
22
|
+
def rb(*)
|
23
|
+
text
|
37
24
|
end
|
38
25
|
|
39
|
-
|
40
|
-
def method_missing(sym, *args, &yld)
|
41
|
-
if Malt::Format.registry.key?(sym)
|
42
|
-
return to(sym, *args, &yld).to_s
|
43
|
-
elsif md = /^to_/.match(sym.to_s)
|
44
|
-
type = md.post_match.to_sym
|
45
|
-
if Malt::Format.registry.key?(type) # TODO: Malt.machine.format?
|
46
|
-
return to(type, *args, &yld)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
super(sym, *args, &yld)
|
50
|
-
end
|
26
|
+
alias_method :ruby, :rb
|
51
27
|
|
52
28
|
#
|
53
|
-
|
54
|
-
|
55
|
-
#end
|
56
|
-
|
57
|
-
def render(*type_and_data, &yld)
|
58
|
-
type, data = parse_type_and_data(type_and_data)
|
59
|
-
render_engine.render(:text=>text, :file=>file, :data=>data, &yld)
|
29
|
+
def to_rb(*)
|
30
|
+
self
|
60
31
|
end
|
61
32
|
|
62
|
-
|
63
|
-
|
64
|
-
#
|
65
|
-
def render_engine
|
66
|
-
@render_engine ||= Malt::Engine::Ruby.new(options)
|
67
|
-
end
|
33
|
+
alias_method :to_ruby, :to_rb
|
68
34
|
|
69
35
|
end
|
70
36
|
|
data/lib/malt/formats/sass.rb
CHANGED
@@ -6,9 +6,10 @@ module Malt::Format
|
|
6
6
|
|
7
7
|
# Sass Format
|
8
8
|
#
|
9
|
+
#
|
9
10
|
class Sass < Abstract
|
10
11
|
|
11
|
-
|
12
|
+
file_extension 'sass'
|
12
13
|
|
13
14
|
#
|
14
15
|
def sass(*)
|
@@ -21,13 +22,14 @@ module Malt::Format
|
|
21
22
|
end
|
22
23
|
|
23
24
|
#
|
24
|
-
def css(data
|
25
|
-
|
25
|
+
def css(*data, &content)
|
26
|
+
render_into(:css, *data, &content)
|
27
|
+
#render_engine.render(:format=>:css, :text=>text, :file=>file, :data=>data, :type=>type, &yld)
|
26
28
|
end
|
27
29
|
|
28
30
|
#
|
29
|
-
def to_css(data
|
30
|
-
result = css(data, &
|
31
|
+
def to_css(*data, &content)
|
32
|
+
result = css(*data, &content)
|
31
33
|
CSS.new(:text=>result, :file=>refile(:css), :type=>:css)
|
32
34
|
end
|
33
35
|
|
@@ -38,27 +40,17 @@ module Malt::Format
|
|
38
40
|
# CSS.new(opts)
|
39
41
|
#end
|
40
42
|
|
41
|
-
|
42
|
-
#def render_to(to, db, &yld)
|
43
|
-
# case to
|
44
|
-
# when :css
|
45
|
-
# malt_engine.render_css(text, file, db, &yld)
|
46
|
-
# else
|
47
|
-
# raise UnspportedConversion.new(type, to)
|
48
|
-
# end
|
49
|
-
#end
|
50
|
-
|
51
|
-
private
|
43
|
+
private
|
52
44
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
45
|
+
##
|
46
|
+
#def render_engine
|
47
|
+
# @render_engine ||= Malt::Engine::Sass.new(options)
|
48
|
+
#end
|
57
49
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
50
|
+
# Sass default output type is CSS.
|
51
|
+
def default
|
52
|
+
:css
|
53
|
+
end
|
62
54
|
|
63
55
|
end
|
64
56
|
|
data/lib/malt/formats/scss.rb
CHANGED
@@ -9,7 +9,7 @@ module Malt::Format
|
|
9
9
|
# This uses the same engine as Sass.
|
10
10
|
class SCSS < Abstract
|
11
11
|
|
12
|
-
|
12
|
+
file_extension 'scss'
|
13
13
|
|
14
14
|
#
|
15
15
|
def scss(*)
|
@@ -22,44 +22,27 @@ module Malt::Format
|
|
22
22
|
end
|
23
23
|
|
24
24
|
#
|
25
|
-
def css(data
|
26
|
-
|
25
|
+
def css(*data, &content)
|
26
|
+
render_into(:css, *data, &content)
|
27
27
|
end
|
28
28
|
|
29
29
|
#
|
30
|
-
def to_css(data
|
31
|
-
result = css(data, &
|
30
|
+
def to_css(*data, &content)
|
31
|
+
result = css(*data, &content)
|
32
32
|
CSS.new(:text=>result, :file=>refile(:css), :type=>:css)
|
33
33
|
end
|
34
34
|
|
35
|
-
|
36
|
-
#def compile(db, &yld)
|
37
|
-
# result = render_engine.render(text, db, &yld)
|
38
|
-
# opts = options.merge(:text=>result, file=>refile(:css))
|
39
|
-
# CSS.new(opts)
|
40
|
-
#end
|
35
|
+
private
|
41
36
|
|
42
|
-
|
43
|
-
#def
|
44
|
-
#
|
45
|
-
# when :css
|
46
|
-
# malt_engine.render_css(text, file, db, &yld)
|
47
|
-
# else
|
48
|
-
# raise UnspportedConversion.new(type, to)
|
49
|
-
# end
|
37
|
+
##
|
38
|
+
#def render_engine
|
39
|
+
# @render_engine ||= Malt::Engine::Sass.new(options)
|
50
40
|
#end
|
51
41
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
@render_engine ||= Malt::Engine::Sass.new(options)
|
57
|
-
end
|
58
|
-
|
59
|
-
# Sass default output type is CSS.
|
60
|
-
def default
|
61
|
-
:css
|
62
|
-
end
|
42
|
+
# Sass default output type is CSS.
|
43
|
+
def default
|
44
|
+
:css
|
45
|
+
end
|
63
46
|
|
64
47
|
end
|
65
48
|
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'malt/formats/abstract'
|
2
|
+
require 'malt/formats/html'
|
3
|
+
require 'malt/engines/erb'
|
4
|
+
|
5
|
+
module Malt::Format
|
6
|
+
|
7
|
+
# Yes, pure Ruby as a template format.
|
8
|
+
#
|
9
|
+
# The ruby code is run through eval and whatever is returned is given
|
10
|
+
# as the rendering.
|
11
|
+
#
|
12
|
+
# The Ruby format is a *polyglot* format --it accepts all conversion
|
13
|
+
# types and assumes the end-user knows it will be the result.
|
14
|
+
#
|
15
|
+
# The Ruby type is also used for "precompiling" other formats such
|
16
|
+
# as ERB.
|
17
|
+
#
|
18
|
+
class String < AbstractTemplate
|
19
|
+
|
20
|
+
file_extension 'str'
|
21
|
+
|
22
|
+
#
|
23
|
+
def string(*) ; text ; end
|
24
|
+
|
25
|
+
#
|
26
|
+
def to_string(*) ; self ; end
|
27
|
+
|
28
|
+
=begin
|
29
|
+
#
|
30
|
+
def to(type, *data, &yld)
|
31
|
+
new_class = Malt::Format.registry[type.to_sym] # TODO: Malt.machine.format?
|
32
|
+
new_text = render(*data, &yld)
|
33
|
+
new_file = refile(type)
|
34
|
+
new_options = options.merge(:text=>new_text, :file=>new_file)
|
35
|
+
new_class.new(new_options)
|
36
|
+
end
|
37
|
+
=end
|
38
|
+
|
39
|
+
# # Ruby templates can be any type.
|
40
|
+
# def method_missing(sym, *args, &yld)
|
41
|
+
# if Malt::Format.registry.key?(sym)
|
42
|
+
# return to(sym, *args, &yld).to_s
|
43
|
+
# elsif md = /^to_/.match(sym.to_s)
|
44
|
+
# type = md.post_match.to_sym
|
45
|
+
# if Malt::Format.registry.key?(type) # TODO: Malt.machine.format?
|
46
|
+
# return to(type, *args, &yld)
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
# super(sym, *args, &yld)
|
50
|
+
# end
|
51
|
+
|
52
|
+
#private
|
53
|
+
|
54
|
+
##
|
55
|
+
#def render_engine
|
56
|
+
# @render_engine ||= Malt::Engine::String.new(options)
|
57
|
+
#end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
data/lib/malt/formats/tenjin.rb
CHANGED
@@ -25,13 +25,13 @@ module Malt::Format
|
|
25
25
|
alias_method(:to_ruby, :to_rb)
|
26
26
|
|
27
27
|
#
|
28
|
-
def html(data
|
29
|
-
|
28
|
+
def html(*data, &content)
|
29
|
+
render_into(:html, *data, &content)
|
30
30
|
end
|
31
31
|
|
32
32
|
#
|
33
|
-
def to_html(data
|
34
|
-
new_text = render(:html, data, &yld)
|
33
|
+
def to_html(*data, &yld)
|
34
|
+
new_text = render(:html, *data, &yld)
|
35
35
|
new_file = refile(:html)
|
36
36
|
new_options = options.merge(:text=>new_text, :file=>new_file, :type=>:html)
|
37
37
|
HTML.new(new_options)
|
data/lib/malt/formats/text.rb
CHANGED
data/lib/malt/formats/textile.rb
CHANGED
@@ -6,7 +6,7 @@ module Malt::Format
|
|
6
6
|
#
|
7
7
|
class Textile < Abstract
|
8
8
|
|
9
|
-
|
9
|
+
file_extension 'textile', 'tt'
|
10
10
|
|
11
11
|
#
|
12
12
|
def textile(*)
|
@@ -24,8 +24,8 @@ module Malt::Format
|
|
24
24
|
alias_method :to_tt, :to_textile
|
25
25
|
|
26
26
|
#
|
27
|
-
def html(*)
|
28
|
-
|
27
|
+
def html(*data, &content)
|
28
|
+
render_into(:html, *data, &content)
|
29
29
|
end
|
30
30
|
|
31
31
|
#
|
@@ -34,25 +34,13 @@ module Malt::Format
|
|
34
34
|
HTML.new(opts)
|
35
35
|
end
|
36
36
|
|
37
|
+
#private
|
37
38
|
#
|
38
|
-
|
39
|
-
#
|
40
|
-
#
|
41
|
-
# self
|
42
|
-
# when :html
|
43
|
-
# malt_engine.render_html(text, file)
|
44
|
-
# else
|
45
|
-
# raise "can't render textile to #{to} type" #?
|
46
|
-
# end
|
39
|
+
##
|
40
|
+
#def render_engine
|
41
|
+
# @render_engine ||= Malt::Engine::RedCloth.new(options)
|
47
42
|
#end
|
48
43
|
|
49
|
-
private
|
50
|
-
|
51
|
-
#
|
52
|
-
def render_engine
|
53
|
-
@render_engine ||= Malt::Engine::RedCloth.new(options)
|
54
|
-
end
|
55
|
-
|
56
44
|
end
|
57
45
|
|
58
46
|
end
|
data/lib/malt/kernel.rb
CHANGED
data/lib/malt/machine.rb
CHANGED
@@ -5,19 +5,19 @@ module Malt
|
|
5
5
|
# which engines and formats are used for rendering.
|
6
6
|
#--
|
7
7
|
# TODO: Can we dynamically generate the MARKUP and TEMPLATE constants
|
8
|
-
# from the format classes? In anycase, the still
|
8
|
+
# from the format classes? In anycase, the still needs tweaking.
|
9
9
|
#++
|
10
10
|
class Machine
|
11
11
|
|
12
12
|
# List of markup types. These are formats that just allow markup transformations
|
13
13
|
# and do not provide for data injection.
|
14
|
-
MARKUP = [:rdoc, :markdown, :textile, :scss, :sass, :less, :css, :html, :xml]
|
14
|
+
MARKUP = [:rdoc, :markdown, :textile, :scss, :sass, :less, :css, :html, :xml, :wikicloth]
|
15
15
|
|
16
16
|
# List of template types. These are template formats that provide data injection.
|
17
|
-
|
17
|
+
TEMPLATE = [:erb, :liquid, :mustache, :tenjin, :ragtag, :radius, :erector, :builder, :ruby, :string]
|
18
18
|
|
19
19
|
# Template types that prevent arbitrary Ruby code execution.
|
20
|
-
|
20
|
+
TEMPLATE_SAFE = [:liquid, :mustache]
|
21
21
|
|
22
22
|
# New Malt Machine.
|
23
23
|
#
|
@@ -26,7 +26,7 @@ module Malt
|
|
26
26
|
#
|
27
27
|
def initialize(config={})
|
28
28
|
if priority = config[:priority]
|
29
|
-
priority.map
|
29
|
+
priority = priority.map{ |e| e.to_sym }
|
30
30
|
else
|
31
31
|
priority = []
|
32
32
|
end
|
@@ -68,6 +68,7 @@ module Malt
|
|
68
68
|
end
|
69
69
|
@priority
|
70
70
|
end
|
71
|
+
alias_method :prefer, :priority
|
71
72
|
|
72
73
|
#
|
73
74
|
def engine?(ext)
|
@@ -92,7 +93,7 @@ module Malt
|
|
92
93
|
type = options[:type] || options[:format] || File.extname(file)
|
93
94
|
type = ext_to_type(type)
|
94
95
|
malt_class = formats[type]
|
95
|
-
raise "
|
96
|
+
raise "unknown type -- #{type}" unless malt_class
|
96
97
|
malt_class.new(options.merge(:file=>file,:type=>type))
|
97
98
|
end
|
98
99
|
|
@@ -110,11 +111,14 @@ module Malt
|
|
110
111
|
end
|
111
112
|
|
112
113
|
# Open a URL as a Malt Format object.
|
114
|
+
#
|
115
|
+
# @return [Malt::Format]
|
113
116
|
def open(url, options={})
|
114
117
|
require 'open-uri'
|
115
118
|
text = open(url).read
|
116
119
|
file = File.basename(url) # parse better with URI.parse
|
117
|
-
|
120
|
+
options[:file] = file
|
121
|
+
text(text, options)
|
118
122
|
end
|
119
123
|
|
120
124
|
# Render template directly.
|
@@ -126,14 +130,67 @@ module Malt
|
|
126
130
|
# parameters[:engine] - Force the use of a this specific engine.
|
127
131
|
# parameters[:to] - Format to convert to (usual default is `html`).
|
128
132
|
#
|
129
|
-
def render(parameters={}, &
|
133
|
+
def render(parameters={}, &content)
|
134
|
+
parameters = normalize_parameters(parameters)
|
135
|
+
|
136
|
+
if parameters[:multi]
|
137
|
+
multi_render(parameters, &content)
|
138
|
+
else
|
139
|
+
single_render(parameters, &content)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
private
|
144
|
+
|
145
|
+
# Normalize parameters.
|
146
|
+
def normalize_parameters(parameters)
|
147
|
+
params = parameters.rekey
|
148
|
+
|
149
|
+
if data = params.delete(:data)
|
150
|
+
scope, locals = split_data(data)
|
151
|
+
params[:scope] ||= scope
|
152
|
+
params[:locals] ||= locals
|
153
|
+
end
|
154
|
+
|
155
|
+
file = params[:file]
|
156
|
+
text = params[:text]
|
157
|
+
|
158
|
+
unless text
|
159
|
+
params[:text] = file_read(file)
|
160
|
+
end
|
161
|
+
|
162
|
+
params
|
163
|
+
end
|
164
|
+
|
165
|
+
#
|
166
|
+
def multi_render(parameters={}, &content)
|
167
|
+
type = parameters[:type]
|
168
|
+
#file = parameters[:file]
|
169
|
+
text = parameters[:text]
|
170
|
+
|
171
|
+
if type = parameters[:type]
|
172
|
+
types = [type].flatten
|
173
|
+
else
|
174
|
+
types = file.split('.')[1..-1]
|
175
|
+
end
|
176
|
+
|
177
|
+
types.reverse_each do |t|
|
178
|
+
parameters[:type] = t
|
179
|
+
parameters[:text] = single_render(parameters, &content)
|
180
|
+
end
|
181
|
+
|
182
|
+
parameters[:text]
|
183
|
+
end
|
184
|
+
|
185
|
+
#
|
186
|
+
def single_render(parameters={}, &content)
|
130
187
|
type = parameters[:type]
|
131
188
|
file = parameters[:file]
|
132
189
|
text = parameters[:text]
|
133
190
|
engine = parameters[:engine]
|
134
191
|
|
135
192
|
type = file_type(file, type)
|
136
|
-
text = file_read(file) unless text
|
193
|
+
#text = file_read(file) unless text
|
137
194
|
|
138
195
|
engine_class = engine(type, engine)
|
139
196
|
|
@@ -142,22 +199,22 @@ module Malt
|
|
142
199
|
parameters[:text] = text
|
143
200
|
|
144
201
|
engine = engine_class.new
|
145
|
-
|
202
|
+
|
203
|
+
engine.render(parameters, &content)
|
146
204
|
else
|
147
205
|
if parameters[:pass]
|
148
206
|
text
|
149
207
|
else
|
150
208
|
raise NoEngineError, "no engine to handle `#{type}' format"
|
151
209
|
end
|
152
|
-
end
|
210
|
+
end
|
153
211
|
end
|
154
212
|
|
155
|
-
private
|
156
|
-
|
157
213
|
#
|
158
214
|
def engine(type, engine=nil)
|
159
215
|
type = ext_to_type(type)
|
160
216
|
#engine = engine || Malt.config.engine[type] # FIXME
|
217
|
+
|
161
218
|
case engine
|
162
219
|
when Class
|
163
220
|
#raise unless Engine.registry[type].include?(engine)
|
@@ -218,6 +275,19 @@ module Malt
|
|
218
275
|
end
|
219
276
|
end
|
220
277
|
|
278
|
+
# Unlike +#scope_and_locals+, this method returns +nil+ for missing
|
279
|
+
# scope or locals.
|
280
|
+
#
|
281
|
+
def split_data(data)
|
282
|
+
scope, locals = *[data].flatten
|
283
|
+
if scope.respond_to?(:to_hash)
|
284
|
+
locals ||= {}
|
285
|
+
locals = locals.merge(scope.to_hash)
|
286
|
+
scope = nil
|
287
|
+
end
|
288
|
+
return scope, locals
|
289
|
+
end
|
290
|
+
|
221
291
|
end
|
222
292
|
|
223
293
|
#
|