hamlit 1.4.3 → 1.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/lib/hamlit/attribute.rb +8 -4
- data/lib/hamlit/compilers/old_attribute.rb +8 -1
- data/lib/hamlit/concerns/balanceable.rb +10 -0
- data/lib/hamlit/parsers/attribute.rb +21 -6
- data/lib/hamlit/version.rb +1 -1
- data/spec/hamlit/engine/old_attributes_spec.rb +33 -9
- 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: 7de4f077471615790e1d0d4993e8fe0926ef84be
|
4
|
+
data.tar.gz: b404e0b74b3a0857287424f22d530a5923eaa2f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f53a569a02a7aa2163559e29793f3a3890e1c6aff8f69e64864a296f738d770c99dc75196cc76643ac8bd209ada3887d916b2660ae63b97c0b7853c43424fcca
|
7
|
+
data.tar.gz: a21d15241aef3b22a3419ac27561b2b020abb342cb5a01357efa2451dea4f06419a35d22a03379b6b47941b513ed98efbb822f3e9f3d6d7712aca32b04a709cd
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## v1.4.5
|
2
|
+
|
3
|
+
- Support Ruby 2.0 and 2.1 for v1.4.4
|
4
|
+
|
5
|
+
## v1.4.4 (yanked)
|
6
|
+
|
7
|
+
- Fix old attribute parser to be more flexible
|
8
|
+
- Accept multiple hashes as old attributes
|
9
|
+
- Accept old attributes with hash and literal
|
10
|
+
|
1
11
|
## v1.4.3
|
2
12
|
|
3
13
|
- Allow `when` to have multiple candidates
|
data/lib/hamlit/attribute.rb
CHANGED
@@ -10,18 +10,22 @@ module Hamlit
|
|
10
10
|
class Attribute
|
11
11
|
include Concerns::AttributeBuilder
|
12
12
|
|
13
|
-
def self.build(quote,
|
13
|
+
def self.build(quote, *args)
|
14
14
|
builder = self.new(quote)
|
15
|
-
builder.build(
|
15
|
+
builder.build(*args)
|
16
16
|
end
|
17
17
|
|
18
18
|
def initialize(quote)
|
19
19
|
@quote = quote
|
20
20
|
end
|
21
21
|
|
22
|
-
def build(
|
22
|
+
def build(*args)
|
23
23
|
result = ''
|
24
|
-
|
24
|
+
attributes = args.inject({}) do |attributes, arg|
|
25
|
+
merge_attributes(attributes, arg)
|
26
|
+
end
|
27
|
+
|
28
|
+
attributes.each do |key, value|
|
25
29
|
if value == true
|
26
30
|
result += " #{key}"
|
27
31
|
next
|
@@ -32,7 +32,7 @@ module Hamlit
|
|
32
32
|
truespeed typemustmatch data].freeze
|
33
33
|
|
34
34
|
def compile_old_attribute(str)
|
35
|
-
raise RuntimeBuild unless
|
35
|
+
raise RuntimeBuild unless valid_hash?(str)
|
36
36
|
|
37
37
|
attrs = parse_old_attributes(str)
|
38
38
|
assert_no_boolean_attributes!(attrs)
|
@@ -51,6 +51,13 @@ module Hamlit
|
|
51
51
|
|
52
52
|
private
|
53
53
|
|
54
|
+
def valid_hash?(str)
|
55
|
+
sexp = Ripper.sexp(str)
|
56
|
+
return false unless sexp
|
57
|
+
|
58
|
+
sexp.flatten[1] == :hash
|
59
|
+
end
|
60
|
+
|
54
61
|
def format_attributes(attributes)
|
55
62
|
attributes = flatten_attributes(attributes)
|
56
63
|
ignore_falsy_values(attributes)
|
@@ -11,6 +11,11 @@ module Hamlit
|
|
11
11
|
fetch_balanced_tokens(all_tokens, :on_lparen, :on_rparen)
|
12
12
|
end
|
13
13
|
|
14
|
+
def fetch_balanced_embexprs(all_tokens)
|
15
|
+
tokens = all_tokens[1..-1] # ignore first `"`
|
16
|
+
fetch_balanced_tokens(tokens, :on_embexpr_beg, :on_embexpr_end)
|
17
|
+
end
|
18
|
+
|
14
19
|
def balanced_braces_exist?(tokens)
|
15
20
|
balanced_tokens_exist?(tokens, :on_lbrace, :on_rbrace)
|
16
21
|
end
|
@@ -19,6 +24,11 @@ module Hamlit
|
|
19
24
|
balanced_tokens_exist?(tokens, :on_lparen, :on_rparen)
|
20
25
|
end
|
21
26
|
|
27
|
+
def balanced_embexprs_exist?(tokens)
|
28
|
+
tokens = tokens[1..-1] # ignore first `"`
|
29
|
+
balanced_tokens_exist?(tokens, :on_embexpr_beg, :on_embexpr_end)
|
30
|
+
end
|
31
|
+
|
22
32
|
private
|
23
33
|
|
24
34
|
def fetch_balanced_tokens(all_tokens, open_token, close_token)
|
@@ -6,6 +6,8 @@ module Hamlit
|
|
6
6
|
module Attribute
|
7
7
|
include Concerns::Balanceable
|
8
8
|
|
9
|
+
EMBEXPR_PREFIX = '"#'.freeze
|
10
|
+
|
9
11
|
def parse_attributes(scanner)
|
10
12
|
if scanner.match?(/{/)
|
11
13
|
parse_old_attributes(scanner) + parse_new_attributes(scanner)
|
@@ -16,20 +18,24 @@ module Hamlit
|
|
16
18
|
|
17
19
|
private
|
18
20
|
|
21
|
+
# NOTE: Old attributes are not valid as Ruby expression.
|
22
|
+
# So Ripper is broken if you give an original expression to it.
|
23
|
+
# This method bypasses it by changing expression to string interpolation.
|
24
|
+
# Ideally you should implement an original lexer for haml old attributes.
|
19
25
|
def parse_old_attributes(scanner)
|
20
26
|
return [] unless scanner.match?(/{/)
|
21
27
|
|
22
|
-
tokens =
|
23
|
-
until
|
28
|
+
tokens = try_lex(EMBEXPR_PREFIX + scanner.rest)
|
29
|
+
until balanced_embexprs_exist?(tokens)
|
24
30
|
@current_lineno += 1
|
25
31
|
break unless @lines[@current_lineno]
|
26
32
|
scanner.concat(current_line)
|
27
|
-
tokens =
|
33
|
+
tokens = try_lex(EMBEXPR_PREFIX + scanner.rest)
|
28
34
|
end
|
29
35
|
|
30
|
-
tokens =
|
31
|
-
scanner.pos += tokens.last.first.last
|
32
|
-
[tokens.map(&:last).join]
|
36
|
+
tokens = fetch_balanced_embexprs(tokens)
|
37
|
+
scanner.pos += tokens.last.first.last - 1 # remove EMBEXPR_PREFIX's offset
|
38
|
+
[tokens.map(&:last).join.gsub(/\A#/, '')]
|
33
39
|
end
|
34
40
|
|
35
41
|
def parse_new_attributes(scanner)
|
@@ -47,6 +53,15 @@ module Hamlit
|
|
47
53
|
scanner.pos += tokens.last.first.last + 1
|
48
54
|
[tokens.map(&:last).join]
|
49
55
|
end
|
56
|
+
|
57
|
+
# Ripper.lex and reject tokens whose row is 0 (invalid).
|
58
|
+
# This should be used only for an expression which can
|
59
|
+
# be invalid as Ruby and valid as haml.
|
60
|
+
def try_lex(str)
|
61
|
+
Ripper.lex(str).reject do |(row, col), type, str|
|
62
|
+
row == 0
|
63
|
+
end
|
64
|
+
end
|
50
65
|
end
|
51
66
|
end
|
52
67
|
end
|
data/lib/hamlit/version.rb
CHANGED
@@ -56,15 +56,6 @@ describe Hamlit::Engine do
|
|
56
56
|
HTML
|
57
57
|
end
|
58
58
|
|
59
|
-
it 'renders runtime hash attribute' do
|
60
|
-
assert_render(<<-'HAML', <<-HTML)
|
61
|
-
- hash = { foo: 'bar' }
|
62
|
-
%span{ hash }
|
63
|
-
HAML
|
64
|
-
<span foo='bar'></span>
|
65
|
-
HTML
|
66
|
-
end
|
67
|
-
|
68
59
|
it 'renders multi-byte chars as static attribute value' do
|
69
60
|
assert_render(<<-'HAML', <<-HTML)
|
70
61
|
%img{ alt: 'こんにちは' }
|
@@ -73,6 +64,39 @@ describe Hamlit::Engine do
|
|
73
64
|
HTML
|
74
65
|
end
|
75
66
|
|
67
|
+
describe 'runtime attributes' do
|
68
|
+
it 'renders runtime hash attribute' do
|
69
|
+
assert_render(<<-'HAML', <<-HTML)
|
70
|
+
- hash = { foo: 'bar' }
|
71
|
+
%span{ hash }
|
72
|
+
HAML
|
73
|
+
<span foo='bar'></span>
|
74
|
+
HTML
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'renders multiples hashes' do
|
78
|
+
assert_render(<<-'HAML', <<-HTML)
|
79
|
+
- h1 = { a: 'b' }
|
80
|
+
- h2 = { c: 'd' }
|
81
|
+
- h3 = { e: 'f' }
|
82
|
+
%span{ h1, h2, h3 }
|
83
|
+
HAML
|
84
|
+
<span a='b' c='d' e='f'></span>
|
85
|
+
HTML
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'renders multiples hashes and literal hash' do
|
89
|
+
assert_render(<<-'HAML', <<-HTML)
|
90
|
+
- h1 = { a: 'b' }
|
91
|
+
- h2 = { c: 'd' }
|
92
|
+
- h3 = { e: 'f' }
|
93
|
+
%span{ h1, h2, h3, g: 'h', i: 'j' }
|
94
|
+
HAML
|
95
|
+
<span a='b' c='d' e='f' g='h' i='j'></span>
|
96
|
+
HTML
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
76
100
|
describe 'joinable attributes' do
|
77
101
|
it 'joins class with a space' do
|
78
102
|
assert_render(<<-'HAML', <<-HTML)
|
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.
|
4
|
+
version: 1.4.5
|
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-06-
|
11
|
+
date: 2015-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: escape_utils
|