hamlit 1.6.1 → 1.6.2
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.
- checksums.yaml +4 -4
- data/.travis.yml +8 -0
- data/CHANGELOG.md +7 -0
- data/benchmarks/benchmark.rb +52 -20
- data/benchmarks/view.escaped.slim +17 -0
- data/doc/engine/indent.md +2 -7
- data/doc/faml/engine/indent.md +2 -7
- data/lib/hamlit/concerns/indentable.rb +9 -40
- data/lib/hamlit/parsers/tag.rb +3 -0
- data/lib/hamlit/version.rb +1 -1
- data/spec/hamlit/engine/error_spec.rb +15 -0
- data/spec/hamlit/engine/indent_spec.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f85fe19ae942cdfef4ed10ea87a021b5603d915
|
4
|
+
data.tar.gz: cec640d9203032acf294e118fa737724d89c0952
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c668671bcbea79462a605a52b934fa1ec86c81f2ba665abcdc5a1f1667a8b18548896f0069646a8318713d708a2cd241aa10dc28db0b03e4aa167110d679672a
|
7
|
+
data.tar.gz: 5879b98703b9a549bee394304a1d34c3686c72a84bc7bb0b4d8da135e0674d3077e753009770da9a72d033ee3417970ef150200d1b362807b4c999c79025c628
|
data/.travis.yml
CHANGED
@@ -14,9 +14,11 @@ env:
|
|
14
14
|
- TASK=spec
|
15
15
|
- TASK=rails:spec
|
16
16
|
- TASK=bench TIME=20
|
17
|
+
- TASK=bench TIME=20 HTML_ESCAPE=1
|
17
18
|
matrix:
|
18
19
|
allow_failures:
|
19
20
|
- env: TASK=bench TIME=20
|
21
|
+
- env: TASK=bench TIME=20 HTML_ESCAPE=1
|
20
22
|
exclude:
|
21
23
|
- env: TASK=spec
|
22
24
|
gemfile: spec/rails/Gemfile
|
@@ -24,11 +26,17 @@ matrix:
|
|
24
26
|
gemfile: Gemfile
|
25
27
|
- env: TASK=bench TIME=20
|
26
28
|
gemfile: spec/rails/Gemfile
|
29
|
+
- env: TASK=bench TIME=20 HTML_ESCAPE=1
|
30
|
+
gemfile: spec/rails/Gemfile
|
27
31
|
- rvm: 2.1
|
28
32
|
env: TASK=rails:spec
|
29
33
|
- rvm: 2.1
|
30
34
|
env: TASK=bench TIME=20
|
35
|
+
- rvm: 2.1
|
36
|
+
env: TASK=bench TIME=20 HTML_ESCAPE=1
|
31
37
|
- rvm: 2.0.0
|
32
38
|
env: TASK=rails:spec
|
33
39
|
- rvm: 2.0.0
|
34
40
|
env: TASK=bench TIME=20
|
41
|
+
- rvm: 2.0.0
|
42
|
+
env: TASK=bench TIME=20 HTML_ESCAPE=1
|
data/CHANGELOG.md
CHANGED
data/benchmarks/benchmark.rb
CHANGED
@@ -16,15 +16,38 @@ class Benchmarks
|
|
16
16
|
@time = time
|
17
17
|
@benches = []
|
18
18
|
@versions = {}
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
def init_compiled_benches(escape_enabled)
|
22
|
+
if escape_enabled
|
23
|
+
@erb_code = File.read(File.dirname(__FILE__) + '/view.erb')
|
24
|
+
@haml_code = File.read(File.dirname(__FILE__) + '/view.haml')
|
25
|
+
@slim_code = File.read(File.dirname(__FILE__) + '/view.escaped.slim')
|
26
|
+
init_escaped_benches
|
27
|
+
else
|
28
|
+
@erb_code = File.read(File.dirname(__FILE__) + '/view.erb')
|
29
|
+
@haml_code = File.read(File.dirname(__FILE__) + '/view.haml')
|
30
|
+
@slim_code = File.read(File.dirname(__FILE__) + '/view.slim')
|
31
|
+
init_plain_benches
|
32
|
+
end
|
33
|
+
end
|
23
34
|
|
24
|
-
|
35
|
+
def run
|
36
|
+
show_versions
|
37
|
+
result = Benchmark.ips do |x|
|
38
|
+
x.config(time: @time, warmup: 2)
|
39
|
+
@benches.each do |name, block|
|
40
|
+
x.report(name, &block)
|
41
|
+
end
|
42
|
+
x.compare!
|
43
|
+
end
|
25
44
|
end
|
26
45
|
|
27
|
-
|
46
|
+
private
|
47
|
+
|
48
|
+
# Totally the same as slim-template/slim's compiled bench.
|
49
|
+
def init_plain_benches
|
50
|
+
puts 'Compiled rendering benchmarks without HTML escape'
|
28
51
|
context = Context.new
|
29
52
|
|
30
53
|
haml_ugly = Haml::Engine.new(@haml_code, format: :html5, ugly: true)
|
@@ -32,29 +55,36 @@ class Benchmarks
|
|
32
55
|
context.instance_eval %{
|
33
56
|
def run_erubis; #{Erubis::Eruby.new(@erb_code).src}; end
|
34
57
|
def run_slim_ugly; #{Slim::Engine.new.call @slim_code}; end
|
35
|
-
def
|
36
|
-
def run_hamlit; #{Hamlit::Engine.new.call @haml_code}; end
|
58
|
+
def run_hamlit; #{Hamlit::Engine.new(escape_html: false).call @haml_code}; end
|
37
59
|
}
|
38
60
|
|
39
61
|
bench('hamlit', Hamlit::VERSION) { context.run_hamlit }
|
40
62
|
bench('erubis', Erubis::VERSION) { context.run_erubis }
|
41
63
|
bench('slim', Slim::VERSION) { context.run_slim_ugly }
|
42
|
-
bench('faml', Faml::VERSION) { context.run_faml }
|
43
64
|
bench('haml', Haml::VERSION) { context.run_haml_ugly }
|
44
65
|
end
|
45
66
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
x.report(name, &block)
|
52
|
-
end
|
53
|
-
x.compare!
|
54
|
-
end
|
55
|
-
end
|
67
|
+
# slim-template/slim's compiled bench with HTML escaping.
|
68
|
+
def init_escaped_benches
|
69
|
+
puts 'Compiled rendering benchmarks with HTML escape'
|
70
|
+
context = Context.new
|
71
|
+
context.instance_eval("def header; '<script>'; end")
|
56
72
|
|
57
|
-
|
73
|
+
haml_ugly = Haml::Engine.new(@haml_code, format: :html5, ugly: true, escape_html: true)
|
74
|
+
haml_ugly.def_method(context, :run_haml_ugly)
|
75
|
+
context.instance_eval %{
|
76
|
+
def run_erubis; #{Erubis::EscapedEruby.new(@erb_code).src}; end
|
77
|
+
def run_slim_ugly; #{Slim::Engine.new.call @slim_code}; end
|
78
|
+
def run_faml; #{Faml::Engine.new.call @haml_code}; end
|
79
|
+
def run_hamlit; #{Hamlit::Engine.new.call @haml_code}; end
|
80
|
+
}
|
81
|
+
|
82
|
+
bench('hamlit', Hamlit::VERSION) { context.run_hamlit }
|
83
|
+
bench('slim', Slim::VERSION) { context.run_slim_ugly }
|
84
|
+
bench('faml', Faml::VERSION) { context.run_faml }
|
85
|
+
bench('erubis', Erubis::VERSION) { context.run_erubis }
|
86
|
+
bench('haml', Haml::VERSION) { context.run_haml_ugly }
|
87
|
+
end
|
58
88
|
|
59
89
|
def bench(name, version, &block)
|
60
90
|
@benches.push([name, block])
|
@@ -70,4 +100,6 @@ class Benchmarks
|
|
70
100
|
end
|
71
101
|
|
72
102
|
time = (ENV['TIME'] || 5).to_i
|
73
|
-
Benchmarks.new(time)
|
103
|
+
bench = Benchmarks.new(time)
|
104
|
+
bench.init_compiled_benches(ENV['HTML_ESCAPE'])
|
105
|
+
bench.run
|
data/doc/engine/indent.md
CHANGED
@@ -17,9 +17,7 @@
|
|
17
17
|
|
18
18
|
### Faml
|
19
19
|
```html
|
20
|
-
|
21
|
-
%a
|
22
|
-
|
20
|
+
Faml::IndentTracker::HardTabNotAllowed: Indentation with hard tabs are not allowed :-p
|
23
21
|
```
|
24
22
|
|
25
23
|
|
@@ -45,9 +43,6 @@ foo
|
|
45
43
|
|
46
44
|
### Faml
|
47
45
|
```html
|
48
|
-
|
49
|
-
%span
|
50
|
-
foo
|
51
|
-
|
46
|
+
Faml::IndentTracker::HardTabNotAllowed: Indentation with hard tabs are not allowed :-p
|
52
47
|
```
|
53
48
|
|
data/doc/faml/engine/indent.md
CHANGED
@@ -9,9 +9,7 @@
|
|
9
9
|
## Output
|
10
10
|
### Faml
|
11
11
|
```html
|
12
|
-
|
13
|
-
%a
|
14
|
-
|
12
|
+
Faml::IndentTracker::HardTabNotAllowed: Indentation with hard tabs are not allowed :-p
|
15
13
|
```
|
16
14
|
|
17
15
|
### Hamlit
|
@@ -35,10 +33,7 @@
|
|
35
33
|
## Output
|
36
34
|
### Faml
|
37
35
|
```html
|
38
|
-
|
39
|
-
%span
|
40
|
-
foo
|
41
|
-
|
36
|
+
Faml::IndentTracker::HardTabNotAllowed: Indentation with hard tabs are not allowed :-p
|
42
37
|
```
|
43
38
|
|
44
39
|
### Hamlit
|
@@ -19,10 +19,6 @@ module Hamlit
|
|
19
19
|
count_indent(next_line)
|
20
20
|
end
|
21
21
|
|
22
|
-
def next_width
|
23
|
-
count_width(next_line)
|
24
|
-
end
|
25
|
-
|
26
22
|
def with_indented(&block)
|
27
23
|
@current_indent += 1
|
28
24
|
block.call
|
@@ -37,11 +33,6 @@ module Hamlit
|
|
37
33
|
line.match(/\A[ \t]+/).to_s.length / indent_rule
|
38
34
|
end
|
39
35
|
|
40
|
-
def count_width(line)
|
41
|
-
return EOF unless line
|
42
|
-
line[/\A[ \t]+/].to_s.length
|
43
|
-
end
|
44
|
-
|
45
36
|
def same_indent?(line)
|
46
37
|
return false unless line
|
47
38
|
count_indent(line) == @current_indent
|
@@ -65,6 +56,15 @@ module Hamlit
|
|
65
56
|
next_indent != @current_indent
|
66
57
|
end
|
67
58
|
|
59
|
+
def has_block?
|
60
|
+
return false unless next_line
|
61
|
+
return fetch_indent(next_line).length > 0 unless @indent_space
|
62
|
+
|
63
|
+
next_indent > @current_indent
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
68
|
# Validate the template is using consitent indentation, 2 spaces or a tab.
|
69
69
|
def validate_indentation_consistency!(indent)
|
70
70
|
return false if indent.empty?
|
@@ -85,37 +85,6 @@ module Hamlit
|
|
85
85
|
"#{length} #{label}#{'s' if length > 1}"
|
86
86
|
end
|
87
87
|
|
88
|
-
def has_block?
|
89
|
-
return false unless next_line
|
90
|
-
return fetch_indent(next_line).length > 0 unless @indent_space
|
91
|
-
|
92
|
-
next_indent > @current_indent
|
93
|
-
end
|
94
|
-
|
95
|
-
private
|
96
|
-
|
97
|
-
def indent_label(indent)
|
98
|
-
return %Q{"#{indent}"} if indent.include?(' ') && indent.include?("\t")
|
99
|
-
|
100
|
-
label = indent.include?(' ') ? 'space' : 'tab'
|
101
|
-
length = indent.match(/[ \t]+/).to_s.length
|
102
|
-
|
103
|
-
"#{length} #{label}#{'s' if length > 1}"
|
104
|
-
end
|
105
|
-
|
106
|
-
def count_width(line)
|
107
|
-
return EOF unless line
|
108
|
-
line[/\A +/].to_s.length
|
109
|
-
end
|
110
|
-
|
111
|
-
def next_space
|
112
|
-
next_line[/\A +/].to_s
|
113
|
-
end
|
114
|
-
|
115
|
-
def next_width
|
116
|
-
count_width(next_line)
|
117
|
-
end
|
118
|
-
|
119
88
|
def indent_rule
|
120
89
|
(@indent_space || '').length
|
121
90
|
end
|
data/lib/hamlit/parsers/tag.rb
CHANGED
@@ -26,8 +26,11 @@ module Hamlit
|
|
26
26
|
inner_removal = parse_whitespace_removal(scanner)
|
27
27
|
|
28
28
|
if !has_block? || scanner.match?(/=|&=|!=/)
|
29
|
+
return syntax_error("Self-closing tags can't have content.") if scanner.scan(/\/ *[^ ]/)
|
29
30
|
return ast if scanner.scan(/\//)
|
30
31
|
return ast << parse_line(scanner, inline: true)
|
32
|
+
elsif scanner.match?(/\//)
|
33
|
+
return syntax_error("Illegal nesting: nesting within a self-closing tag is illegal.")
|
31
34
|
end
|
32
35
|
|
33
36
|
content = [:multi, [:static, "\n"]]
|
data/lib/hamlit/version.rb
CHANGED
@@ -69,5 +69,20 @@ describe Hamlit::Engine do
|
|
69
69
|
HAML
|
70
70
|
to raise_error(Hamlit::SyntaxError, "Indentation can't use both tabs and spaces.")
|
71
71
|
end
|
72
|
+
|
73
|
+
it 'raises syntax error for an inconsistent indentation' do
|
74
|
+
expect { render_string(<<-HAML.unindent) }.
|
75
|
+
%div/ foo
|
76
|
+
HAML
|
77
|
+
to raise_error(Hamlit::SyntaxError, "Self-closing tags can't have content.")
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'raises syntax error for an inconsistent indentation' do
|
81
|
+
expect { render_string(<<-HAML.unindent) }.
|
82
|
+
%div/
|
83
|
+
foo
|
84
|
+
HAML
|
85
|
+
to raise_error(Hamlit::SyntaxError, "Illegal nesting: nesting within a self-closing tag is illegal.")
|
86
|
+
end
|
72
87
|
end
|
73
88
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
describe Hamlit::Engine do
|
2
2
|
describe 'tab indent' do
|
3
3
|
it 'accepts tab indentation' do
|
4
|
-
assert_render(<<-HAML, <<-HTML, compatible_only: :haml)
|
4
|
+
assert_render(<<-HAML, <<-HTML, compatible_only: :haml, error_with: :faml)
|
5
5
|
%p
|
6
6
|
\t%a
|
7
7
|
HAML
|
@@ -26,7 +26,7 @@ describe Hamlit::Engine do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'accepts N-tab indentation' do
|
29
|
-
assert_render(<<-HAML, <<-HTML, compatible_only: :haml)
|
29
|
+
assert_render(<<-HAML, <<-HTML, compatible_only: :haml, error_with: :faml)
|
30
30
|
%p
|
31
31
|
\t%span
|
32
32
|
\t\tfoo
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hamlit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takashi Kokubun
|
@@ -295,6 +295,7 @@ files:
|
|
295
295
|
- benchmarks/benchmark.rb
|
296
296
|
- benchmarks/context.rb
|
297
297
|
- benchmarks/view.erb
|
298
|
+
- benchmarks/view.escaped.slim
|
298
299
|
- benchmarks/view.haml
|
299
300
|
- benchmarks/view.slim
|
300
301
|
- bin/hamlit
|
@@ -603,4 +604,3 @@ test_files:
|
|
603
604
|
- spec/spec_helper/document_generator.rb
|
604
605
|
- spec/spec_helper/render_helper.rb
|
605
606
|
- spec/spec_helper/test_case.rb
|
606
|
-
has_rdoc:
|