tilt 2.1.0 → 2.3.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 (49) hide show
  1. checksums.yaml +4 -4
  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 +47 -81
  14. data/lib/tilt/creole.rb +9 -20
  15. data/lib/tilt/csv.rb +5 -4
  16. data/lib/tilt/erb.rb +9 -17
  17. data/lib/tilt/erubi.rb +7 -6
  18. data/lib/tilt/erubis.rb +9 -6
  19. data/lib/tilt/etanni.rb +3 -2
  20. data/lib/tilt/haml.rb +12 -9
  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 +180 -104
  25. data/lib/tilt/markaby.rb +5 -7
  26. data/lib/tilt/maruku.rb +5 -19
  27. data/lib/tilt/nokogiri.rb +11 -10
  28. data/lib/tilt/pandoc.rb +33 -51
  29. data/lib/tilt/pipeline.rb +1 -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 -75
  36. data/lib/tilt/redcloth.rb +9 -19
  37. data/lib/tilt/rst-pandoc.rb +6 -19
  38. data/lib/tilt/sass.rb +34 -43
  39. data/lib/tilt/slim.rb +5 -0
  40. data/lib/tilt/string.rb +9 -3
  41. data/lib/tilt/template.rb +151 -61
  42. data/lib/tilt/typescript.rb +11 -18
  43. data/lib/tilt/wikicloth.rb +7 -19
  44. data/lib/tilt/yajl.rb +5 -11
  45. data/lib/tilt.rb +56 -40
  46. metadata +10 -7
  47. data/lib/tilt/bluecloth.rb +0 -26
  48. data/lib/tilt/less.rb +0 -32
  49. data/lib/tilt/sigil.rb +0 -36
data/lib/tilt/maruku.rb CHANGED
@@ -1,22 +1,8 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require 'maruku'
3
4
 
4
- module Tilt
5
- # Maruku markdown implementation. See:
6
- # http://maruku.rubyforge.org/
7
- class MarukuTemplate < Template
8
- def prepare
9
- @engine = Maruku.new(data, options)
10
- @output = nil
11
- end
12
-
13
- def evaluate(scope, locals, &block)
14
- @output ||= @engine.to_html
15
- end
16
-
17
- def allows_script?
18
- false
19
- end
20
- end
5
+ # Maruku markdown implementation. See: https://github.com/bhollis/maruku
6
+ Tilt::MarukuTemplate = Tilt::StaticTemplate.subclass do
7
+ Maruku.new(@data, @options).to_html
21
8
  end
22
-
data/lib/tilt/nokogiri.rb CHANGED
@@ -1,21 +1,23 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require 'nokogiri'
3
4
 
4
5
  module Tilt
5
6
  # Nokogiri template implementation. See:
6
7
  # http://nokogiri.org/
7
8
  class NokogiriTemplate < Template
8
- DOCUMENT_HEADER = /^<\?xml version=\"1\.0\"\?>\n?/
9
+ DOCUMENT_HEADER = /\A<\?xml version=\"1\.0\"\?>\n?/
9
10
  self.default_mime_type = 'text/xml'
10
11
 
11
- def prepare; end
12
-
13
12
  def evaluate(scope, locals)
14
- if data.respond_to?(:to_str)
15
- wrapper = proc { yield.sub(DOCUMENT_HEADER, "") } if block_given?
16
- super(scope, locals, &wrapper)
13
+ if @data.respond_to?(:to_str)
14
+ if block_given?
15
+ super(scope, locals){yield.sub(DOCUMENT_HEADER, "")}
16
+ else
17
+ super
18
+ end
17
19
  else
18
- ::Nokogiri::XML::Builder.new.tap(&data).to_xml
20
+ ::Nokogiri::XML::Builder.new(&@data).to_xml
19
21
  end
20
22
  end
21
23
 
@@ -29,8 +31,7 @@ module Tilt
29
31
  end
30
32
 
31
33
  def precompiled_template(locals)
32
- data.to_str
34
+ @data.to_str
33
35
  end
34
36
  end
35
37
  end
36
-
data/lib/tilt/pandoc.rb CHANGED
@@ -1,57 +1,39 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require 'pandoc-ruby'
3
4
 
4
- module Tilt
5
- # Pandoc markdown implementation. See:
6
- # http://pandoc.org/
7
- class PandocTemplate < Template
8
- self.default_mime_type = 'text/html'
9
-
10
- # turn options hash into an array
11
- # Map tilt options to pandoc options
12
- # Replace hash keys with value true with symbol for key
13
- # Remove hash keys with value false
14
- # Leave other hash keys untouched
15
- def pandoc_options
16
- result = []
17
- from = "markdown"
18
- smart_extension = "-smart"
19
- options.each do |k,v|
20
- case k
21
- when :smartypants
22
- smart_extension = "+smart" if v
23
- when :escape_html
24
- from = "markdown-raw_html" if v
25
- when :commonmark
26
- from = "commonmark" if v
27
- when :markdown_strict
28
- from = "markdown_strict" if v
29
- else
30
- case v
31
- when true
32
- result << k
33
- when false
34
- # do nothing
35
- else
36
- result << { k => v }
37
- end
38
- end
5
+ # Pandoc markdown implementation. See: http://pandoc.org/
6
+ Tilt::PandocTemplate = Tilt::StaticTemplate.subclass do
7
+ # turn options hash into an array
8
+ # Map tilt options to pandoc options
9
+ # Replace hash keys with value true with symbol for key
10
+ # Remove hash keys with value false
11
+ # Leave other hash keys untouched
12
+ pandoc_options = []
13
+ from = "markdown"
14
+ smart_extension = "-smart"
15
+ @options.each do |k,v|
16
+ case k
17
+ when :smartypants
18
+ smart_extension = "+smart" if v
19
+ when :escape_html
20
+ from = "markdown-raw_html" if v
21
+ when :commonmark
22
+ from = "commonmark" if v
23
+ when :markdown_strict
24
+ from = "markdown_strict" if v
25
+ else
26
+ case v
27
+ when true
28
+ pandoc_options << k
29
+ when false
30
+ # do nothing
31
+ else
32
+ pandoc_options << { k => v }
39
33
  end
40
- result << { :f => from + smart_extension }
41
- result
42
- end
43
-
44
- def prepare
45
- @engine = PandocRuby.new(data, *pandoc_options)
46
- @output = nil
47
- end
48
-
49
- def evaluate(scope, locals, &block)
50
- @output ||= @engine.to_html.strip
51
- end
52
-
53
- def allows_script?
54
- false
55
34
  end
56
35
  end
36
+ pandoc_options << { :f => from + smart_extension }
37
+
38
+ PandocRuby.new(@data, *pandoc_options).to_html.strip
57
39
  end
data/lib/tilt/pipeline.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'template'
2
3
 
3
4
  module Tilt
data/lib/tilt/plain.rb CHANGED
@@ -1,16 +1,5 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
 
3
-
4
- module Tilt
5
- # Raw text (no template functionality).
6
- class PlainTemplate < Template
7
- self.default_mime_type = 'text/html'
8
-
9
- def prepare
10
- end
11
-
12
- def evaluate(scope, locals, &block)
13
- @output ||= data
14
- end
15
- end
16
- end
4
+ # Raw text (no template functionality).
5
+ Tilt::PlainTemplate = Tilt::StaticTemplate.subclass{@data}
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,86 +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'
37
-
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
14
+ # only raise an exception if someone is trying to enable :escape_html
15
+ @options.delete(:escape_html) unless @options[:escape_html]
42
16
 
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
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
52
27
  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
74
- end
75
- end
76
-
77
- if defined? ::Redcarpet::Render and defined? ::Redcarpet::Markdown
78
- superclass = Redcarpet2Template
79
- else
80
- superclass = Redcarpet1Template
81
28
  end
82
29
 
83
- class RedcarpetTemplate < superclass
84
- end
30
+ Redcarpet::Markdown.new(renderer, @options).render(@data)
85
31
  end
86
-
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,23 +1,10 @@
1
- require 'tilt/template'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
2
3
  require_relative 'pandoc'
3
4
 
4
- module Tilt
5
- # Pandoc reStructuredText implementation. See:
6
- # http://pandoc.org/
7
- class RstPandocTemplate < PandocTemplate
8
- self.default_mime_type = 'text/html'
5
+ rst = {:f => "rst"}.freeze
9
6
 
10
- def prepare
11
- @engine = PandocRuby.new(data, :f => "rst")
12
- @output = nil
13
- end
14
-
15
- def evaluate(scope, locals, &block)
16
- @output ||= @engine.to_html.strip
17
- end
18
-
19
- def allows_script?
20
- false
21
- end
22
- end
7
+ # Pandoc reStructuredText implementation. See: # http://pandoc.org/
8
+ Tilt::RstPandocTemplate = Tilt::StaticTemplate.subclass do
9
+ PandocRuby.new(@data, rst).to_html.strip
23
10
  end