polyrex 0.1.2 → 0.2.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.
Files changed (2) hide show
  1. data/lib/polyrex.rb +97 -0
  2. metadata +2 -2
data/lib/polyrex.rb CHANGED
@@ -48,6 +48,7 @@ end
48
48
 
49
49
  end
50
50
 
51
+ # -- start of crud methods --
51
52
  def valid_creation?()
52
53
 
53
54
  xpath = BacktrackXPath.new(@parent_node).to_s.gsub('//','/')
@@ -85,6 +86,102 @@ end
85
86
  @parent_node = XPath.first(@doc.root, "//[@id='#{id}']")
86
87
  self
87
88
  end
89
+ # -- end of crud methods --
90
+
91
+ # -- start of full text edit methods
92
+ def format_masks
93
+ @format_masks
94
+ end
95
+
96
+ def parse(lines)
97
+ a = lines.split("\n")
98
+
99
+ a.map! do |x|
100
+ x.match(/(\s+)?(.*)/).captures
101
+ end
102
+
103
+ new_a = []
104
+ history = []
105
+ history << new_a
106
+
107
+ root_format_mask = @format_masks.shift
108
+ field_names = root_format_mask.to_s.scan(/\[!(\w+)\]/).flatten.map(&:to_sym)
109
+ root_name = @recordx.shift
110
+
111
+ build_tree(a, new_a, 0, history)
112
+ out = scan_link(new_a)
113
+
114
+ summary = field_names.map {|x| "<%s/>" % x}.join
115
+ @doc = Document.new("<%s><summary>%s</summary></%s>" % [root_name, summary, root_name])
116
+ records = Document.new("<records>%s</records>" % out)
117
+ @doc.root.add records
118
+ end
119
+
120
+ def build_tree(a, new_a, prev_indent, history=[])
121
+ if a.length > 0 then
122
+ x = a.shift
123
+ n = x.shift
124
+ cur_indent = n ? n.length : 0
125
+ indent, xr = build_branch(a, new_a, cur_indent, prev_indent, x, history )
126
+
127
+ if xr then
128
+ history.pop
129
+ cur_indent, xr = build_branch(a, history[-1] || new_a, indent, prev_indent, xr, history )
130
+ return [cur_indent, xr] if xr
131
+ end
132
+ end
133
+ end
134
+
135
+ def build_branch(a, new_a, cur_indent, prev_indent, x, history=[])
136
+ if cur_indent > prev_indent then
137
+ new_a = history[-1]
138
+ new_inner_a = [x]
139
+ new_a << new_inner_a
140
+ history << new_inner_a
141
+ build_tree(a, history[-2], cur_indent, history)
142
+ elsif cur_indent == prev_indent then
143
+ new_inner_a = [x]
144
+ new_a << new_inner_a
145
+ history << new_inner_a
146
+ build_tree(a, new_inner_a, cur_indent, history)
147
+ else
148
+ # revert to the earlier new_a
149
+ return [cur_indent, x]
150
+ end
151
+ end
152
+
153
+ def scan_link(a,indent='')
154
+ out = []
155
+ i2 = indent.clone
156
+ a.each do |x|
157
+ i = indent.length / 2
158
+ tag_name = @recordx[i].to_s
159
+
160
+ line= x[0].reverse.map(&:strip).join
161
+ @field_names = @format_masks[i].to_s.scan(/\[!(\w+)\]/).flatten.map(&:to_sym)
162
+
163
+ t = @format_masks[i].to_s.gsub(/\[!(\w+)\]/, '(.*)').sub(/\[/,'\[').sub(/\]/,'\]')
164
+ field_values = line.match(/#{t}/).captures
165
+
166
+ fields = @field_names.zip(field_values).map{|name, value| "<%s>%s</%s>" % [name,value,name]}.join
167
+
168
+ out << indent + "<#{tag_name}><summary>#{fields}</summary>"
169
+ if x.length > 1 and x[0].is_a? Array then
170
+ #i2 += ' '
171
+ out << indent + "<records>\n"
172
+ x.shift
173
+ out << scan_link(x,i2 + ' ')
174
+ out << indent + "</records>\n"
175
+ else
176
+ out << indent + "<records/>\n"
177
+
178
+ end
179
+ out << indent + "</#{tag_name}>\n"
180
+ end
181
+ out.join
182
+ end
183
+
184
+ # -- end of full text edit methods
88
185
 
89
186
  def to_xml()
90
187
  @doc.to_s
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.1.2
4
+ version: 0.2.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-19 00:00:00 +01:00
12
+ date: 2010-05-22 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency