nokogiri 1.6.0 → 1.13.2
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 +3 -19
- data/LICENSE-DEPENDENCIES.md +1903 -0
- data/LICENSE.md +9 -0
- data/README.md +280 -0
- data/bin/nokogiri +84 -31
- data/dependencies.yml +23 -4
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +952 -132
- 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 +231 -96
- 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 +269 -177
- 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 +407 -357
- data/lib/nokogiri/css/parser.y +265 -246
- 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 +8 -7
- data/lib/nokogiri/css/xpath_visitor.rb +266 -80
- 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 -105
- 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 +270 -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 +29 -20
- 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 +3040 -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 +3037 -0
- data/ports/archives/libxml2-2.9.13.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
- metadata +278 -362
- data/.autotest +0 -26
- data/.gemtest +0 -0
- data/.travis.yml +0 -27
- data/CHANGELOG.ja.rdoc +0 -819
- data/CHANGELOG.rdoc +0 -819
- data/C_CODING_STYLE.rdoc +0 -33
- data/Manifest.txt +0 -315
- data/README.ja.rdoc +0 -106
- data/README.rdoc +0 -175
- data/ROADMAP.md +0 -90
- data/Rakefile +0 -246
- 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/ports/archives/libxml2-2.8.0.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.26.tar.gz +0 -0
- data/tasks/cross_compile.rb +0 -132
- 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/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/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/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_document.c
CHANGED
@@ -1,29 +1,71 @@
|
|
1
|
-
#include <
|
1
|
+
#include <nokogiri.h>
|
2
2
|
|
3
|
-
|
3
|
+
VALUE cNokogiriXmlDocument ;
|
4
|
+
|
5
|
+
static int
|
6
|
+
dealloc_node_i2(xmlNodePtr key, xmlNodePtr node, xmlDocPtr doc)
|
4
7
|
{
|
5
|
-
switch(node->type) {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
switch (node->type) {
|
9
|
+
case XML_ATTRIBUTE_NODE:
|
10
|
+
xmlFreePropList((xmlAttrPtr)node);
|
11
|
+
break;
|
12
|
+
case XML_NAMESPACE_DECL:
|
13
|
+
xmlFreeNs((xmlNsPtr)node);
|
14
|
+
break;
|
15
|
+
case XML_DTD_NODE:
|
16
|
+
xmlFreeDtd((xmlDtdPtr)node);
|
17
|
+
break;
|
18
|
+
default:
|
19
|
+
if (node->parent == NULL) {
|
20
|
+
xmlAddChild((xmlNodePtr)doc, node);
|
21
|
+
}
|
16
22
|
}
|
17
23
|
return ST_CONTINUE;
|
18
24
|
}
|
19
25
|
|
20
|
-
static
|
26
|
+
static int
|
27
|
+
dealloc_node_i(st_data_t key, st_data_t node, st_data_t doc)
|
28
|
+
{
|
29
|
+
return dealloc_node_i2((xmlNodePtr)key, (xmlNodePtr)node, (xmlDocPtr)doc);
|
30
|
+
}
|
31
|
+
|
32
|
+
static void
|
33
|
+
remove_private(xmlNodePtr node)
|
34
|
+
{
|
35
|
+
xmlNodePtr child;
|
36
|
+
|
37
|
+
for (child = node->children; child; child = child->next) {
|
38
|
+
remove_private(child);
|
39
|
+
}
|
40
|
+
|
41
|
+
if ((node->type == XML_ELEMENT_NODE ||
|
42
|
+
node->type == XML_XINCLUDE_START ||
|
43
|
+
node->type == XML_XINCLUDE_END) &&
|
44
|
+
node->properties) {
|
45
|
+
for (child = (xmlNodePtr)node->properties; child; child = child->next) {
|
46
|
+
remove_private(child);
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
node->_private = NULL;
|
51
|
+
}
|
52
|
+
|
53
|
+
static void
|
54
|
+
mark(xmlDocPtr doc)
|
55
|
+
{
|
56
|
+
nokogiriTuplePtr tuple = (nokogiriTuplePtr)doc->_private;
|
57
|
+
if (tuple) {
|
58
|
+
rb_gc_mark(tuple->doc);
|
59
|
+
rb_gc_mark(tuple->node_cache);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
static void
|
64
|
+
dealloc(xmlDocPtr doc)
|
21
65
|
{
|
22
|
-
xmlDeregisterNodeFunc func;
|
23
66
|
st_table *node_hash;
|
24
67
|
|
25
68
|
NOKOGIRI_DEBUG_START(doc);
|
26
|
-
func = xmlDeregisterNodeDefault(NULL);
|
27
69
|
|
28
70
|
node_hash = DOC_UNLINKED_NODE_HASH(doc);
|
29
71
|
|
@@ -31,22 +73,32 @@ static void dealloc(xmlDocPtr doc)
|
|
31
73
|
st_free_table(node_hash);
|
32
74
|
|
33
75
|
free(doc->_private);
|
34
|
-
|
76
|
+
|
77
|
+
/* When both Nokogiri and libxml-ruby are loaded, make sure that all nodes
|
78
|
+
* have their _private pointers cleared. This is to avoid libxml-ruby's
|
79
|
+
* xmlDeregisterNode callback from accessing VALUE pointers from ruby's GC
|
80
|
+
* free context, which can result in segfaults.
|
81
|
+
*/
|
82
|
+
if (xmlDeregisterNodeDefaultValue) {
|
83
|
+
remove_private((xmlNodePtr)doc);
|
84
|
+
}
|
85
|
+
|
35
86
|
xmlFreeDoc(doc);
|
36
87
|
|
37
|
-
xmlDeregisterNodeDefault(func);
|
38
88
|
NOKOGIRI_DEBUG_END(doc);
|
39
89
|
}
|
40
90
|
|
41
|
-
static void
|
91
|
+
static void
|
92
|
+
recursively_remove_namespaces_from_node(xmlNodePtr node)
|
42
93
|
{
|
43
94
|
xmlNodePtr child ;
|
44
95
|
xmlAttrPtr property ;
|
45
96
|
|
46
97
|
xmlSetNs(node, NULL);
|
47
98
|
|
48
|
-
for (child = node->children ; child ; child = child->next)
|
99
|
+
for (child = node->children ; child ; child = child->next) {
|
49
100
|
recursively_remove_namespaces_from_node(child);
|
101
|
+
}
|
50
102
|
|
51
103
|
if (((node->type == XML_ELEMENT_NODE) ||
|
52
104
|
(node->type == XML_XINCLUDE_START) ||
|
@@ -59,7 +111,7 @@ static void recursively_remove_namespaces_from_node(xmlNodePtr node)
|
|
59
111
|
if (node->type == XML_ELEMENT_NODE && node->properties != NULL) {
|
60
112
|
property = node->properties ;
|
61
113
|
while (property != NULL) {
|
62
|
-
if (property->ns) property->ns = NULL ;
|
114
|
+
if (property->ns) { property->ns = NULL ; }
|
63
115
|
property = property->next ;
|
64
116
|
}
|
65
117
|
}
|
@@ -71,12 +123,13 @@ static void recursively_remove_namespaces_from_node(xmlNodePtr node)
|
|
71
123
|
*
|
72
124
|
* Get the url name for this document.
|
73
125
|
*/
|
74
|
-
static VALUE
|
126
|
+
static VALUE
|
127
|
+
url(VALUE self)
|
75
128
|
{
|
76
129
|
xmlDocPtr doc;
|
77
130
|
Data_Get_Struct(self, xmlDoc, doc);
|
78
131
|
|
79
|
-
if(doc->URL) return NOKOGIRI_STR_NEW2(doc->URL);
|
132
|
+
if (doc->URL) { return NOKOGIRI_STR_NEW2(doc->URL); }
|
80
133
|
|
81
134
|
return Qnil;
|
82
135
|
}
|
@@ -87,42 +140,42 @@ static VALUE url(VALUE self)
|
|
87
140
|
*
|
88
141
|
* Set the root element on this document
|
89
142
|
*/
|
90
|
-
static VALUE
|
143
|
+
static VALUE
|
144
|
+
rb_xml_document_root_set(VALUE self, VALUE rb_new_root)
|
91
145
|
{
|
92
|
-
xmlDocPtr
|
93
|
-
xmlNodePtr
|
94
|
-
xmlNodePtr old_root;
|
146
|
+
xmlDocPtr c_document;
|
147
|
+
xmlNodePtr c_new_root = NULL, c_current_root;
|
95
148
|
|
96
|
-
Data_Get_Struct(self, xmlDoc,
|
97
|
-
|
98
|
-
old_root = NULL;
|
99
|
-
|
100
|
-
if(NIL_P(root)) {
|
101
|
-
old_root = xmlDocGetRootElement(doc);
|
102
|
-
|
103
|
-
if(old_root) {
|
104
|
-
xmlUnlinkNode(old_root);
|
105
|
-
nokogiri_root_node(old_root);
|
106
|
-
}
|
149
|
+
Data_Get_Struct(self, xmlDoc, c_document);
|
107
150
|
|
108
|
-
|
151
|
+
c_current_root = xmlDocGetRootElement(c_document);
|
152
|
+
if (c_current_root) {
|
153
|
+
xmlUnlinkNode(c_current_root);
|
154
|
+
noko_xml_document_pin_node(c_current_root);
|
109
155
|
}
|
110
156
|
|
111
|
-
|
157
|
+
if (!NIL_P(rb_new_root)) {
|
158
|
+
if (!rb_obj_is_kind_of(rb_new_root, cNokogiriXmlNode)) {
|
159
|
+
rb_raise(rb_eArgError,
|
160
|
+
"expected Nokogiri::XML::Node but received %"PRIsVALUE,
|
161
|
+
rb_obj_class(rb_new_root));
|
162
|
+
}
|
112
163
|
|
164
|
+
Data_Get_Struct(rb_new_root, xmlNode, c_new_root);
|
113
165
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
166
|
+
/* If the new root's document is not the same as the current document,
|
167
|
+
* then we need to dup the node in to this document. */
|
168
|
+
if (c_new_root->doc != c_document) {
|
169
|
+
c_new_root = xmlDocCopyNode(c_new_root, c_document, 1);
|
170
|
+
if (!c_new_root) {
|
171
|
+
rb_raise(rb_eRuntimeError, "Could not reparent node (xmlDocCopyNode)");
|
172
|
+
}
|
120
173
|
}
|
121
174
|
}
|
122
175
|
|
123
|
-
xmlDocSetRootElement(
|
124
|
-
|
125
|
-
return
|
176
|
+
xmlDocSetRootElement(c_document, c_new_root);
|
177
|
+
|
178
|
+
return rb_new_root;
|
126
179
|
}
|
127
180
|
|
128
181
|
/*
|
@@ -131,17 +184,20 @@ static VALUE set_root(VALUE self, VALUE root)
|
|
131
184
|
*
|
132
185
|
* Get the root node for this document.
|
133
186
|
*/
|
134
|
-
static VALUE
|
187
|
+
static VALUE
|
188
|
+
rb_xml_document_root(VALUE self)
|
135
189
|
{
|
136
|
-
xmlDocPtr
|
137
|
-
xmlNodePtr
|
190
|
+
xmlDocPtr c_document;
|
191
|
+
xmlNodePtr c_root;
|
138
192
|
|
139
|
-
Data_Get_Struct(self, xmlDoc,
|
193
|
+
Data_Get_Struct(self, xmlDoc, c_document);
|
140
194
|
|
141
|
-
|
195
|
+
c_root = xmlDocGetRootElement(c_document);
|
196
|
+
if (!c_root) {
|
197
|
+
return Qnil;
|
198
|
+
}
|
142
199
|
|
143
|
-
|
144
|
-
return Nokogiri_wrap_xml_node(Qnil, root) ;
|
200
|
+
return noko_xml_node_wrap(Qnil, c_root) ;
|
145
201
|
}
|
146
202
|
|
147
203
|
/*
|
@@ -150,15 +206,17 @@ static VALUE root(VALUE self)
|
|
150
206
|
*
|
151
207
|
* Set the encoding string for this Document
|
152
208
|
*/
|
153
|
-
static VALUE
|
209
|
+
static VALUE
|
210
|
+
set_encoding(VALUE self, VALUE encoding)
|
154
211
|
{
|
155
212
|
xmlDocPtr doc;
|
156
213
|
Data_Get_Struct(self, xmlDoc, doc);
|
157
214
|
|
158
|
-
if (doc->encoding)
|
159
|
-
|
215
|
+
if (doc->encoding) {
|
216
|
+
xmlFree(DISCARD_CONST_QUAL_XMLCHAR(doc->encoding));
|
217
|
+
}
|
160
218
|
|
161
|
-
doc->encoding = xmlStrdup((xmlChar *)
|
219
|
+
doc->encoding = xmlStrdup((xmlChar *)StringValueCStr(encoding));
|
162
220
|
|
163
221
|
return encoding;
|
164
222
|
}
|
@@ -169,12 +227,13 @@ static VALUE set_encoding(VALUE self, VALUE encoding)
|
|
169
227
|
*
|
170
228
|
* Get the encoding for this Document
|
171
229
|
*/
|
172
|
-
static VALUE
|
230
|
+
static VALUE
|
231
|
+
encoding(VALUE self)
|
173
232
|
{
|
174
233
|
xmlDocPtr doc;
|
175
234
|
Data_Get_Struct(self, xmlDoc, doc);
|
176
235
|
|
177
|
-
if(!doc->encoding) return Qnil;
|
236
|
+
if (!doc->encoding) { return Qnil; }
|
178
237
|
return NOKOGIRI_STR_NEW2(doc->encoding);
|
179
238
|
}
|
180
239
|
|
@@ -184,12 +243,13 @@ static VALUE encoding(VALUE self)
|
|
184
243
|
*
|
185
244
|
* Get the XML version for this Document
|
186
245
|
*/
|
187
|
-
static VALUE
|
246
|
+
static VALUE
|
247
|
+
version(VALUE self)
|
188
248
|
{
|
189
249
|
xmlDocPtr doc;
|
190
250
|
Data_Get_Struct(self, xmlDoc, doc);
|
191
251
|
|
192
|
-
if(!doc->version) return Qnil;
|
252
|
+
if (!doc->version) { return Qnil; }
|
193
253
|
return NOKOGIRI_STR_NEW2(doc->version);
|
194
254
|
}
|
195
255
|
|
@@ -199,14 +259,15 @@ static VALUE version(VALUE self)
|
|
199
259
|
*
|
200
260
|
* Create a new document from an IO object
|
201
261
|
*/
|
202
|
-
static VALUE
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
262
|
+
static VALUE
|
263
|
+
read_io(VALUE klass,
|
264
|
+
VALUE io,
|
265
|
+
VALUE url,
|
266
|
+
VALUE encoding,
|
267
|
+
VALUE options)
|
207
268
|
{
|
208
|
-
const char *
|
209
|
-
const char *
|
269
|
+
const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url);
|
270
|
+
const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
|
210
271
|
VALUE error_list = rb_ary_new();
|
211
272
|
VALUE document;
|
212
273
|
xmlDocPtr doc;
|
@@ -215,30 +276,31 @@ static VALUE read_io( VALUE klass,
|
|
215
276
|
xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
|
216
277
|
|
217
278
|
doc = xmlReadIO(
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
279
|
+
(xmlInputReadCallback)noko_io_read,
|
280
|
+
(xmlInputCloseCallback)noko_io_close,
|
281
|
+
(void *)io,
|
282
|
+
c_url,
|
283
|
+
c_enc,
|
284
|
+
(int)NUM2INT(options)
|
285
|
+
);
|
225
286
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
226
287
|
|
227
|
-
if(doc == NULL) {
|
288
|
+
if (doc == NULL) {
|
228
289
|
xmlErrorPtr error;
|
229
290
|
|
230
291
|
xmlFreeDoc(doc);
|
231
292
|
|
232
293
|
error = xmlGetLastError();
|
233
|
-
if(error)
|
234
|
-
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(
|
235
|
-
else
|
294
|
+
if (error) {
|
295
|
+
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
296
|
+
} else {
|
236
297
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
298
|
+
}
|
237
299
|
|
238
300
|
return Qnil;
|
239
301
|
}
|
240
302
|
|
241
|
-
document =
|
303
|
+
document = noko_xml_document_wrap(klass, doc);
|
242
304
|
rb_iv_set(document, "@errors", error_list);
|
243
305
|
return document;
|
244
306
|
}
|
@@ -249,15 +311,16 @@ static VALUE read_io( VALUE klass,
|
|
249
311
|
*
|
250
312
|
* Create a new document from a String
|
251
313
|
*/
|
252
|
-
static VALUE
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
314
|
+
static VALUE
|
315
|
+
read_memory(VALUE klass,
|
316
|
+
VALUE string,
|
317
|
+
VALUE url,
|
318
|
+
VALUE encoding,
|
319
|
+
VALUE options)
|
257
320
|
{
|
258
|
-
const char *
|
259
|
-
const char *
|
260
|
-
const char *
|
321
|
+
const char *c_buffer = StringValuePtr(string);
|
322
|
+
const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url);
|
323
|
+
const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
|
261
324
|
int len = (int)RSTRING_LEN(string);
|
262
325
|
VALUE error_list = rb_ary_new();
|
263
326
|
VALUE document;
|
@@ -268,21 +331,22 @@ static VALUE read_memory( VALUE klass,
|
|
268
331
|
doc = xmlReadMemory(c_buffer, len, c_url, c_enc, (int)NUM2INT(options));
|
269
332
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
270
333
|
|
271
|
-
if(doc == NULL) {
|
334
|
+
if (doc == NULL) {
|
272
335
|
xmlErrorPtr error;
|
273
336
|
|
274
337
|
xmlFreeDoc(doc);
|
275
338
|
|
276
339
|
error = xmlGetLastError();
|
277
|
-
if(error)
|
278
|
-
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(
|
279
|
-
else
|
340
|
+
if (error) {
|
341
|
+
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
342
|
+
} else {
|
280
343
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
344
|
+
}
|
281
345
|
|
282
346
|
return Qnil;
|
283
347
|
}
|
284
348
|
|
285
|
-
document =
|
349
|
+
document = noko_xml_document_wrap(klass, doc);
|
286
350
|
rb_iv_set(document, "@errors", error_list);
|
287
351
|
return document;
|
288
352
|
}
|
@@ -294,21 +358,27 @@ static VALUE read_memory( VALUE klass,
|
|
294
358
|
* Copy this Document. An optional depth may be passed in, but it defaults
|
295
359
|
* to a deep copy. 0 is a shallow copy, 1 is a deep copy.
|
296
360
|
*/
|
297
|
-
static VALUE
|
361
|
+
static VALUE
|
362
|
+
duplicate_document(int argc, VALUE *argv, VALUE self)
|
298
363
|
{
|
299
364
|
xmlDocPtr doc, dup;
|
365
|
+
VALUE copy;
|
300
366
|
VALUE level;
|
301
367
|
|
302
|
-
if(rb_scan_args(argc, argv, "01", &level) == 0)
|
368
|
+
if (rb_scan_args(argc, argv, "01", &level) == 0) {
|
303
369
|
level = INT2NUM((long)1);
|
370
|
+
}
|
304
371
|
|
305
372
|
Data_Get_Struct(self, xmlDoc, doc);
|
306
373
|
|
307
374
|
dup = xmlCopyDoc(doc, (int)NUM2INT(level));
|
308
|
-
|
375
|
+
|
376
|
+
if (dup == NULL) { return Qnil; }
|
309
377
|
|
310
378
|
dup->type = doc->type;
|
311
|
-
|
379
|
+
copy = noko_xml_document_wrap(rb_obj_class(self), dup);
|
380
|
+
rb_iv_set(copy, "@errors", rb_iv_get(self, "@errors"));
|
381
|
+
return copy ;
|
312
382
|
}
|
313
383
|
|
314
384
|
/*
|
@@ -317,18 +387,18 @@ static VALUE duplicate_node(int argc, VALUE *argv, VALUE self)
|
|
317
387
|
*
|
318
388
|
* Create a new document with +version+ (defaults to "1.0")
|
319
389
|
*/
|
320
|
-
static VALUE
|
390
|
+
static VALUE
|
391
|
+
new (int argc, VALUE *argv, VALUE klass)
|
321
392
|
{
|
322
393
|
xmlDocPtr doc;
|
323
394
|
VALUE version, rest, rb_doc ;
|
324
395
|
|
325
396
|
rb_scan_args(argc, argv, "0*", &rest);
|
326
397
|
version = rb_ary_entry(rest, (long)0);
|
327
|
-
if (NIL_P(version)) version = rb_str_new2("1.0");
|
398
|
+
if (NIL_P(version)) { version = rb_str_new2("1.0"); }
|
328
399
|
|
329
|
-
doc = xmlNewDoc((xmlChar *)
|
330
|
-
rb_doc =
|
331
|
-
rb_obj_call_init(rb_doc, argc, argv);
|
400
|
+
doc = xmlNewDoc((xmlChar *)StringValueCStr(version));
|
401
|
+
rb_doc = noko_xml_document_wrap_with_init_args(klass, doc, argc, argv);
|
332
402
|
return rb_doc ;
|
333
403
|
}
|
334
404
|
|
@@ -354,13 +424,13 @@ static VALUE new(int argc, VALUE *argv, VALUE klass)
|
|
354
424
|
* </bicycle>
|
355
425
|
* </root>
|
356
426
|
* EOXML
|
357
|
-
*
|
427
|
+
*
|
358
428
|
* doc.xpath("//tire").to_s # => ""
|
359
429
|
* doc.xpath("//part:tire", "part" => "http://general-motors.com/").to_s # => "<part:tire>Michelin Model XGV</part:tire>"
|
360
430
|
* doc.xpath("//part:tire", "part" => "http://schwinn.com/").to_s # => "<part:tire>I'm a bicycle tire!</part:tire>"
|
361
|
-
*
|
431
|
+
*
|
362
432
|
* doc.remove_namespaces!
|
363
|
-
*
|
433
|
+
*
|
364
434
|
* doc.xpath("//tire").to_s # => "<tire>Michelin Model XGV</tire><tire>I'm a bicycle tire!</tire>"
|
365
435
|
* doc.xpath("//part:tire", "part" => "http://general-motors.com/").to_s # => ""
|
366
436
|
* doc.xpath("//part:tire", "part" => "http://schwinn.com/").to_s # => ""
|
@@ -369,7 +439,8 @@ static VALUE new(int argc, VALUE *argv, VALUE klass)
|
|
369
439
|
* please direct your browser to
|
370
440
|
* http://tenderlovemaking.com/2009/04/23/namespaces-in-xml.html
|
371
441
|
*/
|
372
|
-
|
442
|
+
static VALUE
|
443
|
+
remove_namespaces_bang(VALUE self)
|
373
444
|
{
|
374
445
|
xmlDocPtr doc ;
|
375
446
|
Data_Get_Struct(self, xmlDoc, doc);
|
@@ -389,7 +460,8 @@ VALUE remove_namespaces_bang(VALUE self)
|
|
389
460
|
* +external_id+, +system_id+, and +content+ set the External ID, System ID,
|
390
461
|
* and content respectively. All of these parameters are optional.
|
391
462
|
*/
|
392
|
-
static VALUE
|
463
|
+
static VALUE
|
464
|
+
create_entity(int argc, VALUE *argv, VALUE self)
|
393
465
|
{
|
394
466
|
VALUE name;
|
395
467
|
VALUE type;
|
@@ -402,52 +474,50 @@ static VALUE create_entity(int argc, VALUE *argv, VALUE self)
|
|
402
474
|
Data_Get_Struct(self, xmlDoc, doc);
|
403
475
|
|
404
476
|
rb_scan_args(argc, argv, "14", &name, &type, &external_id, &system_id,
|
405
|
-
|
477
|
+
&content);
|
406
478
|
|
407
479
|
xmlResetLastError();
|
408
480
|
ptr = xmlAddDocEntity(
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
if(NULL == ptr) {
|
481
|
+
doc,
|
482
|
+
(xmlChar *)(NIL_P(name) ? NULL : StringValueCStr(name)),
|
483
|
+
(int)(NIL_P(type) ? XML_INTERNAL_GENERAL_ENTITY : NUM2INT(type)),
|
484
|
+
(xmlChar *)(NIL_P(external_id) ? NULL : StringValueCStr(external_id)),
|
485
|
+
(xmlChar *)(NIL_P(system_id) ? NULL : StringValueCStr(system_id)),
|
486
|
+
(xmlChar *)(NIL_P(content) ? NULL : StringValueCStr(content))
|
487
|
+
);
|
488
|
+
|
489
|
+
if (NULL == ptr) {
|
418
490
|
xmlErrorPtr error = xmlGetLastError();
|
419
|
-
if(error)
|
420
|
-
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(
|
421
|
-
else
|
491
|
+
if (error) {
|
492
|
+
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
493
|
+
} else {
|
422
494
|
rb_raise(rb_eRuntimeError, "Could not create entity");
|
495
|
+
}
|
423
496
|
|
424
497
|
return Qnil;
|
425
498
|
}
|
426
499
|
|
427
|
-
return
|
500
|
+
return noko_xml_node_wrap(cNokogiriXmlEntityDecl, (xmlNodePtr)ptr);
|
428
501
|
}
|
429
502
|
|
430
|
-
static int
|
503
|
+
static int
|
504
|
+
block_caller(void *ctx, xmlNodePtr c_node, xmlNodePtr c_parent_node)
|
431
505
|
{
|
432
|
-
VALUE block;
|
433
|
-
VALUE
|
434
|
-
VALUE
|
506
|
+
VALUE block = (VALUE)ctx;
|
507
|
+
VALUE rb_node;
|
508
|
+
VALUE rb_parent_node;
|
435
509
|
VALUE ret;
|
436
510
|
|
437
|
-
if(
|
438
|
-
|
511
|
+
if (c_node->type == XML_NAMESPACE_DECL) {
|
512
|
+
rb_node = noko_xml_namespace_wrap((xmlNsPtr)c_node, c_parent_node->doc);
|
513
|
+
} else {
|
514
|
+
rb_node = noko_xml_node_wrap(Qnil, c_node);
|
439
515
|
}
|
440
|
-
|
441
|
-
node = Nokogiri_wrap_xml_node(Qnil, _node);
|
442
|
-
}
|
443
|
-
parent = _parent ? Nokogiri_wrap_xml_node(Qnil, _parent) : Qnil;
|
444
|
-
block = (VALUE)ctx;
|
445
|
-
|
446
|
-
ret = rb_funcall(block, rb_intern("call"), 2, node, parent);
|
516
|
+
rb_parent_node = c_parent_node ? noko_xml_node_wrap(Qnil, c_parent_node) : Qnil;
|
447
517
|
|
448
|
-
|
518
|
+
ret = rb_funcall(block, rb_intern("call"), 2, rb_node, rb_parent_node);
|
449
519
|
|
450
|
-
return 1;
|
520
|
+
return (Qfalse == ret || Qnil == ret) ? 0 : 1;
|
451
521
|
}
|
452
522
|
|
453
523
|
/* call-seq:
|
@@ -455,122 +525,156 @@ static int block_caller(void * ctx, xmlNodePtr _node, xmlNodePtr _parent)
|
|
455
525
|
* doc.canonicalize { |obj, parent| ... }
|
456
526
|
*
|
457
527
|
* Canonicalize a document and return the results. Takes an optional block
|
458
|
-
* that takes two parameters: the +obj+ and that node's +parent+.
|
528
|
+
* that takes two parameters: the +obj+ and that node's +parent+.
|
459
529
|
* The +obj+ will be either a Nokogiri::XML::Node, or a Nokogiri::XML::Namespace
|
460
|
-
* The block must return a non-nil, non-false value if the +obj+ passed in
|
530
|
+
* The block must return a non-nil, non-false value if the +obj+ passed in
|
461
531
|
* should be included in the canonicalized document.
|
462
532
|
*/
|
463
|
-
static VALUE
|
533
|
+
static VALUE
|
534
|
+
rb_xml_document_canonicalize(int argc, VALUE *argv, VALUE self)
|
464
535
|
{
|
465
|
-
VALUE
|
466
|
-
VALUE
|
467
|
-
VALUE
|
468
|
-
xmlChar **
|
469
|
-
long ns_len, i;
|
536
|
+
VALUE rb_mode;
|
537
|
+
VALUE rb_namespaces;
|
538
|
+
VALUE rb_comments_p;
|
539
|
+
xmlChar **c_namespaces;
|
470
540
|
|
471
|
-
xmlDocPtr
|
472
|
-
xmlOutputBufferPtr
|
473
|
-
xmlC14NIsVisibleCallback
|
474
|
-
void *
|
541
|
+
xmlDocPtr c_doc;
|
542
|
+
xmlOutputBufferPtr c_obuf;
|
543
|
+
xmlC14NIsVisibleCallback c_callback_wrapper = NULL;
|
544
|
+
void *rb_callback = NULL;
|
475
545
|
|
476
546
|
VALUE rb_cStringIO;
|
477
|
-
VALUE
|
547
|
+
VALUE rb_io;
|
478
548
|
|
479
|
-
rb_scan_args(argc, argv, "03", &
|
549
|
+
rb_scan_args(argc, argv, "03", &rb_mode, &rb_namespaces, &rb_comments_p);
|
550
|
+
if (!NIL_P(rb_mode)) { Check_Type(rb_mode, T_FIXNUM); }
|
551
|
+
if (!NIL_P(rb_namespaces)) { Check_Type(rb_namespaces, T_ARRAY); }
|
480
552
|
|
481
|
-
Data_Get_Struct(self, xmlDoc,
|
553
|
+
Data_Get_Struct(self, xmlDoc, c_doc);
|
482
554
|
|
483
555
|
rb_cStringIO = rb_const_get_at(rb_cObject, rb_intern("StringIO"));
|
484
|
-
|
485
|
-
|
556
|
+
rb_io = rb_class_new_instance(0, 0, rb_cStringIO);
|
557
|
+
c_obuf = xmlAllocOutputBuffer(NULL);
|
486
558
|
|
487
|
-
|
488
|
-
|
489
|
-
|
559
|
+
c_obuf->writecallback = (xmlOutputWriteCallback)noko_io_write;
|
560
|
+
c_obuf->closecallback = (xmlOutputCloseCallback)noko_io_close;
|
561
|
+
c_obuf->context = (void *)rb_io;
|
490
562
|
|
491
|
-
if(rb_block_given_p()) {
|
492
|
-
|
493
|
-
|
563
|
+
if (rb_block_given_p()) {
|
564
|
+
c_callback_wrapper = block_caller;
|
565
|
+
rb_callback = (void *)rb_block_proc();
|
494
566
|
}
|
495
567
|
|
496
|
-
if(NIL_P(
|
497
|
-
|
498
|
-
}
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
const char * ptr = StringValuePtr(entry);
|
505
|
-
ns[i] = (xmlChar*) ptr;
|
568
|
+
if (NIL_P(rb_namespaces)) {
|
569
|
+
c_namespaces = NULL;
|
570
|
+
} else {
|
571
|
+
long ns_len = RARRAY_LEN(rb_namespaces);
|
572
|
+
c_namespaces = calloc((size_t)ns_len + 1, sizeof(xmlChar *));
|
573
|
+
for (int j = 0 ; j < ns_len ; j++) {
|
574
|
+
VALUE entry = rb_ary_entry(rb_namespaces, j);
|
575
|
+
c_namespaces[j] = (xmlChar *)StringValueCStr(entry);
|
506
576
|
}
|
507
577
|
}
|
508
578
|
|
579
|
+
xmlC14NExecute(c_doc, c_callback_wrapper, rb_callback,
|
580
|
+
(int)(NIL_P(rb_mode) ? 0 : NUM2INT(rb_mode)),
|
581
|
+
c_namespaces,
|
582
|
+
(int)RTEST(rb_comments_p),
|
583
|
+
c_obuf);
|
584
|
+
|
585
|
+
free(c_namespaces);
|
586
|
+
xmlOutputBufferClose(c_obuf);
|
587
|
+
|
588
|
+
return rb_funcall(rb_io, rb_intern("string"), 0);
|
589
|
+
}
|
590
|
+
|
591
|
+
VALUE
|
592
|
+
noko_xml_document_wrap_with_init_args(VALUE klass, xmlDocPtr c_document, int argc, VALUE *argv)
|
593
|
+
{
|
594
|
+
VALUE rb_document;
|
595
|
+
nokogiriTuplePtr tuple;
|
596
|
+
|
597
|
+
if (!klass) {
|
598
|
+
klass = cNokogiriXmlDocument;
|
599
|
+
}
|
600
|
+
|
601
|
+
rb_document = Data_Wrap_Struct(klass, mark, dealloc, c_document);
|
602
|
+
|
603
|
+
tuple = (nokogiriTuplePtr)malloc(sizeof(nokogiriTuple));
|
604
|
+
tuple->doc = rb_document;
|
605
|
+
tuple->unlinkedNodes = st_init_numtable_with_size(128);
|
606
|
+
tuple->node_cache = rb_ary_new();
|
509
607
|
|
510
|
-
|
511
|
-
(int) (NIL_P(mode) ? 0 : NUM2INT(mode)),
|
512
|
-
ns,
|
513
|
-
(int) (NIL_P(with_comments) ? 0 : 1),
|
514
|
-
buf);
|
608
|
+
c_document->_private = tuple ;
|
515
609
|
|
516
|
-
|
610
|
+
rb_iv_set(rb_document, "@decorators", Qnil);
|
611
|
+
rb_iv_set(rb_document, "@errors", Qnil);
|
612
|
+
rb_iv_set(rb_document, "@node_cache", tuple->node_cache);
|
517
613
|
|
518
|
-
|
614
|
+
rb_obj_call_init(rb_document, argc, argv);
|
615
|
+
|
616
|
+
return rb_document ;
|
519
617
|
}
|
520
618
|
|
521
|
-
|
522
|
-
|
619
|
+
|
620
|
+
/* deprecated. use noko_xml_document_wrap() instead. */
|
621
|
+
VALUE
|
622
|
+
Nokogiri_wrap_xml_document(VALUE klass, xmlDocPtr doc)
|
523
623
|
{
|
524
|
-
|
525
|
-
|
526
|
-
|
624
|
+
/* TODO: deprecate this method in v2.0 */
|
625
|
+
return noko_xml_document_wrap_with_init_args(klass, doc, 0, NULL);
|
626
|
+
}
|
527
627
|
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
cNokogiriXmlDocument = klass;
|
534
|
-
|
535
|
-
rb_define_singleton_method(klass, "read_memory", read_memory, 4);
|
536
|
-
rb_define_singleton_method(klass, "read_io", read_io, 4);
|
537
|
-
rb_define_singleton_method(klass, "new", new, -1);
|
538
|
-
|
539
|
-
rb_define_method(klass, "root", root, 0);
|
540
|
-
rb_define_method(klass, "root=", set_root, 1);
|
541
|
-
rb_define_method(klass, "encoding", encoding, 0);
|
542
|
-
rb_define_method(klass, "encoding=", set_encoding, 1);
|
543
|
-
rb_define_method(klass, "version", version, 0);
|
544
|
-
rb_define_method(klass, "canonicalize", canonicalize, -1);
|
545
|
-
rb_define_method(klass, "dup", duplicate_node, -1);
|
546
|
-
rb_define_method(klass, "url", url, 0);
|
547
|
-
rb_define_method(klass, "create_entity", create_entity, -1);
|
548
|
-
rb_define_method(klass, "remove_namespaces!", remove_namespaces_bang, 0);
|
628
|
+
VALUE
|
629
|
+
noko_xml_document_wrap(VALUE klass, xmlDocPtr doc)
|
630
|
+
{
|
631
|
+
return noko_xml_document_wrap_with_init_args(klass, doc, 0, NULL);
|
549
632
|
}
|
550
633
|
|
551
634
|
|
552
|
-
|
553
|
-
|
635
|
+
void
|
636
|
+
noko_xml_document_pin_node(xmlNodePtr node)
|
554
637
|
{
|
555
|
-
|
638
|
+
xmlDocPtr doc;
|
639
|
+
nokogiriTuplePtr tuple;
|
556
640
|
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
doc
|
562
|
-
);
|
641
|
+
doc = node->doc;
|
642
|
+
tuple = (nokogiriTuplePtr)doc->_private;
|
643
|
+
st_insert(tuple->unlinkedNodes, (st_data_t)node, (st_data_t)node);
|
644
|
+
}
|
563
645
|
|
564
|
-
VALUE cache = rb_ary_new();
|
565
|
-
rb_iv_set(rb_doc, "@decorators", Qnil);
|
566
|
-
rb_iv_set(rb_doc, "@node_cache", cache);
|
567
646
|
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
647
|
+
void
|
648
|
+
noko_xml_document_pin_namespace(xmlNsPtr ns, xmlDocPtr doc)
|
649
|
+
{
|
650
|
+
nokogiriTuplePtr tuple;
|
572
651
|
|
573
|
-
|
652
|
+
tuple = (nokogiriTuplePtr)doc->_private;
|
653
|
+
st_insert(tuple->unlinkedNodes, (st_data_t)ns, (st_data_t)ns);
|
654
|
+
}
|
574
655
|
|
575
|
-
|
656
|
+
|
657
|
+
void
|
658
|
+
noko_init_xml_document()
|
659
|
+
{
|
660
|
+
assert(cNokogiriXmlNode);
|
661
|
+
/*
|
662
|
+
* Nokogiri::XML::Document wraps an xml document.
|
663
|
+
*/
|
664
|
+
cNokogiriXmlDocument = rb_define_class_under(mNokogiriXml, "Document", cNokogiriXmlNode);
|
665
|
+
|
666
|
+
rb_define_singleton_method(cNokogiriXmlDocument, "read_memory", read_memory, 4);
|
667
|
+
rb_define_singleton_method(cNokogiriXmlDocument, "read_io", read_io, 4);
|
668
|
+
rb_define_singleton_method(cNokogiriXmlDocument, "new", new, -1);
|
669
|
+
|
670
|
+
rb_define_method(cNokogiriXmlDocument, "root", rb_xml_document_root, 0);
|
671
|
+
rb_define_method(cNokogiriXmlDocument, "root=", rb_xml_document_root_set, 1);
|
672
|
+
rb_define_method(cNokogiriXmlDocument, "encoding", encoding, 0);
|
673
|
+
rb_define_method(cNokogiriXmlDocument, "encoding=", set_encoding, 1);
|
674
|
+
rb_define_method(cNokogiriXmlDocument, "version", version, 0);
|
675
|
+
rb_define_method(cNokogiriXmlDocument, "canonicalize", rb_xml_document_canonicalize, -1);
|
676
|
+
rb_define_method(cNokogiriXmlDocument, "dup", duplicate_document, -1);
|
677
|
+
rb_define_method(cNokogiriXmlDocument, "url", url, 0);
|
678
|
+
rb_define_method(cNokogiriXmlDocument, "create_entity", create_entity, -1);
|
679
|
+
rb_define_method(cNokogiriXmlDocument, "remove_namespaces!", remove_namespaces_bang, 0);
|
576
680
|
}
|