nokogiri 1.8.5 → 1.13.6
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 +3 -21
- data/LICENSE-DEPENDENCIES.md +1159 -868
- data/LICENSE.md +5 -28
- data/README.md +196 -90
- data/bin/nokogiri +63 -50
- data/dependencies.yml +13 -59
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +750 -420
- 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 +119 -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 +228 -91
- data/ext/nokogiri/nokogiri.h +191 -89
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +41 -36
- data/ext/nokogiri/xml_attribute_decl.c +18 -18
- data/ext/nokogiri/xml_cdata.c +13 -18
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +291 -216
- 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 +43 -18
- data/ext/nokogiri/xml_entity_decl.c +32 -30
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +61 -52
- data/ext/nokogiri/xml_node.c +1044 -616
- data/ext/nokogiri/xml_node_set.c +174 -162
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +226 -175
- data/ext/nokogiri/xml_relax_ng.c +52 -28
- data/ext/nokogiri/xml_sax_parser.c +112 -112
- data/ext/nokogiri/xml_sax_parser_context.c +112 -86
- data/ext/nokogiri/xml_sax_push_parser.c +36 -27
- data/ext/nokogiri/xml_schema.c +112 -33
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +13 -17
- data/ext/nokogiri/xml_xpath_context.c +223 -115
- data/ext/nokogiri/xslt_stylesheet.c +265 -173
- 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 -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 +218 -91
- data/lib/nokogiri/css.rb +50 -17
- data/lib/nokogiri/decorators/slop.rb +9 -7
- 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/{html → html4}/document.rb +103 -105
- 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 +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 +46 -0
- data/lib/nokogiri/html5/document.rb +91 -0
- data/lib/nokogiri/html5/document_fragment.rb +83 -0
- data/lib/nokogiri/html5/node.rb +100 -0
- data/lib/nokogiri/html5.rb +478 -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 +222 -0
- data/lib/nokogiri/version.rb +3 -108
- data/lib/nokogiri/xml/attr.rb +6 -3
- data/lib/nokogiri/xml/attribute_decl.rb +3 -1
- data/lib/nokogiri/xml/builder.rb +97 -53
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +2 -0
- data/lib/nokogiri/xml/document.rb +224 -86
- data/lib/nokogiri/xml/document_fragment.rb +57 -44
- data/lib/nokogiri/xml/dtd.rb +4 -2
- 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 +2 -0
- data/lib/nokogiri/xml/namespace.rb +3 -0
- data/lib/nokogiri/xml/node/save_options.rb +10 -5
- data/lib/nokogiri/xml/node.rb +895 -377
- data/lib/nokogiri/xml/node_set.rb +92 -65
- data/lib/nokogiri/xml/notation.rb +13 -0
- data/lib/nokogiri/xml/parse_options.rb +22 -8
- 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 +38 -34
- 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 +112 -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 +29 -20
- data/lib/nokogiri.rb +49 -65
- 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.14.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
- metadata +220 -266
- 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_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_document.c
CHANGED
@@ -1,41 +1,67 @@
|
|
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)
|
21
34
|
{
|
22
35
|
xmlNodePtr child;
|
23
36
|
|
24
|
-
for (child = node->children; child; child = child->next)
|
37
|
+
for (child = node->children; child; child = child->next) {
|
25
38
|
remove_private(child);
|
39
|
+
}
|
26
40
|
|
27
41
|
if ((node->type == XML_ELEMENT_NODE ||
|
28
42
|
node->type == XML_XINCLUDE_START ||
|
29
43
|
node->type == XML_XINCLUDE_END) &&
|
30
44
|
node->properties) {
|
31
|
-
for (child = (xmlNodePtr)node->properties; child; child = child->next)
|
45
|
+
for (child = (xmlNodePtr)node->properties; child; child = child->next) {
|
32
46
|
remove_private(child);
|
47
|
+
}
|
33
48
|
}
|
34
49
|
|
35
50
|
node->_private = NULL;
|
36
51
|
}
|
37
52
|
|
38
|
-
static void
|
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)
|
39
65
|
{
|
40
66
|
st_table *node_hash;
|
41
67
|
|
@@ -53,23 +79,26 @@ static void dealloc(xmlDocPtr doc)
|
|
53
79
|
* xmlDeregisterNode callback from accessing VALUE pointers from ruby's GC
|
54
80
|
* free context, which can result in segfaults.
|
55
81
|
*/
|
56
|
-
if (xmlDeregisterNodeDefaultValue)
|
82
|
+
if (xmlDeregisterNodeDefaultValue) {
|
57
83
|
remove_private((xmlNodePtr)doc);
|
84
|
+
}
|
58
85
|
|
59
86
|
xmlFreeDoc(doc);
|
60
87
|
|
61
88
|
NOKOGIRI_DEBUG_END(doc);
|
62
89
|
}
|
63
90
|
|
64
|
-
static void
|
91
|
+
static void
|
92
|
+
recursively_remove_namespaces_from_node(xmlNodePtr node)
|
65
93
|
{
|
66
94
|
xmlNodePtr child ;
|
67
95
|
xmlAttrPtr property ;
|
68
96
|
|
69
97
|
xmlSetNs(node, NULL);
|
70
98
|
|
71
|
-
for (child = node->children ; child ; child = child->next)
|
99
|
+
for (child = node->children ; child ; child = child->next) {
|
72
100
|
recursively_remove_namespaces_from_node(child);
|
101
|
+
}
|
73
102
|
|
74
103
|
if (((node->type == XML_ELEMENT_NODE) ||
|
75
104
|
(node->type == XML_XINCLUDE_START) ||
|
@@ -82,7 +111,7 @@ static void recursively_remove_namespaces_from_node(xmlNodePtr node)
|
|
82
111
|
if (node->type == XML_ELEMENT_NODE && node->properties != NULL) {
|
83
112
|
property = node->properties ;
|
84
113
|
while (property != NULL) {
|
85
|
-
if (property->ns) property->ns = NULL ;
|
114
|
+
if (property->ns) { property->ns = NULL ; }
|
86
115
|
property = property->next ;
|
87
116
|
}
|
88
117
|
}
|
@@ -94,12 +123,13 @@ static void recursively_remove_namespaces_from_node(xmlNodePtr node)
|
|
94
123
|
*
|
95
124
|
* Get the url name for this document.
|
96
125
|
*/
|
97
|
-
static VALUE
|
126
|
+
static VALUE
|
127
|
+
url(VALUE self)
|
98
128
|
{
|
99
129
|
xmlDocPtr doc;
|
100
130
|
Data_Get_Struct(self, xmlDoc, doc);
|
101
131
|
|
102
|
-
if(doc->URL) return NOKOGIRI_STR_NEW2(doc->URL);
|
132
|
+
if (doc->URL) { return NOKOGIRI_STR_NEW2(doc->URL); }
|
103
133
|
|
104
134
|
return Qnil;
|
105
135
|
}
|
@@ -110,42 +140,42 @@ static VALUE url(VALUE self)
|
|
110
140
|
*
|
111
141
|
* Set the root element on this document
|
112
142
|
*/
|
113
|
-
static VALUE
|
143
|
+
static VALUE
|
144
|
+
rb_xml_document_root_set(VALUE self, VALUE rb_new_root)
|
114
145
|
{
|
115
|
-
xmlDocPtr
|
116
|
-
xmlNodePtr
|
117
|
-
xmlNodePtr old_root;
|
118
|
-
|
119
|
-
Data_Get_Struct(self, xmlDoc, doc);
|
146
|
+
xmlDocPtr c_document;
|
147
|
+
xmlNodePtr c_new_root = NULL, c_current_root;
|
120
148
|
|
121
|
-
|
149
|
+
Data_Get_Struct(self, xmlDoc, c_document);
|
122
150
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
xmlUnlinkNode(old_root);
|
128
|
-
nokogiri_root_node(old_root);
|
129
|
-
}
|
130
|
-
|
131
|
-
return root;
|
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);
|
132
155
|
}
|
133
156
|
|
134
|
-
|
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
|
+
}
|
135
163
|
|
164
|
+
Data_Get_Struct(rb_new_root, xmlNode, c_new_root);
|
136
165
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
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
|
+
}
|
143
173
|
}
|
144
174
|
}
|
145
175
|
|
146
|
-
xmlDocSetRootElement(
|
147
|
-
|
148
|
-
return
|
176
|
+
xmlDocSetRootElement(c_document, c_new_root);
|
177
|
+
|
178
|
+
return rb_new_root;
|
149
179
|
}
|
150
180
|
|
151
181
|
/*
|
@@ -154,17 +184,20 @@ static VALUE set_root(VALUE self, VALUE root)
|
|
154
184
|
*
|
155
185
|
* Get the root node for this document.
|
156
186
|
*/
|
157
|
-
static VALUE
|
187
|
+
static VALUE
|
188
|
+
rb_xml_document_root(VALUE self)
|
158
189
|
{
|
159
|
-
xmlDocPtr
|
160
|
-
xmlNodePtr
|
190
|
+
xmlDocPtr c_document;
|
191
|
+
xmlNodePtr c_root;
|
161
192
|
|
162
|
-
Data_Get_Struct(self, xmlDoc,
|
193
|
+
Data_Get_Struct(self, xmlDoc, c_document);
|
163
194
|
|
164
|
-
|
195
|
+
c_root = xmlDocGetRootElement(c_document);
|
196
|
+
if (!c_root) {
|
197
|
+
return Qnil;
|
198
|
+
}
|
165
199
|
|
166
|
-
|
167
|
-
return Nokogiri_wrap_xml_node(Qnil, root) ;
|
200
|
+
return noko_xml_node_wrap(Qnil, c_root) ;
|
168
201
|
}
|
169
202
|
|
170
203
|
/*
|
@@ -173,13 +206,15 @@ static VALUE root(VALUE self)
|
|
173
206
|
*
|
174
207
|
* Set the encoding string for this Document
|
175
208
|
*/
|
176
|
-
static VALUE
|
209
|
+
static VALUE
|
210
|
+
set_encoding(VALUE self, VALUE encoding)
|
177
211
|
{
|
178
212
|
xmlDocPtr doc;
|
179
213
|
Data_Get_Struct(self, xmlDoc, doc);
|
180
214
|
|
181
|
-
if (doc->encoding)
|
182
|
-
|
215
|
+
if (doc->encoding) {
|
216
|
+
xmlFree(DISCARD_CONST_QUAL_XMLCHAR(doc->encoding));
|
217
|
+
}
|
183
218
|
|
184
219
|
doc->encoding = xmlStrdup((xmlChar *)StringValueCStr(encoding));
|
185
220
|
|
@@ -192,12 +227,13 @@ static VALUE set_encoding(VALUE self, VALUE encoding)
|
|
192
227
|
*
|
193
228
|
* Get the encoding for this Document
|
194
229
|
*/
|
195
|
-
static VALUE
|
230
|
+
static VALUE
|
231
|
+
encoding(VALUE self)
|
196
232
|
{
|
197
233
|
xmlDocPtr doc;
|
198
234
|
Data_Get_Struct(self, xmlDoc, doc);
|
199
235
|
|
200
|
-
if(!doc->encoding) return Qnil;
|
236
|
+
if (!doc->encoding) { return Qnil; }
|
201
237
|
return NOKOGIRI_STR_NEW2(doc->encoding);
|
202
238
|
}
|
203
239
|
|
@@ -207,12 +243,13 @@ static VALUE encoding(VALUE self)
|
|
207
243
|
*
|
208
244
|
* Get the XML version for this Document
|
209
245
|
*/
|
210
|
-
static VALUE
|
246
|
+
static VALUE
|
247
|
+
version(VALUE self)
|
211
248
|
{
|
212
249
|
xmlDocPtr doc;
|
213
250
|
Data_Get_Struct(self, xmlDoc, doc);
|
214
251
|
|
215
|
-
if(!doc->version) return Qnil;
|
252
|
+
if (!doc->version) { return Qnil; }
|
216
253
|
return NOKOGIRI_STR_NEW2(doc->version);
|
217
254
|
}
|
218
255
|
|
@@ -222,14 +259,15 @@ static VALUE version(VALUE self)
|
|
222
259
|
*
|
223
260
|
* Create a new document from an IO object
|
224
261
|
*/
|
225
|
-
static VALUE
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
262
|
+
static VALUE
|
263
|
+
read_io(VALUE klass,
|
264
|
+
VALUE io,
|
265
|
+
VALUE url,
|
266
|
+
VALUE encoding,
|
267
|
+
VALUE options)
|
230
268
|
{
|
231
|
-
const char *
|
232
|
-
const char *
|
269
|
+
const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url);
|
270
|
+
const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
|
233
271
|
VALUE error_list = rb_ary_new();
|
234
272
|
VALUE document;
|
235
273
|
xmlDocPtr doc;
|
@@ -238,30 +276,31 @@ static VALUE read_io( VALUE klass,
|
|
238
276
|
xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
|
239
277
|
|
240
278
|
doc = xmlReadIO(
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
279
|
+
(xmlInputReadCallback)noko_io_read,
|
280
|
+
(xmlInputCloseCallback)noko_io_close,
|
281
|
+
(void *)io,
|
282
|
+
c_url,
|
283
|
+
c_enc,
|
284
|
+
(int)NUM2INT(options)
|
285
|
+
);
|
248
286
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
249
287
|
|
250
|
-
if(doc == NULL) {
|
288
|
+
if (doc == NULL) {
|
251
289
|
xmlErrorPtr error;
|
252
290
|
|
253
291
|
xmlFreeDoc(doc);
|
254
292
|
|
255
293
|
error = xmlGetLastError();
|
256
|
-
if(error)
|
294
|
+
if (error) {
|
257
295
|
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
258
|
-
else
|
296
|
+
} else {
|
259
297
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
298
|
+
}
|
260
299
|
|
261
300
|
return Qnil;
|
262
301
|
}
|
263
302
|
|
264
|
-
document =
|
303
|
+
document = noko_xml_document_wrap(klass, doc);
|
265
304
|
rb_iv_set(document, "@errors", error_list);
|
266
305
|
return document;
|
267
306
|
}
|
@@ -272,15 +311,16 @@ static VALUE read_io( VALUE klass,
|
|
272
311
|
*
|
273
312
|
* Create a new document from a String
|
274
313
|
*/
|
275
|
-
static VALUE
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
314
|
+
static VALUE
|
315
|
+
read_memory(VALUE klass,
|
316
|
+
VALUE string,
|
317
|
+
VALUE url,
|
318
|
+
VALUE encoding,
|
319
|
+
VALUE options)
|
280
320
|
{
|
281
|
-
const char *
|
282
|
-
const char *
|
283
|
-
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);
|
284
324
|
int len = (int)RSTRING_LEN(string);
|
285
325
|
VALUE error_list = rb_ary_new();
|
286
326
|
VALUE document;
|
@@ -291,21 +331,22 @@ static VALUE read_memory( VALUE klass,
|
|
291
331
|
doc = xmlReadMemory(c_buffer, len, c_url, c_enc, (int)NUM2INT(options));
|
292
332
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
293
333
|
|
294
|
-
if(doc == NULL) {
|
334
|
+
if (doc == NULL) {
|
295
335
|
xmlErrorPtr error;
|
296
336
|
|
297
337
|
xmlFreeDoc(doc);
|
298
338
|
|
299
339
|
error = xmlGetLastError();
|
300
|
-
if(error)
|
340
|
+
if (error) {
|
301
341
|
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
302
|
-
else
|
342
|
+
} else {
|
303
343
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
344
|
+
}
|
304
345
|
|
305
346
|
return Qnil;
|
306
347
|
}
|
307
348
|
|
308
|
-
document =
|
349
|
+
document = noko_xml_document_wrap(klass, doc);
|
309
350
|
rb_iv_set(document, "@errors", error_list);
|
310
351
|
return document;
|
311
352
|
}
|
@@ -317,26 +358,26 @@ static VALUE read_memory( VALUE klass,
|
|
317
358
|
* Copy this Document. An optional depth may be passed in, but it defaults
|
318
359
|
* to a deep copy. 0 is a shallow copy, 1 is a deep copy.
|
319
360
|
*/
|
320
|
-
static VALUE
|
361
|
+
static VALUE
|
362
|
+
duplicate_document(int argc, VALUE *argv, VALUE self)
|
321
363
|
{
|
322
364
|
xmlDocPtr doc, dup;
|
323
365
|
VALUE copy;
|
324
366
|
VALUE level;
|
325
|
-
VALUE error_list;
|
326
367
|
|
327
|
-
if(rb_scan_args(argc, argv, "01", &level) == 0)
|
368
|
+
if (rb_scan_args(argc, argv, "01", &level) == 0) {
|
328
369
|
level = INT2NUM((long)1);
|
370
|
+
}
|
329
371
|
|
330
372
|
Data_Get_Struct(self, xmlDoc, doc);
|
331
373
|
|
332
374
|
dup = xmlCopyDoc(doc, (int)NUM2INT(level));
|
333
375
|
|
334
|
-
if(dup == NULL) return Qnil;
|
376
|
+
if (dup == NULL) { return Qnil; }
|
335
377
|
|
336
378
|
dup->type = doc->type;
|
337
|
-
copy =
|
338
|
-
|
339
|
-
rb_iv_set(copy, "@errors", error_list);
|
379
|
+
copy = noko_xml_document_wrap(rb_obj_class(self), dup);
|
380
|
+
rb_iv_set(copy, "@errors", rb_iv_get(self, "@errors"));
|
340
381
|
return copy ;
|
341
382
|
}
|
342
383
|
|
@@ -346,18 +387,18 @@ static VALUE duplicate_document(int argc, VALUE *argv, VALUE self)
|
|
346
387
|
*
|
347
388
|
* Create a new document with +version+ (defaults to "1.0")
|
348
389
|
*/
|
349
|
-
static VALUE
|
390
|
+
static VALUE
|
391
|
+
new (int argc, VALUE *argv, VALUE klass)
|
350
392
|
{
|
351
393
|
xmlDocPtr doc;
|
352
394
|
VALUE version, rest, rb_doc ;
|
353
395
|
|
354
396
|
rb_scan_args(argc, argv, "0*", &rest);
|
355
397
|
version = rb_ary_entry(rest, (long)0);
|
356
|
-
if (NIL_P(version)) version = rb_str_new2("1.0");
|
398
|
+
if (NIL_P(version)) { version = rb_str_new2("1.0"); }
|
357
399
|
|
358
400
|
doc = xmlNewDoc((xmlChar *)StringValueCStr(version));
|
359
|
-
rb_doc =
|
360
|
-
rb_obj_call_init(rb_doc, argc, argv);
|
401
|
+
rb_doc = noko_xml_document_wrap_with_init_args(klass, doc, argc, argv);
|
361
402
|
return rb_doc ;
|
362
403
|
}
|
363
404
|
|
@@ -398,7 +439,8 @@ static VALUE new(int argc, VALUE *argv, VALUE klass)
|
|
398
439
|
* please direct your browser to
|
399
440
|
* http://tenderlovemaking.com/2009/04/23/namespaces-in-xml.html
|
400
441
|
*/
|
401
|
-
|
442
|
+
static VALUE
|
443
|
+
remove_namespaces_bang(VALUE self)
|
402
444
|
{
|
403
445
|
xmlDocPtr doc ;
|
404
446
|
Data_Get_Struct(self, xmlDoc, doc);
|
@@ -418,7 +460,8 @@ VALUE remove_namespaces_bang(VALUE self)
|
|
418
460
|
* +external_id+, +system_id+, and +content+ set the External ID, System ID,
|
419
461
|
* and content respectively. All of these parameters are optional.
|
420
462
|
*/
|
421
|
-
static VALUE
|
463
|
+
static VALUE
|
464
|
+
create_entity(int argc, VALUE *argv, VALUE self)
|
422
465
|
{
|
423
466
|
VALUE name;
|
424
467
|
VALUE type;
|
@@ -431,52 +474,50 @@ static VALUE create_entity(int argc, VALUE *argv, VALUE self)
|
|
431
474
|
Data_Get_Struct(self, xmlDoc, doc);
|
432
475
|
|
433
476
|
rb_scan_args(argc, argv, "14", &name, &type, &external_id, &system_id,
|
434
|
-
|
477
|
+
&content);
|
435
478
|
|
436
479
|
xmlResetLastError();
|
437
480
|
ptr = xmlAddDocEntity(
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
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) {
|
447
490
|
xmlErrorPtr error = xmlGetLastError();
|
448
|
-
if(error)
|
491
|
+
if (error) {
|
449
492
|
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
450
|
-
else
|
493
|
+
} else {
|
451
494
|
rb_raise(rb_eRuntimeError, "Could not create entity");
|
495
|
+
}
|
452
496
|
|
453
497
|
return Qnil;
|
454
498
|
}
|
455
499
|
|
456
|
-
return
|
500
|
+
return noko_xml_node_wrap(cNokogiriXmlEntityDecl, (xmlNodePtr)ptr);
|
457
501
|
}
|
458
502
|
|
459
|
-
static int
|
503
|
+
static int
|
504
|
+
block_caller(void *ctx, xmlNodePtr c_node, xmlNodePtr c_parent_node)
|
460
505
|
{
|
461
|
-
VALUE block;
|
462
|
-
VALUE
|
463
|
-
VALUE
|
506
|
+
VALUE block = (VALUE)ctx;
|
507
|
+
VALUE rb_node;
|
508
|
+
VALUE rb_parent_node;
|
464
509
|
VALUE ret;
|
465
510
|
|
466
|
-
if(
|
467
|
-
|
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);
|
468
515
|
}
|
469
|
-
|
470
|
-
node = Nokogiri_wrap_xml_node(Qnil, _node);
|
471
|
-
}
|
472
|
-
parent = _parent ? Nokogiri_wrap_xml_node(Qnil, _parent) : Qnil;
|
473
|
-
block = (VALUE)ctx;
|
474
|
-
|
475
|
-
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;
|
476
517
|
|
477
|
-
|
518
|
+
ret = rb_funcall(block, rb_intern("call"), 2, rb_node, rb_parent_node);
|
478
519
|
|
479
|
-
return 1;
|
520
|
+
return (Qfalse == ret || Qnil == ret) ? 0 : 1;
|
480
521
|
}
|
481
522
|
|
482
523
|
/* call-seq:
|
@@ -489,117 +530,151 @@ static int block_caller(void * ctx, xmlNodePtr _node, xmlNodePtr _parent)
|
|
489
530
|
* The block must return a non-nil, non-false value if the +obj+ passed in
|
490
531
|
* should be included in the canonicalized document.
|
491
532
|
*/
|
492
|
-
static VALUE
|
533
|
+
static VALUE
|
534
|
+
rb_xml_document_canonicalize(int argc, VALUE *argv, VALUE self)
|
493
535
|
{
|
494
|
-
VALUE
|
495
|
-
VALUE
|
496
|
-
VALUE
|
497
|
-
xmlChar **
|
498
|
-
long ns_len, i;
|
536
|
+
VALUE rb_mode;
|
537
|
+
VALUE rb_namespaces;
|
538
|
+
VALUE rb_comments_p;
|
539
|
+
xmlChar **c_namespaces;
|
499
540
|
|
500
|
-
xmlDocPtr
|
501
|
-
xmlOutputBufferPtr
|
502
|
-
xmlC14NIsVisibleCallback
|
503
|
-
void *
|
541
|
+
xmlDocPtr c_doc;
|
542
|
+
xmlOutputBufferPtr c_obuf;
|
543
|
+
xmlC14NIsVisibleCallback c_callback_wrapper = NULL;
|
544
|
+
void *rb_callback = NULL;
|
504
545
|
|
505
546
|
VALUE rb_cStringIO;
|
506
|
-
VALUE
|
547
|
+
VALUE rb_io;
|
507
548
|
|
508
|
-
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); }
|
509
552
|
|
510
|
-
Data_Get_Struct(self, xmlDoc,
|
553
|
+
Data_Get_Struct(self, xmlDoc, c_doc);
|
511
554
|
|
512
555
|
rb_cStringIO = rb_const_get_at(rb_cObject, rb_intern("StringIO"));
|
513
|
-
|
514
|
-
|
556
|
+
rb_io = rb_class_new_instance(0, 0, rb_cStringIO);
|
557
|
+
c_obuf = xmlAllocOutputBuffer(NULL);
|
515
558
|
|
516
|
-
|
517
|
-
|
518
|
-
|
559
|
+
c_obuf->writecallback = (xmlOutputWriteCallback)noko_io_write;
|
560
|
+
c_obuf->closecallback = (xmlOutputCloseCallback)noko_io_close;
|
561
|
+
c_obuf->context = (void *)rb_io;
|
519
562
|
|
520
|
-
if(rb_block_given_p()) {
|
521
|
-
|
522
|
-
|
563
|
+
if (rb_block_given_p()) {
|
564
|
+
c_callback_wrapper = block_caller;
|
565
|
+
rb_callback = (void *)rb_block_proc();
|
523
566
|
}
|
524
567
|
|
525
|
-
if(NIL_P(
|
526
|
-
|
527
|
-
}
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
VALUE entry = rb_ary_entry(incl_ns, i);
|
534
|
-
ns[i] = (xmlChar*)StringValueCStr(entry);
|
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);
|
535
576
|
}
|
536
577
|
}
|
537
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();
|
607
|
+
|
608
|
+
c_document->_private = tuple ;
|
538
609
|
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
(int) RTEST(with_comments),
|
543
|
-
buf);
|
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);
|
544
613
|
|
545
|
-
|
614
|
+
rb_obj_call_init(rb_document, argc, argv);
|
546
615
|
|
547
|
-
return
|
616
|
+
return rb_document ;
|
548
617
|
}
|
549
618
|
|
550
|
-
|
551
|
-
|
619
|
+
|
620
|
+
/* deprecated. use noko_xml_document_wrap() instead. */
|
621
|
+
VALUE
|
622
|
+
Nokogiri_wrap_xml_document(VALUE klass, xmlDocPtr doc)
|
552
623
|
{
|
553
|
-
|
554
|
-
|
555
|
-
|
624
|
+
/* TODO: deprecate this method in v2.0 */
|
625
|
+
return noko_xml_document_wrap_with_init_args(klass, doc, 0, NULL);
|
626
|
+
}
|
556
627
|
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
cNokogiriXmlDocument = klass;
|
563
|
-
|
564
|
-
rb_define_singleton_method(klass, "read_memory", read_memory, 4);
|
565
|
-
rb_define_singleton_method(klass, "read_io", read_io, 4);
|
566
|
-
rb_define_singleton_method(klass, "new", new, -1);
|
567
|
-
|
568
|
-
rb_define_method(klass, "root", root, 0);
|
569
|
-
rb_define_method(klass, "root=", set_root, 1);
|
570
|
-
rb_define_method(klass, "encoding", encoding, 0);
|
571
|
-
rb_define_method(klass, "encoding=", set_encoding, 1);
|
572
|
-
rb_define_method(klass, "version", version, 0);
|
573
|
-
rb_define_method(klass, "canonicalize", canonicalize, -1);
|
574
|
-
rb_define_method(klass, "dup", duplicate_document, -1);
|
575
|
-
rb_define_method(klass, "url", url, 0);
|
576
|
-
rb_define_method(klass, "create_entity", create_entity, -1);
|
577
|
-
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);
|
578
632
|
}
|
579
633
|
|
580
634
|
|
581
|
-
|
582
|
-
|
635
|
+
void
|
636
|
+
noko_xml_document_pin_node(xmlNodePtr node)
|
583
637
|
{
|
584
|
-
|
638
|
+
xmlDocPtr doc;
|
639
|
+
nokogiriTuplePtr tuple;
|
585
640
|
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
doc
|
591
|
-
);
|
641
|
+
doc = node->doc;
|
642
|
+
tuple = (nokogiriTuplePtr)doc->_private;
|
643
|
+
st_insert(tuple->unlinkedNodes, (st_data_t)node, (st_data_t)node);
|
644
|
+
}
|
592
645
|
|
593
|
-
VALUE cache = rb_ary_new();
|
594
|
-
rb_iv_set(rb_doc, "@decorators", Qnil);
|
595
|
-
rb_iv_set(rb_doc, "@node_cache", cache);
|
596
646
|
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
647
|
+
void
|
648
|
+
noko_xml_document_pin_namespace(xmlNsPtr ns, xmlDocPtr doc)
|
649
|
+
{
|
650
|
+
nokogiriTuplePtr tuple;
|
651
|
+
|
652
|
+
tuple = (nokogiriTuplePtr)doc->_private;
|
653
|
+
st_insert(tuple->unlinkedNodes, (st_data_t)ns, (st_data_t)ns);
|
654
|
+
}
|
601
655
|
|
602
|
-
rb_obj_call_init(rb_doc, 0, NULL);
|
603
656
|
|
604
|
-
|
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);
|
605
680
|
}
|