hamlit 1.0.0 → 1.1.0
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/CHANGELOG.md +6 -0
- data/README.md +10 -8
- data/hamlit.gemspec +1 -0
- data/lib/hamlit/attribute.rb +11 -1
- data/lib/hamlit/compilers/old_attribute.rb +14 -1
- data/lib/hamlit/version.rb +1 -1
- data/spec/hamlit/engine/old_attributes_spec.rb +28 -4
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5a1e096423ee86064c348eb368f24123485c237
|
4
|
+
data.tar.gz: 4eea016823ef282a698e59cf75af15a98aad9d19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70ca8fad5f406015583d08a0e80e2d878e879ebaf15aa3d6139e8bb91d8871dce7897d23eb9d6bb066854cab88140c0bd6782b176dcf7753e361bd21d0a80153
|
7
|
+
data.tar.gz: 1e78de32103cd32ec2a277ed95eefc1e1cacbd70431db6b8c812982d488d0fbe292e288bf834ab8569a7dba26e02b17575d79404c2f27233e2bc13c07fca1bcb
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -15,19 +15,21 @@ or just replace `gem "haml"` with `gem "hamlit"`.
|
|
15
15
|
## Features
|
16
16
|
### Fast rendering
|
17
17
|
|
18
|
-
|
18
|
+

|
19
|
+
|
20
|
+
Hamlit's rendering is **7.16x times faster** than original haml.
|
19
21
|
|
20
22
|
```
|
21
|
-
erubis:
|
22
|
-
hamlit:
|
23
|
-
slim:
|
24
|
-
faml:
|
25
|
-
haml:
|
23
|
+
erubis: 114501.6 i/s
|
24
|
+
hamlit: 112888.1 i/s - 1.01x slower
|
25
|
+
slim: 103298.5 i/s - 1.11x slower
|
26
|
+
faml: 88675.4 i/s - 1.29x slower
|
27
|
+
haml: 15750.6 i/s - 7.27x slower
|
26
28
|
```
|
27
29
|
|
28
|
-
[This benchmark](https://github.com/k0kubun/hamlit/blob/
|
30
|
+
[This benchmark](https://github.com/k0kubun/hamlit/blob/4e5655c4ba1d51c85b4551c3b22baa6d7780d208/benchmarks/benchmark.rb)
|
29
31
|
is the same as [slim-template/slim](https://github.com/slim-template/slim)'s one for fairness.
|
30
|
-
([The result on travis CI](https://travis-ci.org/k0kubun/hamlit/jobs/
|
32
|
+
([The result on travis CI](https://travis-ci.org/k0kubun/hamlit/jobs/58162910))
|
31
33
|
|
32
34
|
### Better parser
|
33
35
|
|
data/hamlit.gemspec
CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
|
+
spec.required_ruby_version = ">= 2.0.0"
|
20
21
|
|
21
22
|
spec.add_dependency "escape_utils"
|
22
23
|
spec.add_dependency "temple", "~> 0.7.3"
|
data/lib/hamlit/attribute.rb
CHANGED
@@ -27,6 +27,7 @@ module Hamlit
|
|
27
27
|
next
|
28
28
|
end
|
29
29
|
|
30
|
+
value = refine_joinable_value(key, value) if value.is_a?(Array)
|
30
31
|
escaped = Temple::Utils.escape_html(value)
|
31
32
|
result += " #{key}=#{@quote}#{escaped}#{@quote}"
|
32
33
|
end
|
@@ -35,6 +36,15 @@ module Hamlit
|
|
35
36
|
|
36
37
|
private
|
37
38
|
|
39
|
+
def refine_joinable_value(key, value)
|
40
|
+
case key
|
41
|
+
when :id
|
42
|
+
value = value.join('_')
|
43
|
+
when :class
|
44
|
+
value = value.join(' ')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
38
48
|
def merge_attributes(base, target)
|
39
49
|
result = {}
|
40
50
|
base = flatten_attributes(base)
|
@@ -46,7 +56,7 @@ module Hamlit
|
|
46
56
|
when :id
|
47
57
|
result[key] = [base[key], target[key]].compact.join('_')
|
48
58
|
else
|
49
|
-
result[key] = [base[key], target[key]].compact.join(' ')
|
59
|
+
result[key] = [base[key], target[key]].compact.map(&:to_s).sort.join(' ')
|
50
60
|
end
|
51
61
|
else
|
52
62
|
result[key] = base[key].nil? ? target[key] : base[key]
|
@@ -19,6 +19,10 @@ module Hamlit
|
|
19
19
|
NESTABLE_ATTRIBUTES = %w[data].freeze
|
20
20
|
IGNORED_EXPRESSIONS = %w[false nil].freeze
|
21
21
|
|
22
|
+
# Class and id are joined if the value is an array.
|
23
|
+
JOIN_ATTRIBUTES = %w[class id].freeze
|
24
|
+
JOINABLE_TOKENS = %i[on_ident on_qwords_beg on_lbracket].freeze
|
25
|
+
|
22
26
|
# Only boolean attributes can be deleted for performance.
|
23
27
|
BOOLEAN_ATTRIBUTES = %w[
|
24
28
|
autofocus
|
@@ -38,7 +42,8 @@ module Hamlit
|
|
38
42
|
|
39
43
|
format_attributes(attrs).map do |key, value|
|
40
44
|
next true_attribute(key) if value == 'true'
|
41
|
-
assert_static_value!(value)
|
45
|
+
assert_static_value!(value) if NESTABLE_ATTRIBUTES.include?(key)
|
46
|
+
detect_joinable_value!(value) if JOIN_ATTRIBUTES.include?(key)
|
42
47
|
|
43
48
|
[:html, :attr, key, [:dynamic, value]]
|
44
49
|
end
|
@@ -69,6 +74,14 @@ module Hamlit
|
|
69
74
|
end
|
70
75
|
end
|
71
76
|
|
77
|
+
# Give up static compilation when the value is a variable or an array.
|
78
|
+
def detect_joinable_value!(value)
|
79
|
+
tokens = Ripper.lex(value)
|
80
|
+
tokens.each do |(row, col), type, str|
|
81
|
+
raise RuntimeBuild if JOINABLE_TOKENS.include?(type)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
72
85
|
# Give up static compilation when attributes have deletable
|
73
86
|
# attributes, such as 'checked'.
|
74
87
|
def assert_no_boolean_attributes!(attrs)
|
data/lib/hamlit/version.rb
CHANGED
@@ -73,6 +73,34 @@ describe Hamlit::Engine do
|
|
73
73
|
HTML
|
74
74
|
end
|
75
75
|
|
76
|
+
describe 'joinable attributes' do
|
77
|
+
it 'joins class with a space' do
|
78
|
+
assert_render(<<-'HAML', <<-HTML)
|
79
|
+
- val = ['a', 'b', 'c']
|
80
|
+
%p{ class: val }
|
81
|
+
%p{ class: %w[a b c] }
|
82
|
+
%p{ class: ['a', 'b', 'c'] }
|
83
|
+
HAML
|
84
|
+
<p class='a b c'></p>
|
85
|
+
<p class='a b c'></p>
|
86
|
+
<p class='a b c'></p>
|
87
|
+
HTML
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'joins id with an underscore' do
|
91
|
+
assert_render(<<-'HAML', <<-HTML)
|
92
|
+
- val = ['a', 'b', 'c']
|
93
|
+
%p{ id: val }
|
94
|
+
%p{ id: %w[a b c] }
|
95
|
+
%p{ id: ['a', 'b', 'c'] }
|
96
|
+
HAML
|
97
|
+
<p id='a_b_c'></p>
|
98
|
+
<p id='a_b_c'></p>
|
99
|
+
<p id='a_b_c'></p>
|
100
|
+
HTML
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
76
104
|
describe 'deletable attributes' do
|
77
105
|
it 'deletes attributes whose value is nil or false' do
|
78
106
|
assert_render(<<-'HAML', <<-HTML)
|
@@ -118,15 +146,11 @@ describe Hamlit::Engine do
|
|
118
146
|
assert_render(<<-'HAML', <<-HTML)
|
119
147
|
- val = false
|
120
148
|
%a{ href: val }
|
121
|
-
%a{ class: val }
|
122
149
|
- val = nil
|
123
150
|
%a{ href: val }
|
124
|
-
%a{ class: val }
|
125
151
|
HAML
|
126
152
|
<a href='false'></a>
|
127
|
-
<a class='false'></a>
|
128
153
|
<a href=''></a>
|
129
|
-
<a class=''></a>
|
130
154
|
HTML
|
131
155
|
end
|
132
156
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hamlit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takashi Kokubun
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: escape_utils
|
@@ -468,7 +468,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
468
468
|
requirements:
|
469
469
|
- - ">="
|
470
470
|
- !ruby/object:Gem::Version
|
471
|
-
version:
|
471
|
+
version: 2.0.0
|
472
472
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
473
473
|
requirements:
|
474
474
|
- - ">="
|
@@ -568,4 +568,3 @@ test_files:
|
|
568
568
|
- spec/rails/vendor/assets/javascripts/.keep
|
569
569
|
- spec/rails/vendor/assets/stylesheets/.keep
|
570
570
|
- spec/spec_helper.rb
|
571
|
-
has_rdoc:
|