libxml-ruby 0.3.6 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +28 -3
- data/LICENSE +2 -2
- data/README +21 -6
- data/Rakefile +13 -8
- data/TODO +5 -12
- data/ext/xml/extconf.rb +17 -17
- data/ext/xml/libxml.c +2 -2
- data/ext/xml/libxml.h +5 -2
- data/ext/xml/libxml.rb +107 -0
- data/ext/xml/ruby_xml_dtd.c +3 -3
- data/ext/xml/ruby_xml_node.c +112 -25
- data/ext/xml/ruby_xml_node_set.c +61 -10
- data/ext/xml/ruby_xml_parser.c +62 -8
- data/ext/xml/ruby_xml_sax_parser.c +298 -53
- data/ext/xml/ruby_xml_sax_parser.h +32 -1
- data/ext/xml/ruby_xml_schema.c +1 -1
- data/ext/xml/ruby_xml_schema.h +1 -1
- data/ext/xml/ruby_xml_xpath.c +7 -1
- data/ext/xml/ruby_xml_xpath_context.c +2 -1
- data/ext/xml/ruby_xml_xpath_context.h +2 -2
- data/ext/xml/ruby_xml_xpointer_context.c +1 -2
- data/ext/xml/sax_parser_callbacks.inc +202 -0
- data/tests/copy_bug.rb +1 -2
- data/tests/dtd-test.rb +1 -1
- data/tests/libxml_test.rb +2 -0
- data/tests/model/saxtest.xml +5 -0
- data/tests/runner.rb +2 -4
- data/tests/schema-test.rb +1 -1
- data/tests/tc_xml_document.rb +2 -2
- data/tests/tc_xml_document_write.rb +2 -2
- data/tests/tc_xml_document_write2.rb +2 -2
- data/tests/tc_xml_document_write3.rb +2 -2
- data/tests/tc_xml_node.rb +2 -2
- data/tests/tc_xml_node2.rb +2 -2
- data/tests/tc_xml_node3.rb +28 -0
- data/tests/tc_xml_node4.rb +84 -0
- data/tests/tc_xml_node_set.rb +2 -2
- data/tests/tc_xml_node_set2.rb +38 -0
- data/tests/tc_xml_node_xlink.rb +2 -2
- data/tests/tc_xml_parser.rb +2 -2
- data/tests/tc_xml_parser2.rb +2 -2
- data/tests/tc_xml_parser3.rb +2 -2
- data/tests/tc_xml_parser4.rb +2 -2
- data/tests/tc_xml_parser5.rb +2 -2
- data/tests/tc_xml_parser6.rb +2 -2
- data/tests/tc_xml_parser7.rb +2 -2
- data/tests/tc_xml_parser8.rb +32 -0
- data/tests/tc_xml_parser_context.rb +2 -2
- data/tests/tc_xml_xinclude.rb +2 -2
- data/tests/tc_xml_xpath.rb +3 -2
- data/tests/tc_xml_xpointer.rb +3 -2
- data/tests/test_xml_sax_parser.rb +64 -0
- metadata +13 -6
- data/tests/tc_default_validation.rb +0 -0
data/CHANGELOG
CHANGED
@@ -1,14 +1,39 @@
|
|
1
|
-
=====
|
1
|
+
===== 15.4.2006 Ross Bamford <rosco at roscopeco.co.uk>
|
2
|
+
* Implemented SAX parser callback handling
|
3
|
+
|
4
|
+
===== 12.4.2006 Ross Bamford <rosco at roscopeco.co.uk>
|
5
|
+
* Integrated / tested community patches
|
6
|
+
* Defined XML::Node (hash) equality in terms of XML representation
|
7
|
+
|
8
|
+
===== 12.4.2006 Tim Yamin <plasmaroo at gentoo.org> (patches)
|
9
|
+
* Fixed XML::Node#content inoperable bug
|
10
|
+
* Fixed memory leak in same
|
11
|
+
|
12
|
+
===== 12.4.2006 Mark Van Holstyn <mvette13 at gmail.com> (patches)
|
13
|
+
* Added XML::Node::Set#first
|
14
|
+
* Added XML::Node::Set#empty?
|
15
|
+
* Fixes to XML::Node::Set#to_a
|
16
|
+
* Added XML::Node#find_first
|
17
|
+
* Added XML::Node#remove!
|
18
|
+
|
19
|
+
===== 27.3.2006 Ross Bamford <rosco at roscopeco.co.uk>
|
20
|
+
* Integrated contributed XML::Parser.register_error_handler patch
|
21
|
+
|
22
|
+
===== 27.2.2006 Ross Bamford <rosco at roscopeco.co.uk>
|
23
|
+
* Fixed all multiple symbol definitions for -fno-common.
|
24
|
+
* Removed OSX -fno-common workaround.
|
25
|
+
|
26
|
+
===== 21.2.2006 Ross Bamford <rosco at roscopeco.co.uk>
|
2
27
|
* Patched extconf.rb with OSX -fno-common workaround
|
3
28
|
* Added gem and packaging support to Rakefile
|
4
29
|
* Moved version update to Rakefile
|
5
30
|
* Removed legacy project utility scripts
|
6
31
|
|
7
|
-
===== 19.2.2006 Ross Bamford <rosco
|
32
|
+
===== 19.2.2006 Ross Bamford <rosco at roscopeco.co.uk>
|
8
33
|
* Fixed doublefree bug in ruby_xml_attr.
|
9
34
|
* Fixed small leak in parser
|
10
35
|
|
11
|
-
===== 18.12.2005 Ross Bamford <rosco
|
36
|
+
===== 18.12.2005 Ross Bamford <rosco at roscopeco.co.uk>
|
12
37
|
* Updated for GCC 4.0 (community patches)
|
13
38
|
* Fixed default validation bug
|
14
39
|
* Refactored project, removed outdated files, cleaned up tests.
|
data/LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# $Id: LICENSE,v 1.
|
1
|
+
# $Id: LICENSE,v 1.3 2006/02/28 09:57:52 roscopeco Exp $
|
2
2
|
|
3
|
-
Copyright (c) 2002-
|
3
|
+
Copyright (c) 2002-2006 Sean Chittenden <sean@chittenden.org> and contributors
|
4
4
|
Copyright (c) 2001 Wai-Sun "Squidster" Chia <waisun.chia@compaq.com>
|
5
5
|
|
6
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
data/README
CHANGED
@@ -2,13 +2,25 @@
|
|
2
2
|
|
3
3
|
Installation is simple. Follow the following steps:
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
=== Rubygems
|
6
|
+
|
7
|
+
gem install libxml-ruby
|
8
|
+
|
9
|
+
=== Tarball/zip
|
10
|
+
|
11
|
+
$ rake test
|
12
|
+
$ rake install
|
8
13
|
|
9
14
|
If extconf yacks up an error, follow the instructions it provides.
|
10
|
-
|
11
|
-
|
15
|
+
You will need to chdir to ext/xml and run 'ruby extconf.rb' to provide
|
16
|
+
options, after which you can either use Rake for everything or
|
17
|
+
do with make (make && make install).
|
18
|
+
|
19
|
+
Once installed, look at the test scripts (tests/*.rb), and run
|
20
|
+
'rake doc' to generate API documentation.
|
21
|
+
You can find the latest documentation at:
|
22
|
+
|
23
|
+
* http://libxml.rubyforge.org/doc
|
12
24
|
|
13
25
|
== DEPENDENCIES
|
14
26
|
|
@@ -28,7 +40,9 @@ Basic usage for reading and writing documents.
|
|
28
40
|
|
29
41
|
Writing a simple document:
|
30
42
|
|
43
|
+
# require 'rubygems' # if installed via Gems
|
31
44
|
require 'xml/libxml'
|
45
|
+
|
32
46
|
doc = XML::Document.new()
|
33
47
|
doc.root = XML::Node.new('root_node')
|
34
48
|
root = doc.root
|
@@ -94,6 +108,7 @@ perform this operation. This reads in and processes the above
|
|
94
108
|
generated XML document, output.xml. This script assumes that the
|
95
109
|
structure of the document is already known.
|
96
110
|
|
111
|
+
# require 'rubygems' # if installed via Gems
|
97
112
|
require 'xml/libxml'
|
98
113
|
doc = XML::Document.file('output.xml')
|
99
114
|
root = doc.root
|
@@ -126,4 +141,4 @@ And your terminal should look like:
|
|
126
141
|
|
127
142
|
If you have any questions, please send email to libxml-devel@rubyforge.org.
|
128
143
|
|
129
|
-
# $Id: README,v 1.
|
144
|
+
# $Id: README,v 1.5 2006/04/24 19:29:49 roscopeco Exp $
|
data/Rakefile
CHANGED
@@ -71,14 +71,14 @@ task :test => :unittests
|
|
71
71
|
|
72
72
|
Rake::TestTask.new(:alltests) do |t|
|
73
73
|
t.test_files = FileList[
|
74
|
-
'tests/
|
74
|
+
'tests/runner.rb',
|
75
75
|
'tests/contrib/*.rb',
|
76
76
|
]
|
77
77
|
t.verbose = true
|
78
78
|
end
|
79
79
|
|
80
80
|
Rake::TestTask.new(:unittests) do |t|
|
81
|
-
t.test_files = FileList['tests/
|
81
|
+
t.test_files = FileList['tests/runner.rb']
|
82
82
|
t.verbose = false
|
83
83
|
end
|
84
84
|
|
@@ -98,7 +98,8 @@ rd = Rake::RDocTask.new(:doc) do |rdoc|
|
|
98
98
|
rdoc.title = "Libxml-Ruby API"
|
99
99
|
rdoc.options << '--main' << 'README'
|
100
100
|
rdoc.rdoc_files.include('README', 'LICENSE', 'TODO')
|
101
|
-
rdoc.rdoc_files.include('ext/xml/ruby_xml*.c', '
|
101
|
+
rdoc.rdoc_files.include('ext/xml/ruby_xml*.c', 'ext/xml/*.rb')
|
102
|
+
rdoc.rdoc_files.include('*.rdoc')
|
102
103
|
end
|
103
104
|
|
104
105
|
desc "Publish the RDoc documentation to project web site"
|
@@ -119,9 +120,13 @@ end
|
|
119
120
|
task :update_version do
|
120
121
|
unless PKG_VERSION == CURRENT_VERSION
|
121
122
|
File.open('ext/xml/libxml.h.new','w+') do |f|
|
123
|
+
maj, min, mic = /(\d+)\.(\d+)(?:\.(\d+))?/.match(PKG_VERSION).captures
|
122
124
|
f << File.read('ext/xml/libxml.h').
|
123
125
|
gsub(/RUBY_LIBXML_VERSION\s+"(\d.+)"/) { "RUBY_LIBXML_VERSION \"#{PKG_VERSION}\"" }.
|
124
|
-
gsub(/RUBY_LIBXML_VERNUM\s+\d+/) { "RUBY_LIBXML_VERNUM #{PKG_VERSION.tr('.','')}" }
|
126
|
+
gsub(/RUBY_LIBXML_VERNUM\s+\d+/) { "RUBY_LIBXML_VERNUM #{PKG_VERSION.tr('.','').sub(/^0*/,'')}" }.
|
127
|
+
gsub(/RUBY_LIBXML_VER_MAJ\s+\d+/) { "RUBY_LIBXML_VER_MAJ #{maj}" }.
|
128
|
+
gsub(/RUBY_LIBXML_VER_MIN\s+\d+/) { "RUBY_LIBXML_VER_MIN #{min}" }.
|
129
|
+
gsub(/RUBY_LIBXML_VER_MIC\s+\d+/) { "RUBY_LIBXML_VER_MIC #{mic || 0}" }
|
125
130
|
end
|
126
131
|
mv('ext/xml/libxml.h.new', 'ext/xml/libxml.h')
|
127
132
|
end
|
@@ -130,7 +135,8 @@ end
|
|
130
135
|
PKG_FILES = FileList[
|
131
136
|
'ext/xml/extconf.rb',
|
132
137
|
'[A-Z]*',
|
133
|
-
'ext/xml/*.c',
|
138
|
+
'ext/xml/*.c',
|
139
|
+
'ext/xml/*.inc',
|
134
140
|
'ext/xml/ruby_xml*.h',
|
135
141
|
'ext/xml/libxml.h',
|
136
142
|
'tests/**/*',
|
@@ -161,11 +167,10 @@ else
|
|
161
167
|
|
162
168
|
#### Documentation and testing.
|
163
169
|
s.has_rdoc = true
|
164
|
-
s.extra_rdoc_files = rd.rdoc_files.
|
170
|
+
s.extra_rdoc_files = rd.rdoc_files.to_a
|
165
171
|
s.rdoc_options <<
|
166
172
|
'--title' << 'Libxml-Ruby API' <<
|
167
|
-
'--main' << 'README'
|
168
|
-
'-o' << 'rdoc'
|
173
|
+
'--main' << 'README'
|
169
174
|
|
170
175
|
s.test_files = Dir.glob('tests/*runner.rb')
|
171
176
|
|
data/TODO
CHANGED
@@ -1,19 +1,10 @@
|
|
1
|
-
$Id: TODO,v 1.
|
1
|
+
$Id: TODO,v 1.4 2006/04/12 12:08:39 roscopeco Exp $
|
2
2
|
|
3
3
|
==== BUGS
|
4
4
|
|
5
|
-
* Hunt down a 4-8KB/s leak while running rubytest -i0 -F on the library.
|
6
|
-
|
7
|
-
* Also some other C-side problems:
|
8
|
-
* doublefree at Ruby exit when copying nodes between documents,
|
9
|
-
and using node sets, sample trace in node_set_bug.txt
|
10
|
-
* XML::Attr.name gives [BUG] segfault line.
|
11
|
-
|
12
5
|
* Some C funcs need more NULL checking, they're throwing wierd
|
13
6
|
ArgumentErrors into RubyLand. See TODOs in source.
|
14
7
|
|
15
|
-
* Get libxml to compile and build with OS-X.
|
16
|
-
|
17
8
|
==== ENHANCEMENTS
|
18
9
|
|
19
10
|
* Add warnings to each of the xpath functions if xpath isn't compiled
|
@@ -51,8 +42,6 @@ $Id: TODO,v 1.1 2005/12/19 19:53:07 roscopeco Exp $
|
|
51
42
|
'return(Qnil)' with exceptions if 'return(Qnil)' is being used for
|
52
43
|
signaling an error or inability to process the document.
|
53
44
|
|
54
|
-
* Pointer target signedness warnings (GCC 4.0)
|
55
|
-
|
56
45
|
* Need to add the ability to create namespace objects and modify them
|
57
46
|
accordingly.
|
58
47
|
|
@@ -78,6 +67,10 @@ $Id: TODO,v 1.1 2005/12/19 19:53:07 roscopeco Exp $
|
|
78
67
|
|
79
68
|
* Add ability to append hashes and arrays via the XML::Node#<< method.
|
80
69
|
|
70
|
+
* Node (etc.) #[] should support symbol keys.
|
71
|
+
|
72
|
+
* Make nodes comparable (on qualified name?)
|
73
|
+
|
81
74
|
==== Data Serialization
|
82
75
|
|
83
76
|
* Need to define DTD for basic ruby types that have been XML serialized
|
data/ext/xml/extconf.rb
CHANGED
@@ -42,8 +42,10 @@ else
|
|
42
42
|
$defs.push('-DHAVE_ZLIB_H')
|
43
43
|
end
|
44
44
|
|
45
|
-
unless have_library('iconv','iconv_open') or
|
46
|
-
|
45
|
+
unless have_library('iconv','iconv_open') or
|
46
|
+
have_library('c','iconv_open') or
|
47
|
+
have_library('recode','iconv_open') or
|
48
|
+
have_library('iconv')
|
47
49
|
crash(<<EOL)
|
48
50
|
need libiconv.
|
49
51
|
|
@@ -56,7 +58,13 @@ need libiconv.
|
|
56
58
|
EOL
|
57
59
|
end
|
58
60
|
|
59
|
-
unless have_library('xml2', 'xmlParseDoc')
|
61
|
+
unless (have_library('xml2', 'xmlParseDoc') or
|
62
|
+
find_library('xml2', '/opt/lib', '/usr/local/lib', '/usr/lib')) and
|
63
|
+
(have_header('libxml/xmlversion.h') or
|
64
|
+
find_header('libxml/xmlversion.h',
|
65
|
+
'/opt/include/libxml2',
|
66
|
+
'/usr/local/include/libxml2',
|
67
|
+
'/usr/include/libxml2'))
|
60
68
|
crash(<<EOL)
|
61
69
|
need libxml2.
|
62
70
|
|
@@ -76,20 +84,12 @@ unless have_func('docbCreateFileParserCtxt')
|
|
76
84
|
crash('Need docbCreateFileParserCtxt')
|
77
85
|
end
|
78
86
|
|
79
|
-
|
80
|
-
$
|
87
|
+
if try_compile('int main() { return 0; }','-Wall')
|
88
|
+
$CFLAGS << ' -Wall'
|
89
|
+
end
|
81
90
|
|
82
|
-
$CFLAGS << ' '
|
83
|
-
$
|
84
|
-
$CFLAGS = '-g -Wall ' + $CFLAGS
|
91
|
+
$CFLAGS << ' ' << $INCFLAGS
|
92
|
+
$INSTALLFILES = [["../xml/libxml.rb", "$(RUBYLIBDIR)", "../xml"]]
|
85
93
|
|
86
94
|
create_header()
|
87
|
-
create_makefile('xml/
|
88
|
-
|
89
|
-
# Quick hack around a problem building on OSX
|
90
|
-
if RUBY_PLATFORM =~ /darwin/
|
91
|
-
mf = File.read('Makefile')
|
92
|
-
File.open('Makefile','w+') do |f|
|
93
|
-
f << mf.gsub(/^CFLAGS\s+=\s+(.*)/) { "CFLAGS = #{$1.gsub('-fno-common','')}" }
|
94
|
-
end
|
95
|
-
end
|
95
|
+
create_makefile('xml/libxml_so')
|
data/ext/xml/libxml.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/* $Id: libxml.c,v 1.
|
1
|
+
/* $Id: libxml.c,v 1.2 2006/04/17 13:30:22 roscopeco Exp $ */
|
2
2
|
|
3
3
|
/* Please see the LICENSE file for copyright and distribution information */
|
4
4
|
|
@@ -46,7 +46,7 @@ static xmlReallocFunc reallocFunc = NULL;
|
|
46
46
|
static xmlStrdupFunc strdupFunc = NULL;
|
47
47
|
|
48
48
|
void
|
49
|
-
|
49
|
+
Init_libxml_so(void) {
|
50
50
|
/* Some libxml memory goo that should be done before anything else */
|
51
51
|
xmlMemGet((xmlFreeFunc *) & freeFunc,
|
52
52
|
(xmlMallocFunc *) & mallocFunc,
|
data/ext/xml/libxml.h
CHANGED
@@ -6,8 +6,11 @@
|
|
6
6
|
/* Don't nuke this block! It is used for automatically updating the
|
7
7
|
* versions below. VERSION = string formatting, VERNUM = numbered
|
8
8
|
* version for inline testing: increment both or none at all. */
|
9
|
-
#define RUBY_LIBXML_VERSION "0.3.
|
10
|
-
#define RUBY_LIBXML_VERNUM
|
9
|
+
#define RUBY_LIBXML_VERSION "0.3.8"
|
10
|
+
#define RUBY_LIBXML_VERNUM 38
|
11
|
+
#define RUBY_LIBXML_VER_MAJ 0
|
12
|
+
#define RUBY_LIBXML_VER_MIN 3
|
13
|
+
#define RUBY_LIBXML_VER_MIC 8
|
11
14
|
|
12
15
|
#include <ruby.h>
|
13
16
|
#include <rubyio.h>
|
data/ext/xml/libxml.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
# $Id: libxml.rb,v 1.1 2006/04/17 13:30:22 roscopeco Exp $
|
2
|
+
# Please see the LICENSE file for copyright and distribution information
|
3
|
+
require 'xml/libxml_so'
|
4
|
+
|
5
|
+
class XML::Node::Set
|
6
|
+
def empty? #:nodoc:
|
7
|
+
self.length <= 0
|
8
|
+
end
|
9
|
+
|
10
|
+
def first #:nodoc:
|
11
|
+
self.each { |n| return n }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class XML::Document
|
16
|
+
include Enumerable
|
17
|
+
|
18
|
+
# maybe, maybe not...
|
19
|
+
def each(&blk) #:nodoc:
|
20
|
+
find('//*').each(&blk)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class XML::Node::Set
|
25
|
+
# inefficient, but maybe can find a way to cache the
|
26
|
+
# ary and dump on change?
|
27
|
+
def [](i, count = nil) #:nodoc:
|
28
|
+
if count
|
29
|
+
to_a[i,count]
|
30
|
+
else
|
31
|
+
to_a[i]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_s #:nodoc:
|
36
|
+
to_a.to_s
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
module XML::SiblingEnum #:nodoc:all
|
41
|
+
private
|
42
|
+
|
43
|
+
# Iterates nodes and attributes
|
44
|
+
def siblings(node, &blk)
|
45
|
+
if n = node
|
46
|
+
loop do
|
47
|
+
blk.call(n)
|
48
|
+
break unless n = n.next
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class XML::Node
|
55
|
+
include XML::SiblingEnum
|
56
|
+
include Enumerable
|
57
|
+
include Comparable
|
58
|
+
|
59
|
+
# maybe these don't belong on all nodes...
|
60
|
+
def each_child(&blk) #:nodoc:
|
61
|
+
siblings(child, &blk)
|
62
|
+
end
|
63
|
+
|
64
|
+
def each_attr(&blk) #:nodoc:
|
65
|
+
siblings(properties, &blk)
|
66
|
+
end
|
67
|
+
|
68
|
+
# all siblings INCLUDING self
|
69
|
+
def each_sibling(&blk) #:nodoc:
|
70
|
+
siblings(self, &blk)
|
71
|
+
end
|
72
|
+
|
73
|
+
# I guess this is what you'd expect?
|
74
|
+
alias :each :each_child
|
75
|
+
|
76
|
+
def to_a #:nodoc:
|
77
|
+
inject([]) { |ary,n| ary << n }
|
78
|
+
end
|
79
|
+
|
80
|
+
def <=>(other) #:nodoc:
|
81
|
+
to_s <=> other.to_s
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class XML::Attr
|
86
|
+
include XML::SiblingEnum
|
87
|
+
include Enumerable
|
88
|
+
|
89
|
+
def each_sibling(&blk) #:nodoc:
|
90
|
+
siblings(self,&blk)
|
91
|
+
end
|
92
|
+
|
93
|
+
alias :each_attr :each_sibling
|
94
|
+
alias :each :each_sibling
|
95
|
+
|
96
|
+
def to_h #:nodoc:
|
97
|
+
inject({}) do |h,a| h[a.name] = a.value end
|
98
|
+
end
|
99
|
+
|
100
|
+
def to_a #:nodoc:
|
101
|
+
inject([]) do |ary,a| ary << [a.name, a.value] end
|
102
|
+
end
|
103
|
+
|
104
|
+
def to_s #:nodoc:
|
105
|
+
"#{name} = #{value}"
|
106
|
+
end
|
107
|
+
end
|
data/ext/xml/ruby_xml_dtd.c
CHANGED
@@ -22,10 +22,10 @@ ruby_xml_dtd_mark(ruby_xml_dtd *rxdtd) {
|
|
22
22
|
|
23
23
|
/*
|
24
24
|
* call-seq:
|
25
|
-
* XML::
|
26
|
-
* XML::
|
25
|
+
* XML::Dtd.new("public system") => dtd
|
26
|
+
* XML::Dtd.new("public", "system") => dtd
|
27
27
|
*
|
28
|
-
* Create a new
|
28
|
+
* Create a new Dtd from the specified public and system
|
29
29
|
* identifiers.
|
30
30
|
*/
|
31
31
|
VALUE
|
data/ext/xml/ruby_xml_node.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/* $Id: ruby_xml_node.c,v 1.
|
1
|
+
/* $Id: ruby_xml_node.c,v 1.3 2006/04/12 12:08:39 roscopeco Exp $ */
|
2
2
|
|
3
3
|
/* Please see the LICENSE file for copyright and distribution information */
|
4
4
|
|
@@ -141,7 +141,7 @@ ruby_xml_node_content_add(VALUE self, VALUE obj) {
|
|
141
141
|
} else {
|
142
142
|
str = rb_obj_as_string(obj);
|
143
143
|
if (NIL_P(str) || TYPE(str) != T_STRING)
|
144
|
-
rb_raise(rb_eTypeError, "invalid
|
144
|
+
rb_raise(rb_eTypeError, "invalid argument: must be string or XML::Node");
|
145
145
|
|
146
146
|
xmlNodeAddContent(node->node, (xmlChar*)StringValuePtr(str));
|
147
147
|
return(obj);
|
@@ -158,24 +158,17 @@ ruby_xml_node_content_add(VALUE self, VALUE obj) {
|
|
158
158
|
VALUE
|
159
159
|
ruby_xml_node_content_get(VALUE self) {
|
160
160
|
ruby_xml_node *rxn;
|
161
|
-
|
161
|
+
xmlChar *content;
|
162
|
+
VALUE out;
|
163
|
+
|
162
164
|
Data_Get_Struct(self, ruby_xml_node, rxn);
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
165
|
+
content = xmlNodeGetContent(rxn->node);
|
166
|
+
out = rb_str_new2((const char *) content);
|
167
|
+
xmlFree(content);
|
168
|
+
|
169
|
+
return out;
|
168
170
|
}
|
169
171
|
|
170
|
-
/////////////////////////////////////////////
|
171
|
-
// TODO may be bugged:
|
172
|
-
//
|
173
|
-
// node.content = "123"
|
174
|
-
// node.content => nil
|
175
|
-
// node.content_stripped => nil
|
176
|
-
// node.to_s => "<head xml:base=\"123\">wow</head>"
|
177
|
-
|
178
|
-
|
179
172
|
/*
|
180
173
|
* call-seq:
|
181
174
|
* node.content = "string"
|
@@ -193,15 +186,14 @@ ruby_xml_node_content_set(VALUE self, VALUE content) {
|
|
193
186
|
}
|
194
187
|
|
195
188
|
|
196
|
-
/////////////////////////////////////////////////////
|
197
|
-
// TODO may be bugged: see above
|
198
|
-
//
|
199
|
-
|
200
189
|
/*
|
201
190
|
* call-seq:
|
202
191
|
* node.content_stripped => "string"
|
203
192
|
*
|
204
193
|
* Obtain this node's stripped content.
|
194
|
+
*
|
195
|
+
* *Deprecated*: Stripped content can be obtained via the
|
196
|
+
* +content+ method.
|
205
197
|
*/
|
206
198
|
VALUE
|
207
199
|
ruby_xml_node_content_stripped_get(VALUE self) {
|
@@ -584,6 +576,28 @@ ruby_xml_node_entity_ref_q(VALUE self) {
|
|
584
576
|
return(Qfalse);
|
585
577
|
}
|
586
578
|
|
579
|
+
VALUE ruby_xml_node_to_s(VALUE self);
|
580
|
+
|
581
|
+
/*
|
582
|
+
* call-seq:
|
583
|
+
* node.eql?(other_node) => (true|false)
|
584
|
+
*
|
585
|
+
* Test equality between the two nodes. Equality is determined based
|
586
|
+
* on the XML representation of the nodes.
|
587
|
+
*/
|
588
|
+
VALUE
|
589
|
+
ruby_xml_node_eql_q(VALUE self, VALUE other) {
|
590
|
+
// TODO this isn't the best way to handle this
|
591
|
+
ruby_xml_node *rxn, *orxn;
|
592
|
+
VALUE thisxml, otherxml;
|
593
|
+
Data_Get_Struct(self, ruby_xml_node, rxn);
|
594
|
+
Data_Get_Struct(other, ruby_xml_node, orxn);
|
595
|
+
thisxml = ruby_xml_node_to_s(self);
|
596
|
+
otherxml = ruby_xml_node_to_s(other);
|
597
|
+
|
598
|
+
return(rb_funcall(thisxml, rb_intern("=="), 1, otherxml));
|
599
|
+
}
|
600
|
+
|
587
601
|
|
588
602
|
/*
|
589
603
|
* call-seq:
|
@@ -609,6 +623,34 @@ ruby_xml_node_find(int argc, VALUE *argv, VALUE self) {
|
|
609
623
|
return(ruby_xml_xpath_find2(vargc, vargv));
|
610
624
|
}
|
611
625
|
|
626
|
+
/*
|
627
|
+
* call-seq:
|
628
|
+
* node.find_first(xpath_expr, namespace = [any]) => nodeset
|
629
|
+
*
|
630
|
+
* Find the first node matching the specified xpath expression, optionally
|
631
|
+
* using the specified namespaces. Returns an XML::Node.
|
632
|
+
*/
|
633
|
+
VALUE
|
634
|
+
ruby_xml_node_find_first(int argc, VALUE *argv, VALUE self) {
|
635
|
+
VALUE ns = ruby_xml_node_find(argc, argv, self);
|
636
|
+
ruby_xml_node_set *rxnset;
|
637
|
+
|
638
|
+
Data_Get_Struct(ns, ruby_xml_node_set, rxnset);
|
639
|
+
if (rxnset->node_set == NULL || rxnset->node_set->nodeNr < 1)
|
640
|
+
return(Qnil);
|
641
|
+
|
642
|
+
VALUE nodeobj;
|
643
|
+
switch(rxnset->node_set->nodeTab[0]->type) {
|
644
|
+
case XML_ATTRIBUTE_NODE:
|
645
|
+
nodeobj = ruby_xml_attr_new2(cXMLAttr, rxnset->xd, (xmlAttrPtr)rxnset->node_set->nodeTab[0]);
|
646
|
+
break;
|
647
|
+
default:
|
648
|
+
nodeobj = ruby_xml_node_new2(cXMLNode, rxnset->xd, rxnset->node_set->nodeTab[0]);
|
649
|
+
}
|
650
|
+
|
651
|
+
return(nodeobj);
|
652
|
+
}
|
653
|
+
|
612
654
|
|
613
655
|
/*
|
614
656
|
* call-seq:
|
@@ -638,6 +680,24 @@ void ruby_xml_node_free(ruby_xml_node *rxn) {
|
|
638
680
|
}
|
639
681
|
|
640
682
|
|
683
|
+
/*
|
684
|
+
* call-seq:
|
685
|
+
* node.hash => fixnum
|
686
|
+
*
|
687
|
+
* Returns the hash-code for this node. This is the hash of the XML
|
688
|
+
* representation in order to be consistent with eql.
|
689
|
+
*/
|
690
|
+
VALUE
|
691
|
+
ruby_xml_node_hash(VALUE self) {
|
692
|
+
ruby_xml_node *rxn;
|
693
|
+
VALUE thisxml;
|
694
|
+
Data_Get_Struct(self, ruby_xml_node, rxn);
|
695
|
+
thisxml = ruby_xml_node_to_s(self);
|
696
|
+
|
697
|
+
return(rb_funcall(thisxml, rb_intern("hash"), 0));
|
698
|
+
}
|
699
|
+
|
700
|
+
|
641
701
|
/*
|
642
702
|
* call-seq:
|
643
703
|
* node.html_doc? => (true|false)
|
@@ -1599,10 +1659,17 @@ ruby_xml_node_property_set(VALUE self, VALUE key, VALUE val) {
|
|
1599
1659
|
xmlAttrPtr attr;
|
1600
1660
|
VALUE rattr;
|
1601
1661
|
|
1602
|
-
Check_Type(key, T_STRING);
|
1603
|
-
Check_Type(val, T_STRING);
|
1604
1662
|
Data_Get_Struct(self, ruby_xml_node, node);
|
1605
|
-
|
1663
|
+
Check_Type(key, T_STRING);
|
1664
|
+
|
1665
|
+
if( val == Qnil ) {
|
1666
|
+
attr = xmlSetProp(node->node, (xmlChar*)StringValuePtr(key), NULL);
|
1667
|
+
xmlRemoveProp( attr );
|
1668
|
+
return Qnil;
|
1669
|
+
} else {
|
1670
|
+
Check_Type(val, T_STRING);
|
1671
|
+
}
|
1672
|
+
|
1606
1673
|
attr = xmlSetProp(node->node, (xmlChar*)StringValuePtr(key), (xmlChar*)StringValuePtr(val));
|
1607
1674
|
if (attr == NULL) {
|
1608
1675
|
attr = xmlNewProp(node->node, (xmlChar*)StringValuePtr(key), (xmlChar*)StringValuePtr(val));
|
@@ -1656,6 +1723,21 @@ ruby_xml_node_properties_q(VALUE self) {
|
|
1656
1723
|
}
|
1657
1724
|
|
1658
1725
|
|
1726
|
+
/*
|
1727
|
+
* call-seq:
|
1728
|
+
* node.remove! => nil
|
1729
|
+
*
|
1730
|
+
* Removes this node from it's parent.
|
1731
|
+
*/
|
1732
|
+
VALUE
|
1733
|
+
ruby_xml_node_remove_ex(VALUE self) {
|
1734
|
+
ruby_xml_node *rxn;
|
1735
|
+
Data_Get_Struct(self, ruby_xml_node, rxn);
|
1736
|
+
xmlUnlinkNode(rxn->node);
|
1737
|
+
return(Qnil);
|
1738
|
+
}
|
1739
|
+
|
1740
|
+
|
1659
1741
|
/*
|
1660
1742
|
* call-seq:
|
1661
1743
|
* node.search_href => namespace
|
@@ -1800,7 +1882,6 @@ ruby_xml_node_to_s(VALUE self) {
|
|
1800
1882
|
buf = xmlBufferCreate();
|
1801
1883
|
xmlNodeDump(buf, rxn->node->doc, rxn->node, 0, 1);
|
1802
1884
|
result = rb_str_new2((const char*)buf->content);
|
1803
|
-
// TODO result = rb_str_new2((const char*)buf->content); ?
|
1804
1885
|
|
1805
1886
|
xmlBufferFree(buf);
|
1806
1887
|
return result;
|
@@ -2004,8 +2085,11 @@ ruby_init_xml_node(void) {
|
|
2004
2085
|
rb_define_method(cXMLNode, "empty?", ruby_xml_node_empty_q, 0);
|
2005
2086
|
rb_define_method(cXMLNode, "entity?", ruby_xml_node_entity_q, 0);
|
2006
2087
|
rb_define_method(cXMLNode, "entity_ref?", ruby_xml_node_entity_ref_q, 0);
|
2088
|
+
rb_define_method(cXMLNode, "eql?", ruby_xml_node_eql_q, 1);
|
2007
2089
|
rb_define_method(cXMLNode, "find", ruby_xml_node_find, -1);
|
2090
|
+
rb_define_method(cXMLNode, "find_first", ruby_xml_node_find_first, -1);
|
2008
2091
|
rb_define_method(cXMLNode, "fragment?", ruby_xml_node_fragment_q, 0);
|
2092
|
+
rb_define_method(cXMLNode, "hash", ruby_xml_node_hash, 0);
|
2009
2093
|
rb_define_method(cXMLNode, "html_doc?", ruby_xml_node_html_doc_q, 0);
|
2010
2094
|
rb_define_method(cXMLNode, "lang", ruby_xml_node_lang_get, 0);
|
2011
2095
|
rb_define_method(cXMLNode, "lang=", ruby_xml_node_lang_set, 1);
|
@@ -2037,6 +2121,7 @@ ruby_init_xml_node(void) {
|
|
2037
2121
|
rb_define_method(cXMLNode, "property", ruby_xml_node_property_get, 1);
|
2038
2122
|
rb_define_method(cXMLNode, "properties", ruby_xml_node_properties_get, 0);
|
2039
2123
|
rb_define_method(cXMLNode, "properties?", ruby_xml_node_properties_q, 0);
|
2124
|
+
rb_define_method(cXMLNode, "remove!", ruby_xml_node_remove_ex, 0);
|
2040
2125
|
rb_define_method(cXMLNode, "search_ns", ruby_xml_node_search_ns, 1);
|
2041
2126
|
rb_define_method(cXMLNode, "search_href", ruby_xml_node_search_href, 1);
|
2042
2127
|
rb_define_method(cXMLNode, "sibling=", ruby_xml_node_sibling_set, 1);
|
@@ -2049,4 +2134,6 @@ ruby_init_xml_node(void) {
|
|
2049
2134
|
rb_define_method(cXMLNode, "xlink?", ruby_xml_node_xlink_q, 0);
|
2050
2135
|
rb_define_method(cXMLNode, "xlink_type", ruby_xml_node_xlink_type, 0);
|
2051
2136
|
rb_define_method(cXMLNode, "xlink_type_name", ruby_xml_node_xlink_type_name, 0);
|
2137
|
+
|
2138
|
+
rb_define_alias(cXMLNode, "==", "eql?");
|
2052
2139
|
}
|