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.
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
@@ -8,27 +8,37 @@ module Malt::Engine
8
8
  register :markdown, :md
9
9
 
10
10
  # Convert Markdown text to HTML text.
11
- def render(params)
12
- text = params[:text]
11
+ def render(params={})
13
12
  into = params[:to]
13
+
14
+ text = parameters(params, :text)
15
+
14
16
  case into
15
17
  when :html, nil
16
- intermediate(params).to_html
18
+ prepare_engine(params).to_html
17
19
  else
18
20
  super(params)
19
21
  end
20
22
  end
21
23
 
22
- # Convert Markdown text to intermediate object.
23
- def intermediate(params)
24
- text = params[:text]
25
- ::BlueCloth.new(text)
24
+ # Prepare engine for rendering.
25
+ #def prepare_engine(params={})
26
+ # create_engine(params)
27
+ #end
28
+
29
+ # Instantiate engine class and cache if applicable.
30
+ def create_engine(params={})
31
+ text = parameters(params, :text)
32
+
33
+ cached(text) do
34
+ ::BlueCloth.new(text)
35
+ end
26
36
  end
27
37
 
28
- private
38
+ private
29
39
 
30
40
  # Load bluecloth library if not already loaded.
31
- def initialize_engine
41
+ def require_engine
32
42
  return if defined? ::BlueCloth
33
43
  require_library 'bluecloth'
34
44
  end
@@ -8,44 +8,111 @@ module Malt::Engine
8
8
  #
9
9
  class Builder < Abstract
10
10
 
11
- default :builder
11
+ default :builder, :rbml
12
12
 
13
13
  #
14
- #def intermediate(params)
15
- #end
14
+ def render(params={}, &content)
15
+ into = parameters(params, :to) || :html
16
16
 
17
- #
18
- def render(params, &yld)
19
- into = params[:to]
20
17
  case into
21
- when :html, nil
22
- render_html(params, &yld)
18
+ when :xml, :html, :xhtml
19
+ prepare_engine(params, &content) #.target!
23
20
  else
24
- super(params, &yld)
21
+ super(params, &content)
25
22
  end
26
23
  end
27
24
 
28
- # TODO: Do we need a #make_ivar(data, &yld) method to make data into
29
- # instance variables for some templates like this one?
30
- def render_html(params={}, &yld)
31
- text = params[:text]
32
- file = params[:file]
33
- data = params[:data]
34
-
35
- data = make_hash(data, &yld)
36
- builder = ::Builder::XmlMarkup.new(engine_options(params))
37
- data.each{ |k,v| builder.instance_eval("@#{k} = v") }
38
- builder.instance_eval(text, file)
25
+ #private
26
+
27
+ # Prepare engine for rendering.
28
+ def prepare_engine(params={}, &content)
29
+ prefix = parameters(params, :prefix)
30
+
31
+ if prefix
32
+ prepare_engine_prefix(params, &content)
33
+ else
34
+ prepare_engine_scope(params, &content)
35
+ end
36
+ end
37
+
38
+ # TODO: Can Builder be cached?
39
+
40
+ #
41
+ def create_engine(params={})
42
+ opts = engine_options(params)
43
+
44
+ #cached(opts) do
45
+ ::Builder::XmlMarkup.new(opts)
46
+ #end
39
47
  end
40
48
 
41
- private
49
+ #
50
+ def prepare_engine_prefix(params, &content)
51
+ prefix, text, file, scope, locals = parameters(params, :prefix, :text, :file, :scope, :locals)
52
+
53
+ bind = make_binding(scope, locals, &content)
54
+
55
+ #scope, locals = split_data(data)
56
+
57
+ #scope ||= Object.new
58
+ #locals ||= {}
59
+
60
+ engine = create_engine(params)
61
+
62
+ code = %{
63
+ lambda do |#{prefix}|
64
+ #{text}
65
+ end
66
+ }
67
+
68
+ eval(code, bind, file || '(builder)').call(engine)
69
+ end
42
70
 
43
- # Load Erector library if not already loaded.
44
- def initialize_engine
71
+ # TODO: woud rather set instance variable via #instance_variable_set
72
+ # but it is not defined.
73
+
74
+ #
75
+ def prepare_engine_scope(params, &content)
76
+ text, file, scope, locals = parameters(params, :text, :file, :scope, :locals)
77
+
78
+ scope, locals = make_external(scope, locals, &content)
79
+
80
+ engine = create_engine
81
+
82
+ locals.each do |k,v|
83
+ next if k.to_sym == :target
84
+ engine.instance_eval("@#{k} = v")
85
+ end
86
+
87
+ unless scope.respond_to?(:to_struct)
88
+ scope.instance_variables.each do |k|
89
+ next if k == "@target"
90
+ v = scope.instance_variable_get(k)
91
+ engine.instance_eval("#{k} = v")
92
+ end
93
+ end
94
+
95
+ engine.instance_eval(text, file || '(builder)')
96
+
97
+ engine.target!
98
+ end
99
+
100
+ private
101
+
102
+ # Load Builder library if not already loaded.
103
+ def require_engine
45
104
  return if defined? ::Builder
46
105
  require_library 'builder'
106
+
107
+ # Inexplicably Ruby 1.8 acts like the p method is present
108
+ # if undef_method is not used, but acts like it isn't if
109
+ # undef_method is used (raising an error).
110
+ ::Builder::XmlBase.class_eval do
111
+ undef_method :p rescue nil
112
+ end
47
113
  end
48
114
 
115
+ #
49
116
  # :target=>target_object: Object receiving the markup. target_object must
50
117
  # respond to the <<(a_string) operator and return itself.
51
118
  # The default target is a plain string target.
@@ -55,15 +122,9 @@ module Malt::Engine
55
122
  #
56
123
  # :margin=>initial_indentation_level: Amount of initial indentation
57
124
  # (specified in levels, not spaces).
58
- def engine_options(params)
59
- target = params[:target] || settings[:target]
60
- indent = params[:indent] || settings[:indent]
61
- margin = params[:margin] || settings[:margin]
62
- opts = {}
63
- opts[:target] = target if target
64
- opts[:indent] = indent if indent
65
- opts[:margin] = margin if margin
66
- opts
125
+ #
126
+ def engine_option_names
127
+ [:target, :indent, :margin]
67
128
  end
68
129
 
69
130
  end
@@ -0,0 +1,46 @@
1
+ require 'malt/engines/abstract'
2
+
3
+ module Malt::Engine
4
+
5
+ # Coffee Malt Engine
6
+ #
7
+ class Coffee < Abstract
8
+
9
+ default :coffee
10
+
11
+ # Render coffee script to JavaScript.
12
+ def render(params={}, &content)
13
+ into, text, file = parameters(params, :to, :text, :file)
14
+
15
+ case into
16
+ when :javascript, :js, nil
17
+ ::CoffeeScript.compile(text, engine_options(params))
18
+ else
19
+ super(params, &content)
20
+ end
21
+ end
22
+
23
+ # TODO: make a psuedo intermediate ?
24
+ # def prepare_engine(params)
25
+ #
26
+ # end
27
+
28
+ private
29
+
30
+ # Load CoffeeScript library if not already loaded.
31
+ def require_engine
32
+ return if defined? ::CoffeeScript
33
+ require_library 'coffee_script'
34
+ end
35
+
36
+ #
37
+ def engine_options(params)
38
+ options = {}
39
+ options[:bare] = params[:bare] || params[:no_wrap] || false
40
+ options
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
@@ -0,0 +1,60 @@
1
+ require 'malt/engines/abstract'
2
+
3
+ module Malt::Engine
4
+
5
+ # Creole is a MediaWiki format for Ruby.
6
+ #
7
+ # @see http://github.com/larsch/creole
8
+
9
+ class Creole < Abstract
10
+
11
+ default :wiki, :creole
12
+
13
+ # Convert WikiMedia format to HTML.
14
+ #
15
+ def render(params={}, &content)
16
+ into = parameters(params, :to)
17
+
18
+ case into
19
+ when :html, nil
20
+ prepare_engine(params, &content).to_html
21
+ else
22
+ super(params)
23
+ end
24
+ end
25
+
26
+ #
27
+ #def prepare_engine(params={}, &content)
28
+ # create_engine(params)
29
+ #end
30
+
31
+ #
32
+ def create_engine(params={})
33
+ text = parameters(params, :text)
34
+ opts = engine_options(params)
35
+
36
+ cached(opts, text) do
37
+ ::Creole::Parser.new(text, opts)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ # Load `creole` library if not already loaded.
44
+ def require_engine
45
+ return if defined? ::Creole
46
+ require_library 'creole'
47
+ end
48
+
49
+ #
50
+ ENGINE_OPTION_NAMES = [:allowed_schemes, :extensions, :no_escape]
51
+
52
+ #
53
+ def engine_option_names
54
+ ENGINE_OPTION_NAMES
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
@@ -15,72 +15,97 @@ module Malt::Engine
15
15
 
16
16
  # Render ERB template.
17
17
  #
18
- # The +params+ can be:
18
+ # @param [Hash] params
19
19
  #
20
- # * :text - text of erb document
21
- # * :file - file name where text was read (or nil)
22
- # * :data - data source for template interpolation
23
- # * :safe -
24
- # * :trim -
20
+ # @option params [String] :text
21
+ # Text of document.
25
22
  #
26
- # Returns a String.
27
- def render(params={}, &yld)
28
- text = params[:text]
29
- file = params[:file]
30
- data = params[:data]
31
-
32
- data = make_binding(data, &yld)
33
-
34
- if settings[:precompile] == false
35
- intermediate(params).result(data)
36
- else
37
- ruby = compile(params)
38
- eval(ruby, data, file)
39
- end
40
- end
41
-
42
- # Compile ERB template into Ruby source code.
43
- def compile(params={})
44
- file = params[:file]
45
- if cache?
46
- @source[file] ||= intermediate(params).src
47
- else
48
- intermediate(params).src
49
- end
23
+ # @option params [String] :file
24
+ # The file name where text was read (or nil).
25
+ #
26
+ # @option params [Object,Binding] :scope
27
+ # Scope from within which to render, serves as data source for
28
+ # template interpolation.
29
+ #
30
+ # @option params [Object,Binding] :locals
31
+ # Direct key/value data for template interpolation.
32
+ #
33
+ # @option params [Boolean] :safe
34
+ # Run in separate thread.
35
+ #
36
+ # @option params [String] :trim
37
+ # Trim mode, can be either of the following:
38
+ # a) `%` enables Ruby code processing for lines beginning with `%`.
39
+ # b) `<>` omit newline for lines starting with `<%` and ending in `%>`.
40
+ # c) `>` omit newline for lines ending in `%>`.
41
+ #
42
+ # @option params [Boolean] :precompile (true)
43
+ # Precompile the ERB template. Default is `true`.
44
+ # Note that `yield` currently does work with non-compiled tempaltes.
45
+ #
46
+ # @return [String] Rendered output.
47
+ #
48
+ def render(params={}, &content)
49
+ text, file, scope, locals = parameters(params, :text, :file, :scope, :locals)
50
+
51
+ #if settings[:compile] == true
52
+ #else
53
+ bind = make_binding(scope, locals, &content)
54
+ prepare_engine(params).result(bind)
55
+ #end
50
56
  end
51
57
 
52
58
  # Returns instance of underlying ::ERB class.
53
- def intermediate(params={})
54
- text = params[:text]
55
- file = params[:file]
59
+ #def prepare_engine(params={})
60
+ # create_engine(params)
61
+ #end
62
+
63
+ #
64
+ def create_engine(params={})
65
+ text = parameters(params, :text)
56
66
 
57
67
  opts = engine_options(params)
58
68
  safe = opts[:safe]
59
69
  trim = opts[:trim]
60
70
 
61
- if cache?
62
- @cache[file] ||= ::ERB.new(text, safe, trim)
63
- else
71
+ cached(text,safe,trim) do
64
72
  ::ERB.new(text, safe, trim)
65
73
  end
66
74
  end
67
75
 
68
- private
76
+ private
69
77
 
70
78
  # Load ERB library if not already loaded.
71
- def initialize_engine
79
+ def require_engine
72
80
  return if defined? ::ERB
73
81
  require_library('erb')
74
82
  end
75
83
 
76
- def engine_options(params)
77
- opts = {}
78
- opts[:safe] = params[:safe] || settings[:safe]
79
- opts[:trim] = params[:trim] || settings[:trim]
80
- opts
84
+ #
85
+ def engine_option_names
86
+ [:safe, :trim]
81
87
  end
82
88
 
89
+ #def engine_options(params)
90
+ # opts = {}
91
+ # opts[:safe] = params[:safe] || settings[:safe]
92
+ # opts[:trim] = params[:trim] || settings[:trim]
93
+ # opts
94
+ #end
95
+
96
+ # Compile ERB template into Ruby source code.
97
+ #
98
+ # @return [String] Ruby source code.
99
+ #def compile(params={})
100
+ # if cache?
101
+ # @source[params] ||= (
102
+ # intermediate(params).src
103
+ # )
104
+ # else
105
+ # intermediate(params).src
106
+ # end
107
+ #end
108
+
83
109
  end
84
110
 
85
111
  end
86
-