tilt 1.4.1 → 2.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +8 -0
  3. data/Gemfile +33 -26
  4. data/README.md +21 -48
  5. data/Rakefile +21 -30
  6. data/{TEMPLATES.md → docs/TEMPLATES.md} +10 -4
  7. data/docs/common.css +14 -0
  8. data/lib/tilt.rb +85 -154
  9. data/lib/tilt/asciidoc.rb +1 -8
  10. data/lib/tilt/bluecloth.rb +24 -0
  11. data/lib/tilt/builder.rb +1 -8
  12. data/lib/tilt/coffee.rb +1 -8
  13. data/lib/tilt/creole.rb +25 -0
  14. data/lib/tilt/csv.rb +7 -13
  15. data/lib/tilt/erb.rb +2 -55
  16. data/lib/tilt/erubis.rb +43 -0
  17. data/lib/tilt/haml.rb +1 -8
  18. data/lib/tilt/kramdown.rb +33 -0
  19. data/lib/tilt/less.rb +38 -0
  20. data/lib/tilt/liquid.rb +1 -8
  21. data/lib/tilt/mapping.rb +247 -0
  22. data/lib/tilt/markaby.rb +1 -8
  23. data/lib/tilt/maruku.rb +22 -0
  24. data/lib/tilt/nokogiri.rb +1 -8
  25. data/lib/tilt/radius.rb +1 -8
  26. data/lib/tilt/rdiscount.rb +39 -0
  27. data/lib/tilt/rdoc.rb +3 -10
  28. data/lib/tilt/redcarpet.rb +104 -0
  29. data/lib/tilt/{textile.rb → redcloth.rb} +1 -8
  30. data/lib/tilt/sass.rb +41 -0
  31. data/lib/tilt/template.rb +85 -92
  32. data/lib/tilt/wikicloth.rb +22 -0
  33. data/lib/tilt/yajl.rb +1 -8
  34. data/test/{contest.rb → test_helper.rb} +5 -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.rb +215 -0
  51. data/test/tilt_markaby_test.rb +4 -4
  52. data/test/tilt_markdown_test.rb +13 -14
  53. data/test/tilt_marukutemplate_test.rb +6 -18
  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 +6 -18
  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 +35 -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 -386
  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
@@ -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
-
@@ -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
-
@@ -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
-