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/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,104 +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
31
- end
32
- end
33
-
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 self.engine_initialized?
39
- defined? ::Redcarpet::Render and defined? ::Redcarpet::Markdown
40
- end
41
-
42
- def generate_renderer
43
- renderer = options.delete(:renderer) || ::Redcarpet::Render::HTML
44
- return renderer unless options.delete(:smartypants)
45
- return renderer if renderer.is_a?(Class) && renderer <= ::Redcarpet::Render::SmartyPants
46
-
47
- if renderer == ::Redcarpet::Render::XHTML
48
- ::Redcarpet::Render::SmartyHTML.new(:xhtml => true)
49
- elsif renderer == ::Redcarpet::Render::HTML
50
- ::Redcarpet::Render::SmartyHTML
51
- elsif renderer.is_a? Class
52
- Class.new(renderer) { include ::Redcarpet::Render::SmartyPants }
53
- else
54
- renderer.extend ::Redcarpet::Render::SmartyPants
55
- end
56
- end
57
-
58
- def prepare
59
- # try to support the same aliases
60
- Redcarpet1Template::ALIAS.each do |opt, aka|
61
- next if options.key? opt or not options.key? aka
62
- options[opt] = options.delete(aka)
63
- end
64
-
65
- # only raise an exception if someone is trying to enable :escape_html
66
- options.delete(:escape_html) unless options[:escape_html]
67
-
68
- @engine = ::Redcarpet::Markdown.new(generate_renderer, options)
69
- @output = nil
70
- end
71
-
72
- def evaluate(scope, locals, &block)
73
- @output ||= @engine.render(data)
74
- end
75
-
76
- def allows_script?
77
- 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)
78
11
  end
79
12
  end
80
13
 
81
- # Upskirt Markdown implementation. See:
82
- # https://github.com/tanoku/redcarpet
83
- #
84
- # Supports both Redcarpet 1.x and 2.x
85
- class RedcarpetTemplate < Template
86
- Redcarpet1 = Redcarpet1Template
87
- Redcarpet2 = Redcarpet2Template
88
-
89
- def prepare
90
- klass = Redcarpet2.engine_initialized? ? Redcarpet2 : Redcarpet1
91
- @engine = klass.new(file, line, options) { data }
92
- end
14
+ # only raise an exception if someone is trying to enable :escape_html
15
+ @options.delete(:escape_html) unless @options[:escape_html]
93
16
 
94
- def evaluate(scope, locals, &block)
95
- @engine.evaluate(scope, locals, &block)
96
- end
97
-
98
- def allows_script?
99
- 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
100
27
  end
101
28
  end
102
29
 
30
+ Redcarpet::Markdown.new(renderer, @options).render(@data)
103
31
  end
104
-
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
-
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
3
+ require_relative 'pandoc'
4
+
5
+ rst = {:f => "rst"}.freeze
6
+
7
+ # Pandoc reStructuredText implementation. See: # http://pandoc.org/
8
+ Tilt::RstPandocTemplate = Tilt::StaticTemplate.subclass do
9
+ PandocRuby.new(@data, rst).to_html.strip
10
+ end
data/lib/tilt/sass.rb CHANGED
@@ -1,41 +1,78 @@
1
- require 'tilt/template'
2
- require 'sass'
1
+ # frozen_string_literal: true
2
+ require_relative 'template'
3
3
 
4
4
  module Tilt
5
- # Sass template implementation. See:
6
- # http://haml.hamptoncatlin.com/
5
+ # Sass template implementation for generating CSS. See: https://sass-lang.com/
7
6
  #
8
7
  # Sass templates do not support object scopes, locals, or yield.
9
- class SassTemplate < Template
8
+ class SassTemplate < StaticTemplate
10
9
  self.default_mime_type = 'text/css'
11
10
 
12
- def prepare
13
- @engine = ::Sass::Engine.new(data, sass_options)
14
- end
11
+ begin
12
+ require 'sass-embedded'
13
+ # :nocov:
14
+ require 'uri'
15
15
 
16
- def evaluate(scope, locals, &block)
17
- @output ||= @engine.render
18
- end
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
19
22
 
20
- def allows_script?
21
- false
22
- end
23
+ private
23
24
 
24
- private
25
- def sass_options
26
- options.merge(:filename => eval_file, :line => line, :syntax => :sass)
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
38
+ rescue LoadError => err
39
+ begin
40
+ require 'sassc'
41
+ Engine = ::SassC::Engine
42
+ rescue LoadError
43
+ begin
44
+ require 'sass'
45
+ Engine = ::Sass::Engine
46
+ rescue LoadError
47
+ raise err
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def _prepare_output
54
+ Engine.new(@data, sass_options).render
55
+ end
56
+
57
+ def sass_options
58
+ @options[:filename] = eval_file
59
+ @options[:line] = @line
60
+ @options[:syntax] = :sass
61
+ @options
62
+ end
63
+ # :nocov:
27
64
  end
28
65
  end
29
66
 
30
- # Sass's new .scss type template implementation.
31
67
  class ScssTemplate < SassTemplate
32
68
  self.default_mime_type = 'text/css'
33
69
 
34
- private
70
+ private
71
+
35
72
  def sass_options
36
- options.merge(:filename => eval_file, :line => line, :syntax => :scss)
73
+ opts = super
74
+ opts[:syntax] = :scss
75
+ opts
37
76
  end
38
77
  end
39
-
40
78
  end
41
-
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 = "<<#{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