kind_dom 0.9.7 → 0.9.8
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/kind_dom/base.rb +40 -19
- metadata +2 -2
data/lib/kind_dom/base.rb
CHANGED
@@ -33,11 +33,14 @@ module KindDom
|
|
33
33
|
class Base
|
34
34
|
|
35
35
|
attr_reader :dom
|
36
|
+
attr_accessor :find_cache
|
36
37
|
|
37
38
|
# A new KindDom object may be created from raw XML [string] data, or
|
38
39
|
# an already instantiated KindDom::Base, XML::Node or XML::Document.
|
39
40
|
#
|
40
|
-
|
41
|
+
# Caches intermediate found values, before yielding to the optional block.
|
42
|
+
# Disable the cache with opt `:find_cache => false` or set #find_cache to false
|
43
|
+
def initialize(xml_in=nil, opts={})
|
41
44
|
unless xml_in.nil?
|
42
45
|
case
|
43
46
|
when xml_in.kind_of?(KindDom::Base)
|
@@ -50,6 +53,7 @@ module KindDom
|
|
50
53
|
@dom = parser.parse
|
51
54
|
end
|
52
55
|
end
|
56
|
+
@find_cache = {} if opts[:find_cache].nil? ? true : opts[:find_cache]
|
53
57
|
rescue XML::Parser::ParseError
|
54
58
|
end
|
55
59
|
|
@@ -62,17 +66,19 @@ module KindDom
|
|
62
66
|
# (or default) before returning.
|
63
67
|
#
|
64
68
|
def content_for(xpath='.', default=nil) # :yields: found_content
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
69
|
+
content = cache "content_for(#{xpath})" do
|
70
|
+
node = case @dom.class.to_s
|
71
|
+
when 'XML::Document' then
|
72
|
+
@dom.root.find_first(xpath)
|
73
|
+
else # 'XML::Node'
|
74
|
+
@dom.find_first(xpath)
|
75
|
+
end
|
76
|
+
case node.class.to_s
|
77
|
+
when 'XML::Attr' then
|
78
|
+
node.value
|
79
|
+
else
|
80
|
+
node.content
|
81
|
+
end
|
76
82
|
end
|
77
83
|
rescue NoMethodError
|
78
84
|
ensure
|
@@ -92,7 +98,9 @@ module KindDom
|
|
92
98
|
# (or default) before returning.
|
93
99
|
#
|
94
100
|
def collection_of(xpath, default=nil) # :yields: found_collection
|
95
|
-
c =
|
101
|
+
c = cache "collection_of(#{xpath})" do
|
102
|
+
@dom.find(xpath).collect {|n| self.class.new(n) }
|
103
|
+
end
|
96
104
|
rescue NoMethodError
|
97
105
|
ensure
|
98
106
|
c = c.blank?||c.size<1 ? default : c
|
@@ -111,11 +119,13 @@ module KindDom
|
|
111
119
|
# (or default) before returning.
|
112
120
|
#
|
113
121
|
def first_of(xpath, default=nil) # :yields: found_node
|
114
|
-
n =
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
122
|
+
n = cache "first_of(#{xpath})" do
|
123
|
+
case @dom.class.to_s
|
124
|
+
when 'XML::Document' then
|
125
|
+
@dom.root.find_first(xpath)
|
126
|
+
else # 'XML::Node'
|
127
|
+
@dom.find_first(xpath)
|
128
|
+
end
|
119
129
|
end
|
120
130
|
rescue NoMethodError
|
121
131
|
ensure
|
@@ -126,6 +136,17 @@ module KindDom
|
|
126
136
|
return n
|
127
137
|
end
|
128
138
|
end
|
129
|
-
|
139
|
+
|
140
|
+
private
|
141
|
+
|
142
|
+
def cache(key)
|
143
|
+
if @find_cache and @find_cache.has_key?(key)
|
144
|
+
x = @find_cache[key]
|
145
|
+
else
|
146
|
+
x = yield
|
147
|
+
@find_cache[key] = x if @find_cache
|
148
|
+
end
|
149
|
+
return x
|
150
|
+
end
|
130
151
|
end
|
131
152
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kind_dom
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mars Hall
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-08-20 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|