tilt 2.0.10 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +5 -5
  2. data/COPYING +1 -0
  3. data/bin/tilt +2 -120
  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 +5 -13
  10. data/lib/tilt/builder.rb +18 -13
  11. data/lib/tilt/cli.rb +134 -0
  12. data/lib/tilt/coffee.rb +12 -31
  13. data/lib/tilt/commonmarker.rb +82 -65
  14. data/lib/tilt/creole.rb +9 -20
  15. data/lib/tilt/csv.rb +6 -18
  16. data/lib/tilt/erb.rb +23 -21
  17. data/lib/tilt/erubi.rb +29 -6
  18. data/lib/tilt/erubis.rb +19 -11
  19. data/lib/tilt/etanni.rb +5 -4
  20. data/lib/tilt/haml.rb +73 -65
  21. data/lib/tilt/kramdown.rb +8 -20
  22. data/lib/tilt/liquid.rb +10 -14
  23. data/lib/tilt/livescript.rb +8 -20
  24. data/lib/tilt/mapping.rb +228 -109
  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 +33 -43
  29. data/lib/tilt/pipeline.rb +19 -0
  30. data/lib/tilt/plain.rb +4 -15
  31. data/lib/tilt/prawn.rb +10 -25
  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 -72
  36. data/lib/tilt/redcloth.rb +9 -19
  37. data/lib/tilt/rst-pandoc.rb +7 -15
  38. data/lib/tilt/sass.rb +54 -28
  39. data/lib/tilt/slim.rb +5 -0
  40. data/lib/tilt/string.rb +9 -3
  41. data/lib/tilt/template.rb +235 -77
  42. data/lib/tilt/typescript.rb +11 -18
  43. data/lib/tilt/wikicloth.rb +8 -18
  44. data/lib/tilt/yajl.rb +5 -11
  45. data/lib/tilt.rb +60 -39
  46. metadata +24 -16
  47. data/lib/tilt/bluecloth.rb +0 -24
  48. data/lib/tilt/dummy.rb +0 -3
  49. data/lib/tilt/less.rb +0 -30
  50. data/lib/tilt/sigil.rb +0 -34
data/lib/tilt/prawn.rb CHANGED
@@ -1,43 +1,28 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require 'prawn'
3
4
 
4
5
  module Tilt
5
6
  # Prawn template implementation. See: http://prawnpdf.org
6
- #
7
7
  class PrawnTemplate < Template
8
8
  self.default_mime_type = 'application/pdf'
9
9
 
10
10
  def prepare
11
- @engine = ::Prawn::Document.new(prawn_options)
11
+ @options[:page_size] = 'A4' unless @options.has_key?(:page_size)
12
+ @options[:page_layout] = :portrait unless @options.has_key?(:page_layout)
13
+ @engine = ::Prawn::Document.new(@options)
12
14
  end
13
15
 
14
16
  def evaluate(scope, locals, &block)
15
17
  pdf = @engine
16
- if data.respond_to?(:to_str)
17
- locals[:pdf] = pdf
18
- super(scope, locals, &block)
19
- elsif data.kind_of?(Proc)
20
- data.call(pdf)
21
- end
22
- @output ||= pdf.render
23
- end
24
-
25
- def allows_script?
26
- false
18
+ locals = locals.dup
19
+ locals[:pdf] = pdf
20
+ super
21
+ pdf.render
27
22
  end
28
23
 
29
24
  def precompiled_template(locals)
30
- data.to_str
25
+ @data.to_str
31
26
  end
32
-
33
-
34
- private
35
-
36
- def prawn_options
37
- # defaults to A4 instead of crazy US Letter format.
38
- { :page_size => "A4", :page_layout => :portrait }.merge(options)
39
- end
40
-
41
27
  end
42
-
43
28
  end
data/lib/tilt/radius.rb CHANGED
@@ -1,44 +1,37 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require 'radius'
3
4
 
4
5
  module Tilt
5
6
  # Radius Template
6
7
  # http://github.com/jlong/radius/
7
8
  class RadiusTemplate < Template
8
- def self.context_class
9
- @context_class ||= Class.new(Radius::Context) do
10
- attr_accessor :tilt_scope
9
+ class ContextClass < Radius::Context
10
+ attr_accessor :tilt_scope
11
11
 
12
- def tag_missing(name, attributes)
13
- tilt_scope.__send__(name)
14
- end
15
-
16
- def dup
17
- i = super
18
- i.tilt_scope = tilt_scope
19
- i
20
- end
12
+ def tag_missing(name, attributes)
13
+ tilt_scope.__send__(name)
21
14
  end
22
- end
23
15
 
24
- def prepare
16
+ def dup
17
+ i = super
18
+ i.tilt_scope = tilt_scope
19
+ i
20
+ end
25
21
  end
26
22
 
27
23
  def evaluate(scope, locals, &block)
28
- context = self.class.context_class.new
24
+ context = ContextClass.new
29
25
  context.tilt_scope = scope
30
- context.define_tag("yield") do
31
- block.call
32
- end
26
+ context.define_tag("yield", &block) if block
33
27
  locals.each do |tag, value|
34
28
  context.define_tag(tag) do
35
29
  value
36
30
  end
37
31
  end
38
32
 
39
- options = {:tag_prefix => 'r'}.merge(@options)
40
- parser = Radius::Parser.new(context, options)
41
- parser.parse(data)
33
+ @options[:tag_prefix] = 'r' unless @options.has_key?(:tag_prefix)
34
+ Radius::Parser.new(context, @options).parse(@data)
42
35
  end
43
36
 
44
37
  def allows_script?
@@ -1,39 +1,23 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require 'rdiscount'
3
4
 
4
- module Tilt
5
- # Discount Markdown implementation. See:
6
- # http://github.com/rtomayko/rdiscount
7
- #
8
- # RDiscount is a simple text filter. It does not support +scope+ or
9
- # +locals+. The +:smart+ and +:filter_html+ options may be set true
10
- # to enable those flags on the underlying RDiscount object.
11
- class RDiscountTemplate < Template
12
- self.default_mime_type = 'text/html'
5
+ aliases = {
6
+ :escape_html => :filter_html,
7
+ :smartypants => :smart
8
+ }.freeze
13
9
 
14
- ALIAS = {
15
- :escape_html => :filter_html,
16
- :smartypants => :smart
17
- }
10
+ _flags = [:smart, :filter_html, :smartypants, :escape_html].freeze
18
11
 
19
- FLAGS = [:smart, :filter_html, :smartypants, :escape_html]
12
+ # Discount Markdown implementation. See:
13
+ # http://github.com/rtomayko/rdiscount
14
+ #
15
+ # RDiscount is a simple text filter. It does not support +scope+ or
16
+ # +locals+. The +:smart+ and +:filter_html+ options may be set true
17
+ # to enable those flags on the underlying RDiscount object.
18
+ Tilt::RDiscountTemplate = Tilt::StaticTemplate.subclass do
19
+ flags = _flags.select { |flag| @options[flag] }.
20
+ map! { |flag| aliases[flag] || flag }
20
21
 
21
- def flags
22
- FLAGS.select { |flag| options[flag] }.map { |flag| ALIAS[flag] || flag }
23
- end
24
-
25
- def prepare
26
- @engine = RDiscount.new(data, *flags)
27
- @output = nil
28
- end
29
-
30
- def evaluate(scope, locals, &block)
31
- @output ||= @engine.to_html
32
- end
33
-
34
- def allows_script?
35
- false
36
- end
37
- end
22
+ RDiscount.new(@data, *flags).to_html
38
23
  end
39
-
data/lib/tilt/rdoc.rb CHANGED
@@ -1,40 +1,19 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require 'rdoc'
3
4
  require 'rdoc/markup'
4
5
  require 'rdoc/markup/to_html'
6
+ require 'rdoc/options'
5
7
 
6
- module Tilt
7
- # RDoc template. See:
8
- # http://rdoc.rubyforge.org/
9
- #
10
- # It's suggested that your program `require 'rdoc/markup'` and
11
- # `require 'rdoc/markup/to_html'` at load time when using this template
12
- # engine in a threaded environment.
13
- class RDocTemplate < Template
14
- self.default_mime_type = 'text/html'
15
-
16
- def markup
17
- begin
18
- # RDoc 4.0
19
- require 'rdoc/options'
20
- RDoc::Markup::ToHtml.new(RDoc::Options.new, nil)
21
- rescue ArgumentError
22
- # RDoc < 4.0
23
- RDoc::Markup::ToHtml.new
24
- end
25
- end
26
-
27
- def prepare
28
- @engine = markup.convert(data)
29
- @output = nil
30
- end
31
-
32
- def evaluate(scope, locals, &block)
33
- @output ||= @engine.to_s
34
- end
35
-
36
- def allows_script?
37
- false
38
- end
39
- end
8
+ # RDoc template. See: https://github.com/ruby/rdoc
9
+ #
10
+ # It's suggested that your program run the following at load time when
11
+ # using this templae engine in a threaded environment:
12
+ #
13
+ # require 'rdoc'
14
+ # require 'rdoc/markup'
15
+ # require 'rdoc/markup/to_html'
16
+ # require 'rdoc/options'
17
+ Tilt::RDocTemplate = Tilt::StaticTemplate.subclass do
18
+ RDoc::Markup::ToHtml.new(RDoc::Options.new, nil).convert(@data).to_s
40
19
  end
@@ -1,83 +1,31 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require 'redcarpet'
3
4
 
4
- module Tilt
5
- # Compatibility mode for Redcarpet 1.x
6
- class Redcarpet1Template < Template
7
- self.default_mime_type = 'text/html'
5
+ aliases = {:escape_html => :filter_html, :smartypants => :smart}.freeze
8
6
 
9
- ALIAS = {
10
- :escape_html => :filter_html,
11
- :smartypants => :smart
12
- }
13
-
14
- FLAGS = [:smart, :filter_html, :smartypants, :escape_html]
15
-
16
- def flags
17
- FLAGS.select { |flag| options[flag] }.map { |flag| ALIAS[flag] || flag }
18
- end
19
-
20
- def prepare
21
- @engine = RedcarpetCompat.new(data, *flags)
22
- @output = nil
23
- end
24
-
25
- def evaluate(scope, locals, &block)
26
- @output ||= @engine.to_html
27
- end
28
-
29
- def allows_script?
30
- false
7
+ Tilt::RedcarpetTemplate = Tilt::StaticTemplate.subclass do
8
+ aliases.each do |opt, aka|
9
+ if options.key?(aka) || !@options.key?(opt)
10
+ @options[opt] = @options.delete(aka)
31
11
  end
32
12
  end
33
13
 
34
- # Future proof mode for Redcarpet 2.x (not yet released)
35
- class Redcarpet2Template < Template
36
- self.default_mime_type = 'text/html'
14
+ # only raise an exception if someone is trying to enable :escape_html
15
+ @options.delete(:escape_html) unless @options[:escape_html]
37
16
 
38
- def generate_renderer
39
- renderer = options.delete(:renderer) || ::Redcarpet::Render::HTML.new(options)
40
- return renderer unless options.delete(:smartypants)
41
- return renderer if renderer.is_a?(Class) && renderer <= ::Redcarpet::Render::SmartyPants
42
-
43
- if renderer == ::Redcarpet::Render::XHTML
44
- ::Redcarpet::Render::SmartyHTML.new(:xhtml => true)
45
- elsif renderer == ::Redcarpet::Render::HTML
46
- ::Redcarpet::Render::SmartyHTML
47
- elsif renderer.is_a? Class
48
- Class.new(renderer) { include ::Redcarpet::Render::SmartyPants }
49
- else
50
- renderer.extend ::Redcarpet::Render::SmartyPants
51
- end
52
- end
53
-
54
- def prepare
55
- # try to support the same aliases
56
- Redcarpet1Template::ALIAS.each do |opt, aka|
57
- next if options.key? opt or not options.key? aka
58
- options[opt] = options.delete(aka)
59
- end
60
-
61
- # only raise an exception if someone is trying to enable :escape_html
62
- options.delete(:escape_html) unless options[:escape_html]
63
-
64
- @engine = ::Redcarpet::Markdown.new(generate_renderer, options)
65
- @output = nil
66
- end
67
-
68
- def evaluate(scope, locals, &block)
69
- @output ||= @engine.render(data)
70
- end
71
-
72
- def allows_script?
73
- false
17
+ renderer = @options.delete(:renderer) || ::Redcarpet::Render::HTML.new(@options)
18
+ if options.delete(:smartypants) && !(renderer.is_a?(Class) && renderer <= ::Redcarpet::Render::SmartyPants)
19
+ renderer = if renderer == ::Redcarpet::Render::XHTML
20
+ ::Redcarpet::Render::SmartyHTML.new(:xhtml => true)
21
+ elsif renderer == ::Redcarpet::Render::HTML
22
+ ::Redcarpet::Render::SmartyHTML
23
+ elsif renderer.is_a? Class
24
+ Class.new(renderer) { include ::Redcarpet::Render::SmartyPants }
25
+ else
26
+ renderer.extend ::Redcarpet::Render::SmartyPants
74
27
  end
75
28
  end
76
29
 
77
- if defined? ::Redcarpet::Render and defined? ::Redcarpet::Markdown
78
- RedcarpetTemplate = Redcarpet2Template
79
- else
80
- RedcarpetTemplate = Redcarpet1Template
81
- end
30
+ Redcarpet::Markdown.new(renderer, @options).render(@data)
82
31
  end
83
-
data/lib/tilt/redcloth.rb CHANGED
@@ -1,23 +1,13 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require 'redcloth'
3
4
 
4
- module Tilt
5
- # RedCloth implementation. See:
6
- # http://redcloth.org/
7
- class RedClothTemplate < Template
8
- def prepare
9
- @engine = RedCloth.new(data)
10
- options.each {|k, v| @engine.send("#{k}=", v) if @engine.respond_to? "#{k}="}
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
5
+ # RedCloth implementation. See: https://github.com/jgarber/redcloth
6
+ Tilt::RedClothTemplate = Tilt::StaticTemplate.subclass do
7
+ engine = RedCloth.new(@data)
8
+ @options.each do |k, v|
9
+ m = :"#{k}="
10
+ engine.send(m, v) if engine.respond_to? m
21
11
  end
12
+ engine.to_html
22
13
  end
23
-
@@ -1,18 +1,10 @@
1
- require 'tilt/template'
2
- require 'tilt/pandoc'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
3
+ require_relative 'pandoc'
3
4
 
4
- module Tilt
5
- # Pandoc reStructuredText implementation. See:
6
- # http://pandoc.org/
7
- # Use PandocTemplate and specify input format
8
- class RstPandocTemplate < PandocTemplate
9
- def tilt_to_pandoc_mapping
10
- { :smartypants => :smart }
11
- end
5
+ rst = {:f => "rst"}.freeze
12
6
 
13
- def pandoc_options
14
- options.merge!(f: 'rst')
15
- super
16
- end
17
- end
7
+ # Pandoc reStructuredText implementation. See: # http://pandoc.org/
8
+ Tilt::RstPandocTemplate = Tilt::StaticTemplate.subclass do
9
+ PandocRuby.new(@data, rst).to_html.strip
18
10
  end
data/lib/tilt/sass.rb CHANGED
@@ -1,52 +1,78 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
 
3
4
  module Tilt
4
- # Sass template implementation. See:
5
- # http://haml.hamptoncatlin.com/
5
+ # Sass template implementation for generating CSS. See: https://sass-lang.com/
6
6
  #
7
7
  # Sass templates do not support object scopes, locals, or yield.
8
- class SassTemplate < Template
8
+ class SassTemplate < StaticTemplate
9
9
  self.default_mime_type = 'text/css'
10
10
 
11
11
  begin
12
- require 'sassc'
13
- Sass = ::SassC
12
+ require 'sass-embedded'
13
+ # :nocov:
14
+ require 'uri'
15
+
16
+ ALLOWED_KEYS = (defined?(::Sass::Compiler) ? ::Sass::Compiler : ::Sass::Embedded).
17
+ instance_method(:compile_string).
18
+ parameters.
19
+ map{|k, v| v if k == :key}.
20
+ compact rescue nil
21
+ private_constant :ALLOWED_KEYS
22
+
23
+ private
24
+
25
+ def _prepare_output
26
+ ::Sass.compile_string(@data, **sass_options).css
27
+ end
28
+
29
+ def sass_options
30
+ path = File.absolute_path(eval_file)
31
+ path = '/' + path unless path.start_with?('/')
32
+ opts = @options.dup
33
+ opts[:url] = ::URI::File.build([nil, ::URI::DEFAULT_PARSER.escape(path)]).to_s
34
+ opts[:syntax] = :indented
35
+ opts.delete_if{|k| !ALLOWED_KEYS.include?(k)} if ALLOWED_KEYS
36
+ opts
37
+ end
14
38
  rescue LoadError => err
15
39
  begin
16
- require 'sass'
17
- Sass = ::Sass
40
+ require 'sassc'
41
+ Engine = ::SassC::Engine
18
42
  rescue LoadError
19
- raise err
43
+ begin
44
+ require 'sass'
45
+ Engine = ::Sass::Engine
46
+ rescue LoadError
47
+ raise err
48
+ end
20
49
  end
21
- end
22
50
 
23
- def prepare
24
- @engine = Sass::Engine.new(data, sass_options)
25
- end
51
+ private
26
52
 
27
- def evaluate(scope, locals, &block)
28
- @output ||= @engine.render
29
- end
30
-
31
- def allows_script?
32
- false
33
- end
53
+ def _prepare_output
54
+ Engine.new(@data, sass_options).render
55
+ end
34
56
 
35
- private
36
- def sass_options
37
- options.merge(:filename => eval_file, :line => line, :syntax => :sass)
57
+ def sass_options
58
+ @options[:filename] = eval_file
59
+ @options[:line] = @line
60
+ @options[:syntax] = :sass
61
+ @options
62
+ end
63
+ # :nocov:
38
64
  end
39
65
  end
40
66
 
41
- # Sass's new .scss type template implementation.
42
67
  class ScssTemplate < SassTemplate
43
68
  self.default_mime_type = 'text/css'
44
69
 
45
- private
70
+ private
71
+
46
72
  def sass_options
47
- options.merge(:filename => eval_file, :line => line, :syntax => :scss)
73
+ opts = super
74
+ opts[:syntax] = :scss
75
+ opts
48
76
  end
49
77
  end
50
-
51
78
  end
52
-
data/lib/tilt/slim.rb ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
3
+ require 'slim'
4
+
5
+ Tilt::SlimTemplate = Slim::Template
data/lib/tilt/string.rb CHANGED
@@ -1,12 +1,14 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
 
3
4
  module Tilt
4
5
  # The template source is evaluated as a Ruby string. The #{} interpolation
5
6
  # syntax can be used to generated dynamic output.
6
7
  class StringTemplate < Template
7
8
  def prepare
8
- hash = "TILT#{data.hash.abs}"
9
- @code = String.new("<<#{hash}.chomp\n#{data}\n#{hash}")
9
+ hash = "TILT#{@data.hash.abs}"
10
+ @freeze_string_literals = !!@options[:freeze]
11
+ @code = String.new("<<#{hash}.chomp\n#{@data}\n#{hash}")
10
12
  end
11
13
 
12
14
  def precompiled_template(locals)
@@ -17,5 +19,9 @@ module Tilt
17
19
  source, offset = super
18
20
  [source, offset + 1]
19
21
  end
22
+
23
+ def freeze_string_literals?
24
+ @freeze_string_literals
25
+ end
20
26
  end
21
27
  end