malt 0.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.
- data/History.rdoc +13 -0
- data/License.txt +204 -0
- data/README.rdoc +68 -0
- data/bin/malt +4 -0
- data/features/consistent_rendering.feature +36 -0
- data/features/samples/sample.erb +1 -0
- data/features/samples/sample.erubis +1 -0
- data/features/samples/sample.liquid +1 -0
- data/features/samples/sample.mustache +1 -0
- data/features/samples/sample.radius +1 -0
- data/features/step_definitions/engine_steps.rb +49 -0
- data/features/support/loadpath.rb +1 -0
- data/features/support/sample_class.rb +8 -0
- data/lib/malt.rb +79 -0
- data/lib/malt/core_ext.rb +31 -0
- data/lib/malt/engines.rb +10 -0
- data/lib/malt/engines/abstract.rb +151 -0
- data/lib/malt/engines/bluecloth.rb +39 -0
- data/lib/malt/engines/erb.rb +84 -0
- data/lib/malt/engines/erubis.rb +65 -0
- data/lib/malt/engines/haml.rb +68 -0
- data/lib/malt/engines/kramdown.rb +48 -0
- data/lib/malt/engines/less.rb +49 -0
- data/lib/malt/engines/liquid.rb +40 -0
- data/lib/malt/engines/radius.rb +90 -0
- data/lib/malt/engines/rdiscount.rb +49 -0
- data/lib/malt/engines/rdoc.rb +46 -0
- data/lib/malt/engines/redcloth.rb +42 -0
- data/lib/malt/engines/rtals.rb +46 -0
- data/lib/malt/engines/ruby.rb +36 -0
- data/lib/malt/engines/sass.rb +50 -0
- data/lib/malt/engines/tenjin.rb +61 -0
- data/lib/malt/formats.rb +10 -0
- data/lib/malt/formats/abstract.rb +195 -0
- data/lib/malt/formats/css.rb +34 -0
- data/lib/malt/formats/erb.rb +102 -0
- data/lib/malt/formats/haml.rb +53 -0
- data/lib/malt/formats/html.rb +29 -0
- data/lib/malt/formats/latex.rb +47 -0
- data/lib/malt/formats/less.rb +51 -0
- data/lib/malt/formats/liquid.rb +53 -0
- data/lib/malt/formats/markdown.rb +83 -0
- data/lib/malt/formats/pdf.rb +29 -0
- data/lib/malt/formats/radius.rb +47 -0
- data/lib/malt/formats/rdoc.rb +43 -0
- data/lib/malt/formats/rtals.rb +46 -0
- data/lib/malt/formats/ruby.rb +71 -0
- data/lib/malt/formats/sass.rb +56 -0
- data/lib/malt/formats/tenjin.rb +50 -0
- data/lib/malt/formats/text.rb +54 -0
- data/lib/malt/formats/textile.rb +59 -0
- data/lib/malt/formats/yaml.rb +50 -0
- data/lib/malt/kernel.rb +31 -0
- data/lib/malt/meta/data.rb +26 -0
- data/lib/malt/meta/gemfile +17 -0
- data/lib/malt/meta/profile +21 -0
- data/meta/data.rb +26 -0
- data/meta/gemfile +17 -0
- data/meta/profile +21 -0
- data/qed/01_overview.rdoc +44 -0
- data/qed/applique/malt.rb +12 -0
- metadata +283 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'malt/formats/abstract'
|
2
|
+
require 'malt/formats/html'
|
3
|
+
require 'malt/engines/erb'
|
4
|
+
|
5
|
+
module Malt::Formats
|
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 Ruby < Abstract
|
19
|
+
|
20
|
+
register 'rb'
|
21
|
+
|
22
|
+
#
|
23
|
+
def rb ; text ; end
|
24
|
+
alias_method :ruby, :rb
|
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.registry[type.to_sym]
|
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)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Ruby templates can be any type.
|
40
|
+
def method_missing(sym, *args, &yld)
|
41
|
+
if Malt.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.registry.key?(type)
|
46
|
+
return to(type, *args, &yld)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
super(sym, *args, &yld)
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
#def render_to(to, db, &yld)
|
54
|
+
# malt_engine.render(text, file, db, &yld)
|
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)
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
#
|
65
|
+
def render_engine
|
66
|
+
@render_engine ||= Malt::Engines::Ruby.new(options)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'malt/formats/abstract'
|
2
|
+
require 'malt/formats/css'
|
3
|
+
require 'malt/engines/sass'
|
4
|
+
|
5
|
+
module Malt::Formats
|
6
|
+
|
7
|
+
# Sass Format
|
8
|
+
#
|
9
|
+
class Sass < Abstract
|
10
|
+
|
11
|
+
register 'sass'
|
12
|
+
|
13
|
+
#
|
14
|
+
def css(data=nil, &yld)
|
15
|
+
render_engine.render(:format=>:css, :text=>text, :file=>file, :type=>type)
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
def to_css(data=nil, &yld)
|
20
|
+
result = css(data, &yld)
|
21
|
+
CSS.new(:text=>result, :file=>refile(:css), :type=>:css)
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
#def compile(db, &yld)
|
26
|
+
# result = render_engine.render(text, db, &yld)
|
27
|
+
# opts = options.merge(:text=>result, file=>refile(:css))
|
28
|
+
# CSS.new(opts)
|
29
|
+
#end
|
30
|
+
|
31
|
+
#
|
32
|
+
#def render_to(to, db, &yld)
|
33
|
+
# case to
|
34
|
+
# when :css
|
35
|
+
# malt_engine.render_css(text, file, db, &yld)
|
36
|
+
# else
|
37
|
+
# raise UnspportedConversion.new(type, to)
|
38
|
+
# end
|
39
|
+
#end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
#
|
44
|
+
def render_engine
|
45
|
+
@render_engine ||= Malt::Engines::Sass.new(options)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Sass default output type is CSS.
|
49
|
+
def default
|
50
|
+
:css
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'malt/formats/abstract_template'
|
2
|
+
require 'malt/formats/html'
|
3
|
+
require 'malt/engines/tenjin'
|
4
|
+
|
5
|
+
module Malt::Formats
|
6
|
+
|
7
|
+
# Tenjin
|
8
|
+
#
|
9
|
+
# http://www.kuwata-lab.com/tenjin/
|
10
|
+
#
|
11
|
+
class Tenjin < AbstractTemplate
|
12
|
+
|
13
|
+
register 'tenjin'
|
14
|
+
|
15
|
+
def rb
|
16
|
+
render_engine.compile(text, file)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Erb templates can be "precompiled" into Ruby templates.
|
20
|
+
def to_rb
|
21
|
+
text = rb
|
22
|
+
Ruby.new(:text=>text, :file=>refile(:rb), :type=>:rb)
|
23
|
+
end
|
24
|
+
|
25
|
+
alias_method(:to_ruby, :to_rb)
|
26
|
+
|
27
|
+
#
|
28
|
+
def html
|
29
|
+
render(:html, data, &yld)
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
def to_html(data, &yld)
|
34
|
+
new_text = render(:html, data, &yld)
|
35
|
+
new_file = refile(:html)
|
36
|
+
new_options = options.merge(:text=>new_text, :file=>new_file, :type=>:html)
|
37
|
+
HTML.new(new_options)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
#
|
43
|
+
def render_engine
|
44
|
+
@render_engine ||= Malt::Engines::Tenjin.new(options)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'malt/formats/abstract'
|
2
|
+
require 'malt/formats/html'
|
3
|
+
require 'malt/formats/pdf'
|
4
|
+
|
5
|
+
module Malt::Formats
|
6
|
+
|
7
|
+
# Plain text format. Plain text documents are uniqu in that they can
|
8
|
+
# be transformed into any other type of document. For example, applying
|
9
|
+
# to_html in text doesn't actually transform the source text in any way.
|
10
|
+
# Rather it simply "informs" Malt to treat the text as HTML.
|
11
|
+
#
|
12
|
+
class Text < Abstract
|
13
|
+
|
14
|
+
register('txt')
|
15
|
+
|
16
|
+
#
|
17
|
+
def txt(*)
|
18
|
+
text
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
def to_txt(*)
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
def method_missing(sym, *args, &block)
|
28
|
+
if md = /^to_/.match(sym.to_s)
|
29
|
+
type = md.post_match.to_sym
|
30
|
+
opts = options.merge(:type=>type, :file=>refile(type))
|
31
|
+
return Malt.text(text, opts)
|
32
|
+
end
|
33
|
+
super(sym, *args, &block)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns an HTML object.
|
37
|
+
#def to_html
|
38
|
+
# HTML.new(:text=>text,:file=>refile(:html))
|
39
|
+
#end
|
40
|
+
|
41
|
+
# Returns a PDF object.
|
42
|
+
#def to_pdf
|
43
|
+
# PDF.new(:text=>text,:file=>refile(:pdf))
|
44
|
+
#end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def render_engine
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'malt/formats/abstract'
|
2
|
+
require 'malt/engines/redcloth'
|
3
|
+
|
4
|
+
module Malt::Formats
|
5
|
+
|
6
|
+
#
|
7
|
+
class Textile < Abstract
|
8
|
+
|
9
|
+
register('textile', 'tt')
|
10
|
+
|
11
|
+
#
|
12
|
+
def html
|
13
|
+
render_engine.render(:format=>:html, :text=>text, :file=>file)
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
def textile
|
18
|
+
text
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
alias_method :tt, :textile
|
23
|
+
|
24
|
+
#
|
25
|
+
def to_html
|
26
|
+
opts = options.merge(:text=>html, :file=>refile(:html), :type=>:html)
|
27
|
+
HTML.new(opts)
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
def to_textile
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
alias_method :to_tt, :to_textile
|
36
|
+
|
37
|
+
#
|
38
|
+
#def render_to(to, *)
|
39
|
+
# case to
|
40
|
+
# when :textile, :tt
|
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
|
47
|
+
#end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
#
|
52
|
+
def render_engine
|
53
|
+
@render_engine ||= Malt::Engines::RedCloth.new(options)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'malt/formats/abstract'
|
2
|
+
require 'malt/formats/html'
|
3
|
+
|
4
|
+
module Malt::Formats
|
5
|
+
|
6
|
+
# = YAML format
|
7
|
+
#
|
8
|
+
# TODO: hmm... maybe use data to update yaml?
|
9
|
+
class YAML < Abstract
|
10
|
+
|
11
|
+
register 'yaml', 'yml'
|
12
|
+
|
13
|
+
#
|
14
|
+
def yaml(*)
|
15
|
+
text
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :yml, :yaml
|
19
|
+
|
20
|
+
#
|
21
|
+
def to_yaml(*)
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
alias_method :to_yml, :to_yaml
|
26
|
+
|
27
|
+
# Converting a plan YAML file to HTML makes no sense so we
|
28
|
+
# just wrap it in +pre+ tags.
|
29
|
+
def html
|
30
|
+
"<pre>\n#{h text}\n</pre>"
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
def to_html
|
35
|
+
text = html
|
36
|
+
opts = options.merge(:text=>text, :file=>refile(:html), :type=>:html)
|
37
|
+
HTML.new(opts)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
# TODO: HTML escaping
|
43
|
+
def h(text)
|
44
|
+
text
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
data/lib/malt/kernel.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'malt/core_ext'
|
2
|
+
|
3
|
+
module Malt
|
4
|
+
|
5
|
+
module Kernel
|
6
|
+
private
|
7
|
+
|
8
|
+
#
|
9
|
+
def make_ostruct(hash)
|
10
|
+
case hash
|
11
|
+
when OpenStruct
|
12
|
+
hash
|
13
|
+
else
|
14
|
+
OpenStruct.new(hash)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
def ext_to_type(ext)
|
20
|
+
ext = ext.to_s.downcase
|
21
|
+
return nil if ext.empty?
|
22
|
+
if ext[0,1] == '.'
|
23
|
+
ext[1..-1].to_sym
|
24
|
+
else
|
25
|
+
ext.to_sym
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Object.__send__(:remove_const, :VERSION) if Object.const_defined?(:VERSION) # becuase Ruby 1.8~ gets in the way
|
2
|
+
|
3
|
+
module Malt
|
4
|
+
|
5
|
+
DIRECTORY = File.dirname(__FILE__)
|
6
|
+
|
7
|
+
def self.gemfile
|
8
|
+
@gemfile ||= (
|
9
|
+
require 'yaml'
|
10
|
+
YAML.load(File.new(DIRECTORY + '/gemfile'))
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.profile
|
15
|
+
@profile ||= (
|
16
|
+
require 'yaml'
|
17
|
+
YAML.load(File.new(DIRECTORY + '/profile'))
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.const_missing(name)
|
22
|
+
key = name.to_s.downcase
|
23
|
+
gemfile[key] || profile[key] || super(name)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
name : malt
|
2
|
+
date : 2010-09-07
|
3
|
+
version : 0.1.0
|
4
|
+
|
5
|
+
requires:
|
6
|
+
- syckle (build)
|
7
|
+
- qed (test)
|
8
|
+
- rdoc (test)
|
9
|
+
- redcloth (test)
|
10
|
+
- bluecloth (test)
|
11
|
+
- kramdown (test)
|
12
|
+
- haml (test)
|
13
|
+
- tenjin (test)
|
14
|
+
- rtals (test)
|
15
|
+
- liquid (test)
|
16
|
+
- erubis (test)
|
17
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
title : Malt
|
2
|
+
summary: Multi-template/multi-markup rendering engine
|
3
|
+
contact: trans <transfire@gmail.com>
|
4
|
+
created: 2010-06-22
|
5
|
+
|
6
|
+
authors:
|
7
|
+
- Thomas Sawyer
|
8
|
+
|
9
|
+
description:
|
10
|
+
Malt provides a factory framework for rendering
|
11
|
+
a variety of template and markup document formats.
|
12
|
+
|
13
|
+
resources:
|
14
|
+
home: http://rubyworks.github.com/malt
|
15
|
+
code: http://github.com/rubyworks/malt
|
16
|
+
wiki: http://wiki.github.com/rubyworks/malt
|
17
|
+
docs: http://rubyworks.github.com/malt/docs/api
|
18
|
+
bugs: http://github.com/rubyworks/malt/issues
|
19
|
+
|
20
|
+
copyright:
|
21
|
+
Copyright (c) 2010 Thomas Sawyer
|