polyrex-parser 0.2.8 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/polyrex-parser.rb +64 -13
  2. metadata +13 -11
@@ -13,48 +13,99 @@ class PolyrexParser
13
13
  def to_a()
14
14
  @a
15
15
  end
16
+
17
+ def to_s()
18
+ name, value, attributes, *remaining = @a
19
+ [value.strip, scan_a(remaining)].flatten.join(' ')
20
+ end
16
21
 
17
22
  private
18
23
 
19
- def parse(s)
24
+ def scan_a(a)
25
+ a.inject([]) do |r, x|
26
+ name, value, attributes, *remaining = x
27
+ text_remaining = scan_a remaining if remaining
20
28
 
29
+ value = '' if name == 'format_mask' or name == 'schema' or name == 'recordx_type'
30
+ r << value.strip << text_remaining if value
31
+ end
32
+ end
33
+
34
+ def parse(s)
21
35
  s.instance_eval{
22
36
  def fetch_summary()
23
- name = 'summary'
24
- self.slice(((self =~ /<#{name}>/) + name.length + 2) .. \
25
- (self =~ /<\/#{name}>/m) - 1) if self[/<#{name}>/]
37
+ name = 'summary'
38
+ self.slice(((self =~ /<#{name}>/) + name.length + 2) .. \
39
+ (self =~ /<\/#{name}>/m) - 1) if self[/<#{name}>/]
26
40
  end
27
41
  def fetch_records()
28
- name = 'records'
29
- self.slice(((self =~ /<#{name}>/) + name.length + 2) .. \
30
- (self.rindex(/<\/#{name}>/m)) - 1) if self[/<#{name}>/]
42
+ name = 'records'
43
+ self.slice(((self =~ /<#{name}/) + name.length + 2) .. \
44
+ (self.rindex(/<\/#{name}>/m)) - 1) if self[/<\/#{name}/]
31
45
  end
32
46
  }
33
47
 
34
48
  root_name, raw_attributes = s.match(/<(\w+)(\s[^\/>]+)?/).captures
35
49
  attributes = get_attributes(raw_attributes) if raw_attributes
50
+ raw_summary = s.fetch_summary
36
51
 
37
- summary = RexleParser.new("<summary>#{s.fetch_summary}</summary>").to_a
52
+ summary = RexleParser.new("<summary>#{raw_summary}</summary>").to_a
38
53
 
39
54
  raw_records = s.fetch_records
40
55
  records = nil
41
56
 
57
+
42
58
  if raw_records then
59
+
43
60
  node_name = raw_records[/<(\w+)/,1]
44
- record_threads = raw_records.strip.split(/(?=<#{node_name}[^>]*>)/).map do |x|
45
- Thread.new{ Thread.current[:record] = parse(x) }
61
+
62
+ #record_threads = raw_records.strip.split(/(?=<#{node_name}[^>]*>)/).map do |x|
63
+
64
+ a = []
65
+ i = 0
66
+
67
+ while i < raw_records.strip.length do
68
+ i = scan_s(raw_records, node_name, i) + 1
69
+ a << i
70
+ end
71
+
72
+
73
+ record_threads = ([0] + a).each_cons(2).map do |s1, s2|
74
+ raw_s = raw_records[s1...s2]
75
+
76
+ Thread.new{ Thread.current[:record] = parse(raw_s) }
46
77
  end
47
78
  records = record_threads.map{|x| x.join; x[:record]}
79
+
48
80
  end
49
81
 
50
82
  [root_name, "", attributes ||= {}, [*summary], ['records', "",{}, *records]]
83
+
51
84
  end
52
85
 
53
- def get_attributes(raw_attributes)
86
+
87
+ def scan_s(s, node_name, instances=0, i=0)
88
+
89
+ r = s[i..-1] =~ /<\/?#{node_name}/
90
+ l = node_name.length + 1
91
+ return s.length if r.nil?
92
+
93
+ if s.slice(i + r,l) == "<#{node_name}" then
94
+ scan_s(s, node_name, instances+1, i + r + l)
95
+ else
96
+ if instances > 1 then
97
+ scan_s(s, node_name, instances - 1, i + r + node_name.length + 3)
98
+ else
99
+ return i + r + node_name.length + 2
100
+ end
101
+ end
102
+
103
+ end
104
+
105
+ def get_attributes(raw_attributes)
54
106
  raw_attributes.scan(/(\w+\='[^']+')|(\w+\="[^"]+")/).map(&:compact).flatten.inject({}) do |r, x|
55
107
  attr_name, val = x.split(/=/)
56
108
  r.merge(attr_name.to_sym => val[1..-2])
57
109
  end
58
- end
59
-
110
+ end
60
111
  end
metadata CHANGED
@@ -1,27 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyrex-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ prerelease:
5
+ version: 0.3.0
5
6
  platform: ruby
6
- authors: []
7
-
7
+ authors:
8
+ - James Robertson
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2011-02-09 00:00:00 +00:00
13
+ date: 2011-11-20 00:00:00 +00:00
13
14
  default_executable:
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: recordx-parser
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
20
21
  requirements:
21
22
  - - ">="
22
23
  - !ruby/object:Gem::Version
23
24
  version: "0"
24
- version:
25
+ type: :runtime
26
+ version_requirements: *id001
25
27
  description:
26
28
  email:
27
29
  executables: []
@@ -42,21 +44,21 @@ rdoc_options: []
42
44
  require_paths:
43
45
  - lib
44
46
  required_ruby_version: !ruby/object:Gem::Requirement
47
+ none: false
45
48
  requirements:
46
49
  - - ">="
47
50
  - !ruby/object:Gem::Version
48
51
  version: "0"
49
- version:
50
52
  required_rubygems_version: !ruby/object:Gem::Requirement
53
+ none: false
51
54
  requirements:
52
55
  - - ">="
53
56
  - !ruby/object:Gem::Version
54
57
  version: "0"
55
- version:
56
58
  requirements: []
57
59
 
58
60
  rubyforge_project:
59
- rubygems_version: 1.3.5
61
+ rubygems_version: 1.5.2
60
62
  signing_key:
61
63
  specification_version: 3
62
64
  summary: polyrex-parser