polyrex 0.2.3 → 0.3.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/lib/polyrex.rb +29 -81
- metadata +12 -2
data/lib/polyrex.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
|
1
|
+
#/usr/bin/ruby
|
2
2
|
|
3
3
|
# file: polyrex.rb
|
4
4
|
|
5
5
|
require 'polyrex-schema'
|
6
6
|
require 'backtrack-xpath'
|
7
|
+
require 'line-tree'
|
7
8
|
require 'rexml/document'
|
8
9
|
|
9
10
|
class Polyrex
|
@@ -26,7 +27,7 @@ class Polyrex
|
|
26
27
|
|
27
28
|
@schema = schema
|
28
29
|
|
29
|
-
@id = '
|
30
|
+
@id = '0'
|
30
31
|
a = @schema.split('/')
|
31
32
|
|
32
33
|
@rpaths = (a.length).times.inject({}) {|r| r.merge ({a.join('/').gsub(/\[[^\]]+\]/,'') => a.pop}) }
|
@@ -112,92 +113,40 @@ end
|
|
112
113
|
end
|
113
114
|
|
114
115
|
def parse(lines)
|
115
|
-
|
116
|
-
|
117
|
-
a.map! do |x|
|
118
|
-
x.match(/(\s+)?(.*)/).captures
|
119
|
-
end
|
120
|
-
|
121
|
-
new_a = []
|
122
|
-
history = []
|
123
|
-
history << new_a
|
124
|
-
|
125
|
-
build_tree(a, new_a, 0, history)
|
126
|
-
out = scan_link(new_a)
|
127
|
-
|
128
|
-
records = Document.new("<records>%s</records>" % out)
|
129
|
-
doc_records = XPath.first(@doc.root, 'records')
|
130
|
-
|
131
|
-
records.each do |record|
|
132
|
-
doc_records.add record
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
136
|
-
|
137
|
-
def build_tree(a, new_a, prev_indent, history=[])
|
138
|
-
if a.length > 0 then
|
139
|
-
x = a.shift
|
140
|
-
n = x.shift
|
141
|
-
cur_indent = n ? n.length : 0
|
142
|
-
indent, xr = build_branch(a, new_a, cur_indent, prev_indent, x, history )
|
143
|
-
|
144
|
-
if xr then
|
145
|
-
history.pop
|
146
|
-
cur_indent, xr = build_branch(a, history[-1] || new_a, indent, prev_indent, xr, history )
|
147
|
-
return [cur_indent, xr] if xr
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
def build_branch(a, new_a, cur_indent, prev_indent, x, history=[])
|
153
|
-
if cur_indent > prev_indent then
|
154
|
-
new_a = history[-1]
|
155
|
-
new_inner_a = [x]
|
156
|
-
new_a << new_inner_a
|
157
|
-
history << new_inner_a
|
158
|
-
build_tree(a, history[-2], cur_indent, history)
|
159
|
-
elsif cur_indent == prev_indent then
|
160
|
-
new_inner_a = [x]
|
161
|
-
new_a << new_inner_a
|
162
|
-
history << new_inner_a
|
163
|
-
build_tree(a, new_inner_a, cur_indent, history)
|
164
|
-
else
|
165
|
-
# revert to the earlier new_a
|
166
|
-
return [cur_indent, x]
|
167
|
-
end
|
116
|
+
format_line!(@parent_node, LineTree.new(lines).to_a)
|
117
|
+
self
|
168
118
|
end
|
169
119
|
|
170
|
-
def
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
line= x[0].reverse.map(&:strip).join
|
178
|
-
|
120
|
+
def format_line!(records, a, i=0)
|
121
|
+
|
122
|
+
a.each do |x|
|
123
|
+
|
124
|
+
tag_name = @recordx[i].to_s
|
125
|
+
line = x.shift.join
|
126
|
+
|
179
127
|
@field_names = @format_masks[i].to_s.scan(/\[!(\w+)\]/).flatten.map(&:to_sym)
|
180
|
-
|
181
128
|
t = @format_masks[i].to_s.gsub(/\[!(\w+)\]/, '(.*)').sub(/\[/,'\[').sub(/\]/,'\]')
|
182
|
-
field_values = line.match(/#{t}/).captures
|
129
|
+
field_values = line.match(/#{t}/).captures
|
130
|
+
|
131
|
+
@id = (@id.to_i + 1).to_s
|
132
|
+
record = Element.new(tag_name)
|
133
|
+
record.add_attribute('id', @id)
|
134
|
+
summary = Element.new('summary')
|
183
135
|
|
184
|
-
|
136
|
+
@field_names.zip(field_values).each do |name, value|
|
137
|
+
field = Element.new(name.to_s)
|
138
|
+
field.text = value
|
139
|
+
summary.add field
|
140
|
+
end
|
185
141
|
|
186
|
-
|
187
|
-
out << indent + "<#{tag_name} id='#{@id}'><summary>#{fields}</summary>"
|
188
|
-
if x.length > 1 and x[0].is_a? Array then
|
189
|
-
#i2 += ' '
|
190
|
-
out << indent + "<records>\n"
|
191
|
-
x.shift
|
192
|
-
out << scan_link(x,i2 + ' ')
|
193
|
-
out << indent + "</records>\n"
|
194
|
-
else
|
195
|
-
out << indent + "<records/>\n"
|
142
|
+
new_records = Element.new('records')
|
196
143
|
|
197
|
-
|
198
|
-
|
144
|
+
record.add summary
|
145
|
+
record.add new_records
|
146
|
+
records.add record
|
147
|
+
|
148
|
+
format_line!(new_records, x, i+1) unless x.empty?
|
199
149
|
end
|
200
|
-
out.join
|
201
150
|
end
|
202
151
|
|
203
152
|
# -- end of full text edit methods
|
@@ -207,4 +156,3 @@ end
|
|
207
156
|
end
|
208
157
|
|
209
158
|
end
|
210
|
-
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polyrex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors: []
|
7
7
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-05-
|
12
|
+
date: 2010-05-23 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,6 +32,16 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: "0"
|
34
34
|
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: line-tree
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
35
45
|
description:
|
36
46
|
email:
|
37
47
|
executables: []
|