nokogiri 1.2.3-x86-mswin32-60 → 1.4.5-x86-mswin32-60
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.
- data/.autotest +18 -7
- data/.gemtest +0 -0
- data/CHANGELOG.ja.rdoc +297 -3
- data/CHANGELOG.rdoc +289 -0
- data/Manifest.txt +148 -37
- data/README.ja.rdoc +20 -20
- data/README.rdoc +53 -22
- data/Rakefile +127 -211
- data/bin/nokogiri +54 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +89 -54
- data/ext/nokogiri/html_document.c +34 -27
- data/ext/nokogiri/html_document.h +1 -1
- data/ext/nokogiri/html_element_description.c +276 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.c +7 -5
- data/ext/nokogiri/html_entity_lookup.h +1 -1
- data/ext/nokogiri/html_sax_parser_context.c +94 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
- data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
- data/ext/nokogiri/xml_attr.c +20 -9
- data/ext/nokogiri/xml_attr.h +1 -1
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +21 -9
- data/ext/nokogiri/xml_cdata.h +1 -1
- data/ext/nokogiri/xml_comment.c +18 -6
- data/ext/nokogiri/xml_comment.h +1 -1
- data/ext/nokogiri/xml_document.c +247 -68
- data/ext/nokogiri/xml_document.h +5 -3
- data/ext/nokogiri/xml_document_fragment.c +15 -7
- data/ext/nokogiri/xml_document_fragment.h +1 -1
- data/ext/nokogiri/xml_dtd.c +110 -10
- data/ext/nokogiri/xml_dtd.h +3 -1
- data/ext/nokogiri/xml_element_content.c +123 -0
- data/ext/nokogiri/xml_element_content.h +10 -0
- data/ext/nokogiri/xml_element_decl.c +69 -0
- data/ext/nokogiri/xml_element_decl.h +9 -0
- data/ext/nokogiri/xml_encoding_handler.c +79 -0
- data/ext/nokogiri/xml_encoding_handler.h +8 -0
- data/ext/nokogiri/xml_entity_decl.c +110 -0
- data/ext/nokogiri/xml_entity_decl.h +10 -0
- data/ext/nokogiri/xml_entity_reference.c +16 -5
- data/ext/nokogiri/xml_entity_reference.h +1 -1
- data/ext/nokogiri/xml_io.c +40 -8
- data/ext/nokogiri/xml_io.h +2 -1
- data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
- data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
- data/ext/nokogiri/xml_namespace.c +84 -0
- data/ext/nokogiri/xml_namespace.h +13 -0
- data/ext/nokogiri/xml_node.c +782 -225
- data/ext/nokogiri/xml_node.h +2 -4
- data/ext/nokogiri/xml_node_set.c +253 -34
- data/ext/nokogiri/xml_node_set.h +2 -2
- data/ext/nokogiri/xml_processing_instruction.c +17 -5
- data/ext/nokogiri/xml_processing_instruction.h +1 -1
- data/ext/nokogiri/xml_reader.c +277 -85
- data/ext/nokogiri/xml_reader.h +1 -1
- data/ext/nokogiri/xml_relax_ng.c +168 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +183 -111
- data/ext/nokogiri/xml_sax_parser.h +30 -1
- data/ext/nokogiri/xml_sax_parser_context.c +199 -0
- data/ext/nokogiri/xml_sax_parser_context.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +42 -12
- data/ext/nokogiri/xml_sax_push_parser.h +1 -1
- data/ext/nokogiri/xml_schema.c +205 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +28 -173
- data/ext/nokogiri/xml_syntax_error.h +2 -1
- data/ext/nokogiri/xml_text.c +16 -6
- data/ext/nokogiri/xml_text.h +1 -1
- data/ext/nokogiri/xml_xpath_context.c +104 -47
- data/ext/nokogiri/xml_xpath_context.h +1 -1
- data/ext/nokogiri/xslt_stylesheet.c +161 -19
- data/ext/nokogiri/xslt_stylesheet.h +1 -1
- data/lib/nokogiri.rb +47 -8
- data/lib/nokogiri/1.8/nokogiri.so +0 -0
- data/lib/nokogiri/1.9/nokogiri.so +0 -0
- data/lib/nokogiri/css.rb +6 -3
- data/lib/nokogiri/css/node.rb +14 -12
- data/lib/nokogiri/css/parser.rb +665 -62
- data/lib/nokogiri/css/parser.y +20 -10
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/tokenizer.rb +148 -5
- data/lib/nokogiri/css/tokenizer.rex +10 -9
- data/lib/nokogiri/css/xpath_visitor.rb +47 -44
- data/lib/nokogiri/decorators/slop.rb +8 -4
- data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
- data/lib/nokogiri/ffi/html/document.rb +28 -0
- data/lib/nokogiri/ffi/html/element_description.rb +81 -0
- data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
- data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
- data/lib/nokogiri/ffi/libxml.rb +420 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +38 -0
- data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
- data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_attr.rb +20 -0
- data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
- data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
- data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
- data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
- data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
- data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
- data/lib/nokogiri/ffi/structs/xml_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -0
- data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
- data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +124 -0
- data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
- data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +38 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
- data/lib/nokogiri/ffi/weak_bucket.rb +40 -0
- data/lib/nokogiri/ffi/xml/attr.rb +41 -0
- data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
- data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
- data/lib/nokogiri/ffi/xml/comment.rb +18 -0
- data/lib/nokogiri/ffi/xml/document.rb +174 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
- data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
- data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
- data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
- data/lib/nokogiri/ffi/xml/node.rb +559 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +236 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
- data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
- data/lib/nokogiri/ffi/xml/schema.rb +109 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
- data/lib/nokogiri/html.rb +13 -47
- data/lib/nokogiri/html/builder.rb +27 -1
- data/lib/nokogiri/html/document.rb +201 -7
- data/lib/nokogiri/html/document_fragment.rb +41 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +2 -0
- data/lib/nokogiri/html/sax/parser.rb +34 -3
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/nokogiri.rb +1 -0
- data/lib/nokogiri/version.rb +40 -1
- data/lib/nokogiri/version_warning.rb +14 -0
- data/lib/nokogiri/xml.rb +32 -53
- data/lib/nokogiri/xml/attr.rb +5 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +349 -29
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +166 -14
- data/lib/nokogiri/xml/document_fragment.rb +76 -1
- data/lib/nokogiri/xml/dtd.rb +16 -3
- data/lib/nokogiri/xml/element_content.rb +36 -0
- data/lib/nokogiri/xml/element_decl.rb +13 -0
- data/lib/nokogiri/xml/entity_decl.rb +19 -0
- data/lib/nokogiri/xml/namespace.rb +13 -0
- data/lib/nokogiri/xml/node.rb +561 -166
- data/lib/nokogiri/xml/node/save_options.rb +22 -2
- data/lib/nokogiri/xml/node_set.rb +202 -40
- data/lib/nokogiri/xml/parse_options.rb +93 -0
- data/lib/nokogiri/xml/pp.rb +2 -0
- data/lib/nokogiri/xml/pp/character_data.rb +18 -0
- data/lib/nokogiri/xml/pp/node.rb +56 -0
- data/lib/nokogiri/xml/processing_instruction.rb +2 -0
- data/lib/nokogiri/xml/reader.rb +93 -8
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +1 -7
- data/lib/nokogiri/xml/sax/document.rb +107 -2
- data/lib/nokogiri/xml/sax/parser.rb +57 -7
- data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
- data/lib/nokogiri/xml/schema.rb +63 -0
- data/lib/nokogiri/xml/syntax_error.rb +25 -1
- data/lib/nokogiri/xml/text.rb +4 -1
- data/lib/nokogiri/xml/xpath.rb +1 -1
- data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
- data/lib/nokogiri/xml/xpath_context.rb +2 -0
- data/lib/nokogiri/xslt.rb +26 -2
- data/lib/nokogiri/xslt/stylesheet.rb +19 -0
- data/lib/xsd/xmlparser/nokogiri.rb +45 -9
- data/tasks/cross_compile.rb +173 -0
- data/tasks/test.rb +25 -69
- data/test/css/test_nthiness.rb +3 -4
- data/test/css/test_parser.rb +75 -20
- data/test/css/test_tokenizer.rb +23 -1
- data/test/css/test_xpath_visitor.rb +10 -1
- data/test/decorators/test_slop.rb +16 -0
- data/test/ffi/test_document.rb +35 -0
- data/test/files/2ch.html +108 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/bar/bar.xsd +4 -0
- data/test/files/encoding.html +82 -0
- data/test/files/encoding.xhtml +84 -0
- data/test/files/foo/foo.xsd +4 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/shift_jis.html +10 -0
- data/test/files/shift_jis.xml +5 -0
- data/test/files/snuggles.xml +3 -0
- data/test/files/staff.dtd +10 -0
- data/test/files/valid_bar.xml +2 -0
- data/test/helper.rb +101 -23
- data/test/html/sax/test_parser.rb +81 -2
- data/test/html/sax/test_parser_context.rb +48 -0
- data/test/html/test_builder.rb +39 -8
- data/test/html/test_document.rb +186 -23
- data/test/html/test_document_encoding.rb +78 -1
- data/test/html/test_document_fragment.rb +253 -0
- data/test/html/test_element_description.rb +98 -0
- data/test/html/test_named_characters.rb +1 -1
- data/test/html/test_node.rb +124 -36
- data/test/html/test_node_encoding.rb +27 -0
- data/test/test_convert_xpath.rb +1 -52
- data/test/test_css_cache.rb +2 -13
- data/test/test_encoding_handler.rb +46 -0
- data/test/test_memory_leak.rb +88 -19
- data/test/test_nokogiri.rb +38 -5
- data/test/test_reader.rb +188 -6
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +183 -83
- data/test/xml/node/test_save_options.rb +1 -1
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +175 -4
- data/test/xml/sax/test_parser_context.rb +113 -0
- data/test/xml/sax/test_push_parser.rb +90 -2
- data/test/xml/test_attr.rb +35 -1
- data/test/xml/test_attribute_decl.rb +82 -0
- data/test/xml/test_builder.rb +186 -1
- data/test/xml/test_cdata.rb +32 -1
- data/test/xml/test_comment.rb +13 -1
- data/test/xml/test_document.rb +415 -43
- data/test/xml/test_document_encoding.rb +1 -1
- data/test/xml/test_document_fragment.rb +173 -5
- data/test/xml/test_dtd.rb +61 -6
- data/test/xml/test_dtd_encoding.rb +3 -1
- data/test/xml/test_element_content.rb +56 -0
- data/test/xml/test_element_decl.rb +73 -0
- data/test/xml/test_entity_decl.rb +120 -0
- data/test/xml/test_entity_reference.rb +5 -1
- data/test/xml/test_namespace.rb +68 -0
- data/test/xml/test_node.rb +546 -201
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +33 -3
- data/test/xml/test_node_reparenting.rb +321 -0
- data/test/xml/test_node_set.rb +538 -2
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +6 -1
- data/test/xml/test_reader_encoding.rb +1 -1
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +94 -0
- data/test/xml/test_syntax_error.rb +12 -0
- data/test/xml/test_text.rb +35 -1
- data/test/xml/test_unparented_node.rb +5 -5
- data/test/xml/test_xpath.rb +142 -11
- data/test/xslt/test_custom_functions.rb +94 -0
- metadata +328 -92
- data/ext/nokogiri/html_sax_parser.c +0 -57
- data/ext/nokogiri/html_sax_parser.h +0 -11
- data/ext/nokogiri/iconv.dll +0 -0
- data/ext/nokogiri/libexslt.dll +0 -0
- data/ext/nokogiri/libxml2.dll +0 -0
- data/ext/nokogiri/libxslt.dll +0 -0
- data/ext/nokogiri/native.so +0 -0
- data/ext/nokogiri/xml_xpath.c +0 -53
- data/ext/nokogiri/xml_xpath.h +0 -11
- data/ext/nokogiri/zlib1.dll +0 -0
- data/lib/action-nokogiri.rb +0 -30
- data/lib/nokogiri/css/generated_parser.rb +0 -713
- data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
- data/lib/nokogiri/decorators.rb +0 -2
- data/lib/nokogiri/decorators/hpricot.rb +0 -3
- data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
- data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
- data/lib/nokogiri/hpricot.rb +0 -51
- data/lib/nokogiri/xml/comment.rb +0 -6
- data/lib/nokogiri/xml/element.rb +0 -6
- data/lib/nokogiri/xml/entity_declaration.rb +0 -9
- data/lib/nokogiri/xml/fragment_handler.rb +0 -34
- data/test/hpricot/files/basic.xhtml +0 -17
- data/test/hpricot/files/boingboing.html +0 -2266
- data/test/hpricot/files/cy0.html +0 -3653
- data/test/hpricot/files/immob.html +0 -400
- data/test/hpricot/files/pace_application.html +0 -1320
- data/test/hpricot/files/tenderlove.html +0 -16
- data/test/hpricot/files/uswebgen.html +0 -220
- data/test/hpricot/files/utf8.html +0 -1054
- data/test/hpricot/files/week9.html +0 -1723
- data/test/hpricot/files/why.xml +0 -19
- data/test/hpricot/load_files.rb +0 -11
- data/test/hpricot/test_alter.rb +0 -68
- data/test/hpricot/test_builder.rb +0 -20
- data/test/hpricot/test_parser.rb +0 -426
- data/test/hpricot/test_paths.rb +0 -15
- data/test/hpricot/test_preserved.rb +0 -77
- data/test/hpricot/test_xml.rb +0 -30
- data/test/test_gc.rb +0 -15
data/ext/nokogiri/xml_node.h
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
#ifndef NOKOGIRI_XML_NODE
|
2
2
|
#define NOKOGIRI_XML_NODE
|
3
3
|
|
4
|
-
#include <
|
4
|
+
#include <nokogiri.h>
|
5
5
|
|
6
6
|
void init_xml_node();
|
7
|
-
VALUE Nokogiri_wrap_xml_node(xmlNodePtr root);
|
8
7
|
|
9
8
|
extern VALUE cNokogiriXmlNode ;
|
10
9
|
extern VALUE cNokogiriXmlElement ;
|
11
10
|
|
12
|
-
VALUE Nokogiri_wrap_xml_node(xmlNodePtr node) ;
|
11
|
+
VALUE Nokogiri_wrap_xml_node(VALUE klass, xmlNodePtr node) ;
|
13
12
|
void Nokogiri_xml_node_properties(xmlNodePtr node, VALUE attr_hash) ;
|
14
|
-
void Nokogiri_xml_node_namespaces(xmlNodePtr node, VALUE attr_hash) ;
|
15
13
|
#endif
|
data/ext/nokogiri/xml_node_set.c
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
#include <xml_node_set.h>
|
2
2
|
#include <libxml/xpathInternals.h>
|
3
3
|
|
4
|
+
static ID decorate ;
|
5
|
+
|
4
6
|
/*
|
5
7
|
* call-seq:
|
6
8
|
* dup
|
@@ -10,15 +12,13 @@
|
|
10
12
|
static VALUE duplicate(VALUE self)
|
11
13
|
{
|
12
14
|
xmlNodeSetPtr node_set;
|
15
|
+
xmlNodeSetPtr dupl;
|
16
|
+
|
13
17
|
Data_Get_Struct(self, xmlNodeSet, node_set);
|
14
18
|
|
15
|
-
|
16
|
-
int i;
|
17
|
-
for(i = 0; i < node_set->nodeNr; i++) {
|
18
|
-
xmlXPathNodeSetAdd(dupl, node_set->nodeTab[i]);
|
19
|
-
}
|
19
|
+
dupl = xmlXPathNodeSetMerge(NULL, node_set);
|
20
20
|
|
21
|
-
return Nokogiri_wrap_xml_node_set(dupl);
|
21
|
+
return Nokogiri_wrap_xml_node_set(dupl, rb_iv_get(self, "@document"));
|
22
22
|
}
|
23
23
|
|
24
24
|
/*
|
@@ -49,8 +49,8 @@ static VALUE push(VALUE self, VALUE rb_node)
|
|
49
49
|
xmlNodeSetPtr node_set;
|
50
50
|
xmlNodePtr node;
|
51
51
|
|
52
|
-
if(!
|
53
|
-
rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node");
|
52
|
+
if(!(rb_obj_is_kind_of(rb_node, cNokogiriXmlNode) || rb_obj_is_kind_of(rb_node, cNokogiriXmlNamespace)))
|
53
|
+
rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace");
|
54
54
|
|
55
55
|
Data_Get_Struct(self, xmlNodeSet, node_set);
|
56
56
|
Data_Get_Struct(rb_node, xmlNode, node);
|
@@ -58,27 +58,218 @@ static VALUE push(VALUE self, VALUE rb_node)
|
|
58
58
|
return self;
|
59
59
|
}
|
60
60
|
|
61
|
+
/*
|
62
|
+
* call-seq:
|
63
|
+
* delete(node)
|
64
|
+
*
|
65
|
+
* Delete +node+ from the Nodeset, if it is a member. Returns the deleted node
|
66
|
+
* if found, otherwise returns nil.
|
67
|
+
*/
|
68
|
+
static VALUE delete(VALUE self, VALUE rb_node)
|
69
|
+
{
|
70
|
+
xmlNodeSetPtr node_set ;
|
71
|
+
xmlNodePtr node ;
|
72
|
+
|
73
|
+
if(!(rb_obj_is_kind_of(rb_node, cNokogiriXmlNode) || rb_obj_is_kind_of(rb_node, cNokogiriXmlNamespace)))
|
74
|
+
rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace");
|
75
|
+
|
76
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
77
|
+
Data_Get_Struct(rb_node, xmlNode, node);
|
78
|
+
|
79
|
+
if (xmlXPathNodeSetContains(node_set, node)) {
|
80
|
+
xmlXPathNodeSetDel(node_set, node);
|
81
|
+
return rb_node ;
|
82
|
+
}
|
83
|
+
|
84
|
+
return Qnil ;
|
85
|
+
}
|
86
|
+
|
87
|
+
|
61
88
|
/*
|
62
89
|
* call-seq:
|
63
|
-
*
|
90
|
+
* &(node_set)
|
64
91
|
*
|
65
|
-
*
|
92
|
+
* Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.
|
66
93
|
*/
|
67
|
-
static VALUE
|
94
|
+
static VALUE intersection(VALUE self, VALUE rb_other)
|
68
95
|
{
|
69
|
-
int i = NUM2INT(number);
|
70
96
|
xmlNodeSetPtr node_set;
|
97
|
+
xmlNodeSetPtr other;
|
98
|
+
|
99
|
+
if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
|
100
|
+
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
101
|
+
|
71
102
|
Data_Get_Struct(self, xmlNodeSet, node_set);
|
103
|
+
Data_Get_Struct(rb_other, xmlNodeSet, other);
|
72
104
|
|
73
|
-
|
74
|
-
|
105
|
+
return Nokogiri_wrap_xml_node_set(xmlXPathIntersection(node_set, other), rb_iv_get(self, "@document"));
|
106
|
+
}
|
75
107
|
|
76
|
-
if(i < 0)
|
77
|
-
i = i + node_set->nodeNr;
|
78
108
|
|
79
|
-
|
109
|
+
/*
|
110
|
+
* call-seq:
|
111
|
+
* include?(node)
|
112
|
+
*
|
113
|
+
* Returns true if any member of node set equals +node+.
|
114
|
+
*/
|
115
|
+
static VALUE include_eh(VALUE self, VALUE rb_node)
|
116
|
+
{
|
117
|
+
xmlNodeSetPtr node_set;
|
118
|
+
xmlNodePtr node;
|
119
|
+
|
120
|
+
if(!(rb_obj_is_kind_of(rb_node, cNokogiriXmlNode) || rb_obj_is_kind_of(rb_node, cNokogiriXmlNamespace)))
|
121
|
+
rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace");
|
122
|
+
|
123
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
124
|
+
Data_Get_Struct(rb_node, xmlNode, node);
|
125
|
+
|
126
|
+
return (xmlXPathNodeSetContains(node_set, node) ? Qtrue : Qfalse);
|
80
127
|
}
|
81
128
|
|
129
|
+
|
130
|
+
/*
|
131
|
+
* call-seq:
|
132
|
+
* |(node_set)
|
133
|
+
*
|
134
|
+
* Returns a new set built by merging the set and the elements of the given
|
135
|
+
* set.
|
136
|
+
*/
|
137
|
+
static VALUE set_union(VALUE self, VALUE rb_other)
|
138
|
+
{
|
139
|
+
xmlNodeSetPtr node_set;
|
140
|
+
xmlNodeSetPtr other;
|
141
|
+
xmlNodeSetPtr new;
|
142
|
+
|
143
|
+
if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
|
144
|
+
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
145
|
+
|
146
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
147
|
+
Data_Get_Struct(rb_other, xmlNodeSet, other);
|
148
|
+
|
149
|
+
new = xmlXPathNodeSetMerge(NULL, node_set);
|
150
|
+
new = xmlXPathNodeSetMerge(new, other);
|
151
|
+
|
152
|
+
return Nokogiri_wrap_xml_node_set(new, rb_iv_get(self, "@document"));
|
153
|
+
}
|
154
|
+
|
155
|
+
/*
|
156
|
+
* call-seq:
|
157
|
+
* -(node_set)
|
158
|
+
*
|
159
|
+
* Difference - returns a new NodeSet that is a copy of this NodeSet, removing
|
160
|
+
* each item that also appears in +node_set+
|
161
|
+
*/
|
162
|
+
static VALUE minus(VALUE self, VALUE rb_other)
|
163
|
+
{
|
164
|
+
xmlNodeSetPtr node_set;
|
165
|
+
xmlNodeSetPtr other;
|
166
|
+
xmlNodeSetPtr new;
|
167
|
+
int j ;
|
168
|
+
|
169
|
+
if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
|
170
|
+
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
171
|
+
|
172
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
173
|
+
Data_Get_Struct(rb_other, xmlNodeSet, other);
|
174
|
+
|
175
|
+
new = xmlXPathNodeSetMerge(NULL, node_set);
|
176
|
+
for (j = 0 ; j < other->nodeNr ; ++j) {
|
177
|
+
xmlXPathNodeSetDel(new, other->nodeTab[j]);
|
178
|
+
}
|
179
|
+
|
180
|
+
return Nokogiri_wrap_xml_node_set(new, rb_iv_get(self, "@document"));
|
181
|
+
}
|
182
|
+
|
183
|
+
|
184
|
+
static VALUE index_at(VALUE self, long offset)
|
185
|
+
{
|
186
|
+
xmlNodeSetPtr node_set;
|
187
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
188
|
+
|
189
|
+
if(offset >= node_set->nodeNr || abs((int)offset) > node_set->nodeNr) return Qnil;
|
190
|
+
if(offset < 0) offset = offset + node_set->nodeNr;
|
191
|
+
|
192
|
+
if (XML_NAMESPACE_DECL == node_set->nodeTab[offset]->type)
|
193
|
+
return Nokogiri_wrap_xml_namespace2(rb_iv_get(self, "@document"), (xmlNsPtr)(node_set->nodeTab[offset]));
|
194
|
+
return Nokogiri_wrap_xml_node(Qnil, node_set->nodeTab[offset]);
|
195
|
+
}
|
196
|
+
|
197
|
+
static VALUE subseq(VALUE self, long beg, long len)
|
198
|
+
{
|
199
|
+
long j;
|
200
|
+
xmlNodeSetPtr node_set;
|
201
|
+
xmlNodeSetPtr new_set ;
|
202
|
+
|
203
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
204
|
+
|
205
|
+
if (beg > node_set->nodeNr) return Qnil ;
|
206
|
+
if (beg < 0 || len < 0) return Qnil ;
|
207
|
+
|
208
|
+
if ((beg + len) > node_set->nodeNr) {
|
209
|
+
len = node_set->nodeNr - beg ;
|
210
|
+
}
|
211
|
+
|
212
|
+
new_set = xmlXPathNodeSetCreate(NULL);
|
213
|
+
for (j = beg ; j < beg+len ; ++j) {
|
214
|
+
xmlXPathNodeSetAddUnique(new_set, node_set->nodeTab[j]);
|
215
|
+
}
|
216
|
+
return Nokogiri_wrap_xml_node_set(new_set, rb_iv_get(self, "@document"));
|
217
|
+
}
|
218
|
+
|
219
|
+
/*
|
220
|
+
* call-seq:
|
221
|
+
* [index] -> Node or nil
|
222
|
+
* [start, length] -> NodeSet or nil
|
223
|
+
* [range] -> NodeSet or nil
|
224
|
+
* slice(index) -> Node or nil
|
225
|
+
* slice(start, length) -> NodeSet or nil
|
226
|
+
* slice(range) -> NodeSet or nil
|
227
|
+
*
|
228
|
+
* Element reference - returns the node at +index+, or returns a NodeSet
|
229
|
+
* containing nodes starting at +start+ and continuing for +length+ elements, or
|
230
|
+
* returns a NodeSet containing nodes specified by +range+. Negative +indices+
|
231
|
+
* count backward from the end of the +node_set+ (-1 is the last node). Returns
|
232
|
+
* nil if the +index+ (or +start+) are out of range.
|
233
|
+
*/
|
234
|
+
static VALUE slice(int argc, VALUE *argv, VALUE self)
|
235
|
+
{
|
236
|
+
VALUE arg ;
|
237
|
+
long beg, len ;
|
238
|
+
xmlNodeSetPtr node_set;
|
239
|
+
Data_Get_Struct(self, xmlNodeSet, node_set);
|
240
|
+
|
241
|
+
if (argc == 2) {
|
242
|
+
beg = NUM2LONG(argv[0]);
|
243
|
+
len = NUM2LONG(argv[1]);
|
244
|
+
if (beg < 0) {
|
245
|
+
beg += node_set->nodeNr ;
|
246
|
+
}
|
247
|
+
return subseq(self, beg, len);
|
248
|
+
}
|
249
|
+
|
250
|
+
if (argc != 1) {
|
251
|
+
rb_scan_args(argc, argv, "11", NULL, NULL);
|
252
|
+
}
|
253
|
+
arg = argv[0];
|
254
|
+
|
255
|
+
if (FIXNUM_P(arg)) {
|
256
|
+
return index_at(self, FIX2LONG(arg));
|
257
|
+
}
|
258
|
+
|
259
|
+
/* if arg is Range */
|
260
|
+
switch (rb_range_beg_len(arg, &beg, &len, (long)node_set->nodeNr, 0)) {
|
261
|
+
case Qfalse:
|
262
|
+
break;
|
263
|
+
case Qnil:
|
264
|
+
return Qnil;
|
265
|
+
default:
|
266
|
+
return subseq(self, beg, len);
|
267
|
+
}
|
268
|
+
|
269
|
+
return index_at(self, NUM2LONG(arg));
|
270
|
+
}
|
271
|
+
|
272
|
+
|
82
273
|
/*
|
83
274
|
* call-seq:
|
84
275
|
* to_a
|
@@ -88,21 +279,33 @@ static VALUE index_at(VALUE self, VALUE number)
|
|
88
279
|
static VALUE to_array(VALUE self, VALUE rb_node)
|
89
280
|
{
|
90
281
|
xmlNodeSetPtr set;
|
282
|
+
VALUE *elts;
|
283
|
+
VALUE list;
|
284
|
+
int i;
|
285
|
+
|
91
286
|
Data_Get_Struct(self, xmlNodeSet, set);
|
92
287
|
|
93
|
-
|
94
|
-
int i;
|
288
|
+
elts = calloc((size_t)set->nodeNr, sizeof(VALUE *));
|
95
289
|
for(i = 0; i < set->nodeNr; i++) {
|
96
|
-
if(set->nodeTab[i]->
|
97
|
-
elts[i] = (
|
290
|
+
if (XML_NAMESPACE_DECL == set->nodeTab[i]->type) {
|
291
|
+
elts[i] = Nokogiri_wrap_xml_namespace2(rb_iv_get(self, "@document"), (xmlNsPtr)(set->nodeTab[i]));
|
98
292
|
} else {
|
99
|
-
|
293
|
+
xmlNodePtr node = set->nodeTab[i];
|
294
|
+
|
295
|
+
if(node->_private) {
|
296
|
+
if(node->type == XML_DOCUMENT_NODE || node->type == XML_HTML_DOCUMENT_NODE)
|
297
|
+
elts[i] = DOC_RUBY_OBJECT(node->doc);
|
298
|
+
else
|
299
|
+
elts[i] = (VALUE)node->_private;
|
300
|
+
} else {
|
301
|
+
elts[i] = Nokogiri_wrap_xml_node(Qnil, node);
|
302
|
+
}
|
100
303
|
}
|
101
304
|
}
|
102
305
|
|
103
|
-
|
306
|
+
list = rb_ary_new4((long)set->nodeNr, elts);
|
104
307
|
|
105
|
-
free(elts);
|
308
|
+
/*free(elts); */
|
106
309
|
|
107
310
|
return list;
|
108
311
|
}
|
@@ -121,12 +324,14 @@ static VALUE unlink_nodeset(VALUE self)
|
|
121
324
|
Data_Get_Struct(self, xmlNodeSet, node_set);
|
122
325
|
nodeNr = node_set->nodeNr ;
|
123
326
|
for (j = 0 ; j < nodeNr ; j++) {
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
327
|
+
if (XML_NAMESPACE_DECL != node_set->nodeTab[j]->type) {
|
328
|
+
VALUE node ;
|
329
|
+
xmlNodePtr node_ptr;
|
330
|
+
node = Nokogiri_wrap_xml_node(Qnil, node_set->nodeTab[j]);
|
331
|
+
rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */
|
332
|
+
Data_Get_Struct(node, xmlNode, node_ptr);
|
333
|
+
node_set->nodeTab[j] = node_ptr ;
|
334
|
+
}
|
130
335
|
}
|
131
336
|
return self ;
|
132
337
|
}
|
@@ -173,12 +378,18 @@ static void deallocate(xmlNodeSetPtr node_set)
|
|
173
378
|
|
174
379
|
static VALUE allocate(VALUE klass)
|
175
380
|
{
|
176
|
-
return Nokogiri_wrap_xml_node_set(xmlXPathNodeSetCreate(NULL));
|
381
|
+
return Nokogiri_wrap_xml_node_set(xmlXPathNodeSetCreate(NULL), Qnil);
|
177
382
|
}
|
178
383
|
|
179
|
-
VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set)
|
384
|
+
VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document)
|
180
385
|
{
|
181
|
-
|
386
|
+
VALUE new_set ;
|
387
|
+
new_set = Data_Wrap_Struct(cNokogiriXmlNodeSet, 0, deallocate, node_set);
|
388
|
+
if (document != Qnil) {
|
389
|
+
rb_iv_set(new_set, "@document", document);
|
390
|
+
rb_funcall(document, decorate, 1, new_set);
|
391
|
+
}
|
392
|
+
return new_set ;
|
182
393
|
}
|
183
394
|
|
184
395
|
VALUE cNokogiriXmlNodeSet ;
|
@@ -191,9 +402,17 @@ void init_xml_node_set(void)
|
|
191
402
|
|
192
403
|
rb_define_alloc_func(klass, allocate);
|
193
404
|
rb_define_method(klass, "length", length, 0);
|
194
|
-
rb_define_method(klass, "[]",
|
405
|
+
rb_define_method(klass, "[]", slice, -1);
|
406
|
+
rb_define_method(klass, "slice", slice, -1);
|
195
407
|
rb_define_method(klass, "push", push, 1);
|
408
|
+
rb_define_method(klass, "|", set_union, 1);
|
409
|
+
rb_define_method(klass, "-", minus, 1);
|
196
410
|
rb_define_method(klass, "unlink", unlink_nodeset, 0);
|
197
411
|
rb_define_method(klass, "to_a", to_array, 0);
|
198
412
|
rb_define_method(klass, "dup", duplicate, 0);
|
413
|
+
rb_define_method(klass, "delete", delete, 1);
|
414
|
+
rb_define_method(klass, "&", intersection, 1);
|
415
|
+
rb_define_method(klass, "include?", include_eh, 1);
|
416
|
+
|
417
|
+
decorate = rb_intern("decorate");
|
199
418
|
}
|
data/ext/nokogiri/xml_node_set.h
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#ifndef NOKOGIRI_XML_NODE_SET
|
2
2
|
#define NOKOGIRI_XML_NODE_SET
|
3
3
|
|
4
|
-
#include <
|
4
|
+
#include <nokogiri.h>
|
5
5
|
void init_xml_node_set();
|
6
6
|
|
7
7
|
extern VALUE cNokogiriXmlNodeSet ;
|
8
|
-
VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set) ;
|
8
|
+
VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document) ;
|
9
9
|
#endif
|
@@ -7,18 +7,30 @@
|
|
7
7
|
* Create a new ProcessingInstruction element on the +document+ with +name+
|
8
8
|
* and +content+
|
9
9
|
*/
|
10
|
-
static VALUE new(
|
10
|
+
static VALUE new(int argc, VALUE *argv, VALUE klass)
|
11
11
|
{
|
12
12
|
xmlDocPtr xml_doc;
|
13
|
-
|
13
|
+
xmlNodePtr node;
|
14
|
+
VALUE document;
|
15
|
+
VALUE name;
|
16
|
+
VALUE content;
|
17
|
+
VALUE rest;
|
18
|
+
VALUE rb_node;
|
14
19
|
|
15
|
-
|
20
|
+
rb_scan_args(argc, argv, "3*", &document, &name, &content, &rest);
|
21
|
+
|
22
|
+
Data_Get_Struct(document, xmlDoc, xml_doc);
|
23
|
+
|
24
|
+
node = xmlNewDocPI(
|
16
25
|
xml_doc,
|
17
26
|
(const xmlChar *)StringValuePtr(name),
|
18
27
|
(const xmlChar *)StringValuePtr(content)
|
19
28
|
);
|
20
29
|
|
21
|
-
|
30
|
+
NOKOGIRI_ROOT_NODE(node);
|
31
|
+
|
32
|
+
rb_node = Nokogiri_wrap_xml_node(klass, node);
|
33
|
+
rb_obj_call_init(rb_node, argc, argv);
|
22
34
|
|
23
35
|
if(rb_block_given_p()) rb_yield(rb_node);
|
24
36
|
|
@@ -40,5 +52,5 @@ void init_xml_processing_instruction()
|
|
40
52
|
|
41
53
|
cNokogiriXmlProcessingInstruction = klass;
|
42
54
|
|
43
|
-
rb_define_singleton_method(klass, "new", new,
|
55
|
+
rb_define_singleton_method(klass, "new", new, -1);
|
44
56
|
}
|