tilt 1.4.1 → 2.0.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 (72) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +17 -0
  3. data/Gemfile +33 -26
  4. data/README.md +23 -49
  5. data/Rakefile +21 -30
  6. data/{TEMPLATES.md → docs/TEMPLATES.md} +11 -4
  7. data/docs/common.css +14 -0
  8. data/lib/tilt/asciidoc.rb +1 -8
  9. data/lib/tilt/bluecloth.rb +24 -0
  10. data/lib/tilt/builder.rb +1 -8
  11. data/lib/tilt/coffee.rb +1 -8
  12. data/lib/tilt/creole.rb +25 -0
  13. data/lib/tilt/csv.rb +7 -13
  14. data/lib/tilt/erb.rb +2 -55
  15. data/lib/tilt/erubis.rb +43 -0
  16. data/lib/tilt/haml.rb +1 -8
  17. data/lib/tilt/kramdown.rb +33 -0
  18. data/lib/tilt/less.rb +38 -0
  19. data/lib/tilt/liquid.rb +1 -8
  20. data/lib/tilt/mapping.rb +265 -0
  21. data/lib/tilt/markaby.rb +1 -8
  22. data/lib/tilt/maruku.rb +22 -0
  23. data/lib/tilt/nokogiri.rb +1 -8
  24. data/lib/tilt/radius.rb +1 -8
  25. data/lib/tilt/rdiscount.rb +39 -0
  26. data/lib/tilt/rdoc.rb +3 -10
  27. data/lib/tilt/redcarpet.rb +104 -0
  28. data/lib/tilt/{textile.rb → redcloth.rb} +1 -8
  29. data/lib/tilt/sass.rb +41 -0
  30. data/lib/tilt/template.rb +88 -93
  31. data/lib/tilt/wikicloth.rb +22 -0
  32. data/lib/tilt/yajl.rb +1 -8
  33. data/lib/tilt.rb +87 -154
  34. data/test/{contest.rb → test_helper.rb} +7 -11
  35. data/test/tilt_asciidoctor_test.rb +6 -6
  36. data/test/tilt_blueclothtemplate_test.rb +3 -15
  37. data/test/tilt_buildertemplate_test.rb +3 -3
  38. data/test/tilt_cache_test.rb +2 -2
  39. data/test/tilt_coffeescripttemplate_test.rb +8 -18
  40. data/test/tilt_compilesite_test.rb +2 -2
  41. data/test/tilt_creoletemplate_test.rb +3 -7
  42. data/test/tilt_csv_test.rb +5 -9
  43. data/test/tilt_erbtemplate_test.rb +7 -7
  44. data/test/tilt_erubistemplate_test.rb +7 -7
  45. data/test/tilt_etannitemplate_test.rb +4 -3
  46. data/test/tilt_hamltemplate_test.rb +4 -4
  47. data/test/tilt_kramdown_test.rb +5 -27
  48. data/test/tilt_lesstemplate_test.rb +3 -3
  49. data/test/tilt_liquidtemplate_test.rb +3 -3
  50. data/test/tilt_mapping_test.rb +229 -0
  51. data/test/tilt_markaby_test.rb +4 -4
  52. data/test/tilt_markdown_test.rb +23 -21
  53. data/test/tilt_marukutemplate_test.rb +9 -21
  54. data/test/tilt_metadata_test.rb +42 -0
  55. data/test/tilt_nokogiritemplate_test.rb +3 -3
  56. data/test/tilt_radiustemplate_test.rb +3 -3
  57. data/test/tilt_rdiscounttemplate_test.rb +7 -19
  58. data/test/tilt_rdoctemplate_test.rb +3 -5
  59. data/test/tilt_redcarpettemplate_test.rb +11 -23
  60. data/test/tilt_redclothtemplate_test.rb +3 -3
  61. data/test/tilt_sasstemplate_test.rb +4 -4
  62. data/test/tilt_stringtemplate_test.rb +4 -3
  63. data/test/tilt_template_test.rb +42 -49
  64. data/test/tilt_test.rb +10 -15
  65. data/test/tilt_wikiclothtemplate_test.rb +3 -3
  66. data/test/tilt_yajltemplate_test.rb +3 -3
  67. data/tilt.gemspec +19 -32
  68. metadata +26 -385
  69. data/lib/tilt/css.rb +0 -80
  70. data/lib/tilt/markdown.rb +0 -214
  71. data/lib/tilt/wiki.rb +0 -58
  72. data/test/tilt_fallback_test.rb +0 -122
data/lib/tilt/css.rb DELETED
@@ -1,80 +0,0 @@
1
- require 'tilt/template'
2
-
3
- module Tilt
4
- # Sass template implementation. See:
5
- # http://haml.hamptoncatlin.com/
6
- #
7
- # Sass templates do not support object scopes, locals, or yield.
8
- class SassTemplate < Template
9
- self.default_mime_type = 'text/css'
10
-
11
- def self.engine_initialized?
12
- defined? ::Sass::Engine
13
- end
14
-
15
- def initialize_engine
16
- require_template_library 'sass'
17
- end
18
-
19
- def prepare
20
- @engine = ::Sass::Engine.new(data, sass_options)
21
- end
22
-
23
- def evaluate(scope, locals, &block)
24
- @output ||= @engine.render
25
- end
26
-
27
- def allows_script?
28
- false
29
- end
30
-
31
- private
32
- def sass_options
33
- options.merge(:filename => eval_file, :line => line, :syntax => :sass)
34
- end
35
- end
36
-
37
- # Sass's new .scss type template implementation.
38
- class ScssTemplate < SassTemplate
39
- self.default_mime_type = 'text/css'
40
-
41
- private
42
- def sass_options
43
- options.merge(:filename => eval_file, :line => line, :syntax => :scss)
44
- end
45
- end
46
-
47
- # Lessscss template implementation. See:
48
- # http://lesscss.org/
49
- #
50
- # Less templates do not support object scopes, locals, or yield.
51
- class LessTemplate < Template
52
- self.default_mime_type = 'text/css'
53
-
54
- def self.engine_initialized?
55
- defined? ::Less
56
- end
57
-
58
- def initialize_engine
59
- require_template_library 'less'
60
- end
61
-
62
- def prepare
63
- if ::Less.const_defined? :Engine
64
- @engine = ::Less::Engine.new(data)
65
- else
66
- parser = ::Less::Parser.new(options.merge :filename => eval_file, :line => line)
67
- @engine = parser.parse(data)
68
- end
69
- end
70
-
71
- def evaluate(scope, locals, &block)
72
- @output ||= @engine.to_css(options)
73
- end
74
-
75
- def allows_script?
76
- false
77
- end
78
- end
79
- end
80
-
data/lib/tilt/markdown.rb DELETED
@@ -1,214 +0,0 @@
1
- require 'tilt/template'
2
-
3
- module Tilt
4
- # Discount Markdown implementation. See:
5
- # http://github.com/rtomayko/rdiscount
6
- #
7
- # RDiscount is a simple text filter. It does not support +scope+ or
8
- # +locals+. The +:smart+ and +:filter_html+ options may be set true
9
- # to enable those flags on the underlying RDiscount object.
10
- class RDiscountTemplate < Template
11
- self.default_mime_type = 'text/html'
12
-
13
- ALIAS = {
14
- :escape_html => :filter_html,
15
- :smartypants => :smart
16
- }
17
-
18
- FLAGS = [:smart, :filter_html, :smartypants, :escape_html]
19
-
20
- def flags
21
- FLAGS.select { |flag| options[flag] }.map { |flag| ALIAS[flag] || flag }
22
- end
23
-
24
- def self.engine_initialized?
25
- defined? ::RDiscount
26
- end
27
-
28
- def initialize_engine
29
- require_template_library 'rdiscount'
30
- end
31
-
32
- def prepare
33
- @engine = RDiscount.new(data, *flags)
34
- @output = nil
35
- end
36
-
37
- def evaluate(scope, locals, &block)
38
- @output ||= @engine.to_html
39
- end
40
-
41
- def allows_script?
42
- false
43
- end
44
- end
45
-
46
- # Upskirt Markdown implementation. See:
47
- # https://github.com/tanoku/redcarpet
48
- #
49
- # Supports both Redcarpet 1.x and 2.x
50
- class RedcarpetTemplate < Template
51
- def self.engine_initialized?
52
- defined? ::Redcarpet
53
- end
54
-
55
- def initialize_engine
56
- require_template_library 'redcarpet'
57
- end
58
-
59
- def prepare
60
- klass = [Redcarpet2, Redcarpet1].detect { |e| e.engine_initialized? }
61
- @engine = klass.new(file, line, options) { data }
62
- end
63
-
64
- def evaluate(scope, locals, &block)
65
- @engine.evaluate(scope, locals, &block)
66
- end
67
-
68
- def allows_script?
69
- false
70
- end
71
-
72
- # Compatibility mode for Redcarpet 1.x
73
- class Redcarpet1 < RDiscountTemplate
74
- self.default_mime_type = 'text/html'
75
-
76
- def self.engine_initialized?
77
- defined? ::RedcarpetCompat
78
- end
79
-
80
- def prepare
81
- @engine = RedcarpetCompat.new(data, *flags)
82
- @output = nil
83
- end
84
- end
85
-
86
- # Future proof mode for Redcarpet 2.x (not yet released)
87
- class Redcarpet2 < Template
88
- self.default_mime_type = 'text/html'
89
-
90
- def self.engine_initialized?
91
- defined? ::Redcarpet::Render and defined? ::Redcarpet::Markdown
92
- end
93
-
94
- def generate_renderer
95
- renderer = options.delete(:renderer) || ::Redcarpet::Render::HTML
96
- return renderer unless options.delete(:smartypants)
97
- return renderer if renderer.is_a?(Class) && renderer <= ::Redcarpet::Render::SmartyPants
98
-
99
- if renderer == ::Redcarpet::Render::XHTML
100
- ::Redcarpet::Render::SmartyHTML.new(:xhtml => true)
101
- elsif renderer == ::Redcarpet::Render::HTML
102
- ::Redcarpet::Render::SmartyHTML
103
- elsif renderer.is_a? Class
104
- Class.new(renderer) { include ::Redcarpet::Render::SmartyPants }
105
- else
106
- renderer.extend ::Redcarpet::Render::SmartyPants
107
- end
108
- end
109
-
110
- def prepare
111
- # try to support the same aliases
112
- RDiscountTemplate::ALIAS.each do |opt, aka|
113
- next if options.key? opt or not options.key? aka
114
- options[opt] = options.delete(aka)
115
- end
116
-
117
- # only raise an exception if someone is trying to enable :escape_html
118
- options.delete(:escape_html) unless options[:escape_html]
119
-
120
- @engine = ::Redcarpet::Markdown.new(generate_renderer, options)
121
- @output = nil
122
- end
123
-
124
- def evaluate(scope, locals, &block)
125
- @output ||= @engine.render(data)
126
- end
127
-
128
- def allows_script?
129
- false
130
- end
131
- end
132
- end
133
-
134
- # BlueCloth Markdown implementation. See:
135
- # http://deveiate.org/projects/BlueCloth/
136
- class BlueClothTemplate < Template
137
- self.default_mime_type = 'text/html'
138
-
139
- def self.engine_initialized?
140
- defined? ::BlueCloth
141
- end
142
-
143
- def initialize_engine
144
- require_template_library 'bluecloth'
145
- end
146
-
147
- def prepare
148
- @engine = BlueCloth.new(data, options)
149
- @output = nil
150
- end
151
-
152
- def evaluate(scope, locals, &block)
153
- @output ||= @engine.to_html
154
- end
155
-
156
- def allows_script?
157
- false
158
- end
159
- end
160
-
161
- # Maruku markdown implementation. See:
162
- # http://maruku.rubyforge.org/
163
- class MarukuTemplate < Template
164
- def self.engine_initialized?
165
- defined? ::Maruku
166
- end
167
-
168
- def initialize_engine
169
- require_template_library 'maruku'
170
- end
171
-
172
- def prepare
173
- @engine = Maruku.new(data, options)
174
- @output = nil
175
- end
176
-
177
- def evaluate(scope, locals, &block)
178
- @output ||= @engine.to_html
179
- end
180
-
181
- def allows_script?
182
- false
183
- end
184
- end
185
-
186
- # Kramdown Markdown implementation. See:
187
- # http://kramdown.rubyforge.org/
188
- class KramdownTemplate < Template
189
- DUMB_QUOTES = [39, 39, 34, 34]
190
-
191
- def self.engine_initialized?
192
- defined? ::Kramdown
193
- end
194
-
195
- def initialize_engine
196
- require_template_library 'kramdown'
197
- end
198
-
199
- def prepare
200
- options[:smart_quotes] = DUMB_QUOTES unless options[:smartypants]
201
- @engine = Kramdown::Document.new(data, options)
202
- @output = nil
203
- end
204
-
205
- def evaluate(scope, locals, &block)
206
- @output ||= @engine.to_html
207
- end
208
-
209
- def allows_script?
210
- false
211
- end
212
- end
213
- end
214
-
data/lib/tilt/wiki.rb DELETED
@@ -1,58 +0,0 @@
1
- require 'tilt/template'
2
-
3
- module Tilt
4
- # Creole implementation. See:
5
- # http://www.wikicreole.org/
6
- class CreoleTemplate < Template
7
- def self.engine_initialized?
8
- defined? ::Creole
9
- end
10
-
11
- def initialize_engine
12
- require_template_library 'creole'
13
- end
14
-
15
- def prepare
16
- opts = {}
17
- [:allowed_schemes, :extensions, :no_escape].each do |k|
18
- opts[k] = options[k] if options[k]
19
- end
20
- @engine = Creole::Parser.new(data, opts)
21
- @output = nil
22
- end
23
-
24
- def evaluate(scope, locals, &block)
25
- @output ||= @engine.to_html
26
- end
27
-
28
- def allows_script?
29
- false
30
- end
31
- end
32
-
33
- # WikiCloth implementation. See:
34
- # http://redcloth.org/
35
- class WikiClothTemplate < Template
36
- def self.engine_initialized?
37
- defined? ::WikiCloth::Parser
38
- end
39
-
40
- def initialize_engine
41
- require_template_library 'wikicloth'
42
- end
43
-
44
- def prepare
45
- @parser = options.delete(:parser) || WikiCloth::Parser
46
- @engine = @parser.new options.merge(:data => data)
47
- @output = nil
48
- end
49
-
50
- def evaluate(scope, locals, &block)
51
- @output ||= @engine.to_html
52
- end
53
-
54
- def allows_script?
55
- false
56
- end
57
- end
58
- end
@@ -1,122 +0,0 @@
1
- require 'contest'
2
- require 'tilt'
3
-
4
- class TiltFallbackTest < Test::Unit::TestCase
5
- class FailTemplate < Tilt::Template
6
- def self.engine_initialized?; false end
7
- def prepare; end
8
-
9
- def initialize_engine
10
- raise LoadError, "can't load #{self.class}"
11
- end
12
- end
13
-
14
- class WinTemplate < Tilt::Template
15
- def self.engine_initialized?; true end
16
- def prepare; end
17
- end
18
-
19
- FailTemplate2 = Class.new(FailTemplate)
20
- WinTemplate2 = Class.new(WinTemplate)
21
-
22
- def set_ivar(obj, name, value)
23
- obj.instance_variable_set("@#{name}", value)
24
- end
25
-
26
- def clear_ivar(obj, name)
27
- ivar = "@#{name}"
28
- value = obj.instance_variable_get(ivar)
29
- ensure
30
- obj.instance_variable_set(ivar, value.dup.clear)
31
- end
32
-
33
- setup do
34
- # Make sure every test have no mappings.
35
- @p = clear_ivar(Tilt, :preferred_mappings)
36
- @t = clear_ivar(Tilt, :template_mappings)
37
- end
38
-
39
- teardown do
40
- set_ivar(Tilt, :preferred_mappings, @p)
41
- set_ivar(Tilt, :template_mappings, @t)
42
- end
43
-
44
- test "returns nil on unregistered extensions" do
45
- template = Tilt["md"]
46
- assert_equal nil, template
47
- end
48
-
49
- test "returns the last registered template" do
50
- Tilt.register("md", WinTemplate)
51
- Tilt.register("md", WinTemplate2)
52
-
53
- template = Tilt["md"]
54
- assert_equal WinTemplate2, template
55
- end
56
-
57
- test "returns the last registered working template" do
58
- Tilt.register("md", WinTemplate)
59
- Tilt.register("md", FailTemplate)
60
-
61
- template = Tilt["md"]
62
- assert_equal WinTemplate, template
63
- end
64
-
65
- test "if every template fails, raise the exception from the first template" do
66
- Tilt.register("md", FailTemplate)
67
- Tilt.register("md", FailTemplate2)
68
-
69
- exc = assert_raise(LoadError) { Tilt["md"] }
70
- assert_match /FailTemplate2/, exc.message
71
- end
72
-
73
- test ".prefer should also register the template" do
74
- Tilt.prefer(WinTemplate, "md")
75
- assert Tilt.registered?("md")
76
- end
77
-
78
- test ".prefer always win" do
79
- Tilt.register("md", FailTemplate)
80
- Tilt.register("md", WinTemplate)
81
- Tilt.prefer(FailTemplate, "md")
82
-
83
- template = Tilt["md"]
84
- assert_equal FailTemplate, template
85
- end
86
-
87
- test ".prefer accepts multiple extensions" do
88
- extensions = %w[md mkd markdown]
89
- Tilt.prefer(FailTemplate, *extensions)
90
-
91
- extensions.each do |ext|
92
- template = Tilt[ext]
93
- assert_equal FailTemplate, template
94
- end
95
- end
96
-
97
- test ".prefer with no extension should use already registered extensions" do
98
- extensions = %w[md mkd markdown]
99
-
100
- extensions.each do |ext|
101
- Tilt.register(ext, FailTemplate)
102
- Tilt.register(ext, WinTemplate)
103
- end
104
-
105
- Tilt.prefer(FailTemplate)
106
-
107
- extensions.each do |ext|
108
- template = Tilt[ext]
109
- assert_equal FailTemplate, template
110
- end
111
- end
112
-
113
- test ".prefer should only override extensions the preferred library is registered for" do
114
- Tilt.register("md", WinTemplate)
115
- Tilt.register("mkd", FailTemplate)
116
- Tilt.register("mkd", WinTemplate)
117
- Tilt.prefer(FailTemplate)
118
- assert_equal FailTemplate, Tilt["mkd"]
119
- assert_equal WinTemplate, Tilt["md"]
120
- end
121
- end
122
-