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/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