arbre2 2.2.1 → 2.2.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/Gemfile.lock +1 -1
- data/lib/arbre.rb +1 -0
- data/lib/arbre/html/attributes.rb +31 -6
- data/lib/arbre/html/style_hash.rb +55 -0
- data/lib/arbre/html/tag.rb +8 -0
- data/lib/arbre/version.rb +1 -1
- data/spec/arbre/html/style_hash_spec.rb +57 -0
- data/spec/arbre/integration/html_spec.rb +9 -0
- data/spec/arbre/unit/html/attributes_spec.rb +26 -0
- data/spec/arbre/unit/html/tag_spec.rb +27 -15
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a1f9811843c3bcfd91a24ddc44e76515421653d
|
4
|
+
data.tar.gz: 86ff8a7501ba4da8f51f1eb0fd025d2f8c8f7789
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db0e2106409aed13d4486c913d1b5883906ce8185305b67f4c39a0e9536874d1b33edd07a25ffb818e6fd4c0cc045a5d61b70a28599ac6bad1e7f31f9557e6d4
|
7
|
+
data.tar.gz: 66e3d422569768883676c183b531c5b22165eb95be4a9baeafef2232cfdec0791d398c7b351c87b016527f199324271f0df5aacde3279c333cadcadc7738c498
|
data/Gemfile.lock
CHANGED
data/lib/arbre.rb
CHANGED
@@ -20,18 +20,18 @@ module Arbre
|
|
20
20
|
|
21
21
|
def [](attribute)
|
22
22
|
if attribute.to_s == 'class'
|
23
|
-
|
23
|
+
classes
|
24
|
+
elsif attribute.to_s == 'style'
|
25
|
+
style
|
24
26
|
else
|
25
27
|
@attributes[attribute.to_s]
|
26
28
|
end
|
27
29
|
end
|
28
30
|
def []=(attribute, value)
|
29
31
|
if attribute.to_s == 'class'
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
remove 'class'
|
34
|
-
end
|
32
|
+
self.classes = value
|
33
|
+
elsif attribute.to_s == 'style'
|
34
|
+
self.style = value
|
35
35
|
elsif value == true
|
36
36
|
@attributes[attribute.to_s] = attribute.to_s
|
37
37
|
elsif value
|
@@ -41,6 +41,30 @@ module Arbre
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
def classes
|
45
|
+
@attributes['class'] ||= ClassList.new
|
46
|
+
end
|
47
|
+
|
48
|
+
def classes=(value)
|
49
|
+
if value.present?
|
50
|
+
@attributes['class'] = ClassList.new(value)
|
51
|
+
else
|
52
|
+
remove 'class'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def style
|
57
|
+
@attributes['style'] ||= StyleHash.new
|
58
|
+
end
|
59
|
+
|
60
|
+
def style=(value)
|
61
|
+
if value.present?
|
62
|
+
@attributes['style'] = StyleHash.new(value)
|
63
|
+
else
|
64
|
+
remove 'style'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
44
68
|
def remove(attribute)
|
45
69
|
@attributes.delete attribute.to_s
|
46
70
|
end
|
@@ -67,6 +91,7 @@ module Arbre
|
|
67
91
|
def pairs
|
68
92
|
map do |name, value|
|
69
93
|
next if name == 'class' && value.blank?
|
94
|
+
next if name == 'style' && value.blank?
|
70
95
|
"#{html_escape(name)}=\"#{html_escape(value)}\""
|
71
96
|
end
|
72
97
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Arbre
|
2
|
+
module Html
|
3
|
+
|
4
|
+
# A style definition for an HTML element.
|
5
|
+
class StyleHash < Hash
|
6
|
+
|
7
|
+
def initialize(value = nil)
|
8
|
+
super()
|
9
|
+
|
10
|
+
case value
|
11
|
+
when String
|
12
|
+
parse value
|
13
|
+
when Hash
|
14
|
+
update value
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse(value)
|
19
|
+
value.split(';').reject(&:blank?).each do |pair|
|
20
|
+
name, value = pair.split(':', 2)
|
21
|
+
next unless name && value
|
22
|
+
self[name.strip] = value.strip
|
23
|
+
end
|
24
|
+
end
|
25
|
+
private :parse
|
26
|
+
|
27
|
+
# Alias to the hash itself.
|
28
|
+
def style
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
# Make sure to store everything as dasherized values.
|
33
|
+
def []=(name, value)
|
34
|
+
super name.to_s.underscore.dasherize, value
|
35
|
+
end
|
36
|
+
def [](name)
|
37
|
+
super name.to_s.underscore.dasherize
|
38
|
+
end
|
39
|
+
|
40
|
+
def update(value)
|
41
|
+
value.each { |name, value| self[name] = value }
|
42
|
+
end
|
43
|
+
|
44
|
+
def delete(name)
|
45
|
+
super name.to_s.underscore.dasherize
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_s
|
49
|
+
map{ |n, v| "#{n}: #{v};" }.join(' ')
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
data/lib/arbre/html/tag.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'active_support/core_ext/array/extract_options'
|
1
2
|
require 'erb'
|
2
3
|
|
3
4
|
module Arbre
|
@@ -239,6 +240,13 @@ module Arbre
|
|
239
240
|
klass.split(' ').all? { |cls| classes.include?(cls) }
|
240
241
|
end
|
241
242
|
|
243
|
+
def style
|
244
|
+
self[:style]
|
245
|
+
end
|
246
|
+
def style=(value)
|
247
|
+
self[:style] = value
|
248
|
+
end
|
249
|
+
|
242
250
|
######
|
243
251
|
# Rendering
|
244
252
|
|
data/lib/arbre/version.rb
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
include Arbre::Html
|
3
|
+
|
4
|
+
describe StyleHash do
|
5
|
+
|
6
|
+
describe "initializer" do
|
7
|
+
it "should be able to be initialized without arguments" do
|
8
|
+
hash = StyleHash.new
|
9
|
+
expect(hash).to be_empty
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should be able to be initialized with a hash" do
|
13
|
+
hash = StyleHash.new('one' => 'two')
|
14
|
+
expect(hash.to_s).to eql('one: two;')
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be able to be initialized with a string containing a style definition" do
|
18
|
+
hash = StyleHash.new('one: two; three:four;')
|
19
|
+
expect(hash.to_s).to eql('one: two; three: four;')
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should convert to dash-case when initialized with a hash" do
|
23
|
+
hash = StyleHash.new('styleOne' => 'two')
|
24
|
+
expect(hash.to_s).to eql('style-one: two;')
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#style' do
|
30
|
+
it "should be an alias to itself" do
|
31
|
+
hash = StyleHash.new('one:two;')
|
32
|
+
expect(hash.style).to be(hash)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '[]=' do
|
37
|
+
it "should convert the used name to dash-case" do
|
38
|
+
hash = StyleHash.new
|
39
|
+
hash[:style_one] = 'one'
|
40
|
+
hash[:style_two] = 'two'
|
41
|
+
hash['style-three'] = 'three'
|
42
|
+
hash['styleFour'] = 'four'
|
43
|
+
expect(hash.to_s).to eql('style-one: one; style-two: two; style-three: three; style-four: four;')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '[]' do
|
48
|
+
it "should convert the used name to dash-case" do
|
49
|
+
hash = StyleHash.new('style-one: one; style-two: two; style-three: three; style-four: four;')
|
50
|
+
expect(hash[:style_one]).to eql('one')
|
51
|
+
expect(hash[:style_two]).to eql('two')
|
52
|
+
expect(hash['style-three']).to eql('three')
|
53
|
+
expect(hash['styleFour']).to eql('four')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -10,6 +10,15 @@ describe Arbre do
|
|
10
10
|
expect(arbre).to be_rendered_as("<span>Hello World</span>")
|
11
11
|
end
|
12
12
|
|
13
|
+
it "should render all attributes properly" do
|
14
|
+
arbre do
|
15
|
+
div "test", :class => %w(one two), :style => {'one' => 'two'}, 'one' => 'two'
|
16
|
+
end
|
17
|
+
expect(arbre).to be_rendered_as(<<-HTML)
|
18
|
+
<div class="one two" one="two" style="one: two;">test</div>
|
19
|
+
HTML
|
20
|
+
end
|
21
|
+
|
13
22
|
it "should access assigns through instance variables" do
|
14
23
|
assigns[:my_var] = 'Hello World'
|
15
24
|
arbre { span @my_var }
|
@@ -106,6 +106,32 @@ describe Attributes do
|
|
106
106
|
|
107
107
|
end
|
108
108
|
|
109
|
+
describe "style attribute" do
|
110
|
+
|
111
|
+
it "should return a StyleHash when the class attribute is accessed" do
|
112
|
+
expect(attributes[:style]).to be_a(StyleHash)
|
113
|
+
expect(attributes[:style]).to be_empty
|
114
|
+
expect(attributes['style']).to be_a(StyleHash)
|
115
|
+
expect(attributes['style']).to be_empty
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should wrap things into a style when the attribute is set" do
|
119
|
+
attributes[:style] = 'one: two;'
|
120
|
+
expect(attributes[:style]).to eql(StyleHash.new('one: two;'))
|
121
|
+
|
122
|
+
attributes[:style] = {'one' => 'two'}
|
123
|
+
expect(attributes[:style]).to eql(StyleHash.new('one' => 'two'))
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should not set the attribute if a nil or empty hash is passed" do
|
127
|
+
attributes[:style] = nil
|
128
|
+
expect(attributes).not_to have_key(:style)
|
129
|
+
attributes[:style] = []
|
130
|
+
expect(attributes).not_to have_key(:style)
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
109
135
|
describe '#remove' do
|
110
136
|
|
111
137
|
it "should remove the attribute with the given name" do
|
@@ -76,7 +76,7 @@ describe Tag do
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
describe '.
|
79
|
+
describe '.tag_classes' do
|
80
80
|
it "should add the given classes to the tag" do
|
81
81
|
klass = Class.new(Arbre::Html::Div) { classes 'time-input' }
|
82
82
|
expect(klass.new.tag_classes).to eql(%w[time-input])
|
@@ -105,33 +105,33 @@ describe Tag do
|
|
105
105
|
specify { expect(tag.attributes).to be_a(Attributes) }
|
106
106
|
|
107
107
|
it "should allow setting an attribute through #set_attribute" do
|
108
|
-
tag.set_attribute :
|
108
|
+
tag.set_attribute :autocomplete, 'off'
|
109
109
|
tag.set_attribute 'placeholder', '(test)'
|
110
|
-
expect(tag.attributes).to eq('
|
110
|
+
expect(tag.attributes).to eq('autocomplete' => 'off', 'placeholder' => '(test)')
|
111
111
|
end
|
112
112
|
|
113
113
|
it "should allow getting an attribute through #get_attribute" do
|
114
|
-
tag.set_attribute :
|
115
|
-
expect(tag.get_attribute(:
|
116
|
-
expect(tag.get_attribute('
|
114
|
+
tag.set_attribute :autocomplete, 'off'
|
115
|
+
expect(tag.get_attribute(:autocomplete)).to eql('off')
|
116
|
+
expect(tag.get_attribute('autocomplete')).to eql('off')
|
117
117
|
end
|
118
118
|
|
119
119
|
it "should allow setting an attribute through an indexer" do
|
120
|
-
tag[:
|
120
|
+
tag[:autocomplete] = 'off'
|
121
121
|
tag['placeholder'] = '(test)'
|
122
|
-
expect(tag.attributes).to eq('
|
122
|
+
expect(tag.attributes).to eq('autocomplete' => 'off', 'placeholder' => '(test)')
|
123
123
|
end
|
124
124
|
|
125
125
|
it "should allow getting an attribute through an indexer" do
|
126
|
-
tag[:
|
127
|
-
expect(tag[:
|
128
|
-
expect(tag['
|
126
|
+
tag[:autocomplete] = 'off'
|
127
|
+
expect(tag[:autocomplete]).to eql('off')
|
128
|
+
expect(tag['autocomplete']).to eql('off')
|
129
129
|
end
|
130
130
|
|
131
131
|
it "should check whether an attribute is set through has_attribute?" do
|
132
|
-
tag[:
|
133
|
-
expect(tag).to have_attribute(:
|
134
|
-
expect(tag).to have_attribute('
|
132
|
+
tag[:autocomplete] = 'off'
|
133
|
+
expect(tag).to have_attribute(:autocomplete)
|
134
|
+
expect(tag).to have_attribute('autocomplete')
|
135
135
|
expect(tag).not_to have_attribute(:placeholder)
|
136
136
|
end
|
137
137
|
|
@@ -206,7 +206,7 @@ describe Tag do
|
|
206
206
|
end
|
207
207
|
|
208
208
|
######
|
209
|
-
# ID &
|
209
|
+
# ID, classes & style
|
210
210
|
|
211
211
|
describe '#generate_id' do
|
212
212
|
it "should generate an ID for the tag using its object_id" do
|
@@ -261,6 +261,18 @@ describe Tag do
|
|
261
261
|
end
|
262
262
|
end
|
263
263
|
|
264
|
+
describe '#style' do
|
265
|
+
it "should be the same as the :style attribute" do
|
266
|
+
expect(tag.style).to be(tag[:style])
|
267
|
+
end
|
268
|
+
end
|
269
|
+
describe '#style=' do
|
270
|
+
it "should set the style attribute" do
|
271
|
+
tag.style = 'float: left;'
|
272
|
+
expect(tag[:style]).to eql('float' => 'left')
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
264
276
|
## Rendering is exemplified in the integration HTML spec.
|
265
277
|
|
266
278
|
######
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arbre2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Bell
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-03-
|
12
|
+
date: 2014-03-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- lib/arbre/html/document.rb
|
143
143
|
- lib/arbre/html/html_tags.rb
|
144
144
|
- lib/arbre/html/querying.rb
|
145
|
+
- lib/arbre/html/style_hash.rb
|
145
146
|
- lib/arbre/html/tag.rb
|
146
147
|
- lib/arbre/rails.rb
|
147
148
|
- lib/arbre/rails/layouts.rb
|
@@ -156,6 +157,7 @@ files:
|
|
156
157
|
- lib/arbre/rspec/contain_script_matcher.rb
|
157
158
|
- lib/arbre/text_node.rb
|
158
159
|
- lib/arbre/version.rb
|
160
|
+
- spec/arbre/html/style_hash_spec.rb
|
159
161
|
- spec/arbre/integration/html_document_spec.rb
|
160
162
|
- spec/arbre/integration/html_spec.rb
|
161
163
|
- spec/arbre/integration/querying_spec.rb
|
@@ -216,6 +218,7 @@ signing_key:
|
|
216
218
|
specification_version: 4
|
217
219
|
summary: An Object Oriented DOM Tree in Ruby
|
218
220
|
test_files:
|
221
|
+
- spec/arbre/html/style_hash_spec.rb
|
219
222
|
- spec/arbre/integration/html_document_spec.rb
|
220
223
|
- spec/arbre/integration/html_spec.rb
|
221
224
|
- spec/arbre/integration/querying_spec.rb
|