tilt 2.0.10 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/COPYING +1 -0
- data/bin/tilt +2 -120
- data/lib/tilt/_emacs_org.rb +2 -0
- data/lib/tilt/_handlebars.rb +2 -0
- data/lib/tilt/_jbuilder.rb +2 -0
- data/lib/tilt/_org.rb +2 -0
- data/lib/tilt/asciidoc.rb +11 -23
- data/lib/tilt/babel.rb +5 -13
- data/lib/tilt/builder.rb +18 -13
- data/lib/tilt/cli.rb +134 -0
- data/lib/tilt/coffee.rb +18 -25
- data/lib/tilt/commonmarker.rb +47 -71
- data/lib/tilt/creole.rb +9 -20
- data/lib/tilt/csv.rb +6 -18
- data/lib/tilt/erb.rb +32 -16
- data/lib/tilt/erubi.rb +29 -6
- data/lib/tilt/erubis.rb +20 -11
- data/lib/tilt/etanni.rb +3 -2
- data/lib/tilt/haml.rb +73 -65
- data/lib/tilt/kramdown.rb +8 -20
- data/lib/tilt/liquid.rb +10 -14
- data/lib/tilt/livescript.rb +8 -20
- data/lib/tilt/mapping.rb +228 -109
- data/lib/tilt/markaby.rb +5 -7
- data/lib/tilt/maruku.rb +5 -19
- data/lib/tilt/nokogiri.rb +11 -10
- data/lib/tilt/pandoc.rb +33 -43
- data/lib/tilt/pipeline.rb +19 -0
- data/lib/tilt/plain.rb +4 -15
- data/lib/tilt/prawn.rb +15 -23
- data/lib/tilt/radius.rb +15 -22
- data/lib/tilt/rdiscount.rb +17 -33
- data/lib/tilt/rdoc.rb +14 -35
- data/lib/tilt/redcarpet.rb +25 -64
- data/lib/tilt/redcloth.rb +9 -19
- data/lib/tilt/rst-pandoc.rb +7 -15
- data/lib/tilt/sass.rb +45 -28
- data/lib/tilt/slim.rb +5 -0
- data/lib/tilt/string.rb +4 -3
- data/lib/tilt/template.rb +231 -73
- data/lib/tilt/typescript.rb +11 -18
- data/lib/tilt/wikicloth.rb +7 -19
- data/lib/tilt/yajl.rb +5 -11
- data/lib/tilt.rb +61 -29
- metadata +24 -16
- data/lib/tilt/bluecloth.rb +0 -24
- data/lib/tilt/dummy.rb +0 -3
- data/lib/tilt/less.rb +0 -30
- data/lib/tilt/sigil.rb +0 -34
data/lib/tilt/template.rb
CHANGED
@@ -1,17 +1,12 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
3
2
|
module Tilt
|
4
3
|
# @private
|
5
|
-
|
6
|
-
# @private
|
7
|
-
module CompiledTemplates
|
8
|
-
self
|
9
|
-
end
|
10
|
-
elsif RUBY_VERSION >= '1.9'
|
11
|
-
BasicObject
|
12
|
-
else
|
13
|
-
Object
|
4
|
+
module CompiledTemplates
|
14
5
|
end
|
6
|
+
|
7
|
+
# @private
|
8
|
+
TOPOBJECT = CompiledTemplates
|
9
|
+
|
15
10
|
# @private
|
16
11
|
LOCK = Mutex.new
|
17
12
|
|
@@ -33,6 +28,12 @@ module Tilt
|
|
33
28
|
# interface.
|
34
29
|
attr_reader :options
|
35
30
|
|
31
|
+
# A path ending in .rb that the template code will be written to, then
|
32
|
+
# required, instead of being evaled. This is useful for determining
|
33
|
+
# coverage of compiled template code, or to use static analysis tools
|
34
|
+
# on the compiled template code.
|
35
|
+
attr_reader :compiled_path
|
36
|
+
|
36
37
|
class << self
|
37
38
|
# An empty Hash that the template engine can populate with various
|
38
39
|
# metadata.
|
@@ -40,12 +41,12 @@ module Tilt
|
|
40
41
|
@metadata ||= {}
|
41
42
|
end
|
42
43
|
|
43
|
-
#
|
44
|
+
# Use `.metadata[:mime_type]` instead.
|
44
45
|
def default_mime_type
|
45
46
|
metadata[:mime_type]
|
46
47
|
end
|
47
48
|
|
48
|
-
#
|
49
|
+
# Use `.metadata[:mime_type] = val` instead.
|
49
50
|
def default_mime_type=(value)
|
50
51
|
metadata[:mime_type] = value
|
51
52
|
end
|
@@ -57,33 +58,28 @@ module Tilt
|
|
57
58
|
# a block is required.
|
58
59
|
#
|
59
60
|
# All arguments are optional.
|
60
|
-
def initialize(file=nil, line=
|
61
|
-
@file, @line, @options = nil, 1,
|
61
|
+
def initialize(file=nil, line=nil, options=nil)
|
62
|
+
@file, @line, @options = nil, 1, nil
|
62
63
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
when arg.respond_to?(:to_int) ; @line = arg.to_int
|
67
|
-
when arg.respond_to?(:to_hash) ; @options = arg.to_hash.dup
|
68
|
-
when arg.respond_to?(:path) ; @file = arg.path
|
69
|
-
when arg.respond_to?(:to_path) ; @file = arg.to_path
|
70
|
-
else raise TypeError, "Can't load the template file. Pass a string with a path " +
|
71
|
-
"or an object that responds to 'to_str', 'path' or 'to_path'"
|
72
|
-
end
|
73
|
-
end
|
64
|
+
process_arg(options)
|
65
|
+
process_arg(line)
|
66
|
+
process_arg(file)
|
74
67
|
|
75
|
-
raise ArgumentError, "file or block required"
|
68
|
+
raise ArgumentError, "file or block required" unless @file || block_given?
|
76
69
|
|
77
|
-
|
78
|
-
@compiled_method = {}
|
70
|
+
@options ||= {}
|
79
71
|
|
80
|
-
|
81
|
-
|
72
|
+
set_compiled_method_cache
|
73
|
+
|
74
|
+
# Force the encoding of the input data
|
82
75
|
@default_encoding = @options.delete :default_encoding
|
83
76
|
|
77
|
+
# Skip encoding detection from magic comments and forcing that encoding
|
78
|
+
# for compiled templates
|
79
|
+
@skip_compiled_encoding_detection = @options.delete :skip_compiled_encoding_detection
|
80
|
+
|
84
81
|
# load template data and prepare (uses binread to avoid encoding issues)
|
85
|
-
@
|
86
|
-
@data = @reader.call(self)
|
82
|
+
@data = block_given? ? yield(self) : read_template_file
|
87
83
|
|
88
84
|
if @data.respond_to?(:force_encoding)
|
89
85
|
if default_encoding
|
@@ -102,28 +98,29 @@ module Tilt
|
|
102
98
|
# Render the template in the given scope with the locals specified. If a
|
103
99
|
# block is given, it is typically available within the template via
|
104
100
|
# +yield+.
|
105
|
-
def render(scope=nil, locals=
|
106
|
-
scope ||= Object.new
|
101
|
+
def render(scope=nil, locals=nil, &block)
|
107
102
|
current_template = Thread.current[:tilt_current_template]
|
108
103
|
Thread.current[:tilt_current_template] = self
|
109
|
-
evaluate(scope, locals ||
|
104
|
+
evaluate(scope || Object.new, locals || EMPTY_HASH, &block)
|
110
105
|
ensure
|
111
106
|
Thread.current[:tilt_current_template] = current_template
|
112
107
|
end
|
113
108
|
|
114
109
|
# The basename of the template file.
|
115
110
|
def basename(suffix='')
|
116
|
-
File.basename(file, suffix) if file
|
111
|
+
File.basename(@file, suffix) if @file
|
117
112
|
end
|
118
113
|
|
119
114
|
# The template file's basename with all extensions chomped off.
|
120
115
|
def name
|
121
|
-
|
116
|
+
if bname = basename
|
117
|
+
bname.split('.', 2).first
|
118
|
+
end
|
122
119
|
end
|
123
120
|
|
124
121
|
# The filename used in backtraces to describe the template.
|
125
122
|
def eval_file
|
126
|
-
file || '(__TEMPLATE__)'
|
123
|
+
@file || '(__TEMPLATE__)'
|
127
124
|
end
|
128
125
|
|
129
126
|
# An empty Hash that the template engine can populate with various
|
@@ -136,6 +133,35 @@ module Tilt
|
|
136
133
|
end
|
137
134
|
end
|
138
135
|
|
136
|
+
# Set the prefix to use for compiled paths.
|
137
|
+
def compiled_path=(path)
|
138
|
+
if path
|
139
|
+
# Use expanded paths when loading, since that is helpful
|
140
|
+
# for coverage. Remove any .rb suffix, since that will
|
141
|
+
# be added back later.
|
142
|
+
path = File.expand_path(path.sub(/\.rb\z/i, ''))
|
143
|
+
end
|
144
|
+
@compiled_path = path
|
145
|
+
end
|
146
|
+
|
147
|
+
# The compiled method for the locals keys and scope_class provided.
|
148
|
+
# Returns an UnboundMethod, which can be used to define methods
|
149
|
+
# directly on the scope class, which are much faster to call than
|
150
|
+
# Tilt's normal rendering.
|
151
|
+
def compiled_method(locals_keys, scope_class=nil)
|
152
|
+
key = [scope_class, locals_keys].freeze
|
153
|
+
LOCK.synchronize do
|
154
|
+
if meth = @compiled_method[key]
|
155
|
+
return meth
|
156
|
+
end
|
157
|
+
end
|
158
|
+
meth = compile_template_method(locals_keys, scope_class)
|
159
|
+
LOCK.synchronize do
|
160
|
+
@compiled_method[key] = meth
|
161
|
+
end
|
162
|
+
meth
|
163
|
+
end
|
164
|
+
|
139
165
|
protected
|
140
166
|
|
141
167
|
# @!group For template implementations
|
@@ -144,19 +170,23 @@ module Tilt
|
|
144
170
|
# default_encoding-option if present. You may override this method
|
145
171
|
# in your template class if you have a better hint of the data's
|
146
172
|
# encoding.
|
147
|
-
|
148
|
-
|
173
|
+
attr_reader :default_encoding
|
174
|
+
|
175
|
+
def skip_compiled_encoding_detection?
|
176
|
+
@skip_compiled_encoding_detection
|
149
177
|
end
|
150
178
|
|
151
179
|
# Do whatever preparation is necessary to setup the underlying template
|
152
180
|
# engine. Called immediately after template data is loaded. Instance
|
153
181
|
# variables set in this method are available when #evaluate is called.
|
154
182
|
#
|
155
|
-
#
|
183
|
+
# Empty by default as some subclasses do not need separate preparation.
|
156
184
|
def prepare
|
157
|
-
raise NotImplementedError
|
158
185
|
end
|
159
186
|
|
187
|
+
CLASS_METHOD = Kernel.instance_method(:class)
|
188
|
+
USE_BIND_CALL = RUBY_VERSION >= '2.7'
|
189
|
+
|
160
190
|
# Execute the compiled template and return the result string. Template
|
161
191
|
# evaluation is guaranteed to be performed in the scope object with the
|
162
192
|
# locals specified and with support for yielding to the block.
|
@@ -166,8 +196,24 @@ module Tilt
|
|
166
196
|
def evaluate(scope, locals, &block)
|
167
197
|
locals_keys = locals.keys
|
168
198
|
locals_keys.sort!{|x, y| x.to_s <=> y.to_s}
|
169
|
-
|
170
|
-
|
199
|
+
|
200
|
+
case scope
|
201
|
+
when Object
|
202
|
+
scope_class = Module === scope ? scope : scope.class
|
203
|
+
else
|
204
|
+
# :nocov:
|
205
|
+
scope_class = USE_BIND_CALL ? CLASS_METHOD.bind_call(scope) : CLASS_METHOD.bind(scope).call
|
206
|
+
# :nocov:
|
207
|
+
end
|
208
|
+
method = compiled_method(locals_keys, scope_class)
|
209
|
+
|
210
|
+
if USE_BIND_CALL
|
211
|
+
method.bind_call(scope, locals, &block)
|
212
|
+
# :nocov:
|
213
|
+
else
|
214
|
+
method.bind(scope).call(locals, &block)
|
215
|
+
# :nocov:
|
216
|
+
end
|
171
217
|
end
|
172
218
|
|
173
219
|
# Generates all template source by combining the preamble, template, and
|
@@ -185,15 +231,19 @@ module Tilt
|
|
185
231
|
postamble = precompiled_postamble(local_keys)
|
186
232
|
source = String.new
|
187
233
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
template_encoding = extract_encoding(template)
|
234
|
+
unless skip_compiled_encoding_detection?
|
235
|
+
# Ensure that our generated source code has the same encoding as the
|
236
|
+
# the source code generated by the template engine.
|
237
|
+
template_encoding = extract_encoding(template){|t| template = t}
|
192
238
|
|
193
|
-
|
194
|
-
|
239
|
+
if template.encoding != template_encoding
|
240
|
+
# template should never be frozen here. If it was frozen originally,
|
241
|
+
# then extract_encoding should yield a dup.
|
242
|
+
template.force_encoding(template_encoding)
|
243
|
+
end
|
195
244
|
end
|
196
245
|
|
246
|
+
source.force_encoding(template.encoding)
|
197
247
|
source << preamble << "\n" << template << "\n" << postamble
|
198
248
|
|
199
249
|
[source, preamble.count("\n")+1]
|
@@ -221,30 +271,52 @@ module Tilt
|
|
221
271
|
|
222
272
|
private
|
223
273
|
|
224
|
-
def
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
274
|
+
def process_arg(arg)
|
275
|
+
if arg
|
276
|
+
case
|
277
|
+
when arg.respond_to?(:to_str) ; @file = arg.to_str
|
278
|
+
when arg.respond_to?(:to_int) ; @line = arg.to_int
|
279
|
+
when arg.respond_to?(:to_hash) ; @options = arg.to_hash.dup
|
280
|
+
when arg.respond_to?(:path) ; @file = arg.path
|
281
|
+
when arg.respond_to?(:to_path) ; @file = arg.to_path
|
282
|
+
else raise TypeError, "Can't load the template file. Pass a string with a path " +
|
283
|
+
"or an object that responds to 'to_str', 'path' or 'to_path'"
|
284
|
+
end
|
229
285
|
end
|
286
|
+
end
|
287
|
+
|
288
|
+
def read_template_file
|
289
|
+
data = File.binread(file)
|
290
|
+
# Set it to the default external (without verifying)
|
291
|
+
# :nocov:
|
292
|
+
data.force_encoding(Encoding.default_external) if Encoding.default_external
|
293
|
+
# :nocov:
|
230
294
|
data
|
231
295
|
end
|
232
296
|
|
233
|
-
|
234
|
-
|
235
|
-
LOCK.synchronize do
|
236
|
-
@compiled_method[[scope_class, locals_keys]] ||= compile_template_method(locals_keys, scope_class)
|
237
|
-
end
|
297
|
+
def set_compiled_method_cache
|
298
|
+
@compiled_method = {}
|
238
299
|
end
|
239
300
|
|
240
301
|
def local_extraction(local_keys)
|
241
|
-
local_keys.map do |k|
|
302
|
+
assignments = local_keys.map do |k|
|
242
303
|
if k.to_s =~ /\A[a-z_][a-zA-Z_0-9]*\z/
|
243
304
|
"#{k} = locals[#{k.inspect}]"
|
244
305
|
else
|
245
306
|
raise "invalid locals key: #{k.inspect} (keys must be variable names)"
|
246
307
|
end
|
247
|
-
end
|
308
|
+
end
|
309
|
+
|
310
|
+
s = "locals = locals[:locals]"
|
311
|
+
if assignments.delete(s)
|
312
|
+
# If there is a locals key itself named `locals`, delete it from the ordered keys so we can
|
313
|
+
# assign it last. This is important because the assignment of all other locals depends on the
|
314
|
+
# `locals` local variable still matching the `locals` method argument given to the method
|
315
|
+
# created in `#compile_template_method`.
|
316
|
+
assignments << s
|
317
|
+
end
|
318
|
+
|
319
|
+
assignments.join("\n")
|
248
320
|
end
|
249
321
|
|
250
322
|
def compile_template_method(local_keys, scope_class=nil)
|
@@ -253,39 +325,85 @@ module Tilt
|
|
253
325
|
|
254
326
|
method_name = "__tilt_#{Thread.current.object_id.abs}"
|
255
327
|
method_source = String.new
|
328
|
+
method_source.force_encoding(source.encoding)
|
256
329
|
|
257
|
-
if
|
258
|
-
method_source
|
330
|
+
if freeze_string_literals?
|
331
|
+
method_source << "# frozen-string-literal: true\n"
|
259
332
|
end
|
260
333
|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
#{local_code}
|
265
|
-
RUBY
|
334
|
+
# Don't indent method source, to avoid indentation warnings when using compiled paths
|
335
|
+
method_source << "::Tilt::TOPOBJECT.class_eval do\ndef #{method_name}(locals)\n#{local_code}\n"
|
336
|
+
|
266
337
|
offset += method_source.count("\n")
|
267
338
|
method_source << source
|
268
339
|
method_source << "\nend;end;"
|
269
|
-
|
340
|
+
|
341
|
+
bind_compiled_method(method_source, offset, scope_class)
|
270
342
|
unbind_compiled_method(method_name)
|
271
343
|
end
|
272
344
|
|
345
|
+
def bind_compiled_method(method_source, offset, scope_class)
|
346
|
+
path = compiled_path
|
347
|
+
if path && scope_class.name
|
348
|
+
path = path.dup
|
349
|
+
|
350
|
+
if defined?(@compiled_path_counter)
|
351
|
+
path << '-' << @compiled_path_counter.succ!
|
352
|
+
else
|
353
|
+
@compiled_path_counter = "0".dup
|
354
|
+
end
|
355
|
+
path << ".rb"
|
356
|
+
|
357
|
+
# Wrap method source in a class block for the scope, so constant lookup works
|
358
|
+
method_source = "class #{scope_class.name}\n#{method_source}\nend"
|
359
|
+
|
360
|
+
load_compiled_method(path, method_source)
|
361
|
+
else
|
362
|
+
if path
|
363
|
+
warn "compiled_path (#{compiled_path.inspect}) ignored on template with anonymous scope_class (#{scope_class.inspect})"
|
364
|
+
end
|
365
|
+
|
366
|
+
eval_compiled_method(method_source, offset, scope_class)
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
def eval_compiled_method(method_source, offset, scope_class)
|
371
|
+
(scope_class || Object).class_eval(method_source, eval_file, line - offset)
|
372
|
+
end
|
373
|
+
|
374
|
+
def load_compiled_method(path, method_source)
|
375
|
+
File.binwrite(path, method_source)
|
376
|
+
|
377
|
+
# Use load and not require, so unbind_compiled_method does not
|
378
|
+
# break if the same path is used more than once.
|
379
|
+
load path
|
380
|
+
end
|
381
|
+
|
273
382
|
def unbind_compiled_method(method_name)
|
274
383
|
method = TOPOBJECT.instance_method(method_name)
|
275
384
|
TOPOBJECT.class_eval { remove_method(method_name) }
|
276
385
|
method
|
277
386
|
end
|
278
387
|
|
279
|
-
def extract_encoding(script)
|
280
|
-
extract_magic_comment(script) || script.encoding
|
388
|
+
def extract_encoding(script, &block)
|
389
|
+
extract_magic_comment(script, &block) || script.encoding
|
281
390
|
end
|
282
391
|
|
283
392
|
def extract_magic_comment(script)
|
393
|
+
if script.frozen?
|
394
|
+
script = script.dup
|
395
|
+
yield script
|
396
|
+
end
|
397
|
+
|
284
398
|
binary(script) do
|
285
399
|
script[/\A[ \t]*\#.*coding\s*[=:]\s*([[:alnum:]\-_]+).*$/n, 1]
|
286
400
|
end
|
287
401
|
end
|
288
402
|
|
403
|
+
def freeze_string_literals?
|
404
|
+
false
|
405
|
+
end
|
406
|
+
|
289
407
|
def binary(string)
|
290
408
|
original_encoding = string.encoding
|
291
409
|
string.force_encoding(Encoding::BINARY)
|
@@ -294,4 +412,44 @@ module Tilt
|
|
294
412
|
string.force_encoding(original_encoding)
|
295
413
|
end
|
296
414
|
end
|
415
|
+
|
416
|
+
class StaticTemplate < Template
|
417
|
+
def self.subclass(mime_type: 'text/html', &block)
|
418
|
+
Class.new(self) do
|
419
|
+
self.default_mime_type = mime_type
|
420
|
+
|
421
|
+
private
|
422
|
+
|
423
|
+
define_method(:_prepare_output, &block)
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
# Static templates always return the prepared output.
|
428
|
+
def render(scope=nil, locals=nil)
|
429
|
+
@output
|
430
|
+
end
|
431
|
+
|
432
|
+
# Raise NotImplementedError, since static templates
|
433
|
+
# do not support compiled methods.
|
434
|
+
def compiled_method(locals_keys, scope_class=nil)
|
435
|
+
raise NotImplementedError
|
436
|
+
end
|
437
|
+
|
438
|
+
# Static templates never allow script.
|
439
|
+
def allows_script?
|
440
|
+
false
|
441
|
+
end
|
442
|
+
|
443
|
+
protected
|
444
|
+
|
445
|
+
def prepare
|
446
|
+
@output = _prepare_output
|
447
|
+
end
|
448
|
+
|
449
|
+
private
|
450
|
+
|
451
|
+
# Do nothing, since compiled method cache is not used.
|
452
|
+
def set_compiled_method_cache
|
453
|
+
end
|
454
|
+
end
|
297
455
|
end
|
data/lib/tilt/typescript.rb
CHANGED
@@ -1,26 +1,19 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'template'
|
2
3
|
require 'typescript-node'
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
self.default_mime_type = 'application/javascript'
|
5
|
+
Tilt::TypeScriptTemplate = Tilt::StaticTemplate.subclass(mime_type: 'application/javascript') do
|
6
|
+
option_args = []
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
@options.each do |key, value|
|
9
|
+
next unless value
|
10
10
|
|
11
|
-
|
12
|
-
next unless value
|
11
|
+
option_args << "--#{key}"
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
if value != true
|
17
|
-
@option_args << value.to_s
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def evaluate(scope, locals, &block)
|
23
|
-
@output ||= TypeScript::Node.compile(data, *@option_args)
|
13
|
+
if value != true
|
14
|
+
option_args << value.to_s
|
24
15
|
end
|
25
16
|
end
|
17
|
+
|
18
|
+
TypeScript::Node.compile(@data, *option_args)
|
26
19
|
end
|
data/lib/tilt/wikicloth.rb
CHANGED
@@ -1,22 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'template'
|
2
3
|
require 'wikicloth'
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
@parser = options.delete(:parser) || WikiCloth::Parser
|
10
|
-
@engine = @parser.new options.merge(:data => data)
|
11
|
-
@output = nil
|
12
|
-
end
|
13
|
-
|
14
|
-
def evaluate(scope, locals, &block)
|
15
|
-
@output ||= @engine.to_html
|
16
|
-
end
|
17
|
-
|
18
|
-
def allows_script?
|
19
|
-
false
|
20
|
-
end
|
21
|
-
end
|
5
|
+
# WikiCloth implementation. See: https://github.com/nricciar/wikicloth
|
6
|
+
Tilt::WikiClothTemplate = Tilt::StaticTemplate.subclass do
|
7
|
+
parser = @options.delete(:parser) || WikiCloth::Parser
|
8
|
+
@options[:data] = @data
|
9
|
+
parser.new(@options).to_html
|
22
10
|
end
|
data/lib/tilt/yajl.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'template'
|
2
3
|
require 'yajl'
|
3
4
|
|
4
5
|
module Tilt
|
5
|
-
|
6
6
|
# Yajl Template implementation
|
7
7
|
#
|
8
8
|
# Yajl is a fast JSON parsing and encoding library for Ruby
|
@@ -40,14 +40,10 @@ module Tilt
|
|
40
40
|
# template.render(self)
|
41
41
|
#
|
42
42
|
class YajlTemplate < Template
|
43
|
-
|
44
43
|
self.default_mime_type = 'application/json'
|
45
44
|
|
46
|
-
def prepare
|
47
|
-
end
|
48
|
-
|
49
45
|
def evaluate(scope, locals, &block)
|
50
|
-
decorate
|
46
|
+
decorate(super)
|
51
47
|
end
|
52
48
|
|
53
49
|
def precompiled_preamble(locals)
|
@@ -60,10 +56,9 @@ module Tilt
|
|
60
56
|
end
|
61
57
|
|
62
58
|
def precompiled_template(locals)
|
63
|
-
data.to_str
|
59
|
+
@data.to_str
|
64
60
|
end
|
65
61
|
|
66
|
-
|
67
62
|
# Decorates the +json+ input according to given +options+.
|
68
63
|
#
|
69
64
|
# json - The json String to decorate.
|
@@ -71,7 +66,7 @@ module Tilt
|
|
71
66
|
#
|
72
67
|
# Returns the decorated String.
|
73
68
|
def decorate(json)
|
74
|
-
callback, variable = options[:callback], options[:variable]
|
69
|
+
callback, variable = @options[:callback], @options[:variable]
|
75
70
|
if callback && variable
|
76
71
|
"var #{variable} = #{json}; #{callback}(#{variable});"
|
77
72
|
elsif variable
|
@@ -83,5 +78,4 @@ module Tilt
|
|
83
78
|
end
|
84
79
|
end
|
85
80
|
end
|
86
|
-
|
87
81
|
end
|