nokogiri 1.8.5 → 1.15.3
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 +4 -4
- data/Gemfile +40 -18
- data/LICENSE-DEPENDENCIES.md +1636 -1024
- data/LICENSE.md +5 -28
- data/README.md +203 -90
- data/bin/nokogiri +63 -50
- data/dependencies.yml +33 -61
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +867 -417
- data/ext/nokogiri/gumbo.c +594 -0
- data/ext/nokogiri/html4_document.c +165 -0
- data/ext/nokogiri/html4_element_description.c +299 -0
- data/ext/nokogiri/html4_entity_lookup.c +37 -0
- data/ext/nokogiri/html4_sax_parser_context.c +108 -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 +251 -105
- data/ext/nokogiri/nokogiri.h +215 -90
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +42 -37
- data/ext/nokogiri/xml_attribute_decl.c +22 -22
- data/ext/nokogiri/xml_cdata.c +40 -31
- data/ext/nokogiri/xml_comment.c +20 -27
- data/ext/nokogiri/xml_document.c +401 -237
- data/ext/nokogiri/xml_document_fragment.c +13 -17
- data/ext/nokogiri/xml_dtd.c +64 -58
- data/ext/nokogiri/xml_element_content.c +63 -55
- data/ext/nokogiri/xml_element_decl.c +31 -31
- data/ext/nokogiri/xml_encoding_handler.c +54 -21
- data/ext/nokogiri/xml_entity_decl.c +37 -35
- data/ext/nokogiri/xml_entity_reference.c +17 -19
- data/ext/nokogiri/xml_namespace.c +136 -62
- data/ext/nokogiri/xml_node.c +1387 -678
- data/ext/nokogiri/xml_node_set.c +246 -216
- data/ext/nokogiri/xml_processing_instruction.c +18 -20
- data/ext/nokogiri/xml_reader.c +347 -212
- data/ext/nokogiri/xml_relax_ng.c +86 -77
- data/ext/nokogiri/xml_sax_parser.c +149 -124
- data/ext/nokogiri/xml_sax_parser_context.c +145 -103
- data/ext/nokogiri/xml_sax_push_parser.c +64 -36
- data/ext/nokogiri/xml_schema.c +138 -81
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +36 -26
- data/ext/nokogiri/xml_xpath_context.c +366 -178
- data/ext/nokogiri/xslt_stylesheet.c +335 -189
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +111 -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 +630 -0
- data/gumbo-parser/src/error.h +148 -0
- data/gumbo-parser/src/foreign_attrs.c +103 -0
- data/gumbo-parser/src/foreign_attrs.gperf +27 -0
- data/gumbo-parser/src/insertion_mode.h +33 -0
- data/gumbo-parser/src/macros.h +91 -0
- data/gumbo-parser/src/nokogiri_gumbo.h +944 -0
- data/gumbo-parser/src/parser.c +4891 -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 +223 -0
- data/gumbo-parser/src/tag_lookup.c +382 -0
- data/gumbo-parser/src/tag_lookup.gperf +170 -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 +66 -0
- data/gumbo-parser/src/util.h +34 -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 -8
- data/lib/nokogiri/css/parser.rb +397 -377
- data/lib/nokogiri/css/parser.y +250 -245
- data/lib/nokogiri/css/parser_extras.rb +54 -49
- data/lib/nokogiri/css/syntax_error.rb +3 -1
- data/lib/nokogiri/css/tokenizer.rb +107 -104
- data/lib/nokogiri/css/tokenizer.rex +3 -2
- data/lib/nokogiri/css/xpath_visitor.rb +224 -95
- data/lib/nokogiri/css.rb +56 -17
- data/lib/nokogiri/decorators/slop.rb +9 -7
- data/lib/nokogiri/encoding_handler.rb +57 -0
- data/lib/nokogiri/extension.rb +32 -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 +214 -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 +2040 -0
- data/lib/nokogiri/html4/encoding_reader.rb +121 -0
- data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
- data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
- data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
- data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
- data/lib/nokogiri/html4.rb +47 -0
- data/lib/nokogiri/html5/document.rb +168 -0
- data/lib/nokogiri/html5/document_fragment.rb +90 -0
- data/lib/nokogiri/html5/node.rb +103 -0
- data/lib/nokogiri/html5.rb +392 -0
- data/lib/nokogiri/jruby/dependencies.rb +3 -0
- data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
- data/lib/nokogiri/syntax_error.rb +2 -0
- data/lib/nokogiri/version/constant.rb +6 -0
- data/lib/nokogiri/version/info.rb +223 -0
- data/lib/nokogiri/version.rb +3 -108
- data/lib/nokogiri/xml/attr.rb +55 -3
- data/lib/nokogiri/xml/attribute_decl.rb +6 -2
- data/lib/nokogiri/xml/builder.rb +98 -54
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +2 -0
- data/lib/nokogiri/xml/document.rb +312 -126
- data/lib/nokogiri/xml/document_fragment.rb +104 -48
- data/lib/nokogiri/xml/dtd.rb +4 -2
- data/lib/nokogiri/xml/element_content.rb +12 -2
- data/lib/nokogiri/xml/element_decl.rb +6 -2
- data/lib/nokogiri/xml/entity_decl.rb +7 -3
- data/lib/nokogiri/xml/entity_reference.rb +2 -0
- data/lib/nokogiri/xml/namespace.rb +45 -0
- data/lib/nokogiri/xml/node/save_options.rb +23 -8
- data/lib/nokogiri/xml/node.rb +1093 -411
- data/lib/nokogiri/xml/node_set.rb +173 -67
- data/lib/nokogiri/xml/notation.rb +13 -0
- data/lib/nokogiri/xml/parse_options.rb +145 -52
- data/lib/nokogiri/xml/pp/character_data.rb +9 -6
- data/lib/nokogiri/xml/pp/node.rb +42 -30
- data/lib/nokogiri/xml/pp.rb +4 -2
- data/lib/nokogiri/xml/processing_instruction.rb +4 -1
- data/lib/nokogiri/xml/reader.rb +21 -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 +39 -36
- 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 +120 -72
- data/lib/nokogiri/xml/syntax_error.rb +6 -4
- 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 -37
- data/lib/nokogiri/xslt/stylesheet.rb +3 -1
- data/lib/nokogiri/xslt.rb +101 -22
- data/lib/nokogiri.rb +59 -75
- data/lib/xsd/xmlparser/nokogiri.rb +29 -25
- 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/0009-allow-wildcard-namespaces.patch +77 -0
- data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
- data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
- data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
- data/ports/archives/libxml2-2.11.4.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
- metadata +126 -399
- data/.autotest +0 -22
- data/.cross_rubies +0 -8
- data/.editorconfig +0 -17
- data/.gemtest +0 -0
- data/.travis.yml +0 -63
- data/CHANGELOG.md +0 -1368
- data/CONTRIBUTING.md +0 -42
- data/C_CODING_STYLE.rdoc +0 -33
- data/Gemfile-libxml-ruby +0 -3
- data/Manifest.txt +0 -370
- data/ROADMAP.md +0 -111
- data/Rakefile +0 -348
- data/SECURITY.md +0 -19
- data/STANDARD_RESPONSES.md +0 -47
- data/Y_U_NO_GEMSPEC.md +0 -155
- data/appveyor.yml +0 -29
- data/build_all +0 -44
- 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 -61
- 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 -15
- data/ext/nokogiri/xml_node.h +0 -13
- data/ext/nokogiri/xml_node_set.h +0 -12
- 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 -335
- data/lib/nokogiri/html/document_fragment.rb +0 -49
- data/lib/nokogiri/html/element_description_defaults.rb +0 -671
- data/lib/nokogiri/html/sax/parser_context.rb +0 -16
- data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
- data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
- data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
- data/patches/sort-patches-by-date +0 -25
- data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
- data/suppressions/README.txt +0 -1
- data/suppressions/nokogiri_ruby-2.supp +0 -10
- data/tasks/test.rb +0 -100
- data/test/css/test_nthiness.rb +0 -226
- data/test/css/test_parser.rb +0 -386
- data/test/css/test_tokenizer.rb +0 -215
- data/test/css/test_xpath_visitor.rb +0 -96
- data/test/decorators/test_slop.rb +0 -23
- data/test/files/2ch.html +0 -108
- data/test/files/GH_1042.html +0 -18
- data/test/files/address_book.rlx +0 -12
- data/test/files/address_book.xml +0 -10
- data/test/files/atom.xml +0 -344
- data/test/files/bar/bar.xsd +0 -4
- data/test/files/bogus.xml +0 -0
- 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/namespace_pressure_test.xml +0 -1684
- data/test/files/noencoding.html +0 -47
- data/test/files/po.xml +0 -32
- data/test/files/po.xsd +0 -66
- data/test/files/saml/saml20assertion_schema.xsd +0 -283
- data/test/files/saml/saml20protocol_schema.xsd +0 -302
- data/test/files/saml/xenc_schema.xsd +0 -146
- data/test/files/saml/xmldsig_schema.xsd +0 -318
- data/test/files/shift_jis.html +0 -10
- data/test/files/shift_jis.xml +0 -5
- data/test/files/shift_jis_no_charset.html +0 -9
- data/test/files/slow-xpath.xml +0 -25509
- 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 -851
- 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 -271
- data/test/html/sax/test_parser.rb +0 -168
- data/test/html/sax/test_parser_context.rb +0 -46
- data/test/html/sax/test_parser_text.rb +0 -163
- data/test/html/sax/test_push_parser.rb +0 -87
- data/test/html/test_attributes.rb +0 -85
- data/test/html/test_builder.rb +0 -164
- data/test/html/test_document.rb +0 -712
- data/test/html/test_document_encoding.rb +0 -143
- data/test/html/test_document_fragment.rb +0 -310
- 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 -212
- data/test/html/test_node_encoding.rb +0 -91
- data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
- data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
- data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
- data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
- data/test/namespaces/test_namespaces_preservation.rb +0 -31
- data/test/test_convert_xpath.rb +0 -135
- data/test/test_css_cache.rb +0 -47
- data/test/test_encoding_handler.rb +0 -48
- data/test/test_memory_leak.rb +0 -156
- data/test/test_nokogiri.rb +0 -138
- data/test/test_soap4r_sax.rb +0 -52
- data/test/test_xslt_transforms.rb +0 -314
- 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 -402
- data/test/xml/sax/test_parser_context.rb +0 -115
- data/test/xml/sax/test_parser_text.rb +0 -202
- data/test/xml/sax/test_push_parser.rb +0 -265
- data/test/xml/test_attr.rb +0 -74
- data/test/xml/test_attribute_decl.rb +0 -86
- data/test/xml/test_builder.rb +0 -341
- data/test/xml/test_c14n.rb +0 -180
- data/test/xml/test_cdata.rb +0 -54
- data/test/xml/test_comment.rb +0 -40
- data/test/xml/test_document.rb +0 -982
- data/test/xml/test_document_encoding.rb +0 -31
- data/test/xml/test_document_fragment.rb +0 -298
- data/test/xml/test_dtd.rb +0 -187
- data/test/xml/test_dtd_encoding.rb +0 -31
- 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 -262
- data/test/xml/test_namespace.rb +0 -96
- data/test/xml/test_node.rb +0 -1325
- data/test/xml/test_node_attributes.rb +0 -115
- data/test/xml/test_node_encoding.rb +0 -75
- data/test/xml/test_node_inheritance.rb +0 -32
- data/test/xml/test_node_reparenting.rb +0 -592
- data/test/xml/test_node_set.rb +0 -809
- data/test/xml/test_parse_options.rb +0 -64
- data/test/xml/test_processing_instruction.rb +0 -30
- data/test/xml/test_reader.rb +0 -620
- data/test/xml/test_reader_encoding.rb +0 -134
- data/test/xml/test_relax_ng.rb +0 -60
- data/test/xml/test_schema.rb +0 -142
- data/test/xml/test_syntax_error.rb +0 -36
- data/test/xml/test_text.rb +0 -60
- data/test/xml/test_unparented_node.rb +0 -483
- data/test/xml/test_xinclude.rb +0 -83
- data/test/xml/test_xpath.rb +0 -470
- data/test/xslt/test_custom_functions.rb +0 -133
- data/test/xslt/test_exception_handling.rb +0 -37
data/ext/nokogiri/xml_node_set.c
CHANGED
@@ -1,12 +1,11 @@
|
|
1
|
-
#include <
|
2
|
-
#include <xml_namespace.h>
|
3
|
-
#include <libxml/xpathInternals.h>
|
1
|
+
#include <nokogiri.h>
|
4
2
|
|
5
|
-
|
6
|
-
static void xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val);
|
3
|
+
VALUE cNokogiriXmlNodeSet ;
|
7
4
|
|
5
|
+
static ID decorate ;
|
8
6
|
|
9
|
-
static void
|
7
|
+
static void
|
8
|
+
Check_Node_Set_Node_Type(VALUE node)
|
10
9
|
{
|
11
10
|
if (!(rb_obj_is_kind_of(node, cNokogiriXmlNode) ||
|
12
11
|
rb_obj_is_kind_of(node, cNokogiriXmlNamespace))) {
|
@@ -15,34 +14,102 @@ static void Check_Node_Set_Node_Type(VALUE node)
|
|
15
14
|
}
|
16
15
|
|
17
16
|
|
18
|
-
static
|
17
|
+
static
|
18
|
+
VALUE
|
19
|
+
ruby_object_get(xmlNodePtr c_node)
|
19
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
|
+
xml_node_set_mark(void *data)
|
43
|
+
{
|
44
|
+
xmlNodeSetPtr node_set = data;
|
45
|
+
VALUE rb_node;
|
46
|
+
int jnode;
|
47
|
+
|
48
|
+
for (jnode = 0; jnode < node_set->nodeNr; jnode++) {
|
49
|
+
rb_node = ruby_object_get(node_set->nodeTab[jnode]);
|
50
|
+
if (rb_node) {
|
51
|
+
rb_gc_mark(rb_node);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
static void
|
57
|
+
xml_node_set_deallocate(void *data)
|
58
|
+
{
|
59
|
+
xmlNodeSetPtr node_set = data;
|
20
60
|
/*
|
21
|
-
*
|
22
|
-
*
|
23
|
-
* xmlXPathFreeNodeSet() frees those xmlNs structs that are in the
|
24
|
-
* NodeSet.
|
25
|
-
*
|
26
|
-
* this is bad if someone is still trying to use the Namespace object wrapped
|
27
|
-
* around the xmlNs, so we need to avoid that.
|
28
|
-
*
|
29
|
-
* here we reproduce xmlXPathFreeNodeSet() without the xmlNs logic.
|
30
|
-
*
|
31
|
-
* this doesn't cause a leak because Namespace objects that are in an XPath
|
32
|
-
* query NodeSet are given their own lifecycle in
|
33
|
-
* Nokogiri_wrap_xml_namespace().
|
61
|
+
* For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the
|
62
|
+
* offending call to xmlXPathNodeSetFreeNs().
|
34
63
|
*/
|
35
|
-
|
36
|
-
if (node_set->nodeTab != NULL)
|
64
|
+
if (node_set->nodeTab != NULL) {
|
37
65
|
xmlFree(node_set->nodeTab);
|
66
|
+
}
|
38
67
|
|
39
68
|
xmlFree(node_set);
|
40
|
-
NOKOGIRI_DEBUG_END(node_set) ;
|
41
69
|
}
|
42
70
|
|
43
|
-
|
71
|
+
|
72
|
+
static VALUE
|
73
|
+
xml_node_set_allocate(VALUE klass)
|
74
|
+
{
|
75
|
+
return noko_xml_node_set_wrap(xmlXPathNodeSetCreate(NULL), Qnil);
|
76
|
+
}
|
77
|
+
|
78
|
+
static const rb_data_type_t xml_node_set_type = {
|
79
|
+
.wrap_struct_name = "Nokogiri::XML::NodeSet",
|
80
|
+
.function = {
|
81
|
+
.dmark = xml_node_set_mark,
|
82
|
+
.dfree = xml_node_set_deallocate,
|
83
|
+
},
|
84
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
85
|
+
};
|
86
|
+
|
87
|
+
static void
|
88
|
+
xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val)
|
44
89
|
{
|
45
|
-
|
90
|
+
/*
|
91
|
+
* For reasons outlined in xml_namespace.c, here we reproduce xmlXPathNodeSetDel() except for the
|
92
|
+
* offending call to xmlXPathNodeSetFreeNs().
|
93
|
+
*/
|
94
|
+
int i;
|
95
|
+
|
96
|
+
if (cur == NULL) { return; }
|
97
|
+
if (val == NULL) { return; }
|
98
|
+
|
99
|
+
/*
|
100
|
+
* find node in nodeTab
|
101
|
+
*/
|
102
|
+
for (i = 0; i < cur->nodeNr; i++)
|
103
|
+
if (cur->nodeTab[i] == val) { break; }
|
104
|
+
|
105
|
+
if (i >= cur->nodeNr) { /* not found */
|
106
|
+
return;
|
107
|
+
}
|
108
|
+
cur->nodeNr--;
|
109
|
+
for (; i < cur->nodeNr; i++) {
|
110
|
+
cur->nodeTab[i] = cur->nodeTab[i + 1];
|
111
|
+
}
|
112
|
+
cur->nodeTab[cur->nodeNr] = NULL;
|
46
113
|
}
|
47
114
|
|
48
115
|
|
@@ -53,16 +120,17 @@ static VALUE allocate(VALUE klass)
|
|
53
120
|
* Duplicate this NodeSet. Note that the Nodes contained in the NodeSet are not
|
54
121
|
* duplicated (similar to how Array and other Enumerable classes work).
|
55
122
|
*/
|
56
|
-
static VALUE
|
123
|
+
static VALUE
|
124
|
+
duplicate(VALUE rb_self)
|
57
125
|
{
|
58
|
-
xmlNodeSetPtr
|
126
|
+
xmlNodeSetPtr c_self;
|
59
127
|
xmlNodeSetPtr dupl;
|
60
128
|
|
61
|
-
|
129
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
62
130
|
|
63
|
-
dupl = xmlXPathNodeSetMerge(NULL,
|
131
|
+
dupl = xmlXPathNodeSetMerge(NULL, c_self);
|
64
132
|
|
65
|
-
return
|
133
|
+
return noko_xml_node_set_wrap(dupl, rb_iv_get(rb_self, "@document"));
|
66
134
|
}
|
67
135
|
|
68
136
|
/*
|
@@ -71,13 +139,14 @@ static VALUE duplicate(VALUE self)
|
|
71
139
|
*
|
72
140
|
* Get the length of the node set
|
73
141
|
*/
|
74
|
-
static VALUE
|
142
|
+
static VALUE
|
143
|
+
length(VALUE rb_self)
|
75
144
|
{
|
76
|
-
xmlNodeSetPtr
|
145
|
+
xmlNodeSetPtr c_self;
|
77
146
|
|
78
|
-
|
147
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
79
148
|
|
80
|
-
return
|
149
|
+
return c_self ? INT2NUM(c_self->nodeNr) : INT2NUM(0);
|
81
150
|
}
|
82
151
|
|
83
152
|
/*
|
@@ -86,19 +155,20 @@ static VALUE length(VALUE self)
|
|
86
155
|
*
|
87
156
|
* Append +node+ to the NodeSet.
|
88
157
|
*/
|
89
|
-
static VALUE
|
158
|
+
static VALUE
|
159
|
+
push(VALUE rb_self, VALUE rb_node)
|
90
160
|
{
|
91
|
-
xmlNodeSetPtr
|
161
|
+
xmlNodeSetPtr c_self;
|
92
162
|
xmlNodePtr node;
|
93
163
|
|
94
164
|
Check_Node_Set_Node_Type(rb_node);
|
95
165
|
|
96
|
-
|
97
|
-
|
166
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
167
|
+
Noko_Node_Get_Struct(rb_node, xmlNode, node);
|
98
168
|
|
99
|
-
xmlXPathNodeSetAdd(
|
169
|
+
xmlXPathNodeSetAdd(c_self, node);
|
100
170
|
|
101
|
-
return
|
171
|
+
return rb_self;
|
102
172
|
}
|
103
173
|
|
104
174
|
/*
|
@@ -109,18 +179,18 @@ static VALUE push(VALUE self, VALUE rb_node)
|
|
109
179
|
* if found, otherwise returns nil.
|
110
180
|
*/
|
111
181
|
static VALUE
|
112
|
-
delete(VALUE
|
182
|
+
delete (VALUE rb_self, VALUE rb_node)
|
113
183
|
{
|
114
|
-
xmlNodeSetPtr
|
184
|
+
xmlNodeSetPtr c_self;
|
115
185
|
xmlNodePtr node;
|
116
186
|
|
117
187
|
Check_Node_Set_Node_Type(rb_node);
|
118
188
|
|
119
|
-
|
120
|
-
|
189
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
190
|
+
Noko_Node_Get_Struct(rb_node, xmlNode, node);
|
121
191
|
|
122
|
-
if (xmlXPathNodeSetContains(
|
123
|
-
xpath_node_set_del(
|
192
|
+
if (xmlXPathNodeSetContains(c_self, node)) {
|
193
|
+
xpath_node_set_del(c_self, node);
|
124
194
|
return rb_node;
|
125
195
|
}
|
126
196
|
return Qnil ;
|
@@ -133,19 +203,21 @@ delete(VALUE self, VALUE rb_node)
|
|
133
203
|
*
|
134
204
|
* Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.
|
135
205
|
*/
|
136
|
-
static VALUE
|
206
|
+
static VALUE
|
207
|
+
intersection(VALUE rb_self, VALUE rb_other)
|
137
208
|
{
|
138
|
-
xmlNodeSetPtr
|
209
|
+
xmlNodeSetPtr c_self, c_other ;
|
139
210
|
xmlNodeSetPtr intersection;
|
140
211
|
|
141
|
-
if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
|
212
|
+
if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
|
142
213
|
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
214
|
+
}
|
143
215
|
|
144
|
-
|
145
|
-
|
216
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
217
|
+
TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
|
146
218
|
|
147
|
-
intersection = xmlXPathIntersection(
|
148
|
-
return
|
219
|
+
intersection = xmlXPathIntersection(c_self, c_other);
|
220
|
+
return noko_xml_node_set_wrap(intersection, rb_iv_get(rb_self, "@document"));
|
149
221
|
}
|
150
222
|
|
151
223
|
|
@@ -155,17 +227,18 @@ static VALUE intersection(VALUE self, VALUE rb_other)
|
|
155
227
|
*
|
156
228
|
* Returns true if any member of node set equals +node+.
|
157
229
|
*/
|
158
|
-
static VALUE
|
230
|
+
static VALUE
|
231
|
+
include_eh(VALUE rb_self, VALUE rb_node)
|
159
232
|
{
|
160
|
-
xmlNodeSetPtr
|
233
|
+
xmlNodeSetPtr c_self;
|
161
234
|
xmlNodePtr node;
|
162
235
|
|
163
236
|
Check_Node_Set_Node_Type(rb_node);
|
164
237
|
|
165
|
-
|
166
|
-
|
238
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
239
|
+
Noko_Node_Get_Struct(rb_node, xmlNode, node);
|
167
240
|
|
168
|
-
return (xmlXPathNodeSetContains(
|
241
|
+
return (xmlXPathNodeSetContains(c_self, node) ? Qtrue : Qfalse);
|
169
242
|
}
|
170
243
|
|
171
244
|
|
@@ -176,21 +249,23 @@ static VALUE include_eh(VALUE self, VALUE rb_node)
|
|
176
249
|
* Returns a new set built by merging the set and the elements of the given
|
177
250
|
* set.
|
178
251
|
*/
|
179
|
-
static VALUE
|
252
|
+
static VALUE
|
253
|
+
rb_xml_node_set_union(VALUE rb_self, VALUE rb_other)
|
180
254
|
{
|
181
|
-
xmlNodeSetPtr
|
182
|
-
xmlNodeSetPtr
|
255
|
+
xmlNodeSetPtr c_self, c_other;
|
256
|
+
xmlNodeSetPtr c_new_node_set;
|
183
257
|
|
184
|
-
if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
|
258
|
+
if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
|
185
259
|
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
260
|
+
}
|
186
261
|
|
187
|
-
|
188
|
-
|
262
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
263
|
+
TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
|
189
264
|
|
190
|
-
|
191
|
-
|
265
|
+
c_new_node_set = xmlXPathNodeSetMerge(NULL, c_self);
|
266
|
+
c_new_node_set = xmlXPathNodeSetMerge(c_new_node_set, c_other);
|
192
267
|
|
193
|
-
return
|
268
|
+
return noko_xml_node_set_wrap(c_new_node_set, rb_iv_get(rb_self, "@document"));
|
194
269
|
}
|
195
270
|
|
196
271
|
/*
|
@@ -200,62 +275,66 @@ static VALUE set_union(VALUE self, VALUE rb_other)
|
|
200
275
|
* Difference - returns a new NodeSet that is a copy of this NodeSet, removing
|
201
276
|
* each item that also appears in +node_set+
|
202
277
|
*/
|
203
|
-
static VALUE
|
278
|
+
static VALUE
|
279
|
+
minus(VALUE rb_self, VALUE rb_other)
|
204
280
|
{
|
205
|
-
xmlNodeSetPtr
|
281
|
+
xmlNodeSetPtr c_self, c_other;
|
206
282
|
xmlNodeSetPtr new;
|
207
283
|
int j ;
|
208
284
|
|
209
|
-
if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
|
285
|
+
if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
|
210
286
|
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
287
|
+
}
|
211
288
|
|
212
|
-
|
213
|
-
|
289
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
290
|
+
TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
|
214
291
|
|
215
|
-
new = xmlXPathNodeSetMerge(NULL,
|
216
|
-
for (j = 0 ; j <
|
217
|
-
xpath_node_set_del(new,
|
292
|
+
new = xmlXPathNodeSetMerge(NULL, c_self);
|
293
|
+
for (j = 0 ; j < c_other->nodeNr ; ++j) {
|
294
|
+
xpath_node_set_del(new, c_other->nodeTab[j]);
|
218
295
|
}
|
219
296
|
|
220
|
-
return
|
297
|
+
return noko_xml_node_set_wrap(new, rb_iv_get(rb_self, "@document"));
|
221
298
|
}
|
222
299
|
|
223
300
|
|
224
|
-
static VALUE
|
301
|
+
static VALUE
|
302
|
+
index_at(VALUE rb_self, long offset)
|
225
303
|
{
|
226
|
-
xmlNodeSetPtr
|
304
|
+
xmlNodeSetPtr c_self;
|
227
305
|
|
228
|
-
|
306
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
229
307
|
|
230
|
-
if (offset >=
|
308
|
+
if (offset >= c_self->nodeNr || abs((int)offset) > c_self->nodeNr) {
|
231
309
|
return Qnil;
|
232
310
|
}
|
233
311
|
|
234
|
-
if (offset < 0) { offset +=
|
312
|
+
if (offset < 0) { offset += c_self->nodeNr ; }
|
235
313
|
|
236
|
-
return
|
314
|
+
return noko_xml_node_wrap_node_set_result(c_self->nodeTab[offset], rb_self);
|
237
315
|
}
|
238
316
|
|
239
|
-
static VALUE
|
317
|
+
static VALUE
|
318
|
+
subseq(VALUE rb_self, long beg, long len)
|
240
319
|
{
|
241
320
|
long j;
|
242
|
-
xmlNodeSetPtr
|
321
|
+
xmlNodeSetPtr c_self;
|
243
322
|
xmlNodeSetPtr new_set ;
|
244
323
|
|
245
|
-
|
324
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
246
325
|
|
247
|
-
if (beg >
|
248
|
-
if (beg < 0 || len < 0) return Qnil ;
|
326
|
+
if (beg > c_self->nodeNr) { return Qnil ; }
|
327
|
+
if (beg < 0 || len < 0) { return Qnil ; }
|
249
328
|
|
250
|
-
if ((beg + len) >
|
251
|
-
len =
|
329
|
+
if ((beg + len) > c_self->nodeNr) {
|
330
|
+
len = c_self->nodeNr - beg ;
|
252
331
|
}
|
253
332
|
|
254
333
|
new_set = xmlXPathNodeSetCreate(NULL);
|
255
|
-
for (j = beg ; j < beg+len ; ++j) {
|
256
|
-
xmlXPathNodeSetAddUnique(new_set,
|
334
|
+
for (j = beg ; j < beg + len ; ++j) {
|
335
|
+
xmlXPathNodeSetAddUnique(new_set, c_self->nodeTab[j]);
|
257
336
|
}
|
258
|
-
return
|
337
|
+
return noko_xml_node_set_wrap(new_set, rb_iv_get(rb_self, "@document"));
|
259
338
|
}
|
260
339
|
|
261
340
|
/*
|
@@ -273,21 +352,22 @@ static VALUE subseq(VALUE self, long beg, long len)
|
|
273
352
|
* count backward from the end of the +node_set+ (-1 is the last node). Returns
|
274
353
|
* nil if the +index+ (or +start+) are out of range.
|
275
354
|
*/
|
276
|
-
static VALUE
|
355
|
+
static VALUE
|
356
|
+
slice(int argc, VALUE *argv, VALUE rb_self)
|
277
357
|
{
|
278
358
|
VALUE arg ;
|
279
359
|
long beg, len ;
|
280
|
-
xmlNodeSetPtr
|
360
|
+
xmlNodeSetPtr c_self;
|
281
361
|
|
282
|
-
|
362
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
283
363
|
|
284
364
|
if (argc == 2) {
|
285
365
|
beg = NUM2LONG(argv[0]);
|
286
366
|
len = NUM2LONG(argv[1]);
|
287
367
|
if (beg < 0) {
|
288
|
-
beg +=
|
368
|
+
beg += c_self->nodeNr ;
|
289
369
|
}
|
290
|
-
return subseq(
|
370
|
+
return subseq(rb_self, beg, len);
|
291
371
|
}
|
292
372
|
|
293
373
|
if (argc != 1) {
|
@@ -296,20 +376,20 @@ static VALUE slice(int argc, VALUE *argv, VALUE self)
|
|
296
376
|
arg = argv[0];
|
297
377
|
|
298
378
|
if (FIXNUM_P(arg)) {
|
299
|
-
return index_at(
|
379
|
+
return index_at(rb_self, FIX2LONG(arg));
|
300
380
|
}
|
301
381
|
|
302
382
|
/* if arg is Range */
|
303
|
-
switch (rb_range_beg_len(arg, &beg, &len, (long)
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
383
|
+
switch (rb_range_beg_len(arg, &beg, &len, (long)c_self->nodeNr, 0)) {
|
384
|
+
case Qfalse:
|
385
|
+
break;
|
386
|
+
case Qnil:
|
387
|
+
return Qnil;
|
388
|
+
default:
|
389
|
+
return subseq(rb_self, beg, len);
|
310
390
|
}
|
311
391
|
|
312
|
-
return index_at(
|
392
|
+
return index_at(rb_self, NUM2LONG(arg));
|
313
393
|
}
|
314
394
|
|
315
395
|
|
@@ -319,18 +399,19 @@ static VALUE slice(int argc, VALUE *argv, VALUE self)
|
|
319
399
|
*
|
320
400
|
* Return this list as an Array
|
321
401
|
*/
|
322
|
-
static VALUE
|
402
|
+
static VALUE
|
403
|
+
to_array(VALUE rb_self)
|
323
404
|
{
|
324
|
-
xmlNodeSetPtr
|
405
|
+
xmlNodeSetPtr c_self ;
|
325
406
|
VALUE list;
|
326
407
|
int i;
|
327
408
|
|
328
|
-
|
409
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
329
410
|
|
330
|
-
list = rb_ary_new2(
|
331
|
-
for(i = 0; i <
|
332
|
-
VALUE elt =
|
333
|
-
rb_ary_push(
|
411
|
+
list = rb_ary_new2(c_self->nodeNr);
|
412
|
+
for (i = 0; i < c_self->nodeNr; i++) {
|
413
|
+
VALUE elt = noko_xml_node_wrap_node_set_result(c_self->nodeTab[i], rb_self);
|
414
|
+
rb_ary_push(list, elt);
|
334
415
|
}
|
335
416
|
|
336
417
|
return list;
|
@@ -342,145 +423,94 @@ static VALUE to_array(VALUE self, VALUE rb_node)
|
|
342
423
|
*
|
343
424
|
* Unlink this NodeSet and all Node objects it contains from their current context.
|
344
425
|
*/
|
345
|
-
static VALUE
|
426
|
+
static VALUE
|
427
|
+
unlink_nodeset(VALUE rb_self)
|
346
428
|
{
|
347
|
-
xmlNodeSetPtr
|
429
|
+
xmlNodeSetPtr c_self;
|
348
430
|
int j, nodeNr ;
|
349
431
|
|
350
|
-
|
432
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
351
433
|
|
352
|
-
nodeNr =
|
434
|
+
nodeNr = c_self->nodeNr ;
|
353
435
|
for (j = 0 ; j < nodeNr ; j++) {
|
354
|
-
if (! NOKOGIRI_NAMESPACE_EH(
|
436
|
+
if (! NOKOGIRI_NAMESPACE_EH(c_self->nodeTab[j])) {
|
355
437
|
VALUE node ;
|
356
438
|
xmlNodePtr node_ptr;
|
357
|
-
node =
|
439
|
+
node = noko_xml_node_wrap(Qnil, c_self->nodeTab[j]);
|
358
440
|
rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */
|
359
|
-
|
360
|
-
|
441
|
+
Noko_Node_Get_Struct(node, xmlNode, node_ptr);
|
442
|
+
c_self->nodeTab[j] = node_ptr ;
|
361
443
|
}
|
362
444
|
}
|
363
|
-
return
|
445
|
+
return rb_self ;
|
364
446
|
}
|
365
447
|
|
366
448
|
|
367
|
-
|
449
|
+
VALUE
|
450
|
+
noko_xml_node_set_wrap(xmlNodeSetPtr c_node_set, VALUE document)
|
368
451
|
{
|
369
|
-
|
370
|
-
|
371
|
-
* NodeSet are duplicates, and we don't clean them up at deallocate() time.
|
372
|
-
*
|
373
|
-
* as a result, we need to make sure the Ruby manages this memory. we do this
|
374
|
-
* by forcing the creation of a Ruby object wrapped around the xmlNs.
|
375
|
-
*
|
376
|
-
* we also have to make sure that the NodeSet has a reference to the
|
377
|
-
* Namespace object, otherwise GC will kick in and the Namespace won't be
|
378
|
-
* marked.
|
379
|
-
*
|
380
|
-
* we *could* do this safely with *all* the nodes in the NodeSet, but we only
|
381
|
-
* *need* to do it for xmlNs structs, and so you get the code we have here.
|
382
|
-
*/
|
383
|
-
int j ;
|
384
|
-
xmlNodeSetPtr node_set ;
|
385
|
-
VALUE namespace_cache ;
|
386
|
-
|
387
|
-
Data_Get_Struct(self, xmlNodeSet, node_set);
|
452
|
+
int j;
|
453
|
+
VALUE rb_node_set ;
|
388
454
|
|
389
|
-
|
390
|
-
|
391
|
-
for (j = 0 ; j < node_set->nodeNr ; j++) {
|
392
|
-
if (NOKOGIRI_NAMESPACE_EH(node_set->nodeTab[j])) {
|
393
|
-
rb_ary_push(namespace_cache, Nokogiri_wrap_xml_node_set_node(node_set->nodeTab[j], self));
|
394
|
-
}
|
455
|
+
if (c_node_set == NULL) {
|
456
|
+
c_node_set = xmlXPathNodeSetCreate(NULL);
|
395
457
|
}
|
396
|
-
}
|
397
|
-
|
398
458
|
|
399
|
-
|
400
|
-
{
|
401
|
-
VALUE new_set ;
|
402
|
-
|
403
|
-
if (node_set == NULL) {
|
404
|
-
node_set = xmlXPathNodeSetCreate(NULL);
|
405
|
-
}
|
406
|
-
|
407
|
-
new_set = Data_Wrap_Struct(cNokogiriXmlNodeSet, 0, deallocate, node_set);
|
459
|
+
rb_node_set = TypedData_Wrap_Struct(cNokogiriXmlNodeSet, &xml_node_set_type, c_node_set);
|
408
460
|
|
409
461
|
if (!NIL_P(document)) {
|
410
|
-
rb_iv_set(
|
411
|
-
rb_funcall(document, decorate, 1,
|
462
|
+
rb_iv_set(rb_node_set, "@document", document);
|
463
|
+
rb_funcall(document, decorate, 1, rb_node_set);
|
412
464
|
}
|
413
465
|
|
414
|
-
|
415
|
-
|
466
|
+
/* make sure we create ruby objects for all the results, so they'll be marked during the GC mark phase */
|
467
|
+
for (j = 0 ; j < c_node_set->nodeNr ; j++) {
|
468
|
+
noko_xml_node_wrap_node_set_result(c_node_set->nodeTab[j], rb_node_set);
|
469
|
+
}
|
416
470
|
|
417
|
-
return
|
471
|
+
return rb_node_set ;
|
418
472
|
}
|
419
473
|
|
420
|
-
VALUE Nokogiri_wrap_xml_node_set_node(xmlNodePtr node, VALUE node_set)
|
421
|
-
{
|
422
|
-
xmlDocPtr document ;
|
423
474
|
|
475
|
+
VALUE
|
476
|
+
noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set)
|
477
|
+
{
|
424
478
|
if (NOKOGIRI_NAMESPACE_EH(node)) {
|
425
|
-
|
426
|
-
return Nokogiri_wrap_xml_namespace(document, (xmlNsPtr)node);
|
479
|
+
return noko_xml_namespace_wrap_xpath_copy((xmlNsPtr)node);
|
427
480
|
} else {
|
428
|
-
return
|
481
|
+
return noko_xml_node_wrap(Qnil, node);
|
429
482
|
}
|
430
483
|
}
|
431
484
|
|
432
485
|
|
433
|
-
|
486
|
+
xmlNodeSetPtr
|
487
|
+
noko_xml_node_set_unwrap(VALUE rb_node_set)
|
434
488
|
{
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
*
|
439
|
-
* xmlXPathNodeSetDel() frees xmlNs structs, and so here we reproduce that
|
440
|
-
* function with the xmlNs logic.
|
441
|
-
*/
|
442
|
-
int i;
|
443
|
-
|
444
|
-
if (cur == NULL) return;
|
445
|
-
if (val == NULL) return;
|
446
|
-
|
447
|
-
/*
|
448
|
-
* find node in nodeTab
|
449
|
-
*/
|
450
|
-
for (i = 0;i < cur->nodeNr;i++)
|
451
|
-
if (cur->nodeTab[i] == val) break;
|
452
|
-
|
453
|
-
if (i >= cur->nodeNr) { /* not found */
|
454
|
-
return;
|
455
|
-
}
|
456
|
-
cur->nodeNr--;
|
457
|
-
for (;i < cur->nodeNr;i++)
|
458
|
-
cur->nodeTab[i] = cur->nodeTab[i + 1];
|
459
|
-
cur->nodeTab[cur->nodeNr] = NULL;
|
489
|
+
xmlNodeSetPtr c_node_set;
|
490
|
+
TypedData_Get_Struct(rb_node_set, xmlNodeSet, &xml_node_set_type, c_node_set);
|
491
|
+
return c_node_set;
|
460
492
|
}
|
461
493
|
|
462
494
|
|
463
|
-
|
464
|
-
|
495
|
+
void
|
496
|
+
noko_init_xml_node_set(void)
|
465
497
|
{
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
rb_define_method(
|
473
|
-
rb_define_method(
|
474
|
-
rb_define_method(
|
475
|
-
rb_define_method(
|
476
|
-
rb_define_method(
|
477
|
-
rb_define_method(
|
478
|
-
rb_define_method(
|
479
|
-
rb_define_method(
|
480
|
-
rb_define_method(
|
481
|
-
rb_define_method(
|
482
|
-
rb_define_method(klass, "&", intersection, 1);
|
483
|
-
rb_define_method(klass, "include?", include_eh, 1);
|
498
|
+
cNokogiriXmlNodeSet = rb_define_class_under(mNokogiriXml, "NodeSet", rb_cObject);
|
499
|
+
|
500
|
+
rb_define_alloc_func(cNokogiriXmlNodeSet, xml_node_set_allocate);
|
501
|
+
|
502
|
+
rb_define_method(cNokogiriXmlNodeSet, "length", length, 0);
|
503
|
+
rb_define_method(cNokogiriXmlNodeSet, "[]", slice, -1);
|
504
|
+
rb_define_method(cNokogiriXmlNodeSet, "slice", slice, -1);
|
505
|
+
rb_define_method(cNokogiriXmlNodeSet, "push", push, 1);
|
506
|
+
rb_define_method(cNokogiriXmlNodeSet, "|", rb_xml_node_set_union, 1);
|
507
|
+
rb_define_method(cNokogiriXmlNodeSet, "-", minus, 1);
|
508
|
+
rb_define_method(cNokogiriXmlNodeSet, "unlink", unlink_nodeset, 0);
|
509
|
+
rb_define_method(cNokogiriXmlNodeSet, "to_a", to_array, 0);
|
510
|
+
rb_define_method(cNokogiriXmlNodeSet, "dup", duplicate, 0);
|
511
|
+
rb_define_method(cNokogiriXmlNodeSet, "delete", delete, 1);
|
512
|
+
rb_define_method(cNokogiriXmlNodeSet, "&", intersection, 1);
|
513
|
+
rb_define_method(cNokogiriXmlNodeSet, "include?", include_eh, 1);
|
484
514
|
|
485
515
|
decorate = rb_intern("decorate");
|
486
516
|
}
|