former 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.
- data/former.gemspec +1 -0
- data/lib/former/builder.rb +9 -3
- data/lib/former/element.rb +30 -4
- data/lib/former/version.rb +1 -1
- data/test/builder_test.rb +22 -0
- metadata +20 -4
data/former.gemspec
CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
16
16
|
gem.require_paths = ["lib"]
|
17
17
|
gem.add_dependency("nokogiri", ">= 1.6.0")
|
18
|
+
gem.add_dependency("csspool", ">= 3.0.0")
|
18
19
|
gem.add_development_dependency("rake")
|
19
20
|
gem.add_development_dependency("rdoc")
|
20
21
|
end
|
data/lib/former/builder.rb
CHANGED
@@ -25,7 +25,7 @@ module Former
|
|
25
25
|
@html.traverse_prefix do |e|
|
26
26
|
(matches[e] || []).each do |query|
|
27
27
|
if query[:block].nil? or query[:block].call(e)
|
28
|
-
@editable << Element.new(e, query[:query], @editable.length)
|
28
|
+
@editable << Element.new(e, query[:query], @editable.length, query[:args])
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -66,15 +66,21 @@ module Former
|
|
66
66
|
}
|
67
67
|
end
|
68
68
|
|
69
|
-
def self.attr(elem, attr, &block)
|
69
|
+
def self.attr(elem, attr, args=nil, &block)
|
70
70
|
@queries ||= {}
|
71
71
|
@queries[elem] ||= []
|
72
|
-
@queries[elem] << { :query => attr, :block => block }
|
72
|
+
@queries[elem] << { :query => attr, :block => block, :args => args }
|
73
73
|
end
|
74
74
|
|
75
75
|
def self.text(*elems, &block)
|
76
76
|
attr("text()", :text, &block) if elems.length == 0
|
77
77
|
elems.each { |elem| attr(elem, :text, &block) }
|
78
78
|
end
|
79
|
+
|
80
|
+
def self.style_url(property, &block)
|
81
|
+
attr("[@style]", :style_url, { :property => property }) { |elem|
|
82
|
+
elem['style'].include? property and (block_given? ? block.call(elem) : true)
|
83
|
+
}
|
84
|
+
end
|
79
85
|
end
|
80
86
|
end
|
data/lib/former/element.rb
CHANGED
@@ -1,31 +1,41 @@
|
|
1
1
|
require 'json'
|
2
|
+
require 'csspool'
|
2
3
|
|
3
4
|
module Former
|
4
5
|
class Element
|
5
6
|
attr_reader :node, :query
|
6
7
|
|
7
|
-
def initialize(node, query, index)
|
8
|
+
def initialize(node, query, index, args=nil)
|
8
9
|
@node = node
|
9
10
|
@query = query
|
10
11
|
@index = index
|
12
|
+
@args = args || {}
|
11
13
|
end
|
12
14
|
|
13
15
|
def to_json
|
14
16
|
h = {
|
15
|
-
:value =>
|
17
|
+
:value => value,
|
16
18
|
:nodename => @node.name
|
17
19
|
}
|
18
|
-
h[:attr] = @query unless @query == :text
|
20
|
+
h[:attr] = @query unless (@query == :text or @query == :style_url)
|
19
21
|
h.to_json
|
20
22
|
end
|
21
23
|
|
22
24
|
def value
|
23
|
-
@query == :text
|
25
|
+
if @query == :text
|
26
|
+
@node.text
|
27
|
+
elsif @query == :style_url
|
28
|
+
style_url(@node['style']) { |exp| return exp.value }
|
29
|
+
else
|
30
|
+
@node[@query]
|
31
|
+
end
|
24
32
|
end
|
25
33
|
|
26
34
|
def value=(value)
|
27
35
|
if @query == :text
|
28
36
|
@node.content = value
|
37
|
+
elsif @query == :style_url
|
38
|
+
@node['style'] = style_url(@node['style']) { |exp| exp.value = value }
|
29
39
|
else
|
30
40
|
@node[@query] = value
|
31
41
|
end
|
@@ -34,5 +44,21 @@ module Former
|
|
34
44
|
def to_html
|
35
45
|
@node.to_html
|
36
46
|
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def style_url(rules)
|
51
|
+
begin
|
52
|
+
rset = CSSPool.CSS("e { #{rules} }").rule_sets.first
|
53
|
+
decs = rset.declarations.select { |d| d.property == @args[:property] }
|
54
|
+
decs.each do |dec|
|
55
|
+
dec.expressions.select { |e| e.is_a? CSSPool::Terms::URI }.each { |d| yield d }
|
56
|
+
end
|
57
|
+
css = rset.to_minified_css
|
58
|
+
css.slice(4, css.length - 6)
|
59
|
+
rescue Racc::ParseError
|
60
|
+
rules
|
61
|
+
end
|
62
|
+
end
|
37
63
|
end
|
38
64
|
end
|
data/lib/former/version.rb
CHANGED
data/test/builder_test.rb
CHANGED
@@ -7,6 +7,11 @@ class Parser < Former::Builder
|
|
7
7
|
text "p", "a.important"
|
8
8
|
end
|
9
9
|
|
10
|
+
class StyleParser < Former::Builder
|
11
|
+
style_url "background-image"
|
12
|
+
attr "img", :src
|
13
|
+
end
|
14
|
+
|
10
15
|
class AllTextParser < Former::Builder
|
11
16
|
attr "a.important", :href
|
12
17
|
attr("img", :src)
|
@@ -25,6 +30,23 @@ class BuilderTest < Test::Unit::TestCase
|
|
25
30
|
@parser = Parser.new @html_txt
|
26
31
|
end
|
27
32
|
|
33
|
+
def test_style_url
|
34
|
+
p = StyleParser.new "<div style=\"background-image: url('http://blah.com/image.jpg');\">blah</div>"
|
35
|
+
assert_equal p.length, 1
|
36
|
+
p[0] = "http://another.com/image.jpg"
|
37
|
+
assert_equal p.to_html, "<div style='background-image: url(\"http://another.com/image.jpg\");'>blah</div>"
|
38
|
+
|
39
|
+
p = Parser.new "<div style=\"color: #ffffff;\">blah</div>"
|
40
|
+
assert_equal p.length, 0
|
41
|
+
|
42
|
+
p = StyleParser.new "<div style=\"background-image: url('http://blah.com/image.jpg');\"><img src=\"/pic.jpg\" /></div>"
|
43
|
+
assert_equal p.length, 2
|
44
|
+
p[0] = "http://another.com/image.jpg"
|
45
|
+
assert_equal p.to_html, "<div style='background-image: url(\"http://another.com/image.jpg\");'><img src=\"/pic.jpg\"></div>"
|
46
|
+
p[1] = "/blah.jpg"
|
47
|
+
assert_equal p.to_html, "<div style='background-image: url(\"http://another.com/image.jpg\");'><img src=\"/blah.jpg\"></div>"
|
48
|
+
end
|
49
|
+
|
28
50
|
def test_ignore_blank_fields
|
29
51
|
p = AllTextParserNotBlank.new "<p>\n</p><h1> </h1><p> some text </p>"
|
30
52
|
assert_equal p.length, 1
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: former
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-03-
|
12
|
+
date: 2014-03-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 1.6.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: csspool
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 3.0.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.0.0
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: rake
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,7 +110,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
94
110
|
version: '0'
|
95
111
|
segments:
|
96
112
|
- 0
|
97
|
-
hash:
|
113
|
+
hash: -3383286526901818744
|
98
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
115
|
none: false
|
100
116
|
requirements:
|
@@ -103,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
119
|
version: '0'
|
104
120
|
segments:
|
105
121
|
- 0
|
106
|
-
hash:
|
122
|
+
hash: -3383286526901818744
|
107
123
|
requirements: []
|
108
124
|
rubyforge_project:
|
109
125
|
rubygems_version: 1.8.25
|