temple 0.6.0 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Build Status](https://secure.travis-ci.org/judofyr/temple.png?branch=master)](http://travis-ci.org/judofyr/temple) [![Dependency Status](https://gemnasium.com/judofyr/temple.png?travis)](https://gemnasium.com/judofyr/temple) [![Code Climate](https://codeclimate.com/
|
4
|
+
[![Build Status](https://secure.travis-ci.org/judofyr/temple.png?branch=master)](http://travis-ci.org/judofyr/temple) [![Dependency Status](https://gemnasium.com/judofyr/temple.png?travis)](https://gemnasium.com/judofyr/temple) [![Code Climate](https://codeclimate.com/github/judofyr/temple.png)](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:
|