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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +17 -0
- data/Gemfile +33 -26
- data/README.md +23 -49
- data/Rakefile +21 -30
- data/{TEMPLATES.md → docs/TEMPLATES.md} +11 -4
- data/docs/common.css +14 -0
- data/lib/tilt/asciidoc.rb +1 -8
- data/lib/tilt/bluecloth.rb +24 -0
- data/lib/tilt/builder.rb +1 -8
- data/lib/tilt/coffee.rb +1 -8
- data/lib/tilt/creole.rb +25 -0
- data/lib/tilt/csv.rb +7 -13
- data/lib/tilt/erb.rb +2 -55
- data/lib/tilt/erubis.rb +43 -0
- data/lib/tilt/haml.rb +1 -8
- data/lib/tilt/kramdown.rb +33 -0
- data/lib/tilt/less.rb +38 -0
- data/lib/tilt/liquid.rb +1 -8
- data/lib/tilt/mapping.rb +265 -0
- data/lib/tilt/markaby.rb +1 -8
- data/lib/tilt/maruku.rb +22 -0
- data/lib/tilt/nokogiri.rb +1 -8
- data/lib/tilt/radius.rb +1 -8
- data/lib/tilt/rdiscount.rb +39 -0
- data/lib/tilt/rdoc.rb +3 -10
- data/lib/tilt/redcarpet.rb +104 -0
- data/lib/tilt/{textile.rb → redcloth.rb} +1 -8
- data/lib/tilt/sass.rb +41 -0
- data/lib/tilt/template.rb +88 -93
- data/lib/tilt/wikicloth.rb +22 -0
- data/lib/tilt/yajl.rb +1 -8
- data/lib/tilt.rb +87 -154
- data/test/{contest.rb → test_helper.rb} +7 -11
- data/test/tilt_asciidoctor_test.rb +6 -6
- data/test/tilt_blueclothtemplate_test.rb +3 -15
- data/test/tilt_buildertemplate_test.rb +3 -3
- data/test/tilt_cache_test.rb +2 -2
- data/test/tilt_coffeescripttemplate_test.rb +8 -18
- data/test/tilt_compilesite_test.rb +2 -2
- data/test/tilt_creoletemplate_test.rb +3 -7
- data/test/tilt_csv_test.rb +5 -9
- data/test/tilt_erbtemplate_test.rb +7 -7
- data/test/tilt_erubistemplate_test.rb +7 -7
- data/test/tilt_etannitemplate_test.rb +4 -3
- data/test/tilt_hamltemplate_test.rb +4 -4
- data/test/tilt_kramdown_test.rb +5 -27
- data/test/tilt_lesstemplate_test.rb +3 -3
- data/test/tilt_liquidtemplate_test.rb +3 -3
- data/test/tilt_mapping_test.rb +229 -0
- data/test/tilt_markaby_test.rb +4 -4
- data/test/tilt_markdown_test.rb +23 -21
- data/test/tilt_marukutemplate_test.rb +9 -21
- data/test/tilt_metadata_test.rb +42 -0
- data/test/tilt_nokogiritemplate_test.rb +3 -3
- data/test/tilt_radiustemplate_test.rb +3 -3
- data/test/tilt_rdiscounttemplate_test.rb +7 -19
- data/test/tilt_rdoctemplate_test.rb +3 -5
- data/test/tilt_redcarpettemplate_test.rb +11 -23
- data/test/tilt_redclothtemplate_test.rb +3 -3
- data/test/tilt_sasstemplate_test.rb +4 -4
- data/test/tilt_stringtemplate_test.rb +4 -3
- data/test/tilt_template_test.rb +42 -49
- data/test/tilt_test.rb +10 -15
- data/test/tilt_wikiclothtemplate_test.rb +3 -3
- data/test/tilt_yajltemplate_test.rb +3 -3
- data/tilt.gemspec +19 -32
- metadata +26 -385
- data/lib/tilt/css.rb +0 -80
- data/lib/tilt/markdown.rb +0 -214
- data/lib/tilt/wiki.rb +0 -58
- 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
|
data/test/tilt_fallback_test.rb
DELETED
@@ -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
|
-
|