tilt 2.0.0 → 2.4.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.
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