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
@@ -1,19 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Nokogiri
|
2
5
|
module XML
|
3
6
|
#
|
4
7
|
# The Searchable module declares the interface used for searching your DOM.
|
5
8
|
#
|
6
|
-
# It implements the public methods
|
9
|
+
# It implements the public methods #search, #css, and #xpath,
|
7
10
|
# as well as allowing specific implementations to specialize some
|
8
11
|
# of the important behaviors.
|
9
12
|
#
|
10
13
|
module Searchable
|
11
14
|
# Regular expression used by Searchable#search to determine if a query
|
12
15
|
# string is CSS or XPath
|
13
|
-
LOOKS_LIKE_XPATH =
|
14
|
-
|
16
|
+
LOOKS_LIKE_XPATH = %r{^(\./|/|\.\.|\.$)}
|
17
|
+
|
18
|
+
# :section: Searching via XPath or CSS Queries
|
19
|
+
|
15
20
|
###
|
16
|
-
# call-seq:
|
21
|
+
# call-seq:
|
22
|
+
# search(*paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class])
|
17
23
|
#
|
18
24
|
# Search this object for +paths+. +paths+ must be one or more XPath or CSS queries:
|
19
25
|
#
|
@@ -24,52 +30,53 @@ module Nokogiri
|
|
24
30
|
# node.search('.//bike:tire', {'bike' => 'http://schwinn.com/'})
|
25
31
|
# node.search('bike|tire', {'bike' => 'http://schwinn.com/'})
|
26
32
|
#
|
27
|
-
# For XPath queries, a hash of variable bindings may also be
|
28
|
-
#
|
33
|
+
# For XPath queries, a hash of variable bindings may also be appended to the namespace
|
34
|
+
# bindings. For example:
|
29
35
|
#
|
30
36
|
# node.search('.//address[@domestic=$value]', nil, {:value => 'Yes'})
|
31
37
|
#
|
32
|
-
# Custom XPath functions and CSS pseudo-selectors may also be
|
33
|
-
#
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
# end
|
44
|
-
# }.new
|
45
|
-
# )
|
38
|
+
# 💡 Custom XPath functions and CSS pseudo-selectors may also be defined. To define custom
|
39
|
+
# functions create a class and implement the function you want to define. The first argument
|
40
|
+
# to the method will be the current matching NodeSet. Any other arguments are ones that you
|
41
|
+
# pass in. Note that this class may appear anywhere in the argument list. For example:
|
42
|
+
#
|
43
|
+
# handler = Class.new {
|
44
|
+
# def regex node_set, regex
|
45
|
+
# node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ }
|
46
|
+
# end
|
47
|
+
# }.new
|
48
|
+
# node.search('.//title[regex(., "\w+")]', 'div.employee:regex("[0-9]+")', handler)
|
46
49
|
#
|
47
50
|
# See Searchable#xpath and Searchable#css for further usage help.
|
48
|
-
def search
|
51
|
+
def search(*args)
|
49
52
|
paths, handler, ns, binds = extract_params(args)
|
50
53
|
|
51
54
|
xpaths = paths.map(&:to_s).map do |path|
|
52
|
-
(path
|
55
|
+
LOOKS_LIKE_XPATH.match?(path) ? path : xpath_query_from_css_rule(path, ns)
|
53
56
|
end.flatten.uniq
|
54
57
|
|
55
58
|
xpath(*(xpaths + [ns, handler, binds].compact))
|
56
59
|
end
|
57
|
-
|
60
|
+
|
61
|
+
alias_method :/, :search
|
58
62
|
|
59
63
|
###
|
60
|
-
# call-seq:
|
64
|
+
# call-seq:
|
65
|
+
# at(*paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class])
|
61
66
|
#
|
62
67
|
# Search this object for +paths+, and return only the first
|
63
68
|
# result. +paths+ must be one or more XPath or CSS queries.
|
64
69
|
#
|
65
70
|
# See Searchable#search for more information.
|
66
|
-
def at
|
71
|
+
def at(*args)
|
67
72
|
search(*args).first
|
68
73
|
end
|
69
|
-
|
74
|
+
|
75
|
+
alias_method :%, :at
|
70
76
|
|
71
77
|
###
|
72
|
-
# call-seq:
|
78
|
+
# call-seq:
|
79
|
+
# css(*rules, [namespace-bindings, custom-pseudo-class])
|
73
80
|
#
|
74
81
|
# Search this object for CSS +rules+. +rules+ must be one or more CSS
|
75
82
|
# selectors. For example:
|
@@ -82,44 +89,61 @@ module Nokogiri
|
|
82
89
|
#
|
83
90
|
# node.css('bike|tire', {'bike' => 'http://schwinn.com/'})
|
84
91
|
#
|
85
|
-
# Custom CSS pseudo classes may also be defined
|
86
|
-
# custom pseudo classes, create a class and implement the custom
|
87
|
-
#
|
88
|
-
#
|
89
|
-
# arguments are ones that you pass in. For example:
|
92
|
+
# 💡 Custom CSS pseudo classes may also be defined which are mapped to a custom XPath
|
93
|
+
# function. To define custom pseudo classes, create a class and implement the custom pseudo
|
94
|
+
# class you want defined. The first argument to the method will be the matching context
|
95
|
+
# NodeSet. Any other arguments are ones that you pass in. For example:
|
90
96
|
#
|
91
|
-
#
|
92
|
-
# def regex
|
97
|
+
# handler = Class.new {
|
98
|
+
# def regex(node_set, regex)
|
93
99
|
# node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ }
|
94
100
|
# end
|
95
|
-
# }.new
|
101
|
+
# }.new
|
102
|
+
# node.css('title:regex("\w+")', handler)
|
103
|
+
#
|
104
|
+
# 💡 Some XPath syntax is supported in CSS queries. For example, to query for an attribute:
|
96
105
|
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
# an HTML document, you'll never find anything, since HTML tags
|
100
|
-
# will match only lowercase CSS queries. However, "H1" might be
|
101
|
-
# found in an XML document, where tags names are case-sensitive
|
102
|
-
# (e.g., "H1" is distinct from "h1").
|
106
|
+
# node.css('img > @href') # returns all +href+ attributes on an +img+ element
|
107
|
+
# node.css('img / @href') # same
|
103
108
|
#
|
104
|
-
|
109
|
+
# # ⚠ this returns +class+ attributes from all +div+ elements AND THEIR CHILDREN!
|
110
|
+
# node.css('div @class')
|
111
|
+
#
|
112
|
+
# node.css
|
113
|
+
#
|
114
|
+
# 💡 Array-like syntax is supported in CSS queries as an alternative to using +:nth-child()+.
|
115
|
+
#
|
116
|
+
# ⚠ NOTE that indices are 1-based like +:nth-child+ and not 0-based like Ruby Arrays. For
|
117
|
+
# example:
|
118
|
+
#
|
119
|
+
# # equivalent to 'li:nth-child(2)'
|
120
|
+
# node.css('li[2]') # retrieve the second li element in a list
|
121
|
+
#
|
122
|
+
# ⚠ NOTE that the CSS query string is case-sensitive with regards to your document type. HTML
|
123
|
+
# tags will match only lowercase CSS queries, so if you search for "H1" in an HTML document,
|
124
|
+
# you'll never find anything. However, "H1" might be found in an XML document, where tags
|
125
|
+
# names are case-sensitive (e.g., "H1" is distinct from "h1").
|
126
|
+
def css(*args)
|
105
127
|
rules, handler, ns, _ = extract_params(args)
|
106
128
|
|
107
|
-
css_internal
|
129
|
+
css_internal(self, rules, handler, ns)
|
108
130
|
end
|
109
131
|
|
110
132
|
##
|
111
|
-
# call-seq:
|
133
|
+
# call-seq:
|
134
|
+
# at_css(*rules, [namespace-bindings, custom-pseudo-class])
|
112
135
|
#
|
113
136
|
# Search this object for CSS +rules+, and return only the first
|
114
137
|
# match. +rules+ must be one or more CSS selectors.
|
115
138
|
#
|
116
139
|
# See Searchable#css for more information.
|
117
|
-
def at_css
|
140
|
+
def at_css(*args)
|
118
141
|
css(*args).first
|
119
142
|
end
|
120
143
|
|
121
144
|
###
|
122
|
-
# call-seq:
|
145
|
+
# call-seq:
|
146
|
+
# xpath(*paths, [namespace-bindings, variable-bindings, custom-handler-class])
|
123
147
|
#
|
124
148
|
# Search this node for XPath +paths+. +paths+ must be one or more XPath
|
125
149
|
# queries.
|
@@ -135,43 +159,54 @@ module Nokogiri
|
|
135
159
|
#
|
136
160
|
# node.xpath('.//address[@domestic=$value]', nil, {:value => 'Yes'})
|
137
161
|
#
|
138
|
-
# Custom XPath functions may also be defined.
|
139
|
-
#
|
140
|
-
#
|
141
|
-
#
|
142
|
-
# you pass in. Note that this class may appear anywhere in the
|
143
|
-
# argument list. For example:
|
162
|
+
# 💡 Custom XPath functions may also be defined. To define custom functions create a class and
|
163
|
+
# implement the function you want to define. The first argument to the method will be the
|
164
|
+
# current matching NodeSet. Any other arguments are ones that you pass in. Note that this
|
165
|
+
# class may appear anywhere in the argument list. For example:
|
144
166
|
#
|
145
|
-
#
|
146
|
-
# def regex
|
167
|
+
# handler = Class.new {
|
168
|
+
# def regex(node_set, regex)
|
147
169
|
# node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ }
|
148
170
|
# end
|
149
|
-
# }.new
|
171
|
+
# }.new
|
172
|
+
# node.xpath('.//title[regex(., "\w+")]', handler)
|
150
173
|
#
|
151
|
-
def xpath
|
174
|
+
def xpath(*args)
|
152
175
|
paths, handler, ns, binds = extract_params(args)
|
153
176
|
|
154
|
-
xpath_internal
|
177
|
+
xpath_internal(self, paths, handler, ns, binds)
|
155
178
|
end
|
156
179
|
|
157
180
|
##
|
158
|
-
# call-seq:
|
181
|
+
# call-seq:
|
182
|
+
# at_xpath(*paths, [namespace-bindings, variable-bindings, custom-handler-class])
|
159
183
|
#
|
160
184
|
# Search this node for XPath +paths+, and return only the first
|
161
185
|
# match. +paths+ must be one or more XPath queries.
|
162
186
|
#
|
163
187
|
# See Searchable#xpath for more information.
|
164
|
-
def at_xpath
|
188
|
+
def at_xpath(*args)
|
165
189
|
xpath(*args).first
|
166
190
|
end
|
167
191
|
|
192
|
+
# :call-seq:
|
193
|
+
# >(selector) → NodeSet
|
194
|
+
#
|
195
|
+
# Search this node's immediate children using CSS selector +selector+
|
196
|
+
def >(selector) # rubocop:disable Naming/BinaryOperatorParameterName
|
197
|
+
ns = (document.root&.namespaces || {})
|
198
|
+
xpath(CSS.xpath_for(selector, prefix: "./", ns: ns).first)
|
199
|
+
end
|
200
|
+
|
201
|
+
# :section:
|
202
|
+
|
168
203
|
private
|
169
204
|
|
170
|
-
def css_internal
|
171
|
-
xpath_internal
|
205
|
+
def css_internal(node, rules, handler, ns)
|
206
|
+
xpath_internal(node, css_rules_to_xpath(rules, ns), handler, ns, nil)
|
172
207
|
end
|
173
208
|
|
174
|
-
def xpath_internal
|
209
|
+
def xpath_internal(node, paths, handler, ns, binds)
|
175
210
|
document = node.document
|
176
211
|
return NodeSet.new(document) unless document
|
177
212
|
|
@@ -186,14 +221,14 @@ module Nokogiri
|
|
186
221
|
end
|
187
222
|
end
|
188
223
|
|
189
|
-
def xpath_impl
|
224
|
+
def xpath_impl(node, path, handler, ns, binds)
|
190
225
|
ctx = XPathContext.new(node)
|
191
226
|
ctx.register_namespaces(ns)
|
192
|
-
path = path.gsub(/xmlns:/,
|
227
|
+
path = path.gsub(/xmlns:/, " :") unless Nokogiri.uses_libxml?
|
193
228
|
|
194
|
-
binds
|
195
|
-
ctx.register_variable
|
196
|
-
end
|
229
|
+
binds&.each do |key, value|
|
230
|
+
ctx.register_variable(key.to_s, value)
|
231
|
+
end
|
197
232
|
|
198
233
|
ctx.evaluate(path, handler)
|
199
234
|
end
|
@@ -202,13 +237,18 @@ module Nokogiri
|
|
202
237
|
rules.map { |rule| xpath_query_from_css_rule(rule, ns) }
|
203
238
|
end
|
204
239
|
|
205
|
-
def xpath_query_from_css_rule
|
240
|
+
def xpath_query_from_css_rule(rule, ns)
|
241
|
+
visitor = Nokogiri::CSS::XPathVisitor.new(
|
242
|
+
builtins: Nokogiri::CSS::XPathVisitor::BuiltinsConfig::OPTIMAL,
|
243
|
+
doctype: document.xpath_doctype,
|
244
|
+
)
|
206
245
|
self.class::IMPLIED_XPATH_CONTEXTS.map do |implied_xpath_context|
|
207
|
-
CSS.xpath_for(rule.to_s, :
|
208
|
-
|
246
|
+
CSS.xpath_for(rule.to_s, { prefix: implied_xpath_context, ns: ns,
|
247
|
+
visitor: visitor, })
|
248
|
+
end.join(" | ")
|
209
249
|
end
|
210
250
|
|
211
|
-
def extract_params
|
251
|
+
def extract_params(params) # :nodoc:
|
212
252
|
handler = params.find do |param|
|
213
253
|
![Hash, String, Symbol].include?(param.class)
|
214
254
|
end
|
@@ -221,7 +261,7 @@ module Nokogiri
|
|
221
261
|
end
|
222
262
|
ns, binds = hashes.reverse
|
223
263
|
|
224
|
-
ns ||= document.root
|
264
|
+
ns ||= (document.root&.namespaces || {})
|
225
265
|
|
226
266
|
[params, handler, ns, binds]
|
227
267
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
###
|
@@ -41,9 +43,9 @@ module Nokogiri
|
|
41
43
|
|
42
44
|
def to_s
|
43
45
|
message = super.chomp
|
44
|
-
[location_to_s, level_to_s, message]
|
45
|
-
compact.join(": ")
|
46
|
-
force_encoding(message.encoding)
|
46
|
+
[location_to_s, level_to_s, message]
|
47
|
+
.compact.join(": ")
|
48
|
+
.force_encoding(message.encoding)
|
47
49
|
end
|
48
50
|
|
49
51
|
private
|
@@ -53,7 +55,6 @@ module Nokogiri
|
|
53
55
|
when 3 then "FATAL"
|
54
56
|
when 2 then "ERROR"
|
55
57
|
when 1 then "WARNING"
|
56
|
-
else nil
|
57
58
|
end
|
58
59
|
end
|
59
60
|
|
@@ -63,6 +64,7 @@ module Nokogiri
|
|
63
64
|
|
64
65
|
def location_to_s
|
65
66
|
return nil if nil_or_zero?(line) && nil_or_zero?(column)
|
67
|
+
|
66
68
|
"#{line}:#{column}"
|
67
69
|
end
|
68
70
|
end
|
data/lib/nokogiri/xml/text.rb
CHANGED
data/lib/nokogiri/xml/xpath.rb
CHANGED
@@ -1,10 +1,21 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Nokogiri
|
4
4
|
module XML
|
5
|
-
|
6
|
-
# The
|
7
|
-
|
5
|
+
module XPath
|
6
|
+
# The XPath search prefix to search globally, +//+
|
7
|
+
GLOBAL_SEARCH_PREFIX = "//"
|
8
|
+
|
9
|
+
# The XPath search prefix to search direct descendants of the root element, +/+
|
10
|
+
ROOT_SEARCH_PREFIX = "/"
|
11
|
+
|
12
|
+
# The XPath search prefix to search direct descendants of the current element, +./+
|
13
|
+
CURRENT_SEARCH_PREFIX = "./"
|
14
|
+
|
15
|
+
# The XPath search prefix to search anywhere in the current element's subtree, +.//+
|
16
|
+
SUBTREE_SEARCH_PREFIX = ".//"
|
8
17
|
end
|
9
18
|
end
|
10
19
|
end
|
20
|
+
|
21
|
+
require_relative "xpath/syntax_error"
|
@@ -1,16 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
class XPathContext
|
4
|
-
|
5
6
|
###
|
6
7
|
# Register namespaces in +namespaces+
|
7
8
|
def register_namespaces(namespaces)
|
8
9
|
namespaces.each do |k, v|
|
9
|
-
k = k.to_s.gsub(/.*:/,
|
10
|
+
k = k.to_s.gsub(/.*:/, "") # strip off 'xmlns:' or 'xml:'
|
10
11
|
register_ns(k, v)
|
11
12
|
end
|
12
13
|
end
|
13
|
-
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/nokogiri/xml.rb
CHANGED
@@ -1,37 +1,10 @@
|
|
1
|
-
|
2
|
-
require 'nokogiri/xml/parse_options'
|
3
|
-
require 'nokogiri/xml/sax'
|
4
|
-
require 'nokogiri/xml/searchable'
|
5
|
-
require 'nokogiri/xml/node'
|
6
|
-
require 'nokogiri/xml/attribute_decl'
|
7
|
-
require 'nokogiri/xml/element_decl'
|
8
|
-
require 'nokogiri/xml/element_content'
|
9
|
-
require 'nokogiri/xml/character_data'
|
10
|
-
require 'nokogiri/xml/namespace'
|
11
|
-
require 'nokogiri/xml/attr'
|
12
|
-
require 'nokogiri/xml/dtd'
|
13
|
-
require 'nokogiri/xml/cdata'
|
14
|
-
require 'nokogiri/xml/text'
|
15
|
-
require 'nokogiri/xml/document'
|
16
|
-
require 'nokogiri/xml/document_fragment'
|
17
|
-
require 'nokogiri/xml/processing_instruction'
|
18
|
-
require 'nokogiri/xml/node_set'
|
19
|
-
require 'nokogiri/xml/syntax_error'
|
20
|
-
require 'nokogiri/xml/xpath'
|
21
|
-
require 'nokogiri/xml/xpath_context'
|
22
|
-
require 'nokogiri/xml/builder'
|
23
|
-
require 'nokogiri/xml/reader'
|
24
|
-
require 'nokogiri/xml/notation'
|
25
|
-
require 'nokogiri/xml/entity_decl'
|
26
|
-
require 'nokogiri/xml/entity_reference'
|
27
|
-
require 'nokogiri/xml/schema'
|
28
|
-
require 'nokogiri/xml/relax_ng'
|
1
|
+
# frozen_string_literal: true
|
29
2
|
|
30
3
|
module Nokogiri
|
31
4
|
class << self
|
32
5
|
###
|
33
6
|
# Parse XML. Convenience method for Nokogiri::XML::Document.parse
|
34
|
-
def XML
|
7
|
+
def XML(thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_XML, &block)
|
35
8
|
Nokogiri::XML::Document.parse(thing, url, encoding, options, &block)
|
36
9
|
end
|
37
10
|
end
|
@@ -40,36 +13,64 @@ module Nokogiri
|
|
40
13
|
# Original C14N 1.0 spec canonicalization
|
41
14
|
XML_C14N_1_0 = 0
|
42
15
|
# Exclusive C14N 1.0 spec canonicalization
|
43
|
-
XML_C14N_EXCLUSIVE_1_0 =
|
16
|
+
XML_C14N_EXCLUSIVE_1_0 = 1
|
44
17
|
# C14N 1.1 spec canonicalization
|
45
18
|
XML_C14N_1_1 = 2
|
46
19
|
class << self
|
47
20
|
###
|
48
21
|
# Parse an XML document using the Nokogiri::XML::Reader API. See
|
49
22
|
# Nokogiri::XML::Reader for mor information
|
50
|
-
def Reader
|
51
|
-
|
23
|
+
def Reader(string_or_io, url = nil, encoding = nil, options = ParseOptions::STRICT)
|
52
24
|
options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
|
53
|
-
# Give the options to the user
|
54
25
|
yield options if block_given?
|
55
26
|
|
56
|
-
if string_or_io.respond_to?
|
27
|
+
if string_or_io.respond_to?(:read)
|
57
28
|
return Reader.from_io(string_or_io, url, encoding, options.to_i)
|
58
29
|
end
|
30
|
+
|
59
31
|
Reader.from_memory(string_or_io, url, encoding, options.to_i)
|
60
32
|
end
|
61
33
|
|
62
34
|
###
|
63
35
|
# Parse XML. Convenience method for Nokogiri::XML::Document.parse
|
64
|
-
def parse
|
36
|
+
def parse(thing, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML, &block)
|
65
37
|
Document.parse(thing, url, encoding, options, &block)
|
66
38
|
end
|
67
39
|
|
68
40
|
####
|
69
41
|
# Parse a fragment from +string+ in to a NodeSet.
|
70
|
-
def fragment
|
71
|
-
XML::DocumentFragment.parse(string)
|
42
|
+
def fragment(string, options = ParseOptions::DEFAULT_XML, &block)
|
43
|
+
XML::DocumentFragment.parse(string, options, &block)
|
72
44
|
end
|
73
45
|
end
|
74
46
|
end
|
75
47
|
end
|
48
|
+
|
49
|
+
require_relative "xml/pp"
|
50
|
+
require_relative "xml/parse_options"
|
51
|
+
require_relative "xml/sax"
|
52
|
+
require_relative "xml/searchable"
|
53
|
+
require_relative "xml/node"
|
54
|
+
require_relative "xml/attribute_decl"
|
55
|
+
require_relative "xml/element_decl"
|
56
|
+
require_relative "xml/element_content"
|
57
|
+
require_relative "xml/character_data"
|
58
|
+
require_relative "xml/namespace"
|
59
|
+
require_relative "xml/attr"
|
60
|
+
require_relative "xml/dtd"
|
61
|
+
require_relative "xml/cdata"
|
62
|
+
require_relative "xml/text"
|
63
|
+
require_relative "xml/document"
|
64
|
+
require_relative "xml/document_fragment"
|
65
|
+
require_relative "xml/processing_instruction"
|
66
|
+
require_relative "xml/node_set"
|
67
|
+
require_relative "xml/syntax_error"
|
68
|
+
require_relative "xml/xpath"
|
69
|
+
require_relative "xml/xpath_context"
|
70
|
+
require_relative "xml/builder"
|
71
|
+
require_relative "xml/reader"
|
72
|
+
require_relative "xml/notation"
|
73
|
+
require_relative "xml/entity_decl"
|
74
|
+
require_relative "xml/entity_reference"
|
75
|
+
require_relative "xml/schema"
|
76
|
+
require_relative "xml/relax_ng"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XSLT
|
3
5
|
###
|
@@ -17,7 +19,7 @@ module Nokogiri
|
|
17
19
|
# Apply an XSLT stylesheet to an XML::Document.
|
18
20
|
# +params+ is an array of strings used as XSLT parameters.
|
19
21
|
# returns serialized document
|
20
|
-
def apply_to
|
22
|
+
def apply_to(document, params = [])
|
21
23
|
serialize(transform(document, params))
|
22
24
|
end
|
23
25
|
end
|
data/lib/nokogiri/xslt.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module Nokogiri
|
4
5
|
class << self
|
@@ -9,7 +10,7 @@ module Nokogiri
|
|
9
10
|
#
|
10
11
|
# xslt = Nokogiri::XSLT(File.read(ARGV[0]))
|
11
12
|
#
|
12
|
-
def XSLT
|
13
|
+
def XSLT(stylesheet, modules = {})
|
13
14
|
XSLT.parse(stylesheet, modules)
|
14
15
|
end
|
15
16
|
end
|
@@ -21,36 +22,44 @@ module Nokogiri
|
|
21
22
|
class << self
|
22
23
|
###
|
23
24
|
# Parse the stylesheet in +string+, register any +modules+
|
24
|
-
def parse
|
25
|
+
def parse(string, modules = {})
|
25
26
|
modules.each do |url, klass|
|
26
|
-
XSLT.register
|
27
|
+
XSLT.register(url, klass)
|
27
28
|
end
|
28
29
|
|
30
|
+
doc = XML::Document.parse(string, nil, nil, XML::ParseOptions::DEFAULT_XSLT)
|
29
31
|
if Nokogiri.jruby?
|
30
|
-
Stylesheet.parse_stylesheet_doc(
|
32
|
+
Stylesheet.parse_stylesheet_doc(doc, string)
|
31
33
|
else
|
32
|
-
Stylesheet.parse_stylesheet_doc(
|
34
|
+
Stylesheet.parse_stylesheet_doc(doc)
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
36
|
-
|
37
|
-
#
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
38
|
+
# :call-seq:
|
39
|
+
# quote_params(params) → Array
|
40
|
+
#
|
41
|
+
# Quote parameters in +params+ for stylesheet safety.
|
42
|
+
# See Nokogiri::XSLT::Stylesheet.transform for example usage.
|
43
|
+
#
|
44
|
+
# [Parameters]
|
45
|
+
# - +params+ (Hash, Array) XSLT parameters (key->value, or tuples of [key, value])
|
46
|
+
#
|
47
|
+
# [Returns] Array of string parameters, with quotes correctly escaped for use with XSLT::Stylesheet.transform
|
48
|
+
#
|
49
|
+
def quote_params(params)
|
50
|
+
params.flatten.each_slice(2).each_with_object([]) do |kv, quoted_params|
|
51
|
+
key, value = kv.map(&:to_s)
|
52
|
+
value = if /'/.match?(value)
|
53
|
+
"concat('#{value.gsub(/'/, %q{', "'", '})}')"
|
48
54
|
else
|
49
|
-
|
55
|
+
"'#{value}'"
|
50
56
|
end
|
57
|
+
quoted_params << key
|
58
|
+
quoted_params << value
|
51
59
|
end
|
52
|
-
parray.flatten
|
53
60
|
end
|
54
61
|
end
|
55
62
|
end
|
56
63
|
end
|
64
|
+
|
65
|
+
require_relative "xslt/stylesheet"
|