temple 0.6.0 → 0.6.3
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.
- data/.travis.yml +1 -0
- data/CHANGES +12 -0
- data/EXPRESSIONS.md +4 -0
- data/Gemfile +1 -1
- data/README.md +1 -1
- data/lib/temple/generators.rb +1 -1
- data/lib/temple/grammar.rb +1 -0
- data/lib/temple/html/dispatcher.rb +4 -0
- data/lib/temple/html/fast.rb +29 -1
- data/lib/temple/html/pretty.rb +20 -13
- data/lib/temple/templates/rails.rb +1 -1
- data/lib/temple/version.rb +1 -1
- data/test/filters/test_escapable.rb +0 -6
- data/test/helper.rb +14 -2
- data/test/html/test_fast.rb +12 -0
- data/test/html/test_pretty.rb +16 -4
- data/test/test_utils.rb +3 -3
- metadata +2 -3
data/.travis.yml
CHANGED
data/CHANGES
CHANGED
data/EXPRESSIONS.md
CHANGED
@@ -238,6 +238,10 @@ List of html attributes [:html, :attr, identifier, sexp]
|
|
238
238
|
|
239
239
|
HTML attribute abstraction. Identifier can be a String or a Symbol.
|
240
240
|
|
241
|
+
### [:html, :js, code]
|
242
|
+
|
243
|
+
HTML javascript abstraction which wraps the js code in a HTML comment or CDATA depending on document format.
|
244
|
+
|
241
245
|
Formal grammar
|
242
246
|
--------------
|
243
247
|
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Temple
|
2
2
|
======
|
3
3
|
|
4
|
-
[](http://travis-ci.org/judofyr/temple) [](https://gemnasium.com/judofyr/temple) [](http://travis-ci.org/judofyr/temple) [](https://gemnasium.com/judofyr/temple) [](https://codeclimate.com/github/judofyr/temple)
|
5
5
|
|
6
6
|
Temple is an abstraction and a framework for compiling templates to pure Ruby.
|
7
7
|
It's all about making it easier to experiment, implement and optimize template
|
data/lib/temple/generators.rb
CHANGED
@@ -128,7 +128,7 @@ module Temple
|
|
128
128
|
|
129
129
|
# Implements a rails output buffer.
|
130
130
|
#
|
131
|
-
# @output_buffer =
|
131
|
+
# @output_buffer = ActiveSupport::SafeBuffer
|
132
132
|
# @output_buffer.safe_concat "static"
|
133
133
|
# @output_buffer.safe_concat dynamic.to_s
|
134
134
|
# @output_buffer
|
data/lib/temple/grammar.rb
CHANGED
@@ -30,6 +30,7 @@ module Temple
|
|
30
30
|
[:html, :doctype, String] |
|
31
31
|
[:html, :comment, Expression] |
|
32
32
|
[:html, :condcomment, String, Expression]|
|
33
|
+
[:html, :js, Expression] |
|
33
34
|
[:html, :tag, HTMLIdentifier, Expression, 'Expression?'] |
|
34
35
|
[:html, :attrs, 'HTMLAttr*'] |
|
35
36
|
HTMLAttr
|
@@ -18,6 +18,10 @@ module Temple
|
|
18
18
|
[:html, :condcomment, condition, compile(content)]
|
19
19
|
end
|
20
20
|
|
21
|
+
def on_html_js(content)
|
22
|
+
[:html, :js, compile(content)]
|
23
|
+
end
|
24
|
+
|
21
25
|
def on_html_tag(name, attrs, content = nil)
|
22
26
|
result = [:html, :tag, name, compile(attrs)]
|
23
27
|
content ? (result << compile(content)) : result
|
data/lib/temple/html/fast.rb
CHANGED
@@ -23,7 +23,8 @@ module Temple
|
|
23
23
|
|
24
24
|
define_options :format => :xhtml,
|
25
25
|
:attr_quote => '"',
|
26
|
-
:autoclose => %w[meta img link br hr input area param col base]
|
26
|
+
:autoclose => %w[meta img link br hr input area param col base],
|
27
|
+
:js_wrapper => nil
|
27
28
|
|
28
29
|
HTML = [:html, :html4, :html5]
|
29
30
|
|
@@ -32,6 +33,22 @@ module Temple
|
|
32
33
|
unless [:xhtml, *HTML].include?(options[:format])
|
33
34
|
raise ArgumentError, "Invalid format #{options[:format].inspect}"
|
34
35
|
end
|
36
|
+
wrapper = options[:js_wrapper]
|
37
|
+
wrapper = xhtml? ? :cdata : :comment if wrapper == :guess
|
38
|
+
@js_wrapper =
|
39
|
+
case wrapper
|
40
|
+
when :comment
|
41
|
+
[ "<!--\n", "\n//-->" ]
|
42
|
+
when :cdata
|
43
|
+
[ "\n//<![CDATA[\n", "\n//]]>\n" ]
|
44
|
+
when :both
|
45
|
+
[ "<!--\n//<![CDATA[\n", "\n//]]>\n//-->" ]
|
46
|
+
when nil
|
47
|
+
when Array
|
48
|
+
wrapper
|
49
|
+
else
|
50
|
+
raise ArgumentError, "Invalid JavaScript wrapper #{wrapper.inspect}"
|
51
|
+
end
|
35
52
|
end
|
36
53
|
|
37
54
|
def xhtml?
|
@@ -92,6 +109,17 @@ module Temple
|
|
92
109
|
compile(value),
|
93
110
|
[:static, options[:attr_quote]]]
|
94
111
|
end
|
112
|
+
|
113
|
+
def on_html_js(content)
|
114
|
+
if @js_wrapper
|
115
|
+
[:multi,
|
116
|
+
[:static, @js_wrapper.first],
|
117
|
+
compile(content),
|
118
|
+
[:static, @js_wrapper.last]]
|
119
|
+
else
|
120
|
+
compile(content)
|
121
|
+
end
|
122
|
+
end
|
95
123
|
end
|
96
124
|
end
|
97
125
|
end
|
data/lib/temple/html/pretty.rb
CHANGED
@@ -13,7 +13,7 @@ module Temple
|
|
13
13
|
|
14
14
|
def initialize(opts = {})
|
15
15
|
super
|
16
|
-
@last =
|
16
|
+
@last = nil
|
17
17
|
@indent = 0
|
18
18
|
@pretty = options[:pretty]
|
19
19
|
@pre_tags = Regexp.new(options[:pre_tags].map {|t| "<#{t}" }.join('|'))
|
@@ -25,24 +25,31 @@ module Temple
|
|
25
25
|
|
26
26
|
def on_static(content)
|
27
27
|
if @pretty
|
28
|
-
|
29
|
-
|
28
|
+
if @pre_tags !~ content
|
29
|
+
content = content.sub(/\A\s*\n?/, "\n") if options[:indent_tags].include?(@last)
|
30
|
+
content = content.gsub("\n", indent)
|
31
|
+
end
|
32
|
+
@last = :static
|
30
33
|
end
|
31
34
|
[:static, content]
|
32
35
|
end
|
33
36
|
|
34
37
|
def on_dynamic(code)
|
35
38
|
if @pretty
|
36
|
-
@last = :noindent
|
37
39
|
tmp = unique_name
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
indent_code = ''
|
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
|
43
50
|
[:multi,
|
44
51
|
[:code, "#{tmp} = (#{code}).to_s"],
|
45
|
-
[:code, "if #{@pre_tags_name} !~ #{tmp}; #{
|
52
|
+
[:code, "if #{@pre_tags_name} !~ #{tmp}; #{indent_code}end"],
|
46
53
|
[:dynamic, tmp]]
|
47
54
|
else
|
48
55
|
[:dynamic, code]
|
@@ -56,8 +63,8 @@ module Temple
|
|
56
63
|
|
57
64
|
def on_html_comment(content)
|
58
65
|
return super unless @pretty
|
59
|
-
result = [:multi, [:static, tag_indent(
|
60
|
-
@last =
|
66
|
+
result = [:multi, [:static, tag_indent('comment')], super]
|
67
|
+
@last = :comment
|
61
68
|
result
|
62
69
|
end
|
63
70
|
|
@@ -96,7 +103,7 @@ module Temple
|
|
96
103
|
|
97
104
|
# Return indentation before tag
|
98
105
|
def tag_indent(name)
|
99
|
-
result = @last
|
106
|
+
result = @last && (options[:indent_tags].include?(@last) || options[:indent_tags].include?(name)) ? indent : ''
|
100
107
|
@last = name
|
101
108
|
result
|
102
109
|
end
|
data/lib/temple/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,12 +1,24 @@
|
|
1
1
|
require 'bacon'
|
2
2
|
require 'temple'
|
3
3
|
|
4
|
+
class HtmlSafeString < String
|
5
|
+
def html_safe?
|
6
|
+
true
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
self
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
4
14
|
module TestHelper
|
5
|
-
def with_html_safe
|
6
|
-
String.send(:define_method, :html_safe?) {
|
15
|
+
def with_html_safe
|
16
|
+
String.send(:define_method, :html_safe?) { false }
|
17
|
+
String.send(:define_method, :html_safe) { HtmlSafeString.new(self) }
|
7
18
|
yield
|
8
19
|
ensure
|
9
20
|
String.send(:undef_method, :html_safe?) if String.method_defined?(:html_safe?)
|
21
|
+
String.send(:undef_method, :html_safe) if String.method_defined?(:html_safe)
|
10
22
|
end
|
11
23
|
|
12
24
|
def grammar_validate(grammar, exp, message)
|
data/test/html/test_fast.rb
CHANGED
@@ -20,6 +20,18 @@ describe Temple::HTML::Fast do
|
|
20
20
|
@html.call([:html, :comment, [:static, 'test']]).should.equal [:multi, [:static, "<!--"], [:static, "test"], [:static, "-->"]]
|
21
21
|
end
|
22
22
|
|
23
|
+
it 'should compile js wrapped in comments' do
|
24
|
+
Temple::HTML::Fast.new(:js_wrapper => nil).call([:html, :js, [:static, 'test']]).should.equal [:static, "test"]
|
25
|
+
Temple::HTML::Fast.new(:js_wrapper => :comment).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "<!--\n"], [:static, "test"], [:static, "\n//-->"]]
|
26
|
+
Temple::HTML::Fast.new(:js_wrapper => :cdata).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n"]]
|
27
|
+
Temple::HTML::Fast.new(:js_wrapper => :both).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "<!--\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n//-->"]]
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should guess default js comment' do
|
31
|
+
Temple::HTML::Fast.new(:js_wrapper => :guess, :format => :xhtml).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n"]]
|
32
|
+
Temple::HTML::Fast.new(:js_wrapper => :guess, :format => :html).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "<!--\n"], [:static, "test"], [:static, "\n//-->"]]
|
33
|
+
end
|
34
|
+
|
23
35
|
it 'should compile autoclosed html tag' do
|
24
36
|
@html.call([:html, :tag,
|
25
37
|
'img', [:attrs],
|
data/test/html/test_pretty.rb
CHANGED
@@ -19,16 +19,15 @@ describe Temple::HTML::Pretty do
|
|
19
19
|
[:multi],
|
20
20
|
[:static, ">"],
|
21
21
|
[:multi,
|
22
|
-
[:static, "text"],
|
22
|
+
[:static, "\n text"],
|
23
23
|
[:multi,
|
24
24
|
[:code, "_temple_html_pretty2 = (code).to_s"],
|
25
|
-
[:code,
|
25
|
+
[:code, "if _temple_html_pretty1 !~ _temple_html_pretty2; _temple_html_pretty2 = _temple_html_pretty2.gsub(\"\n\", \"\\n \"); end"],
|
26
26
|
[:dynamic, "_temple_html_pretty2"]]],
|
27
|
-
[:static, "</p>"]],
|
27
|
+
[:static, "\n </p>"]],
|
28
28
|
[:static, "\n</div>"]]]
|
29
29
|
end
|
30
30
|
|
31
|
-
|
32
31
|
it 'should not indent preformatted tags' do
|
33
32
|
@html.call([:html, :tag, 'pre', [:multi],
|
34
33
|
[:html, :tag, 'p', [:multi], [:static, 'text']]
|
@@ -46,4 +45,17 @@ describe Temple::HTML::Pretty do
|
|
46
45
|
[:static, "</p>"]],
|
47
46
|
[:static, "</pre>"]]]
|
48
47
|
end
|
48
|
+
|
49
|
+
it 'should not escape html_safe strings' do
|
50
|
+
with_html_safe do
|
51
|
+
@html.call(
|
52
|
+
[:dynamic, '"text<".html_safe']
|
53
|
+
).should.equal [:multi,
|
54
|
+
[:code, "_temple_html_pretty1 = /<code|<pre|<textarea/"],
|
55
|
+
[:multi,
|
56
|
+
[:code, "_temple_html_pretty2 = (\"text<\".html_safe).to_s"],
|
57
|
+
[:code, "if _temple_html_pretty1 !~ _temple_html_pretty2; _temple_html_pretty3 = _temple_html_pretty2.html_safe?; _temple_html_pretty2 = _temple_html_pretty2.gsub(\"\n\", \"\\n\"); _temple_html_pretty2 = _temple_html_pretty2.html_safe if _temple_html_pretty3; end"],
|
58
|
+
[:dynamic, "_temple_html_pretty2"]]]
|
59
|
+
end
|
60
|
+
end
|
49
61
|
end
|
data/test/test_utils.rb
CHANGED
@@ -26,14 +26,14 @@ describe Temple::Utils do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'should escape unsafe html strings' do
|
29
|
-
with_html_safe
|
29
|
+
with_html_safe do
|
30
30
|
Temple::Utils.escape_html_safe('<').should.equal '<'
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'should not escape safe html strings' do
|
35
|
-
with_html_safe
|
36
|
-
Temple::Utils.escape_html_safe('<').should.equal '<'
|
35
|
+
with_html_safe do
|
36
|
+
Temple::Utils.escape_html_safe('<'.html_safe).should.equal '<'
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: temple
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-04-04 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: tilt
|
@@ -182,4 +182,3 @@ test_files:
|
|
182
182
|
- test/test_grammar.rb
|
183
183
|
- test/test_hash.rb
|
184
184
|
- test/test_utils.rb
|
185
|
-
has_rdoc:
|