nokogiri 1.9.1 → 1.15.3
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 +45 -0
- data/LICENSE-DEPENDENCIES.md +1636 -1024
- data/LICENSE.md +5 -28
- data/README.md +203 -89
- data/bin/nokogiri +63 -50
- data/dependencies.yml +33 -61
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +864 -418
- data/ext/nokogiri/gumbo.c +594 -0
- data/ext/nokogiri/html4_document.c +165 -0
- data/ext/nokogiri/html4_element_description.c +299 -0
- data/ext/nokogiri/html4_entity_lookup.c +37 -0
- data/ext/nokogiri/html4_sax_parser_context.c +108 -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 +251 -105
- data/ext/nokogiri/nokogiri.h +215 -90
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +17 -17
- data/ext/nokogiri/xml_attribute_decl.c +22 -22
- data/ext/nokogiri/xml_cdata.c +40 -31
- data/ext/nokogiri/xml_comment.c +20 -27
- data/ext/nokogiri/xml_document.c +401 -240
- data/ext/nokogiri/xml_document_fragment.c +13 -17
- data/ext/nokogiri/xml_dtd.c +64 -58
- data/ext/nokogiri/xml_element_content.c +63 -55
- data/ext/nokogiri/xml_element_decl.c +31 -31
- data/ext/nokogiri/xml_encoding_handler.c +54 -21
- data/ext/nokogiri/xml_entity_decl.c +37 -35
- data/ext/nokogiri/xml_entity_reference.c +17 -19
- data/ext/nokogiri/xml_namespace.c +135 -61
- data/ext/nokogiri/xml_node.c +1346 -677
- data/ext/nokogiri/xml_node_set.c +246 -216
- data/ext/nokogiri/xml_processing_instruction.c +18 -20
- data/ext/nokogiri/xml_reader.c +347 -212
- data/ext/nokogiri/xml_relax_ng.c +86 -77
- data/ext/nokogiri/xml_sax_parser.c +149 -124
- data/ext/nokogiri/xml_sax_parser_context.c +145 -103
- data/ext/nokogiri/xml_sax_push_parser.c +64 -36
- data/ext/nokogiri/xml_schema.c +138 -81
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +36 -26
- data/ext/nokogiri/xml_xpath_context.c +366 -178
- data/ext/nokogiri/xslt_stylesheet.c +335 -189
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +111 -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 +630 -0
- data/gumbo-parser/src/error.h +148 -0
- data/gumbo-parser/src/foreign_attrs.c +103 -0
- data/gumbo-parser/src/foreign_attrs.gperf +27 -0
- data/gumbo-parser/src/insertion_mode.h +33 -0
- data/gumbo-parser/src/macros.h +91 -0
- data/gumbo-parser/src/nokogiri_gumbo.h +944 -0
- data/gumbo-parser/src/parser.c +4891 -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 +223 -0
- data/gumbo-parser/src/tag_lookup.c +382 -0
- data/gumbo-parser/src/tag_lookup.gperf +170 -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 +66 -0
- data/gumbo-parser/src/util.h +34 -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 +224 -95
- data/lib/nokogiri/css.rb +56 -17
- data/lib/nokogiri/decorators/slop.rb +9 -7
- data/lib/nokogiri/encoding_handler.rb +57 -0
- data/lib/nokogiri/extension.rb +32 -0
- data/lib/nokogiri/gumbo.rb +15 -0
- data/lib/nokogiri/html.rb +38 -27
- data/lib/nokogiri/{html → html4}/builder.rb +4 -2
- data/lib/nokogiri/html4/document.rb +214 -0
- data/lib/nokogiri/html4/document_fragment.rb +54 -0
- data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
- data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
- data/lib/nokogiri/html4/encoding_reader.rb +121 -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 +47 -0
- data/lib/nokogiri/html5/document.rb +168 -0
- data/lib/nokogiri/html5/document_fragment.rb +90 -0
- data/lib/nokogiri/html5/node.rb +103 -0
- data/lib/nokogiri/html5.rb +392 -0
- data/lib/nokogiri/jruby/dependencies.rb +3 -0
- data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
- data/lib/nokogiri/syntax_error.rb +2 -0
- data/lib/nokogiri/version/constant.rb +6 -0
- data/lib/nokogiri/version/info.rb +223 -0
- data/lib/nokogiri/version.rb +3 -108
- data/lib/nokogiri/xml/attr.rb +55 -3
- data/lib/nokogiri/xml/attribute_decl.rb +6 -2
- data/lib/nokogiri/xml/builder.rb +98 -54
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +2 -0
- data/lib/nokogiri/xml/document.rb +312 -126
- data/lib/nokogiri/xml/document_fragment.rb +93 -48
- data/lib/nokogiri/xml/dtd.rb +4 -2
- data/lib/nokogiri/xml/element_content.rb +12 -2
- data/lib/nokogiri/xml/element_decl.rb +6 -2
- data/lib/nokogiri/xml/entity_decl.rb +7 -3
- data/lib/nokogiri/xml/entity_reference.rb +2 -0
- data/lib/nokogiri/xml/namespace.rb +45 -0
- data/lib/nokogiri/xml/node/save_options.rb +23 -8
- data/lib/nokogiri/xml/node.rb +1088 -418
- data/lib/nokogiri/xml/node_set.rb +173 -63
- data/lib/nokogiri/xml/notation.rb +13 -0
- data/lib/nokogiri/xml/parse_options.rb +145 -52
- data/lib/nokogiri/xml/pp/character_data.rb +9 -6
- data/lib/nokogiri/xml/pp/node.rb +42 -30
- data/lib/nokogiri/xml/pp.rb +4 -2
- data/lib/nokogiri/xml/processing_instruction.rb +4 -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 +39 -36
- 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 +120 -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 +101 -22
- data/lib/nokogiri.rb +59 -75
- data/lib/xsd/xmlparser/nokogiri.rb +29 -25
- 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/0009-allow-wildcard-namespaces.patch +77 -0
- data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
- data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
- data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
- data/ports/archives/libxml2-2.11.4.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
- metadata +128 -265
- 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 -14
- 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.rb +0 -335
- 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/ports/archives/libxml2-2.9.8.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
@@ -1,52 +1,64 @@
|
|
1
|
-
#include <
|
1
|
+
#include <nokogiri.h>
|
2
2
|
|
3
|
-
|
4
|
-
#include <libxslt/xsltutils.h>
|
5
|
-
#include <libxslt/transform.h>
|
6
|
-
#include <libexslt/exslt.h>
|
7
|
-
|
8
|
-
VALUE xslt;
|
9
|
-
|
10
|
-
int vasprintf (char **strp, const char *fmt, va_list ap);
|
11
|
-
void vasprintf_free (void *p);
|
3
|
+
VALUE cNokogiriXsltStylesheet ;
|
12
4
|
|
13
|
-
static void
|
5
|
+
static void
|
6
|
+
mark(void *data)
|
14
7
|
{
|
8
|
+
nokogiriXsltStylesheetTuple *wrapper = (nokogiriXsltStylesheetTuple *)data;
|
15
9
|
rb_gc_mark(wrapper->func_instances);
|
16
10
|
}
|
17
11
|
|
18
|
-
static void
|
12
|
+
static void
|
13
|
+
dealloc(void *data)
|
19
14
|
{
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
NOKOGIRI_DEBUG_END(doc);
|
25
|
-
|
26
|
-
free(wrapper);
|
15
|
+
nokogiriXsltStylesheetTuple *wrapper = (nokogiriXsltStylesheetTuple *)data;
|
16
|
+
xsltStylesheetPtr doc = wrapper->ss;
|
17
|
+
xsltFreeStylesheet(doc);
|
18
|
+
ruby_xfree(wrapper);
|
27
19
|
}
|
28
20
|
|
29
|
-
static
|
21
|
+
static const rb_data_type_t xslt_stylesheet_type = {
|
22
|
+
.wrap_struct_name = "Nokogiri::XSLT::Stylesheet",
|
23
|
+
.function = {
|
24
|
+
.dmark = mark,
|
25
|
+
.dfree = dealloc,
|
26
|
+
},
|
27
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
28
|
+
};
|
29
|
+
|
30
|
+
PRINTFLIKE_DECL(2, 3)
|
31
|
+
static void
|
32
|
+
xslt_generic_error_handler(void *ctx, const char *msg, ...)
|
30
33
|
{
|
31
|
-
|
34
|
+
VALUE message;
|
32
35
|
|
36
|
+
#ifdef TRUFFLERUBY_NOKOGIRI_SYSTEM_LIBRARIES
|
37
|
+
/* It is not currently possible to pass var args from native
|
38
|
+
functions to sulong, so we work around the issue here. */
|
39
|
+
message = rb_sprintf("xslt_generic_error_handler: %s", msg);
|
40
|
+
#else
|
33
41
|
va_list args;
|
34
42
|
va_start(args, msg);
|
35
|
-
|
43
|
+
message = rb_vsprintf(msg, args);
|
36
44
|
va_end(args);
|
45
|
+
#endif
|
37
46
|
|
38
|
-
|
39
|
-
|
40
|
-
vasprintf_free(message);
|
47
|
+
rb_str_concat((VALUE)ctx, message);
|
41
48
|
}
|
42
49
|
|
43
|
-
VALUE
|
50
|
+
VALUE
|
51
|
+
Nokogiri_wrap_xslt_stylesheet(xsltStylesheetPtr ss)
|
44
52
|
{
|
45
53
|
VALUE self;
|
46
54
|
nokogiriXsltStylesheetTuple *wrapper;
|
47
55
|
|
48
|
-
self =
|
49
|
-
|
56
|
+
self = TypedData_Make_Struct(
|
57
|
+
cNokogiriXsltStylesheet,
|
58
|
+
nokogiriXsltStylesheetTuple,
|
59
|
+
&xslt_stylesheet_type,
|
60
|
+
wrapper
|
61
|
+
);
|
50
62
|
|
51
63
|
ss->_private = (void *)self;
|
52
64
|
wrapper->ss = ss;
|
@@ -61,29 +73,30 @@ VALUE Nokogiri_wrap_xslt_stylesheet(xsltStylesheetPtr ss)
|
|
61
73
|
*
|
62
74
|
* Parse a stylesheet from +document+.
|
63
75
|
*/
|
64
|
-
static VALUE
|
76
|
+
static VALUE
|
77
|
+
parse_stylesheet_doc(VALUE klass, VALUE xmldocobj)
|
65
78
|
{
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
Data_Get_Struct(xmldocobj, xmlDoc, xml);
|
70
|
-
exsltRegisterAll();
|
79
|
+
xmlDocPtr xml, xml_cpy;
|
80
|
+
VALUE errstr, exception;
|
81
|
+
xsltStylesheetPtr ss ;
|
71
82
|
|
72
|
-
|
73
|
-
xsltSetGenericErrorFunc((void *)errstr, xslt_generic_error_handler);
|
83
|
+
xml = noko_xml_document_unwrap(xmldocobj);
|
74
84
|
|
75
|
-
|
76
|
-
|
85
|
+
errstr = rb_str_new(0, 0);
|
86
|
+
xsltSetGenericErrorFunc((void *)errstr, xslt_generic_error_handler);
|
77
87
|
|
78
|
-
|
88
|
+
xml_cpy = xmlCopyDoc(xml, 1); /* 1 => recursive */
|
89
|
+
ss = xsltParseStylesheetDoc(xml_cpy);
|
79
90
|
|
80
|
-
|
81
|
-
xmlFreeDoc(xml_cpy);
|
82
|
-
exception = rb_exc_new3(rb_eRuntimeError, errstr);
|
83
|
-
rb_exc_raise(exception);
|
84
|
-
}
|
91
|
+
xsltSetGenericErrorFunc(NULL, NULL);
|
85
92
|
|
86
|
-
|
93
|
+
if (!ss) {
|
94
|
+
xmlFreeDoc(xml_cpy);
|
95
|
+
exception = rb_exc_new3(rb_eRuntimeError, errstr);
|
96
|
+
rb_exc_raise(exception);
|
97
|
+
}
|
98
|
+
|
99
|
+
return Nokogiri_wrap_xslt_stylesheet(ss);
|
87
100
|
}
|
88
101
|
|
89
102
|
|
@@ -93,178 +106,311 @@ static VALUE parse_stylesheet_doc(VALUE klass, VALUE xmldocobj)
|
|
93
106
|
*
|
94
107
|
* Serialize +document+ to an xml string.
|
95
108
|
*/
|
96
|
-
static VALUE
|
97
|
-
|
98
|
-
xmlDocPtr xml ;
|
99
|
-
nokogiriXsltStylesheetTuple *wrapper;
|
100
|
-
xmlChar* doc_ptr ;
|
101
|
-
int doc_len ;
|
102
|
-
VALUE rval ;
|
103
|
-
|
104
|
-
Data_Get_Struct(xmlobj, xmlDoc, xml);
|
105
|
-
Data_Get_Struct(self, nokogiriXsltStylesheetTuple, wrapper);
|
106
|
-
xsltSaveResultToString(&doc_ptr, &doc_len, xml, wrapper->ss);
|
107
|
-
rval = NOKOGIRI_STR_NEW(doc_ptr, doc_len);
|
108
|
-
xmlFree(doc_ptr);
|
109
|
-
return rval ;
|
110
|
-
}
|
111
|
-
|
112
|
-
static void swallow_superfluous_xml_errors(void * userdata, xmlErrorPtr error, ...)
|
109
|
+
static VALUE
|
110
|
+
rb_xslt_stylesheet_serialize(VALUE self, VALUE xmlobj)
|
113
111
|
{
|
112
|
+
xmlDocPtr xml ;
|
113
|
+
nokogiriXsltStylesheetTuple *wrapper;
|
114
|
+
xmlChar *doc_ptr ;
|
115
|
+
int doc_len ;
|
116
|
+
VALUE rval ;
|
117
|
+
|
118
|
+
xml = noko_xml_document_unwrap(xmlobj);
|
119
|
+
TypedData_Get_Struct(
|
120
|
+
self,
|
121
|
+
nokogiriXsltStylesheetTuple,
|
122
|
+
&xslt_stylesheet_type,
|
123
|
+
wrapper
|
124
|
+
);
|
125
|
+
xsltSaveResultToString(&doc_ptr, &doc_len, xml, wrapper->ss);
|
126
|
+
rval = NOKOGIRI_STR_NEW(doc_ptr, doc_len);
|
127
|
+
xmlFree(doc_ptr);
|
128
|
+
return rval ;
|
114
129
|
}
|
115
130
|
|
116
131
|
/*
|
117
|
-
*
|
118
|
-
*
|
132
|
+
* call-seq:
|
133
|
+
* transform(document)
|
134
|
+
* transform(document, params = {})
|
135
|
+
*
|
136
|
+
* Apply an XSLT stylesheet to an XML::Document.
|
137
|
+
*
|
138
|
+
* [Parameters]
|
139
|
+
* - +document+ (Nokogiri::XML::Document) the document to be transformed.
|
140
|
+
* - +params+ (Hash, Array) strings used as XSLT parameters.
|
141
|
+
*
|
142
|
+
* [Returns] Nokogiri::XML::Document
|
143
|
+
*
|
144
|
+
* *Example* of basic transformation:
|
145
|
+
*
|
146
|
+
* xslt = <<~XSLT
|
147
|
+
* <xsl:stylesheet version="1.0"
|
148
|
+
* xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
149
|
+
*
|
150
|
+
* <xsl:param name="title"/>
|
151
|
+
*
|
152
|
+
* <xsl:template match="/">
|
153
|
+
* <html>
|
154
|
+
* <body>
|
155
|
+
* <h1><xsl:value-of select="$title"/></h1>
|
156
|
+
* <ol>
|
157
|
+
* <xsl:for-each select="staff/employee">
|
158
|
+
* <li><xsl:value-of select="employeeId"></li>
|
159
|
+
* </xsl:for-each>
|
160
|
+
* </ol>
|
161
|
+
* </body>
|
162
|
+
* </html>
|
163
|
+
* </xsl:stylesheet>
|
164
|
+
* XSLT
|
165
|
+
*
|
166
|
+
* xml = <<~XML
|
167
|
+
* <?xml version="1.0"?>
|
168
|
+
* <staff>
|
169
|
+
* <employee>
|
170
|
+
* <employeeId>EMP0001</employeeId>
|
171
|
+
* <position>Accountant</position>
|
172
|
+
* </employee>
|
173
|
+
* <employee>
|
174
|
+
* <employeeId>EMP0002</employeeId>
|
175
|
+
* <position>Developer</position>
|
176
|
+
* </employee>
|
177
|
+
* </staff>
|
178
|
+
* XML
|
179
|
+
*
|
180
|
+
* doc = Nokogiri::XML::Document.parse(xml)
|
181
|
+
* stylesheet = Nokogiri::XSLT.parse(xslt)
|
119
182
|
*
|
120
|
-
*
|
121
|
-
* +params+ is an array of strings used as XSLT parameters.
|
122
|
-
* returns Nokogiri::XML::Document
|
183
|
+
* ⚠ Note that the +h1+ element is empty because no param has been provided!
|
123
184
|
*
|
124
|
-
*
|
185
|
+
* stylesheet.transform(doc).to_xml
|
186
|
+
* # => "<html><body>\n" +
|
187
|
+
* # "<h1></h1>\n" +
|
188
|
+
* # "<ol>\n" +
|
189
|
+
* # "<li>EMP0001</li>\n" +
|
190
|
+
* # "<li>EMP0002</li>\n" +
|
191
|
+
* # "</ol>\n" +
|
192
|
+
* # "</body></html>\n"
|
125
193
|
*
|
126
|
-
*
|
127
|
-
* xslt = Nokogiri::XSLT(File.read(ARGV[1]))
|
128
|
-
* puts xslt.transform(doc, ['key', 'value'])
|
194
|
+
* *Example* of using an input parameter hash:
|
129
195
|
*
|
196
|
+
* ⚠ The title is populated, but note how we need to quote-escape the value.
|
197
|
+
*
|
198
|
+
* stylesheet.transform(doc, { "title" => "'Employee List'" }).to_xml
|
199
|
+
* # => "<html><body>\n" +
|
200
|
+
* # "<h1>Employee List</h1>\n" +
|
201
|
+
* # "<ol>\n" +
|
202
|
+
* # "<li>EMP0001</li>\n" +
|
203
|
+
* # "<li>EMP0002</li>\n" +
|
204
|
+
* # "</ol>\n" +
|
205
|
+
* # "</body></html>\n"
|
206
|
+
*
|
207
|
+
* *Example* using the XSLT.quote_params helper method to safely quote-escape strings:
|
208
|
+
*
|
209
|
+
* stylesheet.transform(doc, Nokogiri::XSLT.quote_params({ "title" => "Aaron's List" })).to_xml
|
210
|
+
* # => "<html><body>\n" +
|
211
|
+
* # "<h1>Aaron's List</h1>\n" +
|
212
|
+
* # "<ol>\n" +
|
213
|
+
* # "<li>EMP0001</li>\n" +
|
214
|
+
* # "<li>EMP0002</li>\n" +
|
215
|
+
* # "</ol>\n" +
|
216
|
+
* # "</body></html>\n"
|
217
|
+
*
|
218
|
+
* *Example* using an array of XSLT parameters
|
219
|
+
*
|
220
|
+
* You can also use an array if you want to.
|
221
|
+
*
|
222
|
+
* stylesheet.transform(doc, ["title", "'Employee List'"]).to_xml
|
223
|
+
* # => "<html><body>\n" +
|
224
|
+
* # "<h1>Employee List</h1>\n" +
|
225
|
+
* # "<ol>\n" +
|
226
|
+
* # "<li>EMP0001</li>\n" +
|
227
|
+
* # "<li>EMP0002</li>\n" +
|
228
|
+
* # "</ol>\n" +
|
229
|
+
* # "</body></html>\n"
|
230
|
+
*
|
231
|
+
* Or pass an array to XSLT.quote_params:
|
232
|
+
*
|
233
|
+
* stylesheet.transform(doc, Nokogiri::XSLT.quote_params(["title", "Aaron's List"])).to_xml
|
234
|
+
* # => "<html><body>\n" +
|
235
|
+
* # "<h1>Aaron's List</h1>\n" +
|
236
|
+
* # "<ol>\n" +
|
237
|
+
* # "<li>EMP0001</li>\n" +
|
238
|
+
* # "<li>EMP0002</li>\n" +
|
239
|
+
* # "</ol>\n" +
|
240
|
+
* # "</body></html>\n"
|
241
|
+
*
|
242
|
+
* See: Nokogiri::XSLT.quote_params
|
130
243
|
*/
|
131
|
-
static VALUE
|
244
|
+
static VALUE
|
245
|
+
rb_xslt_stylesheet_transform(int argc, VALUE *argv, VALUE self)
|
132
246
|
{
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
params[
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
247
|
+
VALUE rb_document, rb_param, rb_error_str;
|
248
|
+
xmlDocPtr c_document ;
|
249
|
+
xmlDocPtr c_result_document ;
|
250
|
+
nokogiriXsltStylesheetTuple *wrapper;
|
251
|
+
const char **params ;
|
252
|
+
long param_len, j ;
|
253
|
+
int parse_error_occurred ;
|
254
|
+
int defensive_copy_p = 0;
|
255
|
+
|
256
|
+
rb_scan_args(argc, argv, "11", &rb_document, &rb_param);
|
257
|
+
if (NIL_P(rb_param)) { rb_param = rb_ary_new2(0L) ; }
|
258
|
+
if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlDocument)) {
|
259
|
+
rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::Document");
|
260
|
+
}
|
261
|
+
|
262
|
+
/* handle hashes as arguments. */
|
263
|
+
if (T_HASH == TYPE(rb_param)) {
|
264
|
+
rb_param = rb_funcall(rb_param, rb_intern("to_a"), 0);
|
265
|
+
rb_param = rb_funcall(rb_param, rb_intern("flatten"), 0);
|
266
|
+
}
|
267
|
+
|
268
|
+
Check_Type(rb_param, T_ARRAY);
|
269
|
+
|
270
|
+
c_document = noko_xml_document_unwrap(rb_document);
|
271
|
+
TypedData_Get_Struct(self, nokogiriXsltStylesheetTuple, &xslt_stylesheet_type, wrapper);
|
272
|
+
|
273
|
+
param_len = RARRAY_LEN(rb_param);
|
274
|
+
params = ruby_xcalloc((size_t)param_len + 1, sizeof(char *));
|
275
|
+
for (j = 0 ; j < param_len ; j++) {
|
276
|
+
VALUE entry = rb_ary_entry(rb_param, j);
|
277
|
+
const char *ptr = StringValueCStr(entry);
|
278
|
+
params[j] = ptr;
|
279
|
+
}
|
280
|
+
params[param_len] = 0 ;
|
281
|
+
|
282
|
+
xsltTransformContextPtr c_transform_context = xsltNewTransformContext(wrapper->ss, c_document);
|
283
|
+
if (xsltNeedElemSpaceHandling(c_transform_context) &&
|
284
|
+
noko_xml_document_has_wrapped_blank_nodes_p(c_document)) {
|
285
|
+
// see https://github.com/sparklemotion/nokogiri/issues/2800
|
286
|
+
c_document = xmlCopyDoc(c_document, 1);
|
287
|
+
defensive_copy_p = 1;
|
288
|
+
}
|
289
|
+
xsltFreeTransformContext(c_transform_context);
|
290
|
+
|
291
|
+
rb_error_str = rb_str_new(0, 0);
|
292
|
+
xsltSetGenericErrorFunc((void *)rb_error_str, xslt_generic_error_handler);
|
293
|
+
xmlSetGenericErrorFunc((void *)rb_error_str, xslt_generic_error_handler);
|
294
|
+
|
295
|
+
c_result_document = xsltApplyStylesheet(wrapper->ss, c_document, params);
|
296
|
+
|
297
|
+
ruby_xfree(params);
|
298
|
+
if (defensive_copy_p) {
|
299
|
+
xmlFreeDoc(c_document);
|
300
|
+
c_document = NULL;
|
301
|
+
}
|
302
|
+
|
303
|
+
xsltSetGenericErrorFunc(NULL, NULL);
|
304
|
+
xmlSetGenericErrorFunc(NULL, NULL);
|
305
|
+
|
306
|
+
parse_error_occurred = (Qfalse == rb_funcall(rb_error_str, rb_intern("empty?"), 0));
|
307
|
+
|
308
|
+
if (parse_error_occurred) {
|
309
|
+
rb_exc_raise(rb_exc_new3(rb_eRuntimeError, rb_error_str));
|
310
|
+
}
|
311
|
+
|
312
|
+
return noko_xml_document_wrap((VALUE)0, c_result_document) ;
|
184
313
|
}
|
185
314
|
|
186
|
-
static void
|
315
|
+
static void
|
316
|
+
method_caller(xmlXPathParserContextPtr ctxt, int nargs)
|
187
317
|
{
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
318
|
+
VALUE handler;
|
319
|
+
const char *function_name;
|
320
|
+
xsltTransformContextPtr transform;
|
321
|
+
const xmlChar *functionURI;
|
322
|
+
|
323
|
+
transform = xsltXPathGetTransformContext(ctxt);
|
324
|
+
functionURI = ctxt->context->functionURI;
|
325
|
+
handler = (VALUE)xsltGetExtData(transform, functionURI);
|
326
|
+
function_name = (const char *)(ctxt->context->function);
|
327
|
+
|
328
|
+
Nokogiri_marshal_xpath_funcall_and_return_values(
|
329
|
+
ctxt,
|
330
|
+
nargs,
|
331
|
+
handler,
|
332
|
+
(const char *)function_name
|
333
|
+
);
|
199
334
|
}
|
200
335
|
|
201
|
-
static void *
|
336
|
+
static void *
|
337
|
+
initFunc(xsltTransformContextPtr ctxt, const xmlChar *uri)
|
202
338
|
{
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
339
|
+
VALUE modules = rb_iv_get(mNokogiriXslt, "@modules");
|
340
|
+
VALUE obj = rb_hash_aref(modules, rb_str_new2((const char *)uri));
|
341
|
+
VALUE args = { Qfalse };
|
342
|
+
VALUE methods = rb_funcall(obj, rb_intern("instance_methods"), 1, args);
|
343
|
+
VALUE inst;
|
344
|
+
nokogiriXsltStylesheetTuple *wrapper;
|
345
|
+
int i;
|
346
|
+
|
347
|
+
for (i = 0; i < RARRAY_LEN(methods); i++) {
|
348
|
+
VALUE method_name = rb_obj_as_string(rb_ary_entry(methods, i));
|
349
|
+
xsltRegisterExtFunction(
|
350
|
+
ctxt,
|
351
|
+
(unsigned char *)StringValueCStr(method_name),
|
352
|
+
uri,
|
353
|
+
method_caller
|
354
|
+
);
|
355
|
+
}
|
356
|
+
|
357
|
+
TypedData_Get_Struct(
|
358
|
+
(VALUE)ctxt->style->_private,
|
359
|
+
nokogiriXsltStylesheetTuple,
|
360
|
+
&xslt_stylesheet_type,
|
361
|
+
wrapper
|
362
|
+
);
|
363
|
+
inst = rb_class_new_instance(0, NULL, obj);
|
364
|
+
rb_ary_push(wrapper->func_instances, inst);
|
365
|
+
|
366
|
+
return (void *)inst;
|
223
367
|
}
|
224
368
|
|
225
|
-
static void
|
226
|
-
|
369
|
+
static void
|
370
|
+
shutdownFunc(xsltTransformContextPtr ctxt,
|
371
|
+
const xmlChar *uri, void *data)
|
227
372
|
{
|
228
|
-
|
373
|
+
nokogiriXsltStylesheetTuple *wrapper;
|
229
374
|
|
230
|
-
|
231
|
-
|
375
|
+
TypedData_Get_Struct(
|
376
|
+
(VALUE)ctxt->style->_private,
|
377
|
+
nokogiriXsltStylesheetTuple,
|
378
|
+
&xslt_stylesheet_type,
|
379
|
+
wrapper
|
380
|
+
);
|
232
381
|
|
233
|
-
|
382
|
+
rb_ary_clear(wrapper->func_instances);
|
234
383
|
}
|
235
384
|
|
236
|
-
/*
|
237
|
-
|
238
|
-
|
239
|
-
*
|
240
|
-
* Register a class that implements custom XSLT transformation functions.
|
241
|
-
*/
|
242
|
-
static VALUE registr(VALUE self, VALUE uri, VALUE obj)
|
385
|
+
/* docstring is in lib/nokogiri/xslt.rb */
|
386
|
+
static VALUE
|
387
|
+
rb_xslt_s_register(VALUE self, VALUE uri, VALUE obj)
|
243
388
|
{
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
389
|
+
VALUE modules = rb_iv_get(self, "@modules");
|
390
|
+
if (NIL_P(modules)) {
|
391
|
+
rb_raise(rb_eRuntimeError, "internal error: @modules not set");
|
392
|
+
}
|
393
|
+
|
394
|
+
rb_hash_aset(modules, uri, obj);
|
395
|
+
xsltRegisterExtModule(
|
396
|
+
(unsigned char *)StringValueCStr(uri),
|
397
|
+
initFunc,
|
398
|
+
shutdownFunc
|
399
|
+
);
|
400
|
+
return self;
|
250
401
|
}
|
251
402
|
|
252
|
-
|
253
|
-
void
|
403
|
+
void
|
404
|
+
noko_init_xslt_stylesheet(void)
|
254
405
|
{
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
nokogiri = rb_define_module("Nokogiri");
|
259
|
-
xslt = rb_define_module_under(nokogiri, "XSLT");
|
260
|
-
klass = rb_define_class_under(xslt, "Stylesheet", rb_cObject);
|
406
|
+
rb_define_singleton_method(mNokogiriXslt, "register", rb_xslt_s_register, 2);
|
407
|
+
rb_iv_set(mNokogiriXslt, "@modules", rb_hash_new());
|
261
408
|
|
262
|
-
|
409
|
+
cNokogiriXsltStylesheet = rb_define_class_under(mNokogiriXslt, "Stylesheet", rb_cObject);
|
263
410
|
|
264
|
-
cNokogiriXsltStylesheet
|
411
|
+
rb_undef_alloc_func(cNokogiriXsltStylesheet);
|
265
412
|
|
266
|
-
rb_define_singleton_method(
|
267
|
-
|
268
|
-
rb_define_method(
|
269
|
-
rb_define_method(klass, "transform", transform, -1);
|
413
|
+
rb_define_singleton_method(cNokogiriXsltStylesheet, "parse_stylesheet_doc", parse_stylesheet_doc, 1);
|
414
|
+
rb_define_method(cNokogiriXsltStylesheet, "serialize", rb_xslt_stylesheet_serialize, 1);
|
415
|
+
rb_define_method(cNokogiriXsltStylesheet, "transform", rb_xslt_stylesheet_transform, -1);
|
270
416
|
}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
## Gumbo 0.10.1 (2015-04-30)
|
2
|
+
|
3
|
+
Same as 0.10.0, but with the version number bumped because the last version-number commit to v0.9.4 makes GitHub think that v0.9.4 is the latest version and so it's not highlighted on the webpage.
|
4
|
+
|
5
|
+
## Gumbo 0.10.0 (2015-04-30)
|
6
|
+
|
7
|
+
* Full support for `<template>` tag (kevinhendricks, nostrademons).
|
8
|
+
* Some fixes for `<rtc>`/`<rt>` handling (kevinhendricks, vmg).
|
9
|
+
* All html5lib-trunk tests pass now! (kevinhendricks, vmg, nostrademons)
|
10
|
+
* Support for fragment parsing (vmg)
|
11
|
+
* A couple additional example programs (kevinhendricks)
|
12
|
+
* Performance improvements totaling an estimated 30-40% total improvement (vmg, nostrademons).
|
13
|
+
|
14
|
+
## Gumbo 0.9.4 (2015-04-30)
|
15
|
+
|
16
|
+
* Additional Visual Studio fixes (lowjoel, nostrademons)
|
17
|
+
* Fixed some unused variable warnings.
|
18
|
+
* Fix for glibtoolize vs. libtoolize build errors on Mac.
|
19
|
+
* Fixed `CDATA` end tag handling.
|
20
|
+
|
21
|
+
## Gumbo 0.9.3 (2015-02-17)
|
22
|
+
|
23
|
+
* Bugfix for `Æ` entities (rgrove)
|
24
|
+
* Fix `CDATA` handling; `CDATA` sections now generate a `GUMBO_NODE_CDATA` node rather
|
25
|
+
than plain text.
|
26
|
+
* Fix `get_title example` to handle whitespace nodes (gsnedders)
|
27
|
+
* Visual Studio compilation fixes (fishioon)
|
28
|
+
* Take the namespace into account when determining whether a node matches a
|
29
|
+
certain tag (aroben)
|
30
|
+
* Replace the varargs tag functions with a tagset bytevector, for a 20-30%
|
31
|
+
speedup in overall parse time (kevinhendricks, vmg)
|
32
|
+
* Add MacOS X support to Travis CI, and fix the deployment/DLL issues this
|
33
|
+
uncovered (nostrademons, kevinhendricks, vmg)
|
34
|
+
|
35
|
+
## Gumbo 0.9.2 (2014-09-21)
|
36
|
+
|
37
|
+
* Performance improvements: Ragel-based char ref decoder and DFA-based UTF8
|
38
|
+
decoder, totaling speedups of up to 300%.
|
39
|
+
* Added benchmarking program and some sample data.
|
40
|
+
* Fixed a compiler error under Visual Studio.
|
41
|
+
* Fix an error in the ctypes bindings that could lead to memory corruption in
|
42
|
+
the Python bindings.
|
43
|
+
* Fix duplicate attributes when parsing `<isindex>` tags.
|
44
|
+
* Don't leave semicolons behind when consuming entity references (rgrove)
|
45
|
+
* Internally rename some functions in preparation for an amalgamation file
|
46
|
+
(jdeng)
|
47
|
+
* Add proper cflags for gyp builds (skabbes)
|
48
|
+
|
49
|
+
## Gumbo 0.9.1 (2014-08-07)
|
50
|
+
|
51
|
+
* First version listed on PyPi.
|
52
|
+
* Autotools files excluded from GitHub and generated via autogen.sh. (endgame)
|
53
|
+
* Numerous compiler warnings fixed. (bnoordhuis, craigbarnes)
|
54
|
+
* Google security audit passed.
|
55
|
+
* Gyp support (tfarina)
|
56
|
+
* Naming convention for structs changed to avoid C reserved words.
|
57
|
+
* Fix several integer and buffer overflows (Maxime2)
|
58
|
+
* Some Visual Studio compiler support (bugparty)
|
59
|
+
* Python3 compatibility for the ctypes bindings.
|
60
|
+
|
61
|
+
## Gumbo 0.9.0 (2013-08-13)
|
62
|
+
|
63
|
+
* Initial release open-sourced by Google.
|