| Module | YAML::BaseNode |
| In: |
lib/yaml/basenode.rb
|
YAML Generic Model container
# File lib/yaml/basenode.rb, line 69
69: def at( seg )
70: if Hash === @value
71: self[seg]
72: elsif Array === @value and seg =~ /\A\d+\Z/ and @value[seg.to_i]
73: @value[seg.to_i]
74: end
75: end
# File lib/yaml/basenode.rb, line 194
194: def children
195: if Hash === @value
196: @value.values.collect { |c| c[1] }
197: elsif Array === @value
198: @value
199: end
200: end
# File lib/yaml/basenode.rb, line 202
202: def children_with_index
203: if Hash === @value
204: @value.keys.collect { |i| [self[i], i] }
205: elsif Array === @value
206: i = -1; @value.collect { |v| i += 1; [v, i] }
207: end
208: end
Search a node for a single YPath segment
# File lib/yaml/basenode.rb, line 93
93: def match_segment( ypath, depth )
94: deep_nodes = []
95: seg = ypath.segments[ depth ]
96: if seg == "/"
97: unless String === @value
98: idx = -1
99: @value.collect { |v|
100: idx += 1
101: if Hash === @value
102: match_init = [v[0].transform, v[1]]
103: match_deep = v[1].match_segment( ypath, depth )
104: else
105: match_init = [idx, v]
106: match_deep = v.match_segment( ypath, depth )
107: end
108: if match_deep
109: match_deep.each { |m|
110: deep_nodes.push( match_init + m )
111: }
112: end
113: }
114: end
115: depth += 1
116: seg = ypath.segments[ depth ]
117: end
118: match_nodes =
119: case seg
120: when "."
121: [[nil, self]]
122: when ".."
123: [["..", nil]]
124: when "*"
125: if @value.is_a? Enumerable
126: idx = -1
127: @value.collect { |h|
128: idx += 1
129: if Hash === @value
130: [h[0].transform, h[1]]
131: else
132: [idx, h]
133: end
134: }
135: end
136: else
137: if seg =~ /^"(.*)"$/
138: seg = $1
139: elsif seg =~ /^'(.*)'$/
140: seg = $1
141: end
142: if ( v = at( seg ) )
143: [[ seg, v ]]
144: end
145: end
146: return deep_nodes unless match_nodes
147: pred = ypath.predicates[ depth ]
148: if pred
149: case pred
150: when /^\.=/
151: pred = $' # '
152: match_nodes.reject! { |n|
153: n.last.value != pred
154: }
155: else
156: match_nodes.reject! { |n|
157: n.last.at( pred ).nil?
158: }
159: end
160: end
161: return match_nodes + deep_nodes unless ypath.segments.length > depth + 1
162:
163: #puts "DEPTH: #{depth + 1}"
164: deep_nodes = []
165: match_nodes.each { |n|
166: if n[1].is_a? BaseNode
167: match_deep = n[1].match_segment( ypath, depth + 1 )
168: if match_deep
169: match_deep.each { |m|
170: deep_nodes.push( n + m )
171: }
172: end
173: else
174: deep_nodes = []
175: end
176: }
177: deep_nodes = nil if deep_nodes.length == 0
178: deep_nodes
179: end
Search for YPath entry and return a list of qualified paths.
# File lib/yaml/basenode.rb, line 55
55: def search( ypath_str )
56: matches = match_path( ypath_str )
57:
58: if matches
59: matches.collect { |m|
60: path = []
61: m.each_index { |i|
62: path.push m[i] if ( i % 2 ).zero?
63: }
64: "/" + path.compact.join( "/" )
65: }
66: end
67: end
Search for YPath entry and return qualified nodes.
# File lib/yaml/basenode.rb, line 17
17: def select( ypath_str )
18: matches = match_path( ypath_str )
19:
20: #
21: # Create a new generic view of the elements selected
22: #
23: if matches
24: result = []
25: matches.each { |m|
26: result.push m.last
27: }
28: YAML.transfer( 'seq', result )
29: end
30: end
Search for YPath entry and return transformed nodes.
# File lib/yaml/basenode.rb, line 36
36: def select!( ypath_str )
37: matches = match_path( ypath_str )
38:
39: #
40: # Create a new generic view of the elements selected
41: #
42: if matches
43: result = []
44: matches.each { |m|
45: result.push m.last.transform
46: }
47: result
48: end
49: end