xml-motor 0.0.2

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/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in xml-motor.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,199 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module XMLIndexHandler
4
+ def self.get_node_indexes(xml_motor, tag)
5
+ xml_idx_to_find = []
6
+ xml_motor.xmltags[tag.split(".")[0]].each_value do |v|
7
+ xml_idx_to_find.push v
8
+ end
9
+ xml_idx_to_find = xml_idx_to_find.flatten
10
+
11
+ tag.split(".")[1..-1].each do |tag_i|
12
+ outer_idx = xml_idx_to_find
13
+ osize=outer_idx.size/2 -1
14
+ x_curr=[]
15
+ xml_motor.xmltags[tag_i].each_value do |v|
16
+ x_curr.push v
17
+ end
18
+ x_curr = x_curr.flatten
19
+ xsize=x_curr.size/2 -1
20
+
21
+ xml_idx_to_find = expand_node_indexes outer_idx, osize, x_curr, xsize
22
+ end
23
+ xml_idx_to_find
24
+ end
25
+
26
+ def self.expand_node_indexes(outer_idx, osize, x_curr, xsize)
27
+ exapnded_node_indexes = []
28
+ 0.upto osize do |o|
29
+ o1=outer_idx[o*2]
30
+ o2=outer_idx[o*2 +1]
31
+ 0.upto xsize do |x|
32
+ x1=x_curr[x*2]
33
+ x2=x_curr[x*2 +1]
34
+ unless o1>x1 or o2<x2
35
+ exapnded_node_indexes.push x1
36
+ exapnded_node_indexes.push x2
37
+ end
38
+ end
39
+ end
40
+ exapnded_node_indexes.flatten
41
+ end
42
+ end
43
+
44
+ module XMLChopper
45
+ def self.get_tag_attrib_value(tag_value)
46
+ tag_value_split = tag_value.split(/>/)
47
+ in_tag = tag_value_split.first
48
+ out_tag = tag_value_split[1..-1].join
49
+ in_tag_split = in_tag.split(/[ \t]/)
50
+ tag_name = in_tag_split.first
51
+ attribzone = in_tag_split[1..-1].flatten.join(' ')
52
+ attrs = get_attribute_hash attribzone
53
+ [[tag_name,attrs],out_tag]
54
+ end
55
+
56
+ def self.get_attribute_hash(attribzone)
57
+ attribzone = attribzone.strip unless attribzone.nil?
58
+ return nil if attribzone.nil? or attribzone==""
59
+ attrs = {}
60
+ broken_attrib = attribzone.split(/=/)
61
+ attribs = broken_attrib.first.strip
62
+ values = nil
63
+ broken_attrib[1..-2].each do |attrib_part|
64
+ value_n_attrib = attrib_part.split(/[ \t]/)
65
+ values = value_n_attrib[0..-2].join(' ')
66
+ attrs[attribs] = values
67
+ attribs = value_n_attrib[-1].strip
68
+ end
69
+ values = broken_attrib.last.strip
70
+ attrs[attribs] = values
71
+ attrs
72
+ end
73
+ end
74
+
75
+ module XMLJoiner
76
+ def self.dejavu_attributes(attrib_hash)
77
+ return nil if attrib_hash.nil?
78
+ attributes=""
79
+ attrib_hash.each_key do |hash_key|
80
+ attributes += " " + hash_key + "=" + attrib_hash[hash_key]
81
+ end
82
+ attributes
83
+ end
84
+ end
85
+
86
+ ##
87
+ # main class
88
+ ##
89
+
90
+ module XMLMotorHandler
91
+ def self._splitter_(xmldata)
92
+ @xmlnodes=[xmldata.split(/</)[0]]
93
+ xmldata.split(/</)[1..-1].each do |x1|
94
+ @xmlnodes.push XMLChopper.get_tag_attrib_value(x1)
95
+ end
96
+ end
97
+
98
+ def self._indexify_
99
+ @xmltags = {}
100
+ idx = 1
101
+ depth = 0
102
+ @xmlnodes[1..-1].each do |xnode|
103
+ tag_name = xnode[0][0]
104
+ unless tag_name.match(/^\/.*/) then
105
+ @xmltags[tag_name] ||= {}
106
+ @xmltags[tag_name][depth] ||= []
107
+ @xmltags[tag_name][depth].push idx
108
+ depth += 1
109
+ else
110
+ depth -= 1
111
+ @xmltags[tag_name[1..-1]][depth] ||= []
112
+ @xmltags[tag_name[1..-1]][depth].push idx
113
+ end
114
+ idx +=1
115
+ end
116
+ end
117
+
118
+ def self._grab_my_node_ (xml_to_find, attrib_to_find=nil)
119
+ unless attrib_to_find.nil?
120
+ attrib_key = attrib_to_find.split(/=/)[0].strip
121
+ attrib_val = attrib_to_find.split(/=/)[1..-1].join.strip
122
+ end
123
+ nodes = []
124
+ node_count = xml_to_find.size/2 -1
125
+ 0.upto node_count do |ncount|
126
+ node_start = xml_to_find[ncount*2]
127
+ node_stop = xml_to_find[ncount*2 +1]
128
+ unless attrib_to_find.nil? or @xmlnodes[node_start][0][1].nil?
129
+ next unless @xmlnodes[node_start][0][1][attrib_key] == attrib_val
130
+ end
131
+ nodes[ncount] ||= ""
132
+ nodes[ncount] += @xmlnodes[node_start][1] unless @xmlnodes[node_start][1].nil?
133
+ (node_start+1).upto (node_stop-1) do |node_idx|
134
+ any_attrib ||= ""
135
+ any_attrib = XMLJoiner.dejavu_attributes(@xmlnodes[node_idx][0][1]).to_s unless @xmlnodes[node_idx][0][1].nil?
136
+ nodes[ncount] += "<" + @xmlnodes[node_idx][0][0] + any_attrib + ">"
137
+ nodes[ncount] += @xmlnodes[node_idx][1] unless @xmlnodes[node_idx][1].nil?
138
+ end
139
+ end
140
+ nodes.delete(nil) unless attrib_to_find.nil?
141
+ nodes
142
+ end
143
+
144
+ def self.xml_handler(xmldata, tag_to_find=nil, attrib_to_find=nil)
145
+ _splitter_ xmldata
146
+ _indexify_
147
+ my_nodes = nil
148
+ if attrib_to_find.nil?
149
+ xml_to_find = XMLIndexHandler.get_node_indexes self, tag_to_find
150
+ my_nodes = _grab_my_node_ xml_to_find
151
+ elsif tag_to_find.nil?
152
+ elsif !attrib_to_find.nil? and !tag_to_find.nil?
153
+ xml_to_find = XMLIndexHandler.get_node_indexes self, tag_to_find
154
+ my_nodes = _grab_my_node_ xml_to_find, attrib_to_find
155
+ end
156
+ my_nodes
157
+ end
158
+
159
+ def self.xmlnodes
160
+ @xmlnodes
161
+ end
162
+
163
+ def self.xmltags
164
+ @xmltags
165
+ end
166
+ end
167
+
168
+ ##
169
+ # XMLMotor_EXECUTIONER ;)
170
+ ##
171
+
172
+ module XMLMotor
173
+ def self.get_node_from_file(file, my_tag=nil, my_attrib=nil)
174
+ unless file.nil?
175
+ if File.readable? file
176
+ begin
177
+ return XMLMotorHandler.xml_handler File.read(file), my_tag, my_attrib
178
+ rescue
179
+ puts "Error: problem parsing File Content"
180
+ end
181
+ else
182
+ puts "Error: #{file} is not readable."
183
+ end
184
+ end
185
+ return ""
186
+ end
187
+
188
+ def self.get_node_from_content(content, my_tag=nil, my_attrib=nil)
189
+ unless content.nil?
190
+ begin
191
+ return XMLMotorHandler.xml_handler content, my_tag, my_attrib
192
+ rescue
193
+ puts "Error problem parsing String Content #{content}"
194
+ end
195
+ end
196
+ return ""
197
+ end
198
+ end
199
+
@@ -0,0 +1,5 @@
1
+ module Xml
2
+ module Motor
3
+ VERSION = "0.0.2"
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ echo "Building GEM File"
2
+ gem build xml-motor.gemspec
@@ -0,0 +1,46 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "xml-motor/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "xml-motor"
7
+ s.version = Xml::Motor::VERSION
8
+ s.authors = ["abhishekkr"]
9
+ s.email = ["abhishk@thoughtworks.com"]
10
+ s.homepage = "http://github.com/abhishekkr/rubygem_xml_motor"
11
+ s.summary = %q{An easy-to-use XML Parser without any Native Dependencies}
12
+ s.description = %q{A new short XML Parsing Algorithm implemented directly in >500 lines. An easy-to-use XML Parser without any Native Dependencies.
13
+ [How To Use]:
14
+
15
+ Loading:
16
+ + $ gem install xml-motor
17
+ + 'require' the 'xml-motor'
18
+
19
+ Usage:
20
+ + To find values of an xml node from an xml file
21
+ XMLMotor.get_node_from_file <file_with_path>, <node>
22
+ + To find values of an xml node from an xml string
23
+ XMLMotor.get_node_from_content <xml_string>, <node>
24
+ + To find values of an xml node with a tag_name having required attribute
25
+ XMLMotor.get_node_from_content <xml_string>, <node>, "<attrib_key>=<attrib_value>"
26
+
27
+ Example Calls As Code:
28
+ + XMLMotor.get_node_from_content "<A>a</A><B><A>ba</A></B>", "A"
29
+ RETURNS: ["a", "ba"]
30
+ + XMLMotor.get_node_from_content "<A>a</A><B><A>ba</A></B>", "B.A"
31
+ RETURNS: ["ba"]
32
+ + XMLMotor.get_node_from_content "<A i='1'>a</A><B><A i='2'>ba</A></B>", "A", "i='1'"
33
+ RETURNS: ["a"]
34
+ }
35
+
36
+ s.rubyforge_project = "xml-motor"
37
+
38
+ s.files = `git ls-files`.split("\n")
39
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
40
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
41
+ s.require_paths = ["lib"]
42
+
43
+ # specify any dependencies here; for example:
44
+ # s.add_development_dependency "rspec"
45
+ # s.add_runtime_dependency "rest-client"
46
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xml-motor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - abhishekkr
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-06 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: ! "A new short XML Parsing Algorithm implemented directly in >500 lines.
15
+ An easy-to-use XML Parser without any Native Dependencies.\n [How To Use]:\n\n
16
+ \ Loading:\n + $ gem install xml-motor\n + 'require' the 'xml-motor'\n\n
17
+ \ Usage:\n + To find values of an xml node from an xml file\n XMLMotor.get_node_from_file
18
+ <file_with_path>, <node>\n + To find values of an xml node from an xml string\n
19
+ \ XMLMotor.get_node_from_content <xml_string>, <node>\n + To find
20
+ values of an xml node with a tag_name having required attribute\n XMLMotor.get_node_from_content
21
+ <xml_string>, <node>, \"<attrib_key>=<attrib_value>\"\n\n Example Calls As
22
+ Code:\n + XMLMotor.get_node_from_content \"<A>a</A><B><A>ba</A></B>\", \"A\"\n
23
+ \ RETURNS: [\"a\", \"ba\"]\n + XMLMotor.get_node_from_content
24
+ \"<A>a</A><B><A>ba</A></B>\", \"B.A\"\n RETURNS: [\"ba\"]\n +
25
+ XMLMotor.get_node_from_content \"<A i='1'>a</A><B><A i='2'>ba</A></B>\", \"A\",
26
+ \"i='1'\"\n RETURNS: [\"a\"]\n "
27
+ email:
28
+ - abhishk@thoughtworks.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - Gemfile
34
+ - Rakefile
35
+ - lib/xml-motor.rb
36
+ - lib/xml-motor/version.rb
37
+ - make_my_gem.sh
38
+ - xml-motor.gemspec
39
+ homepage: http://github.com/abhishekkr/rubygem_xml_motor
40
+ licenses: []
41
+ post_install_message:
42
+ rdoc_options: []
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ requirements: []
58
+ rubyforge_project: xml-motor
59
+ rubygems_version: 1.8.11
60
+ signing_key:
61
+ specification_version: 3
62
+ summary: An easy-to-use XML Parser without any Native Dependencies
63
+ test_files: []