nokogiri 1.5.10 → 1.13.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of nokogiri might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/Gemfile +5 -0
- data/LICENSE-DEPENDENCIES.md +1903 -0
- data/LICENSE.md +9 -0
- data/README.md +280 -0
- data/bin/nokogiri +84 -31
- data/dependencies.yml +73 -0
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +956 -100
- data/ext/nokogiri/gumbo.c +584 -0
- data/ext/nokogiri/html4_document.c +166 -0
- data/ext/nokogiri/html4_element_description.c +294 -0
- data/ext/nokogiri/html4_entity_lookup.c +37 -0
- data/ext/nokogiri/html4_sax_parser_context.c +120 -0
- data/ext/nokogiri/html4_sax_push_parser.c +95 -0
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +232 -87
- data/ext/nokogiri/nokogiri.h +188 -129
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +49 -40
- data/ext/nokogiri/xml_attribute_decl.c +18 -18
- data/ext/nokogiri/xml_cdata.c +24 -23
- data/ext/nokogiri/xml_comment.c +29 -21
- data/ext/nokogiri/xml_document.c +327 -223
- data/ext/nokogiri/xml_document_fragment.c +12 -16
- data/ext/nokogiri/xml_dtd.c +56 -50
- data/ext/nokogiri/xml_element_content.c +31 -26
- data/ext/nokogiri/xml_element_decl.c +22 -22
- data/ext/nokogiri/xml_encoding_handler.c +45 -20
- data/ext/nokogiri/xml_entity_decl.c +32 -30
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +74 -32
- data/ext/nokogiri/xml_node.c +1290 -680
- data/ext/nokogiri/xml_node_set.c +239 -208
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +227 -189
- data/ext/nokogiri/xml_relax_ng.c +52 -28
- data/ext/nokogiri/xml_sax_parser.c +123 -125
- data/ext/nokogiri/xml_sax_parser_context.c +138 -79
- data/ext/nokogiri/xml_sax_push_parser.c +88 -35
- data/ext/nokogiri/xml_schema.c +112 -33
- data/ext/nokogiri/xml_syntax_error.c +50 -23
- data/ext/nokogiri/xml_text.c +14 -18
- data/ext/nokogiri/xml_xpath_context.c +227 -140
- data/ext/nokogiri/xslt_stylesheet.c +162 -168
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +101 -0
- data/gumbo-parser/THANKS +27 -0
- data/gumbo-parser/src/Makefile +34 -0
- data/gumbo-parser/src/README.md +41 -0
- data/gumbo-parser/src/ascii.c +75 -0
- data/gumbo-parser/src/ascii.h +115 -0
- data/gumbo-parser/src/attribute.c +42 -0
- data/gumbo-parser/src/attribute.h +17 -0
- data/gumbo-parser/src/char_ref.c +22225 -0
- data/gumbo-parser/src/char_ref.h +29 -0
- data/gumbo-parser/src/char_ref.rl +2154 -0
- data/gumbo-parser/src/error.c +626 -0
- data/gumbo-parser/src/error.h +148 -0
- data/gumbo-parser/src/foreign_attrs.c +104 -0
- data/gumbo-parser/src/foreign_attrs.gperf +27 -0
- data/gumbo-parser/src/gumbo.h +943 -0
- data/gumbo-parser/src/insertion_mode.h +33 -0
- data/gumbo-parser/src/macros.h +91 -0
- data/gumbo-parser/src/parser.c +4875 -0
- data/gumbo-parser/src/parser.h +41 -0
- data/gumbo-parser/src/replacement.h +33 -0
- data/gumbo-parser/src/string_buffer.c +103 -0
- data/gumbo-parser/src/string_buffer.h +68 -0
- data/gumbo-parser/src/string_piece.c +48 -0
- data/gumbo-parser/src/svg_attrs.c +174 -0
- data/gumbo-parser/src/svg_attrs.gperf +77 -0
- data/gumbo-parser/src/svg_tags.c +137 -0
- data/gumbo-parser/src/svg_tags.gperf +55 -0
- data/gumbo-parser/src/tag.c +222 -0
- data/gumbo-parser/src/tag_lookup.c +382 -0
- data/gumbo-parser/src/tag_lookup.gperf +169 -0
- data/gumbo-parser/src/tag_lookup.h +13 -0
- data/gumbo-parser/src/token_buffer.c +79 -0
- data/gumbo-parser/src/token_buffer.h +71 -0
- data/gumbo-parser/src/token_type.h +17 -0
- data/gumbo-parser/src/tokenizer.c +3463 -0
- data/gumbo-parser/src/tokenizer.h +112 -0
- data/gumbo-parser/src/tokenizer_states.h +339 -0
- data/gumbo-parser/src/utf8.c +245 -0
- data/gumbo-parser/src/utf8.h +164 -0
- data/gumbo-parser/src/util.c +68 -0
- data/gumbo-parser/src/util.h +30 -0
- data/gumbo-parser/src/vector.c +111 -0
- data/gumbo-parser/src/vector.h +45 -0
- data/lib/nokogiri/class_resolver.rb +67 -0
- data/lib/nokogiri/css/node.rb +10 -58
- data/lib/nokogiri/css/parser.rb +327 -288
- data/lib/nokogiri/css/parser.y +67 -45
- data/lib/nokogiri/css/parser_extras.rb +52 -49
- data/lib/nokogiri/css/syntax_error.rb +3 -1
- data/lib/nokogiri/css/tokenizer.rb +107 -104
- data/lib/nokogiri/css/tokenizer.rex +7 -6
- data/lib/nokogiri/css/xpath_visitor.rb +263 -75
- data/lib/nokogiri/css.rb +50 -17
- data/lib/nokogiri/decorators/slop.rb +17 -8
- data/lib/nokogiri/extension.rb +31 -0
- data/lib/nokogiri/gumbo.rb +15 -0
- data/lib/nokogiri/html.rb +38 -27
- data/lib/nokogiri/{html → html4}/builder.rb +4 -2
- data/lib/nokogiri/html4/document.rb +331 -0
- data/lib/nokogiri/html4/document_fragment.rb +54 -0
- data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
- data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
- data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
- data/lib/nokogiri/{html → html4}/sax/parser.rb +24 -15
- data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
- data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
- data/lib/nokogiri/html4.rb +46 -0
- data/lib/nokogiri/html5/document.rb +88 -0
- data/lib/nokogiri/html5/document_fragment.rb +83 -0
- data/lib/nokogiri/html5/node.rb +96 -0
- data/lib/nokogiri/html5.rb +477 -0
- data/lib/nokogiri/jruby/dependencies.rb +21 -0
- data/lib/nokogiri/syntax_error.rb +2 -0
- data/lib/nokogiri/version/constant.rb +6 -0
- data/lib/nokogiri/version/info.rb +221 -0
- data/lib/nokogiri/version.rb +3 -90
- data/lib/nokogiri/xml/attr.rb +6 -3
- data/lib/nokogiri/xml/attribute_decl.rb +3 -1
- data/lib/nokogiri/xml/builder.rb +96 -54
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +2 -0
- data/lib/nokogiri/xml/document.rb +234 -95
- data/lib/nokogiri/xml/document_fragment.rb +86 -36
- data/lib/nokogiri/xml/dtd.rb +16 -4
- data/lib/nokogiri/xml/element_content.rb +2 -0
- data/lib/nokogiri/xml/element_decl.rb +3 -1
- data/lib/nokogiri/xml/entity_decl.rb +4 -2
- data/lib/nokogiri/xml/entity_reference.rb +20 -0
- data/lib/nokogiri/xml/namespace.rb +3 -0
- data/lib/nokogiri/xml/node/save_options.rb +8 -4
- data/lib/nokogiri/xml/node.rb +947 -502
- data/lib/nokogiri/xml/node_set.rb +168 -159
- data/lib/nokogiri/xml/notation.rb +13 -0
- data/lib/nokogiri/xml/parse_options.rb +40 -5
- data/lib/nokogiri/xml/pp/character_data.rb +9 -6
- data/lib/nokogiri/xml/pp/node.rb +25 -26
- data/lib/nokogiri/xml/pp.rb +4 -2
- data/lib/nokogiri/xml/processing_instruction.rb +3 -1
- data/lib/nokogiri/xml/reader.rb +23 -28
- data/lib/nokogiri/xml/relax_ng.rb +8 -2
- data/lib/nokogiri/xml/sax/document.rb +45 -49
- data/lib/nokogiri/xml/sax/parser.rb +43 -41
- data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
- data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
- data/lib/nokogiri/xml/sax.rb +6 -4
- data/lib/nokogiri/xml/schema.rb +19 -9
- data/lib/nokogiri/xml/searchable.rb +259 -0
- data/lib/nokogiri/xml/syntax_error.rb +25 -1
- data/lib/nokogiri/xml/text.rb +2 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
- data/lib/nokogiri/xml/xpath.rb +15 -4
- data/lib/nokogiri/xml/xpath_context.rb +3 -3
- data/lib/nokogiri/xml.rb +38 -36
- data/lib/nokogiri/xslt/stylesheet.rb +3 -1
- data/lib/nokogiri/xslt.rb +18 -16
- data/lib/nokogiri.rb +69 -69
- data/lib/xsd/xmlparser/nokogiri.rb +26 -24
- data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
- data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
- data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
- data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
- data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
- data/patches/libxml2/0006-update-automake-files-for-arm64.patch +2511 -0
- data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +31 -0
- data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
- data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
- data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
- data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +19 -0
- data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
- metadata +382 -460
- data/.autotest +0 -26
- data/.gemtest +0 -0
- data/CHANGELOG.ja.rdoc +0 -785
- data/CHANGELOG.rdoc +0 -783
- data/C_CODING_STYLE.rdoc +0 -33
- data/Manifest.txt +0 -303
- data/README.ja.rdoc +0 -106
- data/README.rdoc +0 -175
- data/ROADMAP.md +0 -90
- data/Rakefile +0 -228
- data/STANDARD_RESPONSES.md +0 -47
- data/Y_U_NO_GEMSPEC.md +0 -155
- data/build_all +0 -105
- data/ext/nokogiri/html_document.c +0 -170
- data/ext/nokogiri/html_document.h +0 -10
- data/ext/nokogiri/html_element_description.c +0 -279
- data/ext/nokogiri/html_element_description.h +0 -10
- data/ext/nokogiri/html_entity_lookup.c +0 -32
- data/ext/nokogiri/html_entity_lookup.h +0 -8
- data/ext/nokogiri/html_sax_parser_context.c +0 -116
- data/ext/nokogiri/html_sax_parser_context.h +0 -11
- data/ext/nokogiri/html_sax_push_parser.c +0 -87
- data/ext/nokogiri/html_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_attr.h +0 -9
- data/ext/nokogiri/xml_attribute_decl.h +0 -9
- data/ext/nokogiri/xml_cdata.h +0 -9
- data/ext/nokogiri/xml_comment.h +0 -9
- data/ext/nokogiri/xml_document.h +0 -23
- data/ext/nokogiri/xml_document_fragment.h +0 -10
- data/ext/nokogiri/xml_dtd.h +0 -10
- data/ext/nokogiri/xml_element_content.h +0 -10
- data/ext/nokogiri/xml_element_decl.h +0 -9
- data/ext/nokogiri/xml_encoding_handler.h +0 -8
- data/ext/nokogiri/xml_entity_decl.h +0 -10
- data/ext/nokogiri/xml_entity_reference.h +0 -9
- data/ext/nokogiri/xml_io.c +0 -56
- data/ext/nokogiri/xml_io.h +0 -11
- data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
- data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
- data/ext/nokogiri/xml_namespace.h +0 -13
- data/ext/nokogiri/xml_node.h +0 -13
- data/ext/nokogiri/xml_node_set.h +0 -14
- data/ext/nokogiri/xml_processing_instruction.h +0 -9
- data/ext/nokogiri/xml_reader.h +0 -10
- data/ext/nokogiri/xml_relax_ng.h +0 -9
- data/ext/nokogiri/xml_sax_parser.h +0 -39
- data/ext/nokogiri/xml_sax_parser_context.h +0 -10
- data/ext/nokogiri/xml_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_schema.h +0 -9
- data/ext/nokogiri/xml_syntax_error.h +0 -13
- data/ext/nokogiri/xml_text.h +0 -9
- data/ext/nokogiri/xml_xpath_context.h +0 -10
- data/ext/nokogiri/xslt_stylesheet.h +0 -14
- data/lib/nokogiri/html/document.rb +0 -254
- data/lib/nokogiri/html/document_fragment.rb +0 -41
- data/lib/nokogiri/html/element_description_defaults.rb +0 -671
- data/lib/nokogiri/html/sax/parser_context.rb +0 -16
- data/lib/nokogiri/html/sax/push_parser.rb +0 -16
- data/tasks/cross_compile.rb +0 -150
- data/tasks/nokogiri.org.rb +0 -24
- data/tasks/test.rb +0 -95
- data/test/css/test_nthiness.rb +0 -159
- data/test/css/test_parser.rb +0 -341
- data/test/css/test_tokenizer.rb +0 -198
- data/test/css/test_xpath_visitor.rb +0 -91
- data/test/decorators/test_slop.rb +0 -16
- data/test/files/2ch.html +0 -108
- data/test/files/address_book.rlx +0 -12
- data/test/files/address_book.xml +0 -10
- data/test/files/bar/bar.xsd +0 -4
- data/test/files/dont_hurt_em_why.xml +0 -422
- data/test/files/encoding.html +0 -82
- data/test/files/encoding.xhtml +0 -84
- data/test/files/exslt.xml +0 -8
- data/test/files/exslt.xslt +0 -35
- data/test/files/foo/foo.xsd +0 -4
- data/test/files/metacharset.html +0 -10
- data/test/files/noencoding.html +0 -47
- data/test/files/po.xml +0 -32
- data/test/files/po.xsd +0 -66
- data/test/files/shift_jis.html +0 -10
- data/test/files/shift_jis.xml +0 -5
- data/test/files/snuggles.xml +0 -3
- data/test/files/staff.dtd +0 -10
- data/test/files/staff.xml +0 -59
- data/test/files/staff.xslt +0 -32
- data/test/files/test_document_url/bar.xml +0 -2
- data/test/files/test_document_url/document.dtd +0 -4
- data/test/files/test_document_url/document.xml +0 -6
- data/test/files/tlm.html +0 -850
- data/test/files/to_be_xincluded.xml +0 -2
- data/test/files/valid_bar.xml +0 -2
- data/test/files/xinclude.xml +0 -4
- data/test/helper.rb +0 -154
- data/test/html/sax/test_parser.rb +0 -141
- data/test/html/sax/test_parser_context.rb +0 -46
- data/test/html/test_builder.rb +0 -164
- data/test/html/test_document.rb +0 -552
- data/test/html/test_document_encoding.rb +0 -138
- data/test/html/test_document_fragment.rb +0 -261
- data/test/html/test_element_description.rb +0 -105
- data/test/html/test_named_characters.rb +0 -14
- data/test/html/test_node.rb +0 -196
- data/test/html/test_node_encoding.rb +0 -27
- data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
- data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -66
- data/test/test_convert_xpath.rb +0 -135
- data/test/test_css_cache.rb +0 -45
- data/test/test_encoding_handler.rb +0 -46
- data/test/test_memory_leak.rb +0 -156
- data/test/test_nokogiri.rb +0 -132
- data/test/test_reader.rb +0 -555
- data/test/test_soap4r_sax.rb +0 -52
- data/test/test_xslt_transforms.rb +0 -254
- data/test/xml/node/test_save_options.rb +0 -28
- data/test/xml/node/test_subclass.rb +0 -44
- data/test/xml/sax/test_parser.rb +0 -366
- data/test/xml/sax/test_parser_context.rb +0 -106
- data/test/xml/sax/test_push_parser.rb +0 -157
- data/test/xml/test_attr.rb +0 -64
- data/test/xml/test_attribute_decl.rb +0 -86
- data/test/xml/test_builder.rb +0 -306
- data/test/xml/test_c14n.rb +0 -151
- data/test/xml/test_cdata.rb +0 -48
- data/test/xml/test_comment.rb +0 -29
- data/test/xml/test_document.rb +0 -828
- data/test/xml/test_document_encoding.rb +0 -28
- data/test/xml/test_document_fragment.rb +0 -223
- data/test/xml/test_dtd.rb +0 -103
- data/test/xml/test_dtd_encoding.rb +0 -33
- data/test/xml/test_element_content.rb +0 -56
- data/test/xml/test_element_decl.rb +0 -73
- data/test/xml/test_entity_decl.rb +0 -122
- data/test/xml/test_entity_reference.rb +0 -245
- data/test/xml/test_namespace.rb +0 -95
- data/test/xml/test_node.rb +0 -1137
- data/test/xml/test_node_attributes.rb +0 -96
- data/test/xml/test_node_encoding.rb +0 -107
- data/test/xml/test_node_inheritance.rb +0 -32
- data/test/xml/test_node_reparenting.rb +0 -374
- data/test/xml/test_node_set.rb +0 -755
- data/test/xml/test_parse_options.rb +0 -64
- data/test/xml/test_processing_instruction.rb +0 -30
- data/test/xml/test_reader_encoding.rb +0 -142
- data/test/xml/test_relax_ng.rb +0 -60
- data/test/xml/test_schema.rb +0 -103
- data/test/xml/test_syntax_error.rb +0 -12
- data/test/xml/test_text.rb +0 -45
- data/test/xml/test_unparented_node.rb +0 -422
- data/test/xml/test_xinclude.rb +0 -83
- data/test/xml/test_xpath.rb +0 -295
- data/test/xslt/test_custom_functions.rb +0 -133
- data/test/xslt/test_exception_handling.rb +0 -37
- data/test_all +0 -81
data/ext/nokogiri/xml_node_set.c
CHANGED
@@ -1,68 +1,107 @@
|
|
1
|
-
#include <
|
2
|
-
|
1
|
+
#include <nokogiri.h>
|
2
|
+
|
3
|
+
VALUE cNokogiriXmlNodeSet ;
|
3
4
|
|
4
5
|
static ID decorate ;
|
5
6
|
|
6
|
-
static
|
7
|
+
static void
|
8
|
+
Check_Node_Set_Node_Type(VALUE node)
|
9
|
+
{
|
10
|
+
if (!(rb_obj_is_kind_of(node, cNokogiriXmlNode) ||
|
11
|
+
rb_obj_is_kind_of(node, cNokogiriXmlNamespace))) {
|
12
|
+
rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace");
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
|
17
|
+
static
|
18
|
+
VALUE
|
19
|
+
ruby_object_get(xmlNodePtr c_node)
|
20
|
+
{
|
21
|
+
/* see xmlElementType in libxml2 tree.h */
|
22
|
+
switch (c_node->type) {
|
23
|
+
case XML_NAMESPACE_DECL:
|
24
|
+
/* _private is later in the namespace struct */
|
25
|
+
return (VALUE)(((xmlNsPtr)c_node)->_private);
|
26
|
+
|
27
|
+
case XML_DOCUMENT_NODE:
|
28
|
+
case XML_HTML_DOCUMENT_NODE:
|
29
|
+
/* in documents we use _private to store a tuple */
|
30
|
+
if (DOC_RUBY_OBJECT_TEST(((xmlDocPtr)c_node))) {
|
31
|
+
return DOC_RUBY_OBJECT((xmlDocPtr)c_node);
|
32
|
+
}
|
33
|
+
return (VALUE)NULL;
|
34
|
+
|
35
|
+
default:
|
36
|
+
return (VALUE)(c_node->_private);
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
|
41
|
+
static void
|
42
|
+
mark(xmlNodeSetPtr node_set)
|
7
43
|
{
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
44
|
+
VALUE rb_node;
|
45
|
+
int jnode;
|
46
|
+
|
47
|
+
for (jnode = 0; jnode < node_set->nodeNr; jnode++) {
|
48
|
+
rb_node = ruby_object_get(node_set->nodeTab[jnode]);
|
49
|
+
if (rb_node) {
|
50
|
+
rb_gc_mark(rb_node);
|
51
|
+
}
|
52
|
+
}
|
14
53
|
}
|
15
54
|
|
16
|
-
static void
|
55
|
+
static void
|
56
|
+
xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val)
|
17
57
|
{
|
18
58
|
/*
|
19
|
-
*
|
20
|
-
*
|
21
|
-
* assumption lies in the operation where it dereferences nodeTab pointers
|
22
|
-
* while searching for namespace nodes to free.
|
23
|
-
*
|
24
|
-
* however, since Ruby's GC mechanism cannot guarantee the strict order in
|
25
|
-
* which ruby objects will be GC'd, nodes may be garbage collected before a
|
26
|
-
* nodeset containing pointers to those nodes. (this is true regardless of
|
27
|
-
* how we declare dependencies between objects with rb_gc_mark().)
|
28
|
-
*
|
29
|
-
* as a result, xmlXPathFreeNodeSet() will perform unsafe memory operations,
|
30
|
-
* and calling it would be evil.
|
31
|
-
*
|
32
|
-
* so here, we *manually* free the set of namespace nodes that was
|
33
|
-
* constructed at initialization time (see Nokogiri_wrap_xml_node_set()), as
|
34
|
-
* well as the NodeSet, without using the official xmlXPathFreeNodeSet().
|
35
|
-
*
|
36
|
-
* there's probably a lesson in here somewhere about intermingling, within a
|
37
|
-
* single array, structs with different memory-ownership semantics. or more
|
38
|
-
* generally, a lesson about building an API in C/C++ that does not contain
|
39
|
-
* assumptions about the strict order in which memory will be released. hey,
|
40
|
-
* that sounds like a great idea for a blog post! get to it!
|
41
|
-
*
|
42
|
-
* "In Valgrind We Trust." seriously.
|
59
|
+
* For reasons outlined in xml_namespace.c, here we reproduce xmlXPathNodeSetDel() except for the
|
60
|
+
* offending call to xmlXPathNodeSetFreeNs().
|
43
61
|
*/
|
44
|
-
|
62
|
+
int i;
|
45
63
|
|
46
|
-
|
64
|
+
if (cur == NULL) { return; }
|
65
|
+
if (val == NULL) { return; }
|
47
66
|
|
48
|
-
|
67
|
+
/*
|
68
|
+
* find node in nodeTab
|
69
|
+
*/
|
70
|
+
for (i = 0; i < cur->nodeNr; i++)
|
71
|
+
if (cur->nodeTab[i] == val) { break; }
|
72
|
+
|
73
|
+
if (i >= cur->nodeNr) { /* not found */
|
49
74
|
return;
|
75
|
+
}
|
76
|
+
cur->nodeNr--;
|
77
|
+
for (; i < cur->nodeNr; i++) {
|
78
|
+
cur->nodeTab[i] = cur->nodeTab[i + 1];
|
79
|
+
}
|
80
|
+
cur->nodeTab[cur->nodeNr] = NULL;
|
81
|
+
}
|
50
82
|
|
51
|
-
NOKOGIRI_DEBUG_START(node_set) ;
|
52
|
-
st_foreach(tuple->namespaces, dealloc_namespace, 0);
|
53
83
|
|
54
|
-
|
84
|
+
static void
|
85
|
+
deallocate(xmlNodeSetPtr node_set)
|
86
|
+
{
|
87
|
+
/*
|
88
|
+
* For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the
|
89
|
+
* offending call to xmlXPathNodeSetFreeNs().
|
90
|
+
*/
|
91
|
+
NOKOGIRI_DEBUG_START(node_set) ;
|
92
|
+
if (node_set->nodeTab != NULL) {
|
55
93
|
xmlFree(node_set->nodeTab);
|
94
|
+
}
|
56
95
|
|
57
96
|
xmlFree(node_set);
|
58
|
-
st_free_table(tuple->namespaces);
|
59
|
-
free(tuple);
|
60
97
|
NOKOGIRI_DEBUG_END(node_set) ;
|
61
98
|
}
|
62
99
|
|
63
|
-
|
100
|
+
|
101
|
+
static VALUE
|
102
|
+
allocate(VALUE klass)
|
64
103
|
{
|
65
|
-
return
|
104
|
+
return noko_xml_node_set_wrap(xmlXPathNodeSetCreate(NULL), Qnil);
|
66
105
|
}
|
67
106
|
|
68
107
|
|
@@ -70,18 +109,20 @@ static VALUE allocate(VALUE klass)
|
|
70
109
|
* call-seq:
|
71
110
|
* dup
|
72
111
|
*
|
73
|
-
* Duplicate this
|
112
|
+
* Duplicate this NodeSet. Note that the Nodes contained in the NodeSet are not
|
113
|
+
* duplicated (similar to how Array and other Enumerable classes work).
|
74
114
|
*/
|
75
|
-
static VALUE
|
115
|
+
static VALUE
|
116
|
+
duplicate(VALUE self)
|
76
117
|
{
|
77
|
-
|
118
|
+
xmlNodeSetPtr node_set;
|
78
119
|
xmlNodeSetPtr dupl;
|
79
120
|
|
80
|
-
Data_Get_Struct(self,
|
121
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
81
122
|
|
82
|
-
dupl = xmlXPathNodeSetMerge(NULL,
|
123
|
+
dupl = xmlXPathNodeSetMerge(NULL, node_set);
|
83
124
|
|
84
|
-
return
|
125
|
+
return noko_xml_node_set_wrap(dupl, rb_iv_get(self, "@document"));
|
85
126
|
}
|
86
127
|
|
87
128
|
/*
|
@@ -90,12 +131,14 @@ static VALUE duplicate(VALUE self)
|
|
90
131
|
*
|
91
132
|
* Get the length of the node set
|
92
133
|
*/
|
93
|
-
static VALUE
|
134
|
+
static VALUE
|
135
|
+
length(VALUE self)
|
94
136
|
{
|
95
|
-
|
96
|
-
Data_Get_Struct(self, nokogiriNodeSetTuple, tuple);
|
137
|
+
xmlNodeSetPtr node_set;
|
97
138
|
|
98
|
-
|
139
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
140
|
+
|
141
|
+
return node_set ? INT2NUM(node_set->nodeNr) : INT2NUM(0);
|
99
142
|
}
|
100
143
|
|
101
144
|
/*
|
@@ -104,17 +147,19 @@ static VALUE length(VALUE self)
|
|
104
147
|
*
|
105
148
|
* Append +node+ to the NodeSet.
|
106
149
|
*/
|
107
|
-
static VALUE
|
150
|
+
static VALUE
|
151
|
+
push(VALUE self, VALUE rb_node)
|
108
152
|
{
|
109
|
-
|
153
|
+
xmlNodeSetPtr node_set;
|
110
154
|
xmlNodePtr node;
|
111
155
|
|
112
|
-
|
113
|
-
rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace");
|
156
|
+
Check_Node_Set_Node_Type(rb_node);
|
114
157
|
|
115
|
-
Data_Get_Struct(self,
|
158
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
116
159
|
Data_Get_Struct(rb_node, xmlNode, node);
|
117
|
-
|
160
|
+
|
161
|
+
xmlXPathNodeSetAdd(node_set, node);
|
162
|
+
|
118
163
|
return self;
|
119
164
|
}
|
120
165
|
|
@@ -126,31 +171,21 @@ static VALUE push(VALUE self, VALUE rb_node)
|
|
126
171
|
* if found, otherwise returns nil.
|
127
172
|
*/
|
128
173
|
static VALUE
|
129
|
-
delete(VALUE self, VALUE rb_node)
|
174
|
+
delete (VALUE self, VALUE rb_node)
|
130
175
|
{
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
for (i = 0; i < cur->nodeNr; i++)
|
145
|
-
if (cur->nodeTab[i] == node) break;
|
146
|
-
|
147
|
-
cur->nodeNr--;
|
148
|
-
for (;i < cur->nodeNr;i++)
|
149
|
-
cur->nodeTab[i] = cur->nodeTab[i + 1];
|
150
|
-
cur->nodeTab[cur->nodeNr] = NULL;
|
151
|
-
return rb_node;
|
152
|
-
}
|
153
|
-
return Qnil ;
|
176
|
+
xmlNodeSetPtr node_set;
|
177
|
+
xmlNodePtr node;
|
178
|
+
|
179
|
+
Check_Node_Set_Node_Type(rb_node);
|
180
|
+
|
181
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
182
|
+
Data_Get_Struct(rb_node, xmlNode, node);
|
183
|
+
|
184
|
+
if (xmlXPathNodeSetContains(node_set, node)) {
|
185
|
+
xpath_node_set_del(node_set, node);
|
186
|
+
return rb_node;
|
187
|
+
}
|
188
|
+
return Qnil ;
|
154
189
|
}
|
155
190
|
|
156
191
|
|
@@ -160,19 +195,21 @@ delete(VALUE self, VALUE rb_node)
|
|
160
195
|
*
|
161
196
|
* Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.
|
162
197
|
*/
|
163
|
-
static VALUE
|
198
|
+
static VALUE
|
199
|
+
intersection(VALUE self, VALUE rb_other)
|
164
200
|
{
|
165
|
-
|
201
|
+
xmlNodeSetPtr node_set, other ;
|
166
202
|
xmlNodeSetPtr intersection;
|
167
203
|
|
168
|
-
if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
|
204
|
+
if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
|
169
205
|
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
206
|
+
}
|
170
207
|
|
171
|
-
Data_Get_Struct(self,
|
172
|
-
Data_Get_Struct(rb_other,
|
208
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
209
|
+
Data_Get_Struct(rb_other, xmlNodeSet, other);
|
173
210
|
|
174
|
-
intersection = xmlXPathIntersection(
|
175
|
-
return
|
211
|
+
intersection = xmlXPathIntersection(node_set, other);
|
212
|
+
return noko_xml_node_set_wrap(intersection, rb_iv_get(self, "@document"));
|
176
213
|
}
|
177
214
|
|
178
215
|
|
@@ -182,18 +219,18 @@ static VALUE intersection(VALUE self, VALUE rb_other)
|
|
182
219
|
*
|
183
220
|
* Returns true if any member of node set equals +node+.
|
184
221
|
*/
|
185
|
-
static VALUE
|
222
|
+
static VALUE
|
223
|
+
include_eh(VALUE self, VALUE rb_node)
|
186
224
|
{
|
187
|
-
|
225
|
+
xmlNodeSetPtr node_set;
|
188
226
|
xmlNodePtr node;
|
189
227
|
|
190
|
-
|
191
|
-
rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace");
|
228
|
+
Check_Node_Set_Node_Type(rb_node);
|
192
229
|
|
193
|
-
Data_Get_Struct(self,
|
230
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
194
231
|
Data_Get_Struct(rb_node, xmlNode, node);
|
195
232
|
|
196
|
-
return (xmlXPathNodeSetContains(
|
233
|
+
return (xmlXPathNodeSetContains(node_set, node) ? Qtrue : Qfalse);
|
197
234
|
}
|
198
235
|
|
199
236
|
|
@@ -204,21 +241,23 @@ static VALUE include_eh(VALUE self, VALUE rb_node)
|
|
204
241
|
* Returns a new set built by merging the set and the elements of the given
|
205
242
|
* set.
|
206
243
|
*/
|
207
|
-
static VALUE
|
244
|
+
static VALUE
|
245
|
+
rb_xml_node_set_union(VALUE rb_node_set, VALUE rb_other)
|
208
246
|
{
|
209
|
-
|
210
|
-
xmlNodeSetPtr
|
247
|
+
xmlNodeSetPtr c_node_set, c_other;
|
248
|
+
xmlNodeSetPtr c_new_node_set;
|
211
249
|
|
212
|
-
if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
|
250
|
+
if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
|
213
251
|
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
252
|
+
}
|
214
253
|
|
215
|
-
Data_Get_Struct(
|
216
|
-
Data_Get_Struct(rb_other,
|
254
|
+
Data_Get_Struct(rb_node_set, xmlNodeSet, c_node_set);
|
255
|
+
Data_Get_Struct(rb_other, xmlNodeSet, c_other);
|
217
256
|
|
218
|
-
|
219
|
-
|
257
|
+
c_new_node_set = xmlXPathNodeSetMerge(NULL, c_node_set);
|
258
|
+
c_new_node_set = xmlXPathNodeSetMerge(c_new_node_set, c_other);
|
220
259
|
|
221
|
-
return
|
260
|
+
return noko_xml_node_set_wrap(c_new_node_set, rb_iv_get(rb_node_set, "@document"));
|
222
261
|
}
|
223
262
|
|
224
263
|
/*
|
@@ -228,68 +267,66 @@ static VALUE set_union(VALUE self, VALUE rb_other)
|
|
228
267
|
* Difference - returns a new NodeSet that is a copy of this NodeSet, removing
|
229
268
|
* each item that also appears in +node_set+
|
230
269
|
*/
|
231
|
-
static VALUE
|
270
|
+
static VALUE
|
271
|
+
minus(VALUE self, VALUE rb_other)
|
232
272
|
{
|
233
|
-
|
273
|
+
xmlNodeSetPtr node_set, other;
|
234
274
|
xmlNodeSetPtr new;
|
235
275
|
int j ;
|
236
276
|
|
237
|
-
if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
|
277
|
+
if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
|
238
278
|
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
279
|
+
}
|
239
280
|
|
240
|
-
Data_Get_Struct(self,
|
241
|
-
Data_Get_Struct(rb_other,
|
281
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
282
|
+
Data_Get_Struct(rb_other, xmlNodeSet, other);
|
242
283
|
|
243
|
-
new = xmlXPathNodeSetMerge(NULL,
|
244
|
-
for (j = 0 ; j < other->
|
245
|
-
|
284
|
+
new = xmlXPathNodeSetMerge(NULL, node_set);
|
285
|
+
for (j = 0 ; j < other->nodeNr ; ++j) {
|
286
|
+
xpath_node_set_del(new, other->nodeTab[j]);
|
246
287
|
}
|
247
288
|
|
248
|
-
return
|
289
|
+
return noko_xml_node_set_wrap(new, rb_iv_get(self, "@document"));
|
249
290
|
}
|
250
291
|
|
251
292
|
|
252
|
-
static VALUE
|
293
|
+
static VALUE
|
294
|
+
index_at(VALUE self, long offset)
|
253
295
|
{
|
254
296
|
xmlNodeSetPtr node_set;
|
255
|
-
nokogiriNodeSetTuple *tuple;
|
256
297
|
|
257
|
-
Data_Get_Struct(self,
|
258
|
-
node_set = tuple->node_set;
|
298
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
259
299
|
|
260
|
-
if (offset >= node_set->nodeNr || abs((int)offset) > node_set->nodeNr)
|
300
|
+
if (offset >= node_set->nodeNr || abs((int)offset) > node_set->nodeNr) {
|
261
301
|
return Qnil;
|
302
|
+
}
|
262
303
|
|
263
|
-
if (offset < 0)
|
264
|
-
offset += node_set->nodeNr;
|
304
|
+
if (offset < 0) { offset += node_set->nodeNr ; }
|
265
305
|
|
266
|
-
|
267
|
-
return Nokogiri_wrap_xml_namespace2(rb_iv_get(self, "@document"), (xmlNsPtr)(node_set->nodeTab[offset]));
|
268
|
-
return Nokogiri_wrap_xml_node(Qnil, node_set->nodeTab[offset]);
|
306
|
+
return noko_xml_node_wrap_node_set_result(node_set->nodeTab[offset], self);
|
269
307
|
}
|
270
308
|
|
271
|
-
static VALUE
|
309
|
+
static VALUE
|
310
|
+
subseq(VALUE self, long beg, long len)
|
272
311
|
{
|
273
312
|
long j;
|
274
|
-
nokogiriNodeSetTuple *tuple;
|
275
313
|
xmlNodeSetPtr node_set;
|
276
314
|
xmlNodeSetPtr new_set ;
|
277
315
|
|
278
|
-
Data_Get_Struct(self,
|
279
|
-
node_set = tuple->node_set;
|
316
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
280
317
|
|
281
|
-
if (beg > node_set->nodeNr) return Qnil ;
|
282
|
-
if (beg < 0 || len < 0) return Qnil ;
|
318
|
+
if (beg > node_set->nodeNr) { return Qnil ; }
|
319
|
+
if (beg < 0 || len < 0) { return Qnil ; }
|
283
320
|
|
284
321
|
if ((beg + len) > node_set->nodeNr) {
|
285
322
|
len = node_set->nodeNr - beg ;
|
286
323
|
}
|
287
324
|
|
288
325
|
new_set = xmlXPathNodeSetCreate(NULL);
|
289
|
-
for (j = beg ; j < beg+len ; ++j) {
|
326
|
+
for (j = beg ; j < beg + len ; ++j) {
|
290
327
|
xmlXPathNodeSetAddUnique(new_set, node_set->nodeTab[j]);
|
291
328
|
}
|
292
|
-
return
|
329
|
+
return noko_xml_node_set_wrap(new_set, rb_iv_get(self, "@document"));
|
293
330
|
}
|
294
331
|
|
295
332
|
/*
|
@@ -307,14 +344,14 @@ static VALUE subseq(VALUE self, long beg, long len)
|
|
307
344
|
* count backward from the end of the +node_set+ (-1 is the last node). Returns
|
308
345
|
* nil if the +index+ (or +start+) are out of range.
|
309
346
|
*/
|
310
|
-
static VALUE
|
347
|
+
static VALUE
|
348
|
+
slice(int argc, VALUE *argv, VALUE self)
|
311
349
|
{
|
312
350
|
VALUE arg ;
|
313
351
|
long beg, len ;
|
314
352
|
xmlNodeSetPtr node_set;
|
315
|
-
|
316
|
-
Data_Get_Struct(self,
|
317
|
-
node_set = tuple->node_set;
|
353
|
+
|
354
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
318
355
|
|
319
356
|
if (argc == 2) {
|
320
357
|
beg = NUM2LONG(argv[0]);
|
@@ -333,15 +370,15 @@ static VALUE slice(int argc, VALUE *argv, VALUE self)
|
|
333
370
|
if (FIXNUM_P(arg)) {
|
334
371
|
return index_at(self, FIX2LONG(arg));
|
335
372
|
}
|
336
|
-
|
373
|
+
|
337
374
|
/* if arg is Range */
|
338
375
|
switch (rb_range_beg_len(arg, &beg, &len, (long)node_set->nodeNr, 0)) {
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
376
|
+
case Qfalse:
|
377
|
+
break;
|
378
|
+
case Qnil:
|
379
|
+
return Qnil;
|
380
|
+
default:
|
381
|
+
return subseq(self, beg, len);
|
345
382
|
}
|
346
383
|
|
347
384
|
return index_at(self, NUM2LONG(arg));
|
@@ -354,29 +391,21 @@ static VALUE slice(int argc, VALUE *argv, VALUE self)
|
|
354
391
|
*
|
355
392
|
* Return this list as an Array
|
356
393
|
*/
|
357
|
-
static VALUE
|
394
|
+
static VALUE
|
395
|
+
to_array(VALUE self)
|
358
396
|
{
|
359
|
-
xmlNodeSetPtr
|
360
|
-
VALUE *elts;
|
397
|
+
xmlNodeSetPtr node_set ;
|
361
398
|
VALUE list;
|
362
399
|
int i;
|
363
|
-
nokogiriNodeSetTuple *tuple;
|
364
400
|
|
365
|
-
Data_Get_Struct(self,
|
366
|
-
set = tuple->node_set;
|
401
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
367
402
|
|
368
|
-
|
369
|
-
for(i = 0; i <
|
370
|
-
|
371
|
-
|
372
|
-
else
|
373
|
-
elts[i] = Nokogiri_wrap_xml_node(Qnil, set->nodeTab[i]);
|
403
|
+
list = rb_ary_new2(node_set->nodeNr);
|
404
|
+
for (i = 0; i < node_set->nodeNr; i++) {
|
405
|
+
VALUE elt = noko_xml_node_wrap_node_set_result(node_set->nodeTab[i], self);
|
406
|
+
rb_ary_push(list, elt);
|
374
407
|
}
|
375
408
|
|
376
|
-
list = rb_ary_new4((long)set->nodeNr, elts);
|
377
|
-
|
378
|
-
/*free(elts); */
|
379
|
-
|
380
409
|
return list;
|
381
410
|
}
|
382
411
|
|
@@ -386,20 +415,20 @@ static VALUE to_array(VALUE self, VALUE rb_node)
|
|
386
415
|
*
|
387
416
|
* Unlink this NodeSet and all Node objects it contains from their current context.
|
388
417
|
*/
|
389
|
-
static VALUE
|
418
|
+
static VALUE
|
419
|
+
unlink_nodeset(VALUE self)
|
390
420
|
{
|
391
421
|
xmlNodeSetPtr node_set;
|
392
422
|
int j, nodeNr ;
|
393
|
-
nokogiriNodeSetTuple *tuple;
|
394
423
|
|
395
|
-
Data_Get_Struct(self,
|
396
|
-
|
424
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
425
|
+
|
397
426
|
nodeNr = node_set->nodeNr ;
|
398
427
|
for (j = 0 ; j < nodeNr ; j++) {
|
399
|
-
if (
|
428
|
+
if (! NOKOGIRI_NAMESPACE_EH(node_set->nodeTab[j])) {
|
400
429
|
VALUE node ;
|
401
430
|
xmlNodePtr node_ptr;
|
402
|
-
node =
|
431
|
+
node = noko_xml_node_wrap(Qnil, node_set->nodeTab[j]);
|
403
432
|
rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */
|
404
433
|
Data_Get_Struct(node, xmlNode, node_ptr);
|
405
434
|
node_set->nodeTab[j] = node_ptr ;
|
@@ -408,60 +437,62 @@ static VALUE unlink_nodeset(VALUE self)
|
|
408
437
|
return self ;
|
409
438
|
}
|
410
439
|
|
411
|
-
|
440
|
+
|
441
|
+
VALUE
|
442
|
+
noko_xml_node_set_wrap(xmlNodeSetPtr c_node_set, VALUE document)
|
412
443
|
{
|
413
|
-
|
414
|
-
|
415
|
-
xmlNodePtr cur;
|
416
|
-
xmlNsPtr ns;
|
417
|
-
nokogiriNodeSetTuple *tuple;
|
444
|
+
int j;
|
445
|
+
VALUE rb_node_set ;
|
418
446
|
|
419
|
-
|
420
|
-
|
447
|
+
if (c_node_set == NULL) {
|
448
|
+
c_node_set = xmlXPathNodeSetCreate(NULL);
|
449
|
+
}
|
421
450
|
|
422
|
-
|
423
|
-
tuple->namespaces = st_init_numtable();
|
451
|
+
rb_node_set = Data_Wrap_Struct(cNokogiriXmlNodeSet, mark, deallocate, c_node_set);
|
424
452
|
|
425
453
|
if (!NIL_P(document)) {
|
426
|
-
rb_iv_set(
|
427
|
-
rb_funcall(document, decorate, 1,
|
454
|
+
rb_iv_set(rb_node_set, "@document", document);
|
455
|
+
rb_funcall(document, decorate, 1, rb_node_set);
|
428
456
|
}
|
429
457
|
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
if (cur && cur->type == XML_NAMESPACE_DECL) {
|
434
|
-
ns = (xmlNsPtr)cur;
|
435
|
-
if (ns->next && ns->next->type != XML_NAMESPACE_DECL)
|
436
|
-
st_insert(tuple->namespaces, (st_data_t)cur, (st_data_t)0);
|
437
|
-
}
|
438
|
-
}
|
458
|
+
/* make sure we create ruby objects for all the results, so they'll be marked during the GC mark phase */
|
459
|
+
for (j = 0 ; j < c_node_set->nodeNr ; j++) {
|
460
|
+
noko_xml_node_wrap_node_set_result(c_node_set->nodeTab[j], rb_node_set);
|
439
461
|
}
|
440
462
|
|
441
|
-
return
|
463
|
+
return rb_node_set ;
|
442
464
|
}
|
443
465
|
|
444
|
-
VALUE
|
445
|
-
|
466
|
+
VALUE
|
467
|
+
noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set)
|
468
|
+
{
|
469
|
+
if (NOKOGIRI_NAMESPACE_EH(node)) {
|
470
|
+
return noko_xml_namespace_wrap_xpath_copy((xmlNsPtr)node);
|
471
|
+
} else {
|
472
|
+
return noko_xml_node_wrap(Qnil, node);
|
473
|
+
}
|
474
|
+
}
|
475
|
+
|
476
|
+
|
477
|
+
void
|
478
|
+
noko_init_xml_node_set(void)
|
446
479
|
{
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
rb_define_method(
|
454
|
-
rb_define_method(
|
455
|
-
rb_define_method(
|
456
|
-
rb_define_method(
|
457
|
-
rb_define_method(
|
458
|
-
rb_define_method(
|
459
|
-
rb_define_method(
|
460
|
-
rb_define_method(
|
461
|
-
rb_define_method(
|
462
|
-
rb_define_method(
|
463
|
-
rb_define_method(klass, "&", intersection, 1);
|
464
|
-
rb_define_method(klass, "include?", include_eh, 1);
|
480
|
+
cNokogiriXmlNodeSet = rb_define_class_under(mNokogiriXml, "NodeSet", rb_cObject);
|
481
|
+
|
482
|
+
rb_define_alloc_func(cNokogiriXmlNodeSet, allocate);
|
483
|
+
|
484
|
+
rb_define_method(cNokogiriXmlNodeSet, "length", length, 0);
|
485
|
+
rb_define_method(cNokogiriXmlNodeSet, "[]", slice, -1);
|
486
|
+
rb_define_method(cNokogiriXmlNodeSet, "slice", slice, -1);
|
487
|
+
rb_define_method(cNokogiriXmlNodeSet, "push", push, 1);
|
488
|
+
rb_define_method(cNokogiriXmlNodeSet, "|", rb_xml_node_set_union, 1);
|
489
|
+
rb_define_method(cNokogiriXmlNodeSet, "-", minus, 1);
|
490
|
+
rb_define_method(cNokogiriXmlNodeSet, "unlink", unlink_nodeset, 0);
|
491
|
+
rb_define_method(cNokogiriXmlNodeSet, "to_a", to_array, 0);
|
492
|
+
rb_define_method(cNokogiriXmlNodeSet, "dup", duplicate, 0);
|
493
|
+
rb_define_method(cNokogiriXmlNodeSet, "delete", delete, 1);
|
494
|
+
rb_define_method(cNokogiriXmlNodeSet, "&", intersection, 1);
|
495
|
+
rb_define_method(cNokogiriXmlNodeSet, "include?", include_eh, 1);
|
465
496
|
|
466
497
|
decorate = rb_intern("decorate");
|
467
498
|
}
|