ruby-xml-smart 0.1.11-i486-linux

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 (73) hide show
  1. data/AUTHORS +4 -0
  2. data/COPYING +504 -0
  3. data/Changelog +192 -0
  4. data/README +52 -0
  5. data/Rakefile +112 -0
  6. data/TODO +6 -0
  7. data/examples/EXAMPLE.xml +17 -0
  8. data/examples/EXAMPLE.xml.sic +17 -0
  9. data/examples/Visualise/EXAMPLE.xml +18 -0
  10. data/examples/Visualise/term-ansicolor-0.0.4/CHANGES +11 -0
  11. data/examples/Visualise/term-ansicolor-0.0.4/GPL +340 -0
  12. data/examples/Visualise/term-ansicolor-0.0.4/README.en +23 -0
  13. data/examples/Visualise/term-ansicolor-0.0.4/Rakefile +72 -0
  14. data/examples/Visualise/term-ansicolor-0.0.4/VERSION +1 -0
  15. data/examples/Visualise/term-ansicolor-0.0.4/examples/cdiff.rb +20 -0
  16. data/examples/Visualise/term-ansicolor-0.0.4/examples/example.rb +82 -0
  17. data/examples/Visualise/term-ansicolor-0.0.4/install.rb +12 -0
  18. data/examples/Visualise/term-ansicolor-0.0.4/lib/term/ansicolor.rb +78 -0
  19. data/examples/Visualise/xpath_visual.rb +45 -0
  20. data/examples/add_children.rb +14 -0
  21. data/examples/add_elements.rb +13 -0
  22. data/examples/attrs.rb +15 -0
  23. data/examples/children.rb +14 -0
  24. data/examples/concurrent.rb +30 -0
  25. data/examples/copy.rb +23 -0
  26. data/examples/create.rb +18 -0
  27. data/examples/delete.rb +30 -0
  28. data/examples/move_elements.rb +12 -0
  29. data/examples/namespace.rb +14 -0
  30. data/examples/namespace_detailed.rb +36 -0
  31. data/examples/namespace_find.rb +20 -0
  32. data/examples/pull.rb +18 -0
  33. data/examples/qname.rb +16 -0
  34. data/examples/replace.rb +14 -0
  35. data/examples/set_OR_replace.rb +32 -0
  36. data/examples/signals.rb +28 -0
  37. data/examples/string.rb +27 -0
  38. data/examples/write.rb +11 -0
  39. data/examples/xpath_attrs.rb +19 -0
  40. data/examples/xpath_functions.rb +7 -0
  41. data/examples/xpath_root.rb +6 -0
  42. data/extconf.rb +29 -0
  43. data/rbxs.c +136 -0
  44. data/rbxs.h +53 -0
  45. data/rbxs_dom.c +483 -0
  46. data/rbxs_dom.h +32 -0
  47. data/rbxs_domattribute.c +189 -0
  48. data/rbxs_domattribute.h +18 -0
  49. data/rbxs_domattributeset.c +182 -0
  50. data/rbxs_domattributeset.h +17 -0
  51. data/rbxs_domelement.c +656 -0
  52. data/rbxs_domelement.h +18 -0
  53. data/rbxs_domnamespace.c +127 -0
  54. data/rbxs_domnamespace.h +18 -0
  55. data/rbxs_domnamespaceset.c +276 -0
  56. data/rbxs_domnamespaceset.h +17 -0
  57. data/rbxs_domnodeset.c +284 -0
  58. data/rbxs_domnodeset.h +19 -0
  59. data/rbxs_domother.c +121 -0
  60. data/rbxs_domother.h +18 -0
  61. data/rbxs_domtext.c +165 -0
  62. data/rbxs_domtext.h +18 -0
  63. data/rbxs_pull.c +244 -0
  64. data/rbxs_pull.h +17 -0
  65. data/rbxs_pullattribute.c +124 -0
  66. data/rbxs_pullattribute.h +18 -0
  67. data/rbxs_pullattributeset.c +156 -0
  68. data/rbxs_pullattributeset.h +17 -0
  69. data/rbxs_qname.c +267 -0
  70. data/rbxs_qname.h +18 -0
  71. data/rbxs_utils.h +39 -0
  72. data/test/namespace_test.rb +83 -0
  73. metadata +125 -0
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
6
+ node = doc.root.find("/test/names").first
7
+
8
+ # append children
9
+ node.add("test_node", {"attr" => 12}, "Muahaha")
10
+ node.add("test_node", "Muahaha", {"attr" => 13})
11
+ node.add("test_node", {"attr" => 14})
12
+ node.add("test_node", "Muahaha")
13
+ node.add("test_node")
14
+ puts doc
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
6
+ node = doc.root.find("/test/names/name[@team='2']").first
7
+
8
+ # add siblings
9
+ node.add_before("test_node",{"attr" => "12"}, "Muahaha")
10
+ node.add_after("test_node", "Muahaha", {"attr" => "13"})
11
+
12
+ # print doc
13
+ puts doc
data/examples/attrs.rb ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
5
+ attrs = doc.root.attributes
6
+
7
+ attrs.each { |n| puts n.inspect }
8
+ puts attrs.include?("attr2")
9
+
10
+ doc.find("//@xml:lang").each do |attr|
11
+ p attr.value
12
+ attr.value = "en"
13
+ end
14
+
15
+ puts doc.to_s
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
5
+ node = doc.find("/test/names").first
6
+
7
+ $stdout.sync = true
8
+ nums = 1000000
9
+ # Watch the power
10
+ 0.upto(nums) { |i|
11
+ test = node.children[0].to_s
12
+ test = node.children[0].to_s
13
+ print "#{i}/#{nums} runs#{13.chr}" if i%1000 == 0
14
+ }
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+ require 'time'
4
+
5
+ nums = 100000
6
+ # Watch the power
7
+
8
+ id = 16
9
+ e_matnr = "9906264"
10
+ e_name = "mangler"
11
+ e_secid = 1
12
+ exam = true
13
+
14
+ p = []
15
+ 0.upto(nums) do |i|
16
+ p[i] = Thread.new do
17
+ XML::Smart.modify("concurrent.xml","<solutions/>") do |xml|
18
+ res = xml.find("/solutions/solution[@matnr=\"#{e_matnr}\" or @secid=\"#{e_secid}\"]").delete_all! if exam
19
+ node = xml.root.add("solution",{:matnr => e_matnr, :name => e_name, :secid => e_secid, :when => Time.now.xmlschema, :assessment => id})
20
+ 1.upto(3) do |qbi|
21
+ qid = qbi*2
22
+ ques = node.add("question", :block => qbi, :question => qid)
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ p.each do |t|
29
+ t.join
30
+ end
data/examples/copy.rb ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
6
+ soc = XML::Smart.string("<?xml version='1.0'?><root><node id='1'><text>I am a text</text></node><node id='2'/></root>")
7
+
8
+ # copy a node
9
+ nodeA = doc.root.find("/test/names/name[5]").first
10
+ nodeB = soc.root.find("/root/node[@id='1']").first
11
+ nodeS = soc.root.find("/root/*")
12
+ doc.root.add(nodeA) # move the node (default, XML::Smart::Dom::Element::MOVE)
13
+ doc.root.add(nodeB) # copy the foreign node (default, XML::Smart::Dom::Element::COPY)
14
+
15
+ # copy the node 3 times
16
+ 3.times { doc.root.add(nodeA,XML::Smart::Dom::Element::COPY) }
17
+
18
+ # copy all elements in nodeset
19
+ doc.root.add(nodeS)
20
+
21
+ puts soc
22
+ puts "-" * 79
23
+ puts doc
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # When a string as second or third paramter is provided, then a empty
5
+ # xml file is created if it not exists. A block has to be supplied
6
+ #
7
+ # XML::Smart.modify(FILE,LOCKTIMEOUT,STRING) {} ... set timeout for lock file and create file if !exists?
8
+ # XML::Smart.modify(FILE,LOCKTIMEOUT) {} ... set timeout for lock
9
+ # XML::Smart.modify(FILE,STRING) {} ... create file if !exists?
10
+ # XML::Smart.modify(FILE) {} ... just open file change and write back (LOCKTIMEOUT defaults to 7)
11
+
12
+ XML::Smart.modify(File.dirname($0) + "/EXAMPLE.tmp.xml","<elements/>") { |doc|
13
+ node = doc.root.add("element",Time.now)
14
+ }
15
+
16
+ # Print the document
17
+ puts XML::Smart.open(File.dirname($0) + "/EXAMPLE.tmp.xml")
18
+
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
5
+ nodes = doc.root.find("/test/names/name")
6
+
7
+ puts "Original : #{nodes.to_a.inspect}"
8
+
9
+ nodes.delete_if!{ |n| n.text == "egon"}
10
+ puts "#delete_if! : #{nodes.to_a.inspect}"
11
+ puts "#length : #{nodes.length}"
12
+ puts "#nitems : #{nodes.nitems}"
13
+
14
+ nodes.delete_at!(2)
15
+ puts "#delete_at!(2) : #{nodes.to_a.inspect}"
16
+ puts "#length : #{nodes.length}"
17
+ puts "#nitems : #{nodes.nitems}"
18
+
19
+ nodes.delete_at!(-2)
20
+ puts "#delete_at!(-2): #{nodes.to_a.inspect}"
21
+ puts "#length : #{nodes.length}"
22
+ puts "#nitems : #{nodes.nitems}"
23
+
24
+ puts "\n"
25
+ nodes = doc.root.find("/test/names/name/@team")
26
+ puts "Original : #{nodes.to_a.inspect}"
27
+ nodes.delete_if!{ |n| n.to_i % 2 != 0}
28
+ puts "#delete_if!: #{nodes.to_a.inspect}"
29
+
30
+ puts doc
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
6
+ node = doc.find("/test/names/name[@team='2']").first
7
+
8
+ # add all elements that have a bigger team number as previous siblings
9
+ # (Egon is now before Kathrin in the document)
10
+ node.add_before(doc.find("/test/names/name[@team>'2']"))
11
+
12
+ puts doc
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ # add namespaces through a Hash
6
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
7
+ node = doc.root.find("/test/s:hallo", {"s" => "http://schemas.xmlsoap.org/wsdl/soap/"} ).first
8
+
9
+ # various aspects of the node
10
+ p node.name
11
+ puts node.name
12
+ puts node.name.prefix
13
+ puts node.name.namespace
14
+
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
6
+
7
+ # add an element hallo to root
8
+ nsnode = doc.root.add("hallo")
9
+
10
+ # add a namespace to the element
11
+ ns = nsnode.namespaces.add("test","http://heise")
12
+
13
+ # has the element a namespace? - No
14
+ p nsnode.namespace?
15
+
16
+ # set one
17
+ nsnode.namespace = ns
18
+
19
+ # has the element a namespace? - Yes
20
+ p nsnode.namespace?
21
+
22
+ # inspect the namespace + print (to_s)
23
+ p ns
24
+
25
+ # add a node, a namespace, then add the namespace to the element (via a string)
26
+ nsnode = doc.root.add("hallo")
27
+ nsnode.namespaces["sulu"] = "http://slashdot"
28
+ nsnode.namespace = "sulu" # nsnode.namespace = "http://slashdot" would have worked also
29
+ nsnode.namespaces["sulu"] = "http://slashdot/test"
30
+
31
+ # find namspaces
32
+ p nsnode.namespaces.find("soap")
33
+ p nsnode.namespaces.find("http://slashdot/test")
34
+
35
+ # print document
36
+ puts doc
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
6
+
7
+ # add a node with namespace
8
+ nsnode = doc.root.add("hallo")
9
+ ns = nsnode.namespaces.add("test","http://heise")
10
+ nsnode.add("test:entry")
11
+
12
+ # find node
13
+ puts "Find 1: #{doc.find("test:node").empty?}" rescue puts "Find 1: undefined namespace prefix"
14
+ puts "Find 2: #{doc.find("test:node",{"test" => "http://heise"}).empty?}"
15
+
16
+ doc.namespaces = {"t" => "http://heise"}
17
+ puts "Find 3: #{doc.find("t:node").empty?}"
18
+
19
+ # print document
20
+ puts doc
data/examples/pull.rb ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # with next
5
+ puller = XML::Smart.pull(File.open(File.dirname($0) + "/EXAMPLE.xml"))
6
+ while puller.next do
7
+ puts puller.to_s
8
+ p puller.node_type
9
+ end
10
+
11
+ # or with closure
12
+ XML::Smart.pull(File.open(File.dirname($0) + "/EXAMPLE.xml")) { |puller|
13
+ unless puller.attributes.empty?
14
+ puller.attributes.each { |qname,value|
15
+ puts "#{qname}=#{value}"
16
+ }
17
+ end
18
+ }
data/examples/qname.rb ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
6
+ node = doc.root.find("/test/s:hallo", {"s" => "http://schemas.xmlsoap.org/wsdl/soap/"} ).first
7
+
8
+ # check
9
+ if node.name == "hallo"
10
+ p node.name.name
11
+ p node.name.prefix
12
+ p node.name.namespace
13
+ p node.name.to_s
14
+ p node.name.inspect
15
+ p node.name
16
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ $stdout.sync = true
5
+ stime = Time.now.to_f
6
+ nums = 100000
7
+ # Watch the power
8
+ 0.upto(nums) { |i|
9
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
10
+ nodes = doc.root.find("/test/names/name[6]")
11
+ nodes.first.parent.add("name", { "team" => "2" }, "Egon")
12
+ print "#{i}/#{nums} runs#{13.chr}" if i % 100 == 0
13
+ }
14
+ puts "#{nums} parses from a file and some work done: #{Time.now.to_f - stime} seconds"
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+ require 'profile'
4
+
5
+ $stdout.sync = true
6
+ stime = Time.now.to_f
7
+ nums = 1000
8
+ # Watch the power
9
+ 1.upto(nums) { |i|
10
+ # create a XML document and copy the elements for each node to a file
11
+ soc = XML::Smart.string("<?xml version='1.0'?><root><node id='1'><text>I am a text</text></node><node id='2'/></root>")
12
+ soc.root.find("/root/node").each { |ele|
13
+ XML::Smart.modify(File.dirname($0) + "/#{ele.attributes["id"]}.xml","<services/>") { |cdoc|
14
+ cdoc.root.replace_by(ele)
15
+ }
16
+ }
17
+
18
+ # create a XML document and copy the elements for each node to a file
19
+ soc = XML::Smart.string("<?xml version='1.0'?><root><node id='1'><text>I am a text</text></node><node id='2'/></root>")
20
+ soc.root.find("/root/node").each { |ele|
21
+ XML::Smart.modify(File.dirname($0) + "/#{ele.attributes["id"]}.xml","<services/>") { |cdoc|
22
+ cdoc.root = ele
23
+ }
24
+ }
25
+
26
+ # create a file and copy a newly created XML document to it
27
+ XML::Smart.modify(File.dirname($0) + "/1.xml","<services/>") { |cdoc|
28
+ cdoc.root = XML::Smart.string("<root><node id='1'><text>I am a text</text></node><node id='2'/></root>").root
29
+ }
30
+ print "#{i}/#{nums} runs#{13.chr}" if i%100 == 0
31
+ }
32
+ puts "#{nums} parses from a file and some work done: #{Time.now.to_f - stime} seconds"
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
6
+ p = nil
7
+ 1.upto(2) do
8
+ doc.on_change do |type,node|
9
+ p node
10
+ end
11
+ p doc.change_handlers
12
+ p = Proc.new do |type,node|
13
+ puts "1"
14
+ end
15
+ doc.change_handlers << p
16
+ end
17
+ p doc.change_handlers
18
+ doc.change_handlers.delete(p)
19
+ p doc.change_handlers
20
+
21
+ $stdout.sync = true
22
+ stime = Time.now.to_f
23
+ nums = 1
24
+ # Watch the power
25
+ 0.upto(nums) { |i|
26
+ node = doc.find("/test/names/name").first
27
+ node.namespaces["a"] = "uri:b"
28
+ }
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # create a string
5
+ xmldoc = "<?xml version='1.0' encoding='ISO-8859-1'?>\n"
6
+ xmldoc << "<contributors>
7
+ <guy id='1' nick='eTM'>J�rgen</guy>
8
+ <guy id='2' nick='chris2'>Christian</guy>
9
+ <guy id='3'>Emanuel</guy>
10
+ <guy id='4'>41</guy>\n"
11
+ xmldoc << "</contributors>"
12
+
13
+ # parse it
14
+ doc = XML::Smart.string(xmldoc)
15
+
16
+ # output all guys with a nickname (the � is a UTF-8 character in the output)
17
+ # cause (always) everything that is returned is UTF-8
18
+ doc.root.find("/contributors/guy[@nick]").each { |ele|
19
+ puts "#{ele} (#{ele.attributes.include?("ick")})"
20
+ puts "#{ele} (#{ele.attributes["nick"]})"
21
+ }
22
+
23
+ # query arthur dent
24
+ puts doc.root.find("/contributors/guy[@id='4']").first.to_i + 1
25
+
26
+ # write to a file
27
+ File.open(File.dirname($0) + "/EXAMPLE.str.xml",File::WRONLY|File::CREAT|File::TRUNC) { |f| doc.save_as f }
data/examples/write.rb ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # When a closure is used, then the changes are written back to the disk
5
+ XML::Smart.modify(File.dirname($0) + "/EXAMPLE.xml") { |doc|
6
+ node = doc.root.find("/test/names/name")[0]
7
+ node.text = Time.now
8
+ }
9
+
10
+ # Print the document
11
+ puts XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
6
+ node = doc.root.find("/test/names/name[2]/@team").first
7
+
8
+ p node.name == "tea"
9
+ # print attribute name and value
10
+ puts node.name + "=" + node.value
11
+ puts node.name + "=" + node.to_s
12
+ puts node.inspect
13
+
14
+ # set the value of the attribute
15
+ node.value = "Value"
16
+ p node
17
+
18
+ node = doc.root.find("/test/names/name[2]/@team").first.value = "Hi all"
19
+ p node
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ # No closure, so changes are temporary
5
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
6
+ p doc.root.find("count(/test/names/name)")
7
+ p doc.root.find("string(/test/names/name/@team)")
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/ruby
2
+ require "#{File.dirname($0)}/../smart"
3
+
4
+ doc = XML::Smart.open(File.dirname($0) + "/EXAMPLE.xml")
5
+ node = doc.find("//*/text()")
6
+ node.each { |n| puts n.path }
data/extconf.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'mkmf'
2
+ require 'rbconfig'
3
+
4
+ PKG_NAME = 'xml/smart'
5
+
6
+ include Config
7
+
8
+ unless File.exists?('extconf.h')
9
+ $LIBPATH.push(Config::CONFIG['libdir'])
10
+ unless have_library("z", "inflate")
11
+ puts "Error: zlib is needed"
12
+ exit 1
13
+ else
14
+ $defs.push('-DHAVE_ZLIB_H')
15
+ end
16
+ unless have_library("xml2", "xmlXPtrNewRange")
17
+ puts "Error: libxml2 is needed"
18
+ puts " Install libxml2 library or try one of the following options to extconf.rb:"
19
+ puts " --with-xml2-dir=/path/to/libxml2"
20
+ puts " --with-xml2-lib=/path/to/libxml2/lib"
21
+ puts " --with-xml2-include=/path/to/libxml2/include"
22
+ exit 1
23
+ end
24
+ $LDFLAGS << ' ' + `xml2-config --libs`.chomp
25
+ $CFLAGS << ' ' + `xml2-config --cflags`.chomp
26
+ $CFLAGS = '-g -Wall ' + $CFLAGS
27
+ create_header()
28
+ create_makefile(PKG_NAME,".")
29
+ end
data/rbxs.c ADDED
@@ -0,0 +1,136 @@
1
+ #include "rbxs.h"
2
+ #include "rbxs_qname.h"
3
+ #include "rbxs_dom.h"
4
+ #include "rbxs_domnamespace.h"
5
+ #include "rbxs_domnamespaceset.h"
6
+ #include "rbxs_domelement.h"
7
+ #include "rbxs_domtext.h"
8
+ #include "rbxs_domother.h"
9
+ #include "rbxs_domnodeset.h"
10
+ #include "rbxs_domattribute.h"
11
+ #include "rbxs_domattributeset.h"
12
+ #include "rbxs_pull.h"
13
+ #include "rbxs_pullattribute.h"
14
+ #include "rbxs_pullattributeset.h"
15
+ #include "rbxs_utils.h"
16
+
17
+ /* -- */
18
+ //***********************************************************************************
19
+ // Constructors
20
+ //***********************************************************************************
21
+ /* ++ */
22
+
23
+ /*
24
+ * Documentation
25
+ */
26
+ VALUE rbxs_main_modify(int argc, VALUE *argv, VALUE class)
27
+ {
28
+ char *root;
29
+ unsigned short int lock;
30
+
31
+ Check_Type(argv[0], T_STRING);
32
+
33
+ root = NULL;
34
+ lock = 7;
35
+ switch (argc) {
36
+ case 3:
37
+ if ((TYPE(argv[2]) == T_FIXNUM) && (TYPE(argv[1]) != T_STRING)) {
38
+ Check_Type(argv[2], T_FIXNUM);
39
+ lock = NUM2INT(argv[2]);
40
+ root = StringValuePtr(argv[1]);
41
+ } else if ((TYPE(argv[1]) == T_FIXNUM) && (TYPE(argv[2]) != T_STRING)) {
42
+ Check_Type(argv[1], T_FIXNUM);
43
+ lock = NUM2INT(argv[1]);
44
+ root = StringValuePtr(argv[2]);
45
+ } else
46
+ rb_raise(rb_eArgError, "argument 2 and 3 have to be Hash and Integer");
47
+ break;
48
+ case 2:
49
+ if (TYPE(argv[1]) == T_STRING)
50
+ root = StringValuePtr(argv[1]);
51
+ else if (TYPE(argv[1]) == T_FIXNUM) {
52
+ Check_Type(argv[2], T_FIXNUM);
53
+ lock = NUM2INT(argv[2]);
54
+ } else
55
+ rb_raise(rb_eArgError, "argument 2 has to be a String or an Integer");
56
+ break;
57
+ case 1:
58
+ break;
59
+ default:
60
+ rb_raise(rb_eArgError, "wrong number of arguments (need 1, 2 or 3)");
61
+ }
62
+ return(rbxs_dom_open(argv[0],root,lock,1));
63
+ }
64
+
65
+ /*
66
+ * Documentation
67
+ */
68
+ VALUE rbxs_main_open(VALUE class, VALUE name)
69
+ {
70
+ Check_Type(name, T_STRING);
71
+ return(rbxs_dom_open(name,NULL,0,0));
72
+ }
73
+ /*
74
+ * Documentation
75
+ */
76
+ VALUE rbxs_main_open_b(VALUE class, VALUE name, VALUE str)
77
+ {
78
+ Check_Type(name, T_STRING);
79
+ Check_Type(str, T_STRING);
80
+ return(rbxs_dom_open(name,StringValuePtr(str),0,0));
81
+ }
82
+ /*
83
+ * Documentation
84
+ */
85
+ VALUE rbxs_main_string(VALUE class, VALUE string)
86
+ {
87
+ return(rbxs_dom_string(string));
88
+ }
89
+ /*
90
+ * Documentation
91
+ */
92
+ VALUE rbxs_main_pull(VALUE class, VALUE what)
93
+ {
94
+ return(rbxs_pull_new(cSmartPull,what));
95
+ }
96
+
97
+ //***********************************************************************************
98
+ // Initialize module and class
99
+ //***********************************************************************************
100
+ VALUE mXML;
101
+ VALUE cSmart;
102
+
103
+ void Init_smart( void ) {
104
+ mXML = rb_define_module( "XML" );
105
+ cSmart = rb_define_class_under( mXML, "Smart", rb_cObject );
106
+
107
+ // libxml init
108
+ xmlKeepBlanksDefault(0);
109
+ xmlLineNumbersDefault(0);
110
+ defaultEntityLoader = xmlGetExternalEntityLoader();
111
+ xmlSetExternalEntityLoader(xmllintExternalEntityLoader);
112
+
113
+ rb_define_const(cSmart, "LIBXML_VERSION", rb_str_new2(LIBXML_DOTTED_VERSION));
114
+ rb_define_const(cSmart, "VERSION", rb_str_new2(RBXS_VERSION));
115
+
116
+ rb_define_singleton_method(cSmart, "modify", rbxs_main_modify, -1);
117
+ rb_define_singleton_method(cSmart, "open!", rbxs_main_open_b, 2);
118
+ rb_define_singleton_method(cSmart, "open", rbxs_main_open, 1);
119
+ rb_define_singleton_method(cSmart, "new", rbxs_main_string, 1);
120
+ rb_define_singleton_method(cSmart, "string", rbxs_main_string, 1);
121
+ rb_define_singleton_method(cSmart, "pull", rbxs_main_pull, 1);
122
+
123
+ init_rbxs_qname();
124
+ init_rbxs_dom();
125
+ init_rbxs_domnamespaceset();
126
+ init_rbxs_domnamespace();
127
+ init_rbxs_domelement();
128
+ init_rbxs_domtext();
129
+ init_rbxs_domother();
130
+ init_rbxs_domnodeset();
131
+ init_rbxs_domattribute();
132
+ init_rbxs_domattributeset();
133
+ init_rbxs_pull();
134
+ init_rbxs_pullattributeset();
135
+ init_rbxs_pullattribute();
136
+ }
data/rbxs.h ADDED
@@ -0,0 +1,53 @@
1
+ /* Please see the COPYING file for copyright and distribution information */
2
+
3
+ #ifndef __RBXS_H__
4
+ #define __RBXS_H__
5
+
6
+ #include <ruby.h>
7
+ #ifdef RUBY_VM
8
+ #include <ruby/io.h>
9
+ #include <ruby/st.h>
10
+ #else
11
+ #include <version.h>
12
+ #include <rubyio.h>
13
+ #include <st.h>
14
+ #if (RUBY_VERSION_MAJOR == 1 && RUBY_VERSION_MINOR == 8 && RUBY_VERSION_TEENY < 7)
15
+ #define RHASH_SIZE(h) (RHASH(h)->tbl ? RHASH(h)->tbl->num_entries : 0)
16
+ #endif
17
+ #define RHASH_EMPTY_P(h) (RHASH_SIZE(h) == 0)
18
+ #endif
19
+
20
+ #ifdef HAVE_RB_IO_T
21
+ #define RB_IO_T rb_io_t
22
+ #if (RUBY_VERSION_MAJOR == 1 && RUBY_VERSION_MINOR == 8 && RUBY_VERSION_TEENY < 7)
23
+ #define RB_IO_T_FD(o) o->fd
24
+ #else
25
+ #define RB_IO_T_FD(o) fileno(o->f)
26
+ #endif
27
+ #else
28
+ #define RB_IO_T OpenFile
29
+ #define RB_IO_T_FD(o) fileno(o->f)
30
+ #endif
31
+
32
+ #include <stdlib.h>
33
+ #include <stdio.h>
34
+ #include <string.h>
35
+ #include <assert.h>
36
+
37
+ #include <libxml/parser.h>
38
+ #include <libxml/parserInternals.h>
39
+ #include <libxml/tree.h>
40
+ #include <libxml/xpath.h>
41
+ #include <libxml/xpathInternals.h>
42
+ #include <libxml/xmlreader.h>
43
+ #include <libxml/xmlsave.h>
44
+
45
+ #define RBXS_VERSION "0.1.11"
46
+
47
+ #define RBXS_PARSER_TYPE_DOM 0
48
+ #define RBXS_PARSER_TYPE_READER 1
49
+
50
+ RUBY_EXTERN VALUE mXML;
51
+ RUBY_EXTERN VALUE cSmart;
52
+
53
+ #endif