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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +33 -26
- data/README.md +21 -48
- data/Rakefile +21 -30
- data/{TEMPLATES.md → docs/TEMPLATES.md} +10 -4
- data/docs/common.css +14 -0
- data/lib/tilt.rb +85 -154
- 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 +247 -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 +85 -92
- data/lib/tilt/wikicloth.rb +22 -0
- data/lib/tilt/yajl.rb +1 -8
- data/test/{contest.rb → test_helper.rb} +5 -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.rb +215 -0
- data/test/tilt_markaby_test.rb +4 -4
- data/test/tilt_markdown_test.rb +13 -14
- data/test/tilt_marukutemplate_test.rb +6 -18
- 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 +6 -18
- 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 +35 -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 -386
- 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
|
-
|