tilt 2.0.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +5 -5
  2. data/COPYING +2 -1
  3. data/bin/tilt +2 -110
  4. data/lib/tilt/_emacs_org.rb +2 -0
  5. data/lib/tilt/_handlebars.rb +2 -0
  6. data/lib/tilt/_jbuilder.rb +2 -0
  7. data/lib/tilt/_org.rb +2 -0
  8. data/lib/tilt/asciidoc.rb +11 -23
  9. data/lib/tilt/babel.rb +8 -0
  10. data/lib/tilt/builder.rb +23 -14
  11. data/lib/tilt/cli.rb +134 -0
  12. data/lib/tilt/coffee.rb +17 -25
  13. data/lib/tilt/commonmarker.rb +95 -0
  14. data/lib/tilt/creole.rb +9 -20
  15. data/lib/tilt/csv.rb +9 -21
  16. data/lib/tilt/erb.rb +27 -19
  17. data/lib/tilt/erubi.rb +55 -0
  18. data/lib/tilt/erubis.rb +20 -12
  19. data/lib/tilt/etanni.rb +5 -4
  20. data/lib/tilt/haml.rb +79 -42
  21. data/lib/tilt/kramdown.rb +8 -28
  22. data/lib/tilt/liquid.rb +11 -9
  23. data/lib/tilt/livescript.rb +11 -0
  24. data/lib/tilt/mapping.rb +242 -95
  25. data/lib/tilt/markaby.rb +5 -7
  26. data/lib/tilt/maruku.rb +6 -18
  27. data/lib/tilt/nokogiri.rb +11 -10
  28. data/lib/tilt/pandoc.rb +39 -0
  29. data/lib/tilt/pipeline.rb +19 -0
  30. data/lib/tilt/plain.rb +4 -19
  31. data/lib/tilt/prawn.rb +28 -0
  32. data/lib/tilt/radius.rb +15 -22
  33. data/lib/tilt/rdiscount.rb +17 -33
  34. data/lib/tilt/rdoc.rb +14 -35
  35. data/lib/tilt/redcarpet.rb +20 -93
  36. data/lib/tilt/redcloth.rb +9 -19
  37. data/lib/tilt/rst-pandoc.rb +10 -0
  38. data/lib/tilt/sass.rb +59 -22
  39. data/lib/tilt/slim.rb +5 -0
  40. data/lib/tilt/string.rb +9 -3
  41. data/lib/tilt/template.rb +246 -78
  42. data/lib/tilt/typescript.rb +19 -0
  43. data/lib/tilt/wikicloth.rb +8 -18
  44. data/lib/tilt/yajl.rb +5 -11
  45. data/lib/tilt.rb +91 -41
  46. metadata +39 -102
  47. data/CHANGELOG.md +0 -61
  48. data/Gemfile +0 -39
  49. data/HACKING +0 -16
  50. data/README.md +0 -206
  51. data/Rakefile +0 -95
  52. data/docs/TEMPLATES.md +0 -523
  53. data/docs/common.css +0 -14
  54. data/lib/tilt/bluecloth.rb +0 -24
  55. data/lib/tilt/less.rb +0 -38
  56. data/test/markaby/locals.mab +0 -1
  57. data/test/markaby/markaby.mab +0 -1
  58. data/test/markaby/markaby_other_static.mab +0 -1
  59. data/test/markaby/render_twice.mab +0 -1
  60. data/test/markaby/scope.mab +0 -1
  61. data/test/markaby/yielding.mab +0 -2
  62. data/test/test_helper.rb +0 -64
  63. data/test/tilt_asciidoctor_test.rb +0 -44
  64. data/test/tilt_blueclothtemplate_test.rb +0 -33
  65. data/test/tilt_buildertemplate_test.rb +0 -59
  66. data/test/tilt_cache_test.rb +0 -32
  67. data/test/tilt_coffeescripttemplate_test.rb +0 -104
  68. data/test/tilt_compilesite_test.rb +0 -51
  69. data/test/tilt_creoletemplate_test.rb +0 -24
  70. data/test/tilt_csv_test.rb +0 -65
  71. data/test/tilt_erbtemplate_test.rb +0 -239
  72. data/test/tilt_erubistemplate_test.rb +0 -151
  73. data/test/tilt_etannitemplate_test.rb +0 -174
  74. data/test/tilt_hamltemplate_test.rb +0 -144
  75. data/test/tilt_kramdown_test.rb +0 -20
  76. data/test/tilt_lesstemplate_test.less +0 -1
  77. data/test/tilt_lesstemplate_test.rb +0 -42
  78. data/test/tilt_liquidtemplate_test.rb +0 -78
  79. data/test/tilt_mapping_test.rb +0 -229
  80. data/test/tilt_markaby_test.rb +0 -88
  81. data/test/tilt_markdown_test.rb +0 -174
  82. data/test/tilt_marukutemplate_test.rb +0 -36
  83. data/test/tilt_metadata_test.rb +0 -42
  84. data/test/tilt_nokogiritemplate_test.rb +0 -87
  85. data/test/tilt_radiustemplate_test.rb +0 -75
  86. data/test/tilt_rdiscounttemplate_test.rb +0 -43
  87. data/test/tilt_rdoctemplate_test.rb +0 -29
  88. data/test/tilt_redcarpettemplate_test.rb +0 -59
  89. data/test/tilt_redclothtemplate_test.rb +0 -36
  90. data/test/tilt_sasstemplate_test.rb +0 -41
  91. data/test/tilt_stringtemplate_test.rb +0 -171
  92. data/test/tilt_template_test.rb +0 -316
  93. data/test/tilt_test.rb +0 -60
  94. data/test/tilt_wikiclothtemplate_test.rb +0 -32
  95. data/test/tilt_yajltemplate_test.rb +0 -101
  96. data/tilt.gemspec +0 -107
data/lib/tilt/template.rb CHANGED
@@ -1,9 +1,12 @@
1
- require 'tilt'
2
- require 'thread'
3
-
1
+ # frozen_string_literal: true
4
2
  module Tilt
5
3
  # @private
6
- TOPOBJECT = Object.superclass || Object
4
+ module CompiledTemplates
5
+ end
6
+
7
+ # @private
8
+ TOPOBJECT = CompiledTemplates
9
+
7
10
  # @private
8
11
  LOCK = Mutex.new
9
12
 
@@ -25,6 +28,12 @@ module Tilt
25
28
  # interface.
26
29
  attr_reader :options
27
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
+
28
37
  class << self
29
38
  # An empty Hash that the template engine can populate with various
30
39
  # metadata.
@@ -32,12 +41,12 @@ module Tilt
32
41
  @metadata ||= {}
33
42
  end
34
43
 
35
- # @deprecated Use `.metadata[:mime_type]` instead.
44
+ # Use `.metadata[:mime_type]` instead.
36
45
  def default_mime_type
37
46
  metadata[:mime_type]
38
47
  end
39
48
 
40
- # @deprecated Use `.metadata[:mime_type] = val` instead.
49
+ # Use `.metadata[:mime_type] = val` instead.
41
50
  def default_mime_type=(value)
42
51
  metadata[:mime_type] = value
43
52
  end
@@ -49,36 +58,34 @@ module Tilt
49
58
  # a block is required.
50
59
  #
51
60
  # All arguments are optional.
52
- def initialize(file=nil, line=1, options={}, &block)
53
- @file, @line, @options = nil, 1, {}
61
+ def initialize(file=nil, line=nil, options=nil)
62
+ @file, @line, @options = nil, 1, nil
54
63
 
55
- [options, line, file].compact.each do |arg|
56
- case
57
- when arg.respond_to?(:to_str) ; @file = arg.to_str
58
- when arg.respond_to?(:to_int) ; @line = arg.to_int
59
- when arg.respond_to?(:to_hash) ; @options = arg.to_hash.dup
60
- when arg.respond_to?(:path) ; @file = arg.path
61
- when arg.respond_to?(:to_path) ; @file = arg.to_path
62
- else raise TypeError, "Can't load the template file. Pass a string with a path " +
63
- "or an object that responds to 'to_str', 'path' or 'to_path'"
64
- end
65
- end
64
+ process_arg(options)
65
+ process_arg(line)
66
+ process_arg(file)
66
67
 
67
- raise ArgumentError, "file or block required" if (@file || block).nil?
68
+ raise ArgumentError, "file or block required" unless @file || block_given?
68
69
 
69
- # used to hold compiled template methods
70
- @compiled_method = {}
70
+ @options ||= {}
71
+
72
+ set_compiled_method_cache
71
73
 
72
- # used on 1.9 to set the encoding if it is not set elsewhere (like a magic comment)
73
- # currently only used if template compiles to ruby
74
+ # Force the encoding of the input data
74
75
  @default_encoding = @options.delete :default_encoding
75
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
+
76
81
  # load template data and prepare (uses binread to avoid encoding issues)
77
- @reader = block || lambda { |t| read_template_file }
78
- @data = @reader.call(self)
82
+ @data = block_given? ? yield(self) : read_template_file
79
83
 
80
84
  if @data.respond_to?(:force_encoding)
81
- @data.force_encoding(default_encoding) if default_encoding
85
+ if default_encoding
86
+ @data = @data.dup if @data.frozen?
87
+ @data.force_encoding(default_encoding)
88
+ end
82
89
 
83
90
  if !@data.valid_encoding?
84
91
  raise Encoding::InvalidByteSequenceError, "#{eval_file} is not valid #{@data.encoding}"
@@ -91,27 +98,25 @@ module Tilt
91
98
  # Render the template in the given scope with the locals specified. If a
92
99
  # block is given, it is typically available within the template via
93
100
  # +yield+.
94
- def render(scope=Object.new, locals={}, &block)
95
- current_template = Thread.current[:tilt_current_template]
96
- Thread.current[:tilt_current_template] = self
97
- evaluate(scope, locals || {}, &block)
98
- ensure
99
- Thread.current[:tilt_current_template] = current_template
101
+ def render(scope=nil, locals=nil, &block)
102
+ evaluate(scope || Object.new, locals || EMPTY_HASH, &block)
100
103
  end
101
104
 
102
105
  # The basename of the template file.
103
106
  def basename(suffix='')
104
- File.basename(file, suffix) if file
107
+ File.basename(@file, suffix) if @file
105
108
  end
106
109
 
107
110
  # The template file's basename with all extensions chomped off.
108
111
  def name
109
- basename.split('.', 2).first if basename
112
+ if bname = basename
113
+ bname.split('.', 2).first
114
+ end
110
115
  end
111
116
 
112
117
  # The filename used in backtraces to describe the template.
113
118
  def eval_file
114
- file || '(__TEMPLATE__)'
119
+ @file || '(__TEMPLATE__)'
115
120
  end
116
121
 
117
122
  # An empty Hash that the template engine can populate with various
@@ -124,6 +129,35 @@ module Tilt
124
129
  end
125
130
  end
126
131
 
132
+ # Set the prefix to use for compiled paths.
133
+ def compiled_path=(path)
134
+ if path
135
+ # Use expanded paths when loading, since that is helpful
136
+ # for coverage. Remove any .rb suffix, since that will
137
+ # be added back later.
138
+ path = File.expand_path(path.sub(/\.rb\z/i, ''))
139
+ end
140
+ @compiled_path = path
141
+ end
142
+
143
+ # The compiled method for the locals keys and scope_class provided.
144
+ # Returns an UnboundMethod, which can be used to define methods
145
+ # directly on the scope class, which are much faster to call than
146
+ # Tilt's normal rendering.
147
+ def compiled_method(locals_keys, scope_class=nil)
148
+ key = [scope_class, locals_keys].freeze
149
+ LOCK.synchronize do
150
+ if meth = @compiled_method[key]
151
+ return meth
152
+ end
153
+ end
154
+ meth = compile_template_method(locals_keys, scope_class)
155
+ LOCK.synchronize do
156
+ @compiled_method[key] = meth
157
+ end
158
+ meth
159
+ end
160
+
127
161
  protected
128
162
 
129
163
  # @!group For template implementations
@@ -132,19 +166,23 @@ module Tilt
132
166
  # default_encoding-option if present. You may override this method
133
167
  # in your template class if you have a better hint of the data's
134
168
  # encoding.
135
- def default_encoding
136
- @default_encoding
169
+ attr_reader :default_encoding
170
+
171
+ def skip_compiled_encoding_detection?
172
+ @skip_compiled_encoding_detection
137
173
  end
138
174
 
139
175
  # Do whatever preparation is necessary to setup the underlying template
140
176
  # engine. Called immediately after template data is loaded. Instance
141
177
  # variables set in this method are available when #evaluate is called.
142
178
  #
143
- # Subclasses must provide an implementation of this method.
179
+ # Empty by default as some subclasses do not need separate preparation.
144
180
  def prepare
145
- raise NotImplementedError
146
181
  end
147
182
 
183
+ CLASS_METHOD = Kernel.instance_method(:class)
184
+ USE_BIND_CALL = RUBY_VERSION >= '2.7'
185
+
148
186
  # Execute the compiled template and return the result string. Template
149
187
  # evaluation is guaranteed to be performed in the scope object with the
150
188
  # locals specified and with support for yielding to the block.
@@ -152,8 +190,26 @@ module Tilt
152
190
  # This method is only used by source generating templates. Subclasses that
153
191
  # override render() may not support all features.
154
192
  def evaluate(scope, locals, &block)
155
- method = compiled_method(locals.keys)
156
- method.bind(scope).call(locals, &block)
193
+ locals_keys = locals.keys
194
+ locals_keys.sort!{|x, y| x.to_s <=> y.to_s}
195
+
196
+ case scope
197
+ when Object
198
+ scope_class = Module === scope ? scope : scope.class
199
+ else
200
+ # :nocov:
201
+ scope_class = USE_BIND_CALL ? CLASS_METHOD.bind_call(scope) : CLASS_METHOD.bind(scope).call
202
+ # :nocov:
203
+ end
204
+ method = compiled_method(locals_keys, scope_class)
205
+
206
+ if USE_BIND_CALL
207
+ method.bind_call(scope, locals, &block)
208
+ # :nocov:
209
+ else
210
+ method.bind(scope).call(locals, &block)
211
+ # :nocov:
212
+ end
157
213
  end
158
214
 
159
215
  # Generates all template source by combining the preamble, template, and
@@ -169,17 +225,21 @@ module Tilt
169
225
  preamble = precompiled_preamble(local_keys)
170
226
  template = precompiled_template(local_keys)
171
227
  postamble = precompiled_postamble(local_keys)
172
- source = ''
228
+ source = String.new
173
229
 
174
- # Ensure that our generated source code has the same encoding as the
175
- # the source code generated by the template engine.
176
- if source.respond_to?(:force_encoding)
177
- template_encoding = extract_encoding(template)
230
+ unless skip_compiled_encoding_detection?
231
+ # Ensure that our generated source code has the same encoding as the
232
+ # the source code generated by the template engine.
233
+ template_encoding = extract_encoding(template){|t| template = t}
178
234
 
179
- source.force_encoding(template_encoding)
180
- template.force_encoding(template_encoding)
235
+ if template.encoding != template_encoding
236
+ # template should never be frozen here. If it was frozen originally,
237
+ # then extract_encoding should yield a dup.
238
+ template.force_encoding(template_encoding)
239
+ end
181
240
  end
182
241
 
242
+ source.force_encoding(template.encoding)
183
243
  source << preamble << "\n" << template << "\n" << postamble
184
244
 
185
245
  [source, preamble.count("\n")+1]
@@ -207,75 +267,143 @@ module Tilt
207
267
 
208
268
  private
209
269
 
210
- def read_template_file
211
- data = File.open(file, 'rb') { |io| io.read }
212
- if data.respond_to?(:force_encoding)
213
- # Set it to the default external (without verifying)
214
- data.force_encoding(Encoding.default_external) if Encoding.default_external
270
+ def process_arg(arg)
271
+ if arg
272
+ case
273
+ when arg.respond_to?(:to_str) ; @file = arg.to_str
274
+ when arg.respond_to?(:to_int) ; @line = arg.to_int
275
+ when arg.respond_to?(:to_hash) ; @options = arg.to_hash.dup
276
+ when arg.respond_to?(:path) ; @file = arg.path
277
+ when arg.respond_to?(:to_path) ; @file = arg.to_path
278
+ else raise TypeError, "Can't load the template file. Pass a string with a path " +
279
+ "or an object that responds to 'to_str', 'path' or 'to_path'"
280
+ end
215
281
  end
282
+ end
283
+
284
+ def read_template_file
285
+ data = File.binread(file)
286
+ # Set it to the default external (without verifying)
287
+ # :nocov:
288
+ data.force_encoding(Encoding.default_external) if Encoding.default_external
289
+ # :nocov:
216
290
  data
217
291
  end
218
292
 
219
- # The compiled method for the locals keys provided.
220
- def compiled_method(locals_keys)
221
- LOCK.synchronize do
222
- @compiled_method[locals_keys] ||= compile_template_method(locals_keys)
223
- end
293
+ def set_compiled_method_cache
294
+ @compiled_method = {}
224
295
  end
225
296
 
226
297
  def local_extraction(local_keys)
227
- local_keys.map do |k|
298
+ assignments = local_keys.map do |k|
228
299
  if k.to_s =~ /\A[a-z_][a-zA-Z_0-9]*\z/
229
300
  "#{k} = locals[#{k.inspect}]"
230
301
  else
231
302
  raise "invalid locals key: #{k.inspect} (keys must be variable names)"
232
303
  end
233
- end.join("\n")
304
+ end
305
+
306
+ s = "locals = locals[:locals]"
307
+ if assignments.delete(s)
308
+ # If there is a locals key itself named `locals`, delete it from the ordered keys so we can
309
+ # assign it last. This is important because the assignment of all other locals depends on the
310
+ # `locals` local variable still matching the `locals` method argument given to the method
311
+ # created in `#compile_template_method`.
312
+ assignments << s
313
+ end
314
+
315
+ assignments.join("\n")
234
316
  end
235
317
 
236
- def compile_template_method(local_keys)
318
+ def compile_template_method(local_keys, scope_class=nil)
237
319
  source, offset = precompiled(local_keys)
238
320
  local_code = local_extraction(local_keys)
239
321
 
240
322
  method_name = "__tilt_#{Thread.current.object_id.abs}"
241
- method_source = ""
323
+ method_source = String.new
324
+ method_source.force_encoding(source.encoding)
242
325
 
243
- if method_source.respond_to?(:force_encoding)
244
- method_source.force_encoding(source.encoding)
326
+ if freeze_string_literals?
327
+ method_source << "# frozen-string-literal: true\n"
245
328
  end
246
329
 
247
- method_source << <<-RUBY
248
- TOPOBJECT.class_eval do
249
- def #{method_name}(locals)
250
- Thread.current[:tilt_vars] = [self, locals]
251
- class << self
252
- this, locals = Thread.current[:tilt_vars]
253
- this.instance_eval do
254
- #{local_code}
255
- RUBY
330
+ # Don't indent method source, to avoid indentation warnings when using compiled paths
331
+ method_source << "::Tilt::TOPOBJECT.class_eval do\ndef #{method_name}(locals)\n#{local_code}\n"
332
+
256
333
  offset += method_source.count("\n")
257
334
  method_source << source
258
- method_source << "\nend;end;end;end"
259
- Object.class_eval(method_source, eval_file, line - offset)
335
+ method_source << "\nend;end;"
336
+
337
+ bind_compiled_method(method_source, offset, scope_class)
260
338
  unbind_compiled_method(method_name)
261
339
  end
262
340
 
341
+ def bind_compiled_method(method_source, offset, scope_class)
342
+ path = compiled_path
343
+ if path && scope_class.name
344
+ path = path.dup
345
+
346
+ if defined?(@compiled_path_counter)
347
+ path << '-' << @compiled_path_counter.succ!
348
+ else
349
+ @compiled_path_counter = "0".dup
350
+ end
351
+ path << ".rb"
352
+
353
+ # Wrap method source in a class block for the scope, so constant lookup works
354
+ if freeze_string_literals?
355
+ method_source_prefix = "# frozen-string-literal: true\n"
356
+ method_source = method_source.sub(/\A# frozen-string-literal: true\n/, '')
357
+ end
358
+ method_source = "#{method_source_prefix}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
+
263
382
  def unbind_compiled_method(method_name)
264
383
  method = TOPOBJECT.instance_method(method_name)
265
384
  TOPOBJECT.class_eval { remove_method(method_name) }
266
385
  method
267
386
  end
268
387
 
269
- def extract_encoding(script)
270
- extract_magic_comment(script) || script.encoding
388
+ def extract_encoding(script, &block)
389
+ extract_magic_comment(script, &block) || script.encoding
271
390
  end
272
391
 
273
392
  def extract_magic_comment(script)
393
+ if script.frozen?
394
+ script = script.dup
395
+ yield script
396
+ end
397
+
274
398
  binary(script) do
275
399
  script[/\A[ \t]*\#.*coding\s*[=:]\s*([[:alnum:]\-_]+).*$/n, 1]
276
400
  end
277
401
  end
278
402
 
403
+ def freeze_string_literals?
404
+ false
405
+ end
406
+
279
407
  def binary(string)
280
408
  original_encoding = string.encoding
281
409
  string.force_encoding(Encoding::BINARY)
@@ -284,4 +412,44 @@ module Tilt
284
412
  string.force_encoding(original_encoding)
285
413
  end
286
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
287
455
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
3
+ require 'typescript-node'
4
+
5
+ Tilt::TypeScriptTemplate = Tilt::StaticTemplate.subclass(mime_type: 'application/javascript') do
6
+ option_args = []
7
+
8
+ @options.each do |key, value|
9
+ next unless value
10
+
11
+ option_args << "--#{key}"
12
+
13
+ if value != true
14
+ option_args << value.to_s
15
+ end
16
+ end
17
+
18
+ TypeScript::Node.compile(@data, *option_args)
19
+ end
@@ -1,22 +1,12 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require 'wikicloth'
3
4
 
4
- module Tilt
5
- # WikiCloth implementation. See:
6
- # http://redcloth.org/
7
- class WikiClothTemplate < Template
8
- def prepare
9
- @parser = options.delete(:parser) || WikiCloth::Parser
10
- @engine = @parser.new options.merge(:data => data)
11
- @output = nil
12
- end
5
+ warn 'tilt/wikicloth is deprecated, as wikicloth requires modifying string literals', uplevel: 1
13
6
 
14
- def evaluate(scope, locals, &block)
15
- @output ||= @engine.to_html
16
- end
17
-
18
- def allows_script?
19
- false
20
- end
21
- end
7
+ # WikiCloth implementation. See: https://github.com/nricciar/wikicloth
8
+ Tilt::WikiClothTemplate = Tilt::StaticTemplate.subclass do
9
+ parser = @options.delete(:parser) || WikiCloth::Parser
10
+ @options[:data] = @data
11
+ parser.new(@options).to_html
22
12
  end
data/lib/tilt/yajl.rb CHANGED
@@ -1,8 +1,8 @@
1
- require 'tilt/template'
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 super(scope, locals, &block)
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