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
@@ -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
-