temple 0.6.10 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +0 -2
- data/CHANGES +15 -0
- data/README.md +6 -6
- data/Rakefile +1 -1
- data/lib/temple.rb +5 -4
- data/lib/temple/engine.rb +1 -1
- data/lib/temple/erb/engine.rb +2 -2
- data/lib/temple/filters/encoding.rb +1 -1
- data/lib/temple/filters/eraser.rb +1 -1
- data/lib/temple/filters/escapable.rb +2 -2
- data/lib/temple/filters/remove_bom.rb +2 -9
- data/lib/temple/filters/static_freezer.rb +11 -0
- data/lib/temple/filters/validator.rb +1 -1
- data/lib/temple/generator.rb +4 -4
- data/lib/temple/generators/rails_output_buffer.rb +3 -3
- data/lib/temple/html/attribute_merger.rb +1 -1
- data/lib/temple/html/attribute_remover.rb +1 -1
- data/lib/temple/html/attribute_sorter.rb +1 -1
- data/lib/temple/html/fast.rb +42 -42
- data/lib/temple/html/pretty.rb +30 -39
- data/lib/temple/map.rb +105 -0
- data/lib/temple/mixins/engine_dsl.rb +11 -9
- data/lib/temple/mixins/options.rb +26 -24
- data/lib/temple/mixins/template.rb +3 -3
- data/lib/temple/templates/rails.rb +14 -37
- data/lib/temple/templates/tilt.rb +4 -4
- data/lib/temple/utils.rb +23 -26
- data/lib/temple/version.rb +1 -1
- data/temple.gemspec +2 -0
- data/test/filters/test_eraser.rb +4 -4
- data/test/filters/test_escapable.rb +7 -5
- data/test/filters/test_static_freezer.rb +25 -0
- data/test/html/test_attribute_sorter.rb +1 -1
- data/test/html/test_fast.rb +6 -6
- data/test/html/test_pretty.rb +2 -8
- data/test/test_engine.rb +1 -1
- data/test/test_erb.rb +2 -2
- data/test/test_filter.rb +2 -2
- data/test/test_generator.rb +4 -4
- data/test/test_map.rb +39 -0
- metadata +7 -5
- data/lib/temple/hash.rb +0 -105
- data/test/test_hash.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02ca8f3e947dac83c75a1a000ee6704e648b5b2b
|
4
|
+
data.tar.gz: 61b7cc39adfe732535a96b6c3e7f9f8876233869
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2bdfd18f5484eb9af801a382d518d02a04bb7944171203ecafa358b81095c1ddbc17288ba1d2de0417159a56d90207584b5da8499e74dcce08924e1d53e885d
|
7
|
+
data.tar.gz: 29159d5eab3f95322e5a8b6058ae095df229667c0e9fcdb769070eb6874713e32ad0cacf326be483503b864c3e7e27d12aa0601c4ea48a4d9be7cb04ffe9512a
|
data/.travis.yml
CHANGED
data/CHANGES
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
0.7.1
|
2
|
+
|
3
|
+
* Rename *Hash to *Map
|
4
|
+
* Add Filters::StaticFreezer
|
5
|
+
|
6
|
+
0.7.0
|
7
|
+
|
8
|
+
* Drop Ruby 1.8.7 support
|
9
|
+
* EngineDSL: Remove option filter
|
10
|
+
* HTML: Deprecate :html4, :html5 formats
|
11
|
+
* HTML: Add format :xml
|
12
|
+
* Rename DefaultOptions to ClassOptions
|
13
|
+
* Deprecate default_options in favor of options
|
14
|
+
* Add Utils.indent_dynamic
|
15
|
+
|
1
16
|
0.6.10
|
2
17
|
|
3
18
|
* Tilt template: Support :outvar and save/restore buffer to make the behaviour compatible with ERB
|
data/README.md
CHANGED
@@ -195,8 +195,8 @@ When you have a chain of a parsers, some filters and a generator you can finally
|
|
195
195
|
|
196
196
|
```ruby
|
197
197
|
class MyEngine < Temple::Engine
|
198
|
-
# First run MyParser
|
199
|
-
use MyParser
|
198
|
+
# First run MyParser
|
199
|
+
use MyParser
|
200
200
|
|
201
201
|
# Then a custom filter
|
202
202
|
use MyFilter
|
@@ -207,10 +207,10 @@ When you have a chain of a parsers, some filters and a generator you can finally
|
|
207
207
|
filter :DynamicInliner
|
208
208
|
|
209
209
|
# Finally the generator
|
210
|
-
generator :ArrayBuffer
|
210
|
+
generator :ArrayBuffer
|
211
211
|
end
|
212
212
|
|
213
|
-
engine = MyEngine.new(:
|
213
|
+
engine = MyEngine.new(strict: "For MyParser")
|
214
214
|
engine.call(something)
|
215
215
|
```
|
216
216
|
|
@@ -227,7 +227,7 @@ Rails.
|
|
227
227
|
require 'tilt'
|
228
228
|
|
229
229
|
# Create template class MyTemplate and register your file extension
|
230
|
-
MyTemplate = Temple::Templates::Tilt(MyEngine, :
|
230
|
+
MyTemplate = Temple::Templates::Tilt(MyEngine, register_as: 'ext')
|
231
231
|
|
232
232
|
Tilt.new('example.ext').render # => Render a file
|
233
233
|
MyTemplate.new { "String" }.render # => Render a string
|
@@ -236,7 +236,7 @@ Rails.
|
|
236
236
|
Installation
|
237
237
|
------------
|
238
238
|
|
239
|
-
You need
|
239
|
+
You need at least Ruby 1.9.3 to work with Temple. Temple is published as a Ruby Gem which can be installed
|
240
240
|
as following:
|
241
241
|
|
242
242
|
```bash
|
data/Rakefile
CHANGED
data/lib/temple.rb
CHANGED
@@ -10,9 +10,9 @@ module Temple
|
|
10
10
|
autoload :Filter, 'temple/filter'
|
11
11
|
autoload :Templates, 'temple/templates'
|
12
12
|
autoload :Grammar, 'temple/grammar'
|
13
|
-
autoload :
|
14
|
-
autoload :
|
15
|
-
autoload :
|
13
|
+
autoload :ImmutableMap, 'temple/map'
|
14
|
+
autoload :MutableMap, 'temple/map'
|
15
|
+
autoload :OptionMap, 'temple/map'
|
16
16
|
|
17
17
|
module Mixins
|
18
18
|
autoload :Dispatcher, 'temple/mixins/dispatcher'
|
@@ -20,7 +20,7 @@ module Temple
|
|
20
20
|
autoload :EngineDSL, 'temple/mixins/engine_dsl'
|
21
21
|
autoload :GrammarDSL, 'temple/mixins/grammar_dsl'
|
22
22
|
autoload :Options, 'temple/mixins/options'
|
23
|
-
autoload :
|
23
|
+
autoload :ClassOptions, 'temple/mixins/options'
|
24
24
|
autoload :Template, 'temple/mixins/template'
|
25
25
|
end
|
26
26
|
|
@@ -44,6 +44,7 @@ module Temple
|
|
44
44
|
autoload :ControlFlow, 'temple/filters/control_flow'
|
45
45
|
autoload :MultiFlattener, 'temple/filters/multi_flattener'
|
46
46
|
autoload :StaticMerger, 'temple/filters/static_merger'
|
47
|
+
autoload :StaticFreezer, 'temple/filters/static_freezer'
|
47
48
|
autoload :DynamicInliner, 'temple/filters/dynamic_inliner'
|
48
49
|
autoload :Escapable, 'temple/filters/escapable'
|
49
50
|
autoload :Eraser, 'temple/filters/eraser'
|
data/lib/temple/engine.rb
CHANGED
data/lib/temple/erb/engine.rb
CHANGED
@@ -5,8 +5,8 @@ module Temple
|
|
5
5
|
# @api public
|
6
6
|
class Engine < Temple::Engine
|
7
7
|
use Temple::ERB::Parser
|
8
|
-
use Temple::ERB::Trimming
|
9
|
-
filter :Escapable
|
8
|
+
use Temple::ERB::Trimming
|
9
|
+
filter :Escapable
|
10
10
|
filter :MultiFlattener
|
11
11
|
filter :DynamicInliner
|
12
12
|
generator :ArrayBuffer
|
@@ -9,8 +9,8 @@ module Temple
|
|
9
9
|
class Escapable < Filter
|
10
10
|
# Activate the usage of html_safe? if it is available (for Rails 3 for example)
|
11
11
|
define_options :escape_code,
|
12
|
-
:
|
13
|
-
:
|
12
|
+
:disable_escape,
|
13
|
+
use_html_safe: ''.respond_to?(:html_safe?)
|
14
14
|
|
15
15
|
def initialize(opts = {})
|
16
16
|
super
|
@@ -5,15 +5,8 @@ module Temple
|
|
5
5
|
# @api public
|
6
6
|
class RemoveBOM < Parser
|
7
7
|
def call(s)
|
8
|
-
if s.
|
9
|
-
|
10
|
-
s.gsub(Regexp.new("\\A\uFEFF".encode(s.encoding.name)), '')
|
11
|
-
else
|
12
|
-
s
|
13
|
-
end
|
14
|
-
else
|
15
|
-
s.gsub(/\A\xEF\xBB\xBF/, '')
|
16
|
-
end
|
8
|
+
return s if s.encoding.name !~ /^UTF-(8|16|32)(BE|LE)?/
|
9
|
+
s.gsub(Regexp.new("\\A\uFEFF".encode(s.encoding.name)), '')
|
17
10
|
end
|
18
11
|
end
|
19
12
|
end
|
data/lib/temple/generator.rb
CHANGED
@@ -9,9 +9,9 @@ module Temple
|
|
9
9
|
include Mixins::CompiledDispatcher
|
10
10
|
include Mixins::Options
|
11
11
|
|
12
|
-
define_options :
|
13
|
-
:
|
14
|
-
:
|
12
|
+
define_options :save_buffer,
|
13
|
+
capture_generator: 'StringBuffer',
|
14
|
+
buffer: '_buf'
|
15
15
|
|
16
16
|
def call(exp)
|
17
17
|
[preamble, compile(exp), postamble].flatten.compact.join('; ')
|
@@ -53,7 +53,7 @@ module Temple
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def on_capture(name, exp)
|
56
|
-
capture_generator.new(:
|
56
|
+
capture_generator.new(buffer: name).call(exp)
|
57
57
|
end
|
58
58
|
|
59
59
|
def on_static(text)
|
@@ -10,10 +10,10 @@ module Temple
|
|
10
10
|
# @api public
|
11
11
|
class RailsOutputBuffer < StringBuffer
|
12
12
|
define_options :streaming,
|
13
|
-
:
|
14
|
-
:
|
13
|
+
buffer_class: 'ActiveSupport::SafeBuffer',
|
14
|
+
buffer: '@output_buffer',
|
15
15
|
# output_buffer is needed for Rails 3.1 Streaming support
|
16
|
-
:
|
16
|
+
capture_generator: RailsOutputBuffer
|
17
17
|
|
18
18
|
def call(exp)
|
19
19
|
[preamble, compile(exp), postamble].flatten.compact.join('; ')
|
@@ -3,7 +3,7 @@ module Temple
|
|
3
3
|
# This filter merges html attributes (e.g. used for id and class)
|
4
4
|
# @api public
|
5
5
|
class AttributeMerger < Filter
|
6
|
-
define_options :
|
6
|
+
define_options merge_attrs: {'id' => '_', 'class' => ' '}
|
7
7
|
|
8
8
|
def on_html_attrs(*attrs)
|
9
9
|
names = []
|
data/lib/temple/html/fast.rb
CHANGED
@@ -2,40 +2,50 @@ module Temple
|
|
2
2
|
module HTML
|
3
3
|
# @api public
|
4
4
|
class Fast < Filter
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
5
|
+
DOCTYPES = {
|
6
|
+
xml: {
|
7
|
+
'1.1' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
|
8
|
+
'5' => '<!DOCTYPE html>',
|
9
|
+
'html' => '<!DOCTYPE html>',
|
10
|
+
'strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
|
11
|
+
'frameset' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
|
12
|
+
'mobile' => '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">',
|
13
|
+
'basic' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">',
|
14
|
+
'transitional' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
|
15
|
+
'svg' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'
|
16
|
+
},
|
17
|
+
html: {
|
18
|
+
'5' => '<!DOCTYPE html>',
|
19
|
+
'html' => '<!DOCTYPE html>',
|
20
|
+
'strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
|
21
|
+
'frameset' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">',
|
22
|
+
'transitional' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'
|
23
|
+
}
|
24
|
+
}
|
25
|
+
DOCTYPES[:xhtml] = DOCTYPES[:xml]
|
26
|
+
DOCTYPES.freeze
|
16
27
|
|
17
|
-
|
18
|
-
|
19
|
-
'html' => '<!DOCTYPE html>',
|
20
|
-
'strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
|
21
|
-
'frameset' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">',
|
22
|
-
'transitional' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
|
23
|
-
}.freeze
|
28
|
+
# See http://www.w3.org/html/wg/drafts/html/master/single-page.html#void-elements
|
29
|
+
HTML_VOID_ELEMENTS = %w[area base br col embed hr img input keygen link menuitem meta param source track wbr]
|
24
30
|
|
25
|
-
define_options :
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
|
30
|
-
HTML = [:html, :html4, :html5]
|
31
|
+
define_options format: :xhtml,
|
32
|
+
attr_quote: '"',
|
33
|
+
autoclose: HTML_VOID_ELEMENTS,
|
34
|
+
js_wrapper: nil
|
31
35
|
|
32
36
|
def initialize(opts = {})
|
33
37
|
super
|
34
|
-
|
35
|
-
|
38
|
+
@format = options[:format]
|
39
|
+
unless [:xhtml, :html, :xml].include?(@format)
|
40
|
+
if @format == :html4 || @format == :html5
|
41
|
+
@format = :html
|
42
|
+
warn "Format #{@format.inspect} is deprecated, use :html"
|
43
|
+
else
|
44
|
+
raise ArgumentError, "Invalid format #{@format.inspect}"
|
45
|
+
end
|
36
46
|
end
|
37
47
|
wrapper = options[:js_wrapper]
|
38
|
-
wrapper = xhtml
|
48
|
+
wrapper = @format == :xml || @format == :xhtml ? :cdata : :comment if wrapper == :guess
|
39
49
|
@js_wrapper =
|
40
50
|
case wrapper
|
41
51
|
when :comment
|
@@ -52,25 +62,15 @@ module Temple
|
|
52
62
|
end
|
53
63
|
end
|
54
64
|
|
55
|
-
def xhtml?
|
56
|
-
options[:format] == :xhtml
|
57
|
-
end
|
58
|
-
|
59
|
-
def html?
|
60
|
-
!xhtml?
|
61
|
-
end
|
62
|
-
|
63
65
|
def on_html_doctype(type)
|
64
66
|
type = type.to_s.downcase
|
65
67
|
|
66
68
|
if type =~ /^xml(\s+(.+))?$/
|
67
|
-
raise(FilterError, 'Invalid xml directive in html mode') if html
|
69
|
+
raise(FilterError, 'Invalid xml directive in html mode') if @format == :html
|
68
70
|
w = options[:attr_quote]
|
69
71
|
str = "<?xml version=#{w}1.0#{w} encoding=#{w}#{$2 || 'utf-8'}#{w} ?>"
|
70
|
-
elsif html?
|
71
|
-
str = HTML_DOCTYPES[type] || raise(FilterError, "Invalid html doctype #{type}")
|
72
72
|
else
|
73
|
-
str =
|
73
|
+
str = DOCTYPES[@format][type] || raise(FilterError, "Invalid doctype #{type}")
|
74
74
|
end
|
75
75
|
|
76
76
|
[:static, str]
|
@@ -92,9 +92,9 @@ module Temple
|
|
92
92
|
|
93
93
|
def on_html_tag(name, attrs, content = nil)
|
94
94
|
name = name.to_s
|
95
|
-
closed = !content || (empty_exp?(content) && options[:autoclose].include?(name))
|
95
|
+
closed = !content || (empty_exp?(content) && (@format == :xml || options[:autoclose].include?(name)))
|
96
96
|
result = [:multi, [:static, "<#{name}"], compile(attrs)]
|
97
|
-
result << [:static, (closed &&
|
97
|
+
result << [:static, (closed && @format != :html ? ' /' : '') + '>']
|
98
98
|
result << compile(content) if content
|
99
99
|
result << [:static, "</#{name}>"] if !closed
|
100
100
|
result
|
@@ -105,7 +105,7 @@ module Temple
|
|
105
105
|
end
|
106
106
|
|
107
107
|
def on_html_attr(name, value)
|
108
|
-
if html
|
108
|
+
if @format == :html && empty_exp?(value)
|
109
109
|
[:static, " #{name}"]
|
110
110
|
else
|
111
111
|
[:multi,
|
data/lib/temple/html/pretty.rb
CHANGED
@@ -2,21 +2,21 @@ module Temple
|
|
2
2
|
module HTML
|
3
3
|
# @api public
|
4
4
|
class Pretty < Fast
|
5
|
-
define_options :
|
6
|
-
:
|
7
|
-
:
|
5
|
+
define_options indent: ' ',
|
6
|
+
pretty: true,
|
7
|
+
indent_tags: %w(article aside audio base body datalist dd div dl dt
|
8
8
|
fieldset figure footer form head h1 h2 h3 h4 h5 h6
|
9
9
|
header hgroup hr html li link meta nav ol option p
|
10
10
|
rp rt ruby section script style table tbody td tfoot
|
11
11
|
th thead tr ul video doctype).freeze,
|
12
|
-
:
|
12
|
+
pre_tags: %w(code pre textarea).freeze
|
13
13
|
|
14
14
|
def initialize(opts = {})
|
15
15
|
super
|
16
|
-
@
|
16
|
+
@indent_next = nil
|
17
17
|
@indent = 0
|
18
18
|
@pretty = options[:pretty]
|
19
|
-
@pre_tags = Regexp.
|
19
|
+
@pre_tags = @format != :xml && Regexp.union(options[:pre_tags].map {|t| "<#{t}" })
|
20
20
|
end
|
21
21
|
|
22
22
|
def call(exp)
|
@@ -24,36 +24,19 @@ module Temple
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def on_static(content)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
@last = :static
|
27
|
+
return [:static, content] unless @pretty
|
28
|
+
unless @pre_tags && @pre_tags =~ content
|
29
|
+
content = content.sub(/\A\s*\n?/, "\n") if @indent_next
|
30
|
+
content = content.gsub("\n", indent)
|
33
31
|
end
|
32
|
+
@indent_next = false
|
34
33
|
[:static, content]
|
35
34
|
end
|
36
35
|
|
37
36
|
def on_dynamic(code)
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
indent_code << "#{tmp} = #{tmp}.sub(/\\A\\s*\\n?/, \"\\n\"); " if options[:indent_tags].include?(@last)
|
42
|
-
indent_code << "#{tmp} = #{tmp}.gsub(\"\\n\", #{indent.inspect}); "
|
43
|
-
if ''.respond_to?(:html_safe)
|
44
|
-
safe = unique_name
|
45
|
-
# we have to first save if the string was html_safe
|
46
|
-
# otherwise the gsub operation will lose that knowledge
|
47
|
-
indent_code = "#{safe} = #{tmp}.html_safe?; #{indent_code}#{tmp} = #{tmp}.html_safe if #{safe}; "
|
48
|
-
end
|
49
|
-
@last = :dynamic
|
50
|
-
[:multi,
|
51
|
-
[:code, "#{tmp} = (#{code}).to_s"],
|
52
|
-
[:code, "if #{@pre_tags_name} !~ #{tmp}; #{indent_code}end"],
|
53
|
-
[:dynamic, tmp]]
|
54
|
-
else
|
55
|
-
[:dynamic, code]
|
56
|
-
end
|
37
|
+
return [:dynamic, code] unless @pretty
|
38
|
+
indent_next, @indent_next = @indent_next, false
|
39
|
+
[:dynamic, "::Temple::Utils.indent_dynamic((#{code}), #{indent_next.inspect}, #{indent.inspect}#{@pre_tags ? ', ' + @pre_tags_name : ''})"]
|
57
40
|
end
|
58
41
|
|
59
42
|
def on_html_doctype(type)
|
@@ -64,7 +47,7 @@ module Temple
|
|
64
47
|
def on_html_comment(content)
|
65
48
|
return super unless @pretty
|
66
49
|
result = [:multi, [:static, tag_indent('comment')], super]
|
67
|
-
@
|
50
|
+
@indent_next = false
|
68
51
|
result
|
69
52
|
end
|
70
53
|
|
@@ -76,16 +59,18 @@ module Temple
|
|
76
59
|
|
77
60
|
@pretty = false
|
78
61
|
result = [:multi, [:static, "#{tag_indent(name)}<#{name}"], compile(attrs)]
|
79
|
-
result << [:static, (closed &&
|
62
|
+
result << [:static, (closed && @format != :html ? ' /' : '') + '>']
|
80
63
|
|
81
|
-
@pretty = !options[:pre_tags].include?(name)
|
64
|
+
@pretty = !@pre_tags || !options[:pre_tags].include?(name)
|
82
65
|
if content
|
83
66
|
@indent += 1
|
84
67
|
result << compile(content)
|
85
68
|
@indent -= 1
|
86
69
|
end
|
87
|
-
|
88
|
-
|
70
|
+
unless closed
|
71
|
+
indent = tag_indent(name)
|
72
|
+
result << [:static, "#{content && !empty_exp?(content) ? indent : ''}</#{name}>"]
|
73
|
+
end
|
89
74
|
@pretty = true
|
90
75
|
result
|
91
76
|
end
|
@@ -93,6 +78,7 @@ module Temple
|
|
93
78
|
protected
|
94
79
|
|
95
80
|
def preamble
|
81
|
+
return [:multi] unless @pre_tags
|
96
82
|
@pre_tags_name = unique_name
|
97
83
|
[:code, "#{@pre_tags_name} = /#{@pre_tags.source}/"]
|
98
84
|
end
|
@@ -103,9 +89,14 @@ module Temple
|
|
103
89
|
|
104
90
|
# Return indentation before tag
|
105
91
|
def tag_indent(name)
|
106
|
-
|
107
|
-
|
108
|
-
|
92
|
+
if @format == :xml
|
93
|
+
flag = @indent_next != nil
|
94
|
+
@indent_next = true
|
95
|
+
else
|
96
|
+
flag = @indent_next != nil && (@indent_next || options[:indent_tags].include?(name))
|
97
|
+
@indent_next = options[:indent_tags].include?(name)
|
98
|
+
end
|
99
|
+
flag ? indent : ''
|
109
100
|
end
|
110
101
|
end
|
111
102
|
end
|