nokogiri 1.8.5 → 1.13.9
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 +765 -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 +199 -88
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +42 -37
- data/ext/nokogiri/xml_attribute_decl.c +21 -21
- data/ext/nokogiri/xml_cdata.c +14 -19
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +296 -217
- data/ext/nokogiri/xml_document_fragment.c +12 -16
- data/ext/nokogiri/xml_dtd.c +64 -58
- data/ext/nokogiri/xml_element_content.c +31 -26
- data/ext/nokogiri/xml_element_decl.c +25 -25
- data/ext/nokogiri/xml_encoding_handler.c +43 -18
- data/ext/nokogiri/xml_entity_decl.c +37 -35
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +99 -54
- data/ext/nokogiri/xml_node.c +1107 -658
- data/ext/nokogiri/xml_node_set.c +178 -166
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +277 -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 +114 -35
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +14 -18
- data/ext/nokogiri/xml_xpath_context.c +226 -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 +21 -28
- data/lib/nokogiri/xml/relax_ng.rb +8 -2
- data/lib/nokogiri/xml/sax/document.rb +45 -49
- data/lib/nokogiri/xml/sax/parser.rb +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/0005-avoid-isnan-isinf.patch +81 -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.10.3.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.37.tar.xz +0 -0
- metadata +211 -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,36 +79,43 @@ 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) ||
|
76
105
|
(node->type == XML_XINCLUDE_END)) &&
|
77
106
|
node->nsDef) {
|
78
|
-
|
107
|
+
xmlNsPtr curr = node->nsDef;
|
108
|
+
while (curr) {
|
109
|
+
noko_xml_document_pin_namespace(curr, node->doc);
|
110
|
+
curr = curr->next;
|
111
|
+
}
|
79
112
|
node->nsDef = NULL;
|
80
113
|
}
|
81
114
|
|
82
115
|
if (node->type == XML_ELEMENT_NODE && node->properties != NULL) {
|
83
116
|
property = node->properties ;
|
84
117
|
while (property != NULL) {
|
85
|
-
if (property->ns) property->ns = NULL ;
|
118
|
+
if (property->ns) { property->ns = NULL ; }
|
86
119
|
property = property->next ;
|
87
120
|
}
|
88
121
|
}
|
@@ -94,12 +127,13 @@ static void recursively_remove_namespaces_from_node(xmlNodePtr node)
|
|
94
127
|
*
|
95
128
|
* Get the url name for this document.
|
96
129
|
*/
|
97
|
-
static VALUE
|
130
|
+
static VALUE
|
131
|
+
url(VALUE self)
|
98
132
|
{
|
99
133
|
xmlDocPtr doc;
|
100
134
|
Data_Get_Struct(self, xmlDoc, doc);
|
101
135
|
|
102
|
-
if(doc->URL) return NOKOGIRI_STR_NEW2(doc->URL);
|
136
|
+
if (doc->URL) { return NOKOGIRI_STR_NEW2(doc->URL); }
|
103
137
|
|
104
138
|
return Qnil;
|
105
139
|
}
|
@@ -110,42 +144,42 @@ static VALUE url(VALUE self)
|
|
110
144
|
*
|
111
145
|
* Set the root element on this document
|
112
146
|
*/
|
113
|
-
static VALUE
|
147
|
+
static VALUE
|
148
|
+
rb_xml_document_root_set(VALUE self, VALUE rb_new_root)
|
114
149
|
{
|
115
|
-
xmlDocPtr
|
116
|
-
xmlNodePtr
|
117
|
-
xmlNodePtr old_root;
|
150
|
+
xmlDocPtr c_document;
|
151
|
+
xmlNodePtr c_new_root = NULL, c_current_root;
|
118
152
|
|
119
|
-
Data_Get_Struct(self, xmlDoc,
|
153
|
+
Data_Get_Struct(self, xmlDoc, c_document);
|
120
154
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
if(old_root) {
|
127
|
-
xmlUnlinkNode(old_root);
|
128
|
-
nokogiri_root_node(old_root);
|
129
|
-
}
|
130
|
-
|
131
|
-
return root;
|
155
|
+
c_current_root = xmlDocGetRootElement(c_document);
|
156
|
+
if (c_current_root) {
|
157
|
+
xmlUnlinkNode(c_current_root);
|
158
|
+
noko_xml_document_pin_node(c_current_root);
|
132
159
|
}
|
133
160
|
|
134
|
-
|
161
|
+
if (!NIL_P(rb_new_root)) {
|
162
|
+
if (!rb_obj_is_kind_of(rb_new_root, cNokogiriXmlNode)) {
|
163
|
+
rb_raise(rb_eArgError,
|
164
|
+
"expected Nokogiri::XML::Node but received %"PRIsVALUE,
|
165
|
+
rb_obj_class(rb_new_root));
|
166
|
+
}
|
135
167
|
|
168
|
+
Noko_Node_Get_Struct(rb_new_root, xmlNode, c_new_root);
|
136
169
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
170
|
+
/* If the new root's document is not the same as the current document,
|
171
|
+
* then we need to dup the node in to this document. */
|
172
|
+
if (c_new_root->doc != c_document) {
|
173
|
+
c_new_root = xmlDocCopyNode(c_new_root, c_document, 1);
|
174
|
+
if (!c_new_root) {
|
175
|
+
rb_raise(rb_eRuntimeError, "Could not reparent node (xmlDocCopyNode)");
|
176
|
+
}
|
143
177
|
}
|
144
178
|
}
|
145
179
|
|
146
|
-
xmlDocSetRootElement(
|
147
|
-
|
148
|
-
return
|
180
|
+
xmlDocSetRootElement(c_document, c_new_root);
|
181
|
+
|
182
|
+
return rb_new_root;
|
149
183
|
}
|
150
184
|
|
151
185
|
/*
|
@@ -154,17 +188,20 @@ static VALUE set_root(VALUE self, VALUE root)
|
|
154
188
|
*
|
155
189
|
* Get the root node for this document.
|
156
190
|
*/
|
157
|
-
static VALUE
|
191
|
+
static VALUE
|
192
|
+
rb_xml_document_root(VALUE self)
|
158
193
|
{
|
159
|
-
xmlDocPtr
|
160
|
-
xmlNodePtr
|
194
|
+
xmlDocPtr c_document;
|
195
|
+
xmlNodePtr c_root;
|
161
196
|
|
162
|
-
Data_Get_Struct(self, xmlDoc,
|
197
|
+
Data_Get_Struct(self, xmlDoc, c_document);
|
163
198
|
|
164
|
-
|
199
|
+
c_root = xmlDocGetRootElement(c_document);
|
200
|
+
if (!c_root) {
|
201
|
+
return Qnil;
|
202
|
+
}
|
165
203
|
|
166
|
-
|
167
|
-
return Nokogiri_wrap_xml_node(Qnil, root) ;
|
204
|
+
return noko_xml_node_wrap(Qnil, c_root) ;
|
168
205
|
}
|
169
206
|
|
170
207
|
/*
|
@@ -173,13 +210,15 @@ static VALUE root(VALUE self)
|
|
173
210
|
*
|
174
211
|
* Set the encoding string for this Document
|
175
212
|
*/
|
176
|
-
static VALUE
|
213
|
+
static VALUE
|
214
|
+
set_encoding(VALUE self, VALUE encoding)
|
177
215
|
{
|
178
216
|
xmlDocPtr doc;
|
179
217
|
Data_Get_Struct(self, xmlDoc, doc);
|
180
218
|
|
181
|
-
if (doc->encoding)
|
182
|
-
|
219
|
+
if (doc->encoding) {
|
220
|
+
xmlFree(DISCARD_CONST_QUAL_XMLCHAR(doc->encoding));
|
221
|
+
}
|
183
222
|
|
184
223
|
doc->encoding = xmlStrdup((xmlChar *)StringValueCStr(encoding));
|
185
224
|
|
@@ -192,12 +231,13 @@ static VALUE set_encoding(VALUE self, VALUE encoding)
|
|
192
231
|
*
|
193
232
|
* Get the encoding for this Document
|
194
233
|
*/
|
195
|
-
static VALUE
|
234
|
+
static VALUE
|
235
|
+
encoding(VALUE self)
|
196
236
|
{
|
197
237
|
xmlDocPtr doc;
|
198
238
|
Data_Get_Struct(self, xmlDoc, doc);
|
199
239
|
|
200
|
-
if(!doc->encoding) return Qnil;
|
240
|
+
if (!doc->encoding) { return Qnil; }
|
201
241
|
return NOKOGIRI_STR_NEW2(doc->encoding);
|
202
242
|
}
|
203
243
|
|
@@ -207,12 +247,13 @@ static VALUE encoding(VALUE self)
|
|
207
247
|
*
|
208
248
|
* Get the XML version for this Document
|
209
249
|
*/
|
210
|
-
static VALUE
|
250
|
+
static VALUE
|
251
|
+
version(VALUE self)
|
211
252
|
{
|
212
253
|
xmlDocPtr doc;
|
213
254
|
Data_Get_Struct(self, xmlDoc, doc);
|
214
255
|
|
215
|
-
if(!doc->version) return Qnil;
|
256
|
+
if (!doc->version) { return Qnil; }
|
216
257
|
return NOKOGIRI_STR_NEW2(doc->version);
|
217
258
|
}
|
218
259
|
|
@@ -222,14 +263,15 @@ static VALUE version(VALUE self)
|
|
222
263
|
*
|
223
264
|
* Create a new document from an IO object
|
224
265
|
*/
|
225
|
-
static VALUE
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
266
|
+
static VALUE
|
267
|
+
read_io(VALUE klass,
|
268
|
+
VALUE io,
|
269
|
+
VALUE url,
|
270
|
+
VALUE encoding,
|
271
|
+
VALUE options)
|
230
272
|
{
|
231
|
-
const char *
|
232
|
-
const char *
|
273
|
+
const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url);
|
274
|
+
const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
|
233
275
|
VALUE error_list = rb_ary_new();
|
234
276
|
VALUE document;
|
235
277
|
xmlDocPtr doc;
|
@@ -238,30 +280,31 @@ static VALUE read_io( VALUE klass,
|
|
238
280
|
xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
|
239
281
|
|
240
282
|
doc = xmlReadIO(
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
283
|
+
(xmlInputReadCallback)noko_io_read,
|
284
|
+
(xmlInputCloseCallback)noko_io_close,
|
285
|
+
(void *)io,
|
286
|
+
c_url,
|
287
|
+
c_enc,
|
288
|
+
(int)NUM2INT(options)
|
289
|
+
);
|
248
290
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
249
291
|
|
250
|
-
if(doc == NULL) {
|
292
|
+
if (doc == NULL) {
|
251
293
|
xmlErrorPtr error;
|
252
294
|
|
253
295
|
xmlFreeDoc(doc);
|
254
296
|
|
255
297
|
error = xmlGetLastError();
|
256
|
-
if(error)
|
298
|
+
if (error) {
|
257
299
|
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
258
|
-
else
|
300
|
+
} else {
|
259
301
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
302
|
+
}
|
260
303
|
|
261
304
|
return Qnil;
|
262
305
|
}
|
263
306
|
|
264
|
-
document =
|
307
|
+
document = noko_xml_document_wrap(klass, doc);
|
265
308
|
rb_iv_set(document, "@errors", error_list);
|
266
309
|
return document;
|
267
310
|
}
|
@@ -272,15 +315,16 @@ static VALUE read_io( VALUE klass,
|
|
272
315
|
*
|
273
316
|
* Create a new document from a String
|
274
317
|
*/
|
275
|
-
static VALUE
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
318
|
+
static VALUE
|
319
|
+
read_memory(VALUE klass,
|
320
|
+
VALUE string,
|
321
|
+
VALUE url,
|
322
|
+
VALUE encoding,
|
323
|
+
VALUE options)
|
280
324
|
{
|
281
|
-
const char *
|
282
|
-
const char *
|
283
|
-
const char *
|
325
|
+
const char *c_buffer = StringValuePtr(string);
|
326
|
+
const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url);
|
327
|
+
const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
|
284
328
|
int len = (int)RSTRING_LEN(string);
|
285
329
|
VALUE error_list = rb_ary_new();
|
286
330
|
VALUE document;
|
@@ -291,21 +335,22 @@ static VALUE read_memory( VALUE klass,
|
|
291
335
|
doc = xmlReadMemory(c_buffer, len, c_url, c_enc, (int)NUM2INT(options));
|
292
336
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
293
337
|
|
294
|
-
if(doc == NULL) {
|
338
|
+
if (doc == NULL) {
|
295
339
|
xmlErrorPtr error;
|
296
340
|
|
297
341
|
xmlFreeDoc(doc);
|
298
342
|
|
299
343
|
error = xmlGetLastError();
|
300
|
-
if(error)
|
344
|
+
if (error) {
|
301
345
|
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
302
|
-
else
|
346
|
+
} else {
|
303
347
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
348
|
+
}
|
304
349
|
|
305
350
|
return Qnil;
|
306
351
|
}
|
307
352
|
|
308
|
-
document =
|
353
|
+
document = noko_xml_document_wrap(klass, doc);
|
309
354
|
rb_iv_set(document, "@errors", error_list);
|
310
355
|
return document;
|
311
356
|
}
|
@@ -317,26 +362,26 @@ static VALUE read_memory( VALUE klass,
|
|
317
362
|
* Copy this Document. An optional depth may be passed in, but it defaults
|
318
363
|
* to a deep copy. 0 is a shallow copy, 1 is a deep copy.
|
319
364
|
*/
|
320
|
-
static VALUE
|
365
|
+
static VALUE
|
366
|
+
duplicate_document(int argc, VALUE *argv, VALUE self)
|
321
367
|
{
|
322
368
|
xmlDocPtr doc, dup;
|
323
369
|
VALUE copy;
|
324
370
|
VALUE level;
|
325
|
-
VALUE error_list;
|
326
371
|
|
327
|
-
if(rb_scan_args(argc, argv, "01", &level) == 0)
|
372
|
+
if (rb_scan_args(argc, argv, "01", &level) == 0) {
|
328
373
|
level = INT2NUM((long)1);
|
374
|
+
}
|
329
375
|
|
330
376
|
Data_Get_Struct(self, xmlDoc, doc);
|
331
377
|
|
332
378
|
dup = xmlCopyDoc(doc, (int)NUM2INT(level));
|
333
379
|
|
334
|
-
if(dup == NULL) return Qnil;
|
380
|
+
if (dup == NULL) { return Qnil; }
|
335
381
|
|
336
382
|
dup->type = doc->type;
|
337
|
-
copy =
|
338
|
-
|
339
|
-
rb_iv_set(copy, "@errors", error_list);
|
383
|
+
copy = noko_xml_document_wrap(rb_obj_class(self), dup);
|
384
|
+
rb_iv_set(copy, "@errors", rb_iv_get(self, "@errors"));
|
340
385
|
return copy ;
|
341
386
|
}
|
342
387
|
|
@@ -346,18 +391,18 @@ static VALUE duplicate_document(int argc, VALUE *argv, VALUE self)
|
|
346
391
|
*
|
347
392
|
* Create a new document with +version+ (defaults to "1.0")
|
348
393
|
*/
|
349
|
-
static VALUE
|
394
|
+
static VALUE
|
395
|
+
new (int argc, VALUE *argv, VALUE klass)
|
350
396
|
{
|
351
397
|
xmlDocPtr doc;
|
352
398
|
VALUE version, rest, rb_doc ;
|
353
399
|
|
354
400
|
rb_scan_args(argc, argv, "0*", &rest);
|
355
401
|
version = rb_ary_entry(rest, (long)0);
|
356
|
-
if (NIL_P(version)) version = rb_str_new2("1.0");
|
402
|
+
if (NIL_P(version)) { version = rb_str_new2("1.0"); }
|
357
403
|
|
358
404
|
doc = xmlNewDoc((xmlChar *)StringValueCStr(version));
|
359
|
-
rb_doc =
|
360
|
-
rb_obj_call_init(rb_doc, argc, argv);
|
405
|
+
rb_doc = noko_xml_document_wrap_with_init_args(klass, doc, argc, argv);
|
361
406
|
return rb_doc ;
|
362
407
|
}
|
363
408
|
|
@@ -398,7 +443,8 @@ static VALUE new(int argc, VALUE *argv, VALUE klass)
|
|
398
443
|
* please direct your browser to
|
399
444
|
* http://tenderlovemaking.com/2009/04/23/namespaces-in-xml.html
|
400
445
|
*/
|
401
|
-
|
446
|
+
static VALUE
|
447
|
+
remove_namespaces_bang(VALUE self)
|
402
448
|
{
|
403
449
|
xmlDocPtr doc ;
|
404
450
|
Data_Get_Struct(self, xmlDoc, doc);
|
@@ -418,7 +464,8 @@ VALUE remove_namespaces_bang(VALUE self)
|
|
418
464
|
* +external_id+, +system_id+, and +content+ set the External ID, System ID,
|
419
465
|
* and content respectively. All of these parameters are optional.
|
420
466
|
*/
|
421
|
-
static VALUE
|
467
|
+
static VALUE
|
468
|
+
create_entity(int argc, VALUE *argv, VALUE self)
|
422
469
|
{
|
423
470
|
VALUE name;
|
424
471
|
VALUE type;
|
@@ -431,52 +478,50 @@ static VALUE create_entity(int argc, VALUE *argv, VALUE self)
|
|
431
478
|
Data_Get_Struct(self, xmlDoc, doc);
|
432
479
|
|
433
480
|
rb_scan_args(argc, argv, "14", &name, &type, &external_id, &system_id,
|
434
|
-
|
481
|
+
&content);
|
435
482
|
|
436
483
|
xmlResetLastError();
|
437
484
|
ptr = xmlAddDocEntity(
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
if(NULL == ptr) {
|
485
|
+
doc,
|
486
|
+
(xmlChar *)(NIL_P(name) ? NULL : StringValueCStr(name)),
|
487
|
+
(int)(NIL_P(type) ? XML_INTERNAL_GENERAL_ENTITY : NUM2INT(type)),
|
488
|
+
(xmlChar *)(NIL_P(external_id) ? NULL : StringValueCStr(external_id)),
|
489
|
+
(xmlChar *)(NIL_P(system_id) ? NULL : StringValueCStr(system_id)),
|
490
|
+
(xmlChar *)(NIL_P(content) ? NULL : StringValueCStr(content))
|
491
|
+
);
|
492
|
+
|
493
|
+
if (NULL == ptr) {
|
447
494
|
xmlErrorPtr error = xmlGetLastError();
|
448
|
-
if(error)
|
495
|
+
if (error) {
|
449
496
|
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
450
|
-
else
|
497
|
+
} else {
|
451
498
|
rb_raise(rb_eRuntimeError, "Could not create entity");
|
499
|
+
}
|
452
500
|
|
453
501
|
return Qnil;
|
454
502
|
}
|
455
503
|
|
456
|
-
return
|
504
|
+
return noko_xml_node_wrap(cNokogiriXmlEntityDecl, (xmlNodePtr)ptr);
|
457
505
|
}
|
458
506
|
|
459
|
-
static int
|
507
|
+
static int
|
508
|
+
block_caller(void *ctx, xmlNodePtr c_node, xmlNodePtr c_parent_node)
|
460
509
|
{
|
461
|
-
VALUE block;
|
462
|
-
VALUE
|
463
|
-
VALUE
|
510
|
+
VALUE block = (VALUE)ctx;
|
511
|
+
VALUE rb_node;
|
512
|
+
VALUE rb_parent_node;
|
464
513
|
VALUE ret;
|
465
514
|
|
466
|
-
if(
|
467
|
-
|
468
|
-
}
|
469
|
-
|
470
|
-
node = Nokogiri_wrap_xml_node(Qnil, _node);
|
515
|
+
if (c_node->type == XML_NAMESPACE_DECL) {
|
516
|
+
rb_node = noko_xml_namespace_wrap((xmlNsPtr)c_node, c_parent_node->doc);
|
517
|
+
} else {
|
518
|
+
rb_node = noko_xml_node_wrap(Qnil, c_node);
|
471
519
|
}
|
472
|
-
|
473
|
-
block = (VALUE)ctx;
|
520
|
+
rb_parent_node = c_parent_node ? noko_xml_node_wrap(Qnil, c_parent_node) : Qnil;
|
474
521
|
|
475
|
-
ret = rb_funcall(block, rb_intern("call"), 2,
|
522
|
+
ret = rb_funcall(block, rb_intern("call"), 2, rb_node, rb_parent_node);
|
476
523
|
|
477
|
-
|
478
|
-
|
479
|
-
return 1;
|
524
|
+
return (Qfalse == ret || Qnil == ret) ? 0 : 1;
|
480
525
|
}
|
481
526
|
|
482
527
|
/* call-seq:
|
@@ -489,117 +534,151 @@ static int block_caller(void * ctx, xmlNodePtr _node, xmlNodePtr _parent)
|
|
489
534
|
* The block must return a non-nil, non-false value if the +obj+ passed in
|
490
535
|
* should be included in the canonicalized document.
|
491
536
|
*/
|
492
|
-
static VALUE
|
537
|
+
static VALUE
|
538
|
+
rb_xml_document_canonicalize(int argc, VALUE *argv, VALUE self)
|
493
539
|
{
|
494
|
-
VALUE
|
495
|
-
VALUE
|
496
|
-
VALUE
|
497
|
-
xmlChar **
|
498
|
-
long ns_len, i;
|
540
|
+
VALUE rb_mode;
|
541
|
+
VALUE rb_namespaces;
|
542
|
+
VALUE rb_comments_p;
|
543
|
+
xmlChar **c_namespaces;
|
499
544
|
|
500
|
-
xmlDocPtr
|
501
|
-
xmlOutputBufferPtr
|
502
|
-
xmlC14NIsVisibleCallback
|
503
|
-
void *
|
545
|
+
xmlDocPtr c_doc;
|
546
|
+
xmlOutputBufferPtr c_obuf;
|
547
|
+
xmlC14NIsVisibleCallback c_callback_wrapper = NULL;
|
548
|
+
void *rb_callback = NULL;
|
504
549
|
|
505
550
|
VALUE rb_cStringIO;
|
506
|
-
VALUE
|
551
|
+
VALUE rb_io;
|
507
552
|
|
508
|
-
rb_scan_args(argc, argv, "03", &
|
553
|
+
rb_scan_args(argc, argv, "03", &rb_mode, &rb_namespaces, &rb_comments_p);
|
554
|
+
if (!NIL_P(rb_mode)) { Check_Type(rb_mode, T_FIXNUM); }
|
555
|
+
if (!NIL_P(rb_namespaces)) { Check_Type(rb_namespaces, T_ARRAY); }
|
509
556
|
|
510
|
-
Data_Get_Struct(self, xmlDoc,
|
557
|
+
Data_Get_Struct(self, xmlDoc, c_doc);
|
511
558
|
|
512
559
|
rb_cStringIO = rb_const_get_at(rb_cObject, rb_intern("StringIO"));
|
513
|
-
|
514
|
-
|
560
|
+
rb_io = rb_class_new_instance(0, 0, rb_cStringIO);
|
561
|
+
c_obuf = xmlAllocOutputBuffer(NULL);
|
515
562
|
|
516
|
-
|
517
|
-
|
518
|
-
|
563
|
+
c_obuf->writecallback = (xmlOutputWriteCallback)noko_io_write;
|
564
|
+
c_obuf->closecallback = (xmlOutputCloseCallback)noko_io_close;
|
565
|
+
c_obuf->context = (void *)rb_io;
|
519
566
|
|
520
|
-
if(rb_block_given_p()) {
|
521
|
-
|
522
|
-
|
567
|
+
if (rb_block_given_p()) {
|
568
|
+
c_callback_wrapper = block_caller;
|
569
|
+
rb_callback = (void *)rb_block_proc();
|
523
570
|
}
|
524
571
|
|
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);
|
572
|
+
if (NIL_P(rb_namespaces)) {
|
573
|
+
c_namespaces = NULL;
|
574
|
+
} else {
|
575
|
+
long ns_len = RARRAY_LEN(rb_namespaces);
|
576
|
+
c_namespaces = calloc((size_t)ns_len + 1, sizeof(xmlChar *));
|
577
|
+
for (int j = 0 ; j < ns_len ; j++) {
|
578
|
+
VALUE entry = rb_ary_entry(rb_namespaces, j);
|
579
|
+
c_namespaces[j] = (xmlChar *)StringValueCStr(entry);
|
535
580
|
}
|
536
581
|
}
|
537
582
|
|
583
|
+
xmlC14NExecute(c_doc, c_callback_wrapper, rb_callback,
|
584
|
+
(int)(NIL_P(rb_mode) ? 0 : NUM2INT(rb_mode)),
|
585
|
+
c_namespaces,
|
586
|
+
(int)RTEST(rb_comments_p),
|
587
|
+
c_obuf);
|
538
588
|
|
539
|
-
|
540
|
-
|
541
|
-
ns,
|
542
|
-
(int) RTEST(with_comments),
|
543
|
-
buf);
|
589
|
+
free(c_namespaces);
|
590
|
+
xmlOutputBufferClose(c_obuf);
|
544
591
|
|
545
|
-
|
592
|
+
return rb_funcall(rb_io, rb_intern("string"), 0);
|
593
|
+
}
|
594
|
+
|
595
|
+
VALUE
|
596
|
+
noko_xml_document_wrap_with_init_args(VALUE klass, xmlDocPtr c_document, int argc, VALUE *argv)
|
597
|
+
{
|
598
|
+
VALUE rb_document;
|
599
|
+
nokogiriTuplePtr tuple;
|
600
|
+
|
601
|
+
if (!klass) {
|
602
|
+
klass = cNokogiriXmlDocument;
|
603
|
+
}
|
546
604
|
|
547
|
-
|
605
|
+
rb_document = Data_Wrap_Struct(klass, mark, dealloc, c_document);
|
606
|
+
|
607
|
+
tuple = (nokogiriTuplePtr)malloc(sizeof(nokogiriTuple));
|
608
|
+
tuple->doc = rb_document;
|
609
|
+
tuple->unlinkedNodes = st_init_numtable_with_size(128);
|
610
|
+
tuple->node_cache = rb_ary_new();
|
611
|
+
|
612
|
+
c_document->_private = tuple ;
|
613
|
+
|
614
|
+
rb_iv_set(rb_document, "@decorators", Qnil);
|
615
|
+
rb_iv_set(rb_document, "@errors", Qnil);
|
616
|
+
rb_iv_set(rb_document, "@node_cache", tuple->node_cache);
|
617
|
+
|
618
|
+
rb_obj_call_init(rb_document, argc, argv);
|
619
|
+
|
620
|
+
return rb_document ;
|
548
621
|
}
|
549
622
|
|
550
|
-
|
551
|
-
|
623
|
+
|
624
|
+
/* deprecated. use noko_xml_document_wrap() instead. */
|
625
|
+
VALUE
|
626
|
+
Nokogiri_wrap_xml_document(VALUE klass, xmlDocPtr doc)
|
552
627
|
{
|
553
|
-
|
554
|
-
|
555
|
-
|
628
|
+
/* TODO: deprecate this method in v2.0 */
|
629
|
+
return noko_xml_document_wrap_with_init_args(klass, doc, 0, NULL);
|
630
|
+
}
|
556
631
|
|
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);
|
632
|
+
VALUE
|
633
|
+
noko_xml_document_wrap(VALUE klass, xmlDocPtr doc)
|
634
|
+
{
|
635
|
+
return noko_xml_document_wrap_with_init_args(klass, doc, 0, NULL);
|
578
636
|
}
|
579
637
|
|
580
638
|
|
581
|
-
|
582
|
-
|
639
|
+
void
|
640
|
+
noko_xml_document_pin_node(xmlNodePtr node)
|
583
641
|
{
|
584
|
-
|
642
|
+
xmlDocPtr doc;
|
643
|
+
nokogiriTuplePtr tuple;
|
585
644
|
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
doc
|
591
|
-
);
|
645
|
+
doc = node->doc;
|
646
|
+
tuple = (nokogiriTuplePtr)doc->_private;
|
647
|
+
st_insert(tuple->unlinkedNodes, (st_data_t)node, (st_data_t)node);
|
648
|
+
}
|
592
649
|
|
593
|
-
VALUE cache = rb_ary_new();
|
594
|
-
rb_iv_set(rb_doc, "@decorators", Qnil);
|
595
|
-
rb_iv_set(rb_doc, "@node_cache", cache);
|
596
650
|
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
651
|
+
void
|
652
|
+
noko_xml_document_pin_namespace(xmlNsPtr ns, xmlDocPtr doc)
|
653
|
+
{
|
654
|
+
nokogiriTuplePtr tuple;
|
655
|
+
|
656
|
+
tuple = (nokogiriTuplePtr)doc->_private;
|
657
|
+
st_insert(tuple->unlinkedNodes, (st_data_t)ns, (st_data_t)ns);
|
658
|
+
}
|
601
659
|
|
602
|
-
rb_obj_call_init(rb_doc, 0, NULL);
|
603
660
|
|
604
|
-
|
661
|
+
void
|
662
|
+
noko_init_xml_document()
|
663
|
+
{
|
664
|
+
assert(cNokogiriXmlNode);
|
665
|
+
/*
|
666
|
+
* Nokogiri::XML::Document wraps an xml document.
|
667
|
+
*/
|
668
|
+
cNokogiriXmlDocument = rb_define_class_under(mNokogiriXml, "Document", cNokogiriXmlNode);
|
669
|
+
|
670
|
+
rb_define_singleton_method(cNokogiriXmlDocument, "read_memory", read_memory, 4);
|
671
|
+
rb_define_singleton_method(cNokogiriXmlDocument, "read_io", read_io, 4);
|
672
|
+
rb_define_singleton_method(cNokogiriXmlDocument, "new", new, -1);
|
673
|
+
|
674
|
+
rb_define_method(cNokogiriXmlDocument, "root", rb_xml_document_root, 0);
|
675
|
+
rb_define_method(cNokogiriXmlDocument, "root=", rb_xml_document_root_set, 1);
|
676
|
+
rb_define_method(cNokogiriXmlDocument, "encoding", encoding, 0);
|
677
|
+
rb_define_method(cNokogiriXmlDocument, "encoding=", set_encoding, 1);
|
678
|
+
rb_define_method(cNokogiriXmlDocument, "version", version, 0);
|
679
|
+
rb_define_method(cNokogiriXmlDocument, "canonicalize", rb_xml_document_canonicalize, -1);
|
680
|
+
rb_define_method(cNokogiriXmlDocument, "dup", duplicate_document, -1);
|
681
|
+
rb_define_method(cNokogiriXmlDocument, "url", url, 0);
|
682
|
+
rb_define_method(cNokogiriXmlDocument, "create_entity", create_entity, -1);
|
683
|
+
rb_define_method(cNokogiriXmlDocument, "remove_namespaces!", remove_namespaces_bang, 0);
|
605
684
|
}
|