nokogiri 1.14.0.rc1-arm-linux
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of nokogiri might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/Gemfile +38 -0
- data/LICENSE-DEPENDENCIES.md +2224 -0
- data/LICENSE.md +9 -0
- data/README.md +287 -0
- data/bin/nokogiri +131 -0
- data/dependencies.yml +41 -0
- data/ext/nokogiri/depend +38 -0
- data/ext/nokogiri/extconf.rb +1082 -0
- data/ext/nokogiri/gumbo.c +594 -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 +114 -0
- data/ext/nokogiri/html4_sax_push_parser.c +95 -0
- data/ext/nokogiri/include/libexslt/exslt.h +108 -0
- data/ext/nokogiri/include/libexslt/exsltconfig.h +70 -0
- data/ext/nokogiri/include/libexslt/exsltexports.h +63 -0
- data/ext/nokogiri/include/libxml2/libxml/HTMLparser.h +306 -0
- data/ext/nokogiri/include/libxml2/libxml/HTMLtree.h +147 -0
- data/ext/nokogiri/include/libxml2/libxml/SAX.h +204 -0
- data/ext/nokogiri/include/libxml2/libxml/SAX2.h +172 -0
- data/ext/nokogiri/include/libxml2/libxml/c14n.h +128 -0
- data/ext/nokogiri/include/libxml2/libxml/catalog.h +182 -0
- data/ext/nokogiri/include/libxml2/libxml/chvalid.h +230 -0
- data/ext/nokogiri/include/libxml2/libxml/debugXML.h +217 -0
- data/ext/nokogiri/include/libxml2/libxml/dict.h +81 -0
- data/ext/nokogiri/include/libxml2/libxml/encoding.h +232 -0
- data/ext/nokogiri/include/libxml2/libxml/entities.h +153 -0
- data/ext/nokogiri/include/libxml2/libxml/globals.h +499 -0
- data/ext/nokogiri/include/libxml2/libxml/hash.h +236 -0
- data/ext/nokogiri/include/libxml2/libxml/list.h +137 -0
- data/ext/nokogiri/include/libxml2/libxml/nanoftp.h +186 -0
- data/ext/nokogiri/include/libxml2/libxml/nanohttp.h +81 -0
- data/ext/nokogiri/include/libxml2/libxml/parser.h +1244 -0
- data/ext/nokogiri/include/libxml2/libxml/parserInternals.h +656 -0
- data/ext/nokogiri/include/libxml2/libxml/pattern.h +100 -0
- data/ext/nokogiri/include/libxml2/libxml/relaxng.h +218 -0
- data/ext/nokogiri/include/libxml2/libxml/schemasInternals.h +958 -0
- data/ext/nokogiri/include/libxml2/libxml/schematron.h +142 -0
- data/ext/nokogiri/include/libxml2/libxml/threads.h +91 -0
- data/ext/nokogiri/include/libxml2/libxml/tree.h +1312 -0
- data/ext/nokogiri/include/libxml2/libxml/uri.h +94 -0
- data/ext/nokogiri/include/libxml2/libxml/valid.h +463 -0
- data/ext/nokogiri/include/libxml2/libxml/xinclude.h +129 -0
- data/ext/nokogiri/include/libxml2/libxml/xlink.h +189 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlIO.h +368 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlautomata.h +146 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlerror.h +947 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlexports.h +77 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlmemory.h +226 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlmodule.h +57 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlreader.h +428 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlregexp.h +222 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlsave.h +88 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlschemas.h +246 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlschemastypes.h +152 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlstring.h +140 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlunicode.h +202 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlversion.h +503 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlwriter.h +488 -0
- data/ext/nokogiri/include/libxml2/libxml/xpath.h +575 -0
- data/ext/nokogiri/include/libxml2/libxml/xpathInternals.h +632 -0
- data/ext/nokogiri/include/libxml2/libxml/xpointer.h +137 -0
- data/ext/nokogiri/include/libxslt/attributes.h +38 -0
- data/ext/nokogiri/include/libxslt/documents.h +93 -0
- data/ext/nokogiri/include/libxslt/extensions.h +262 -0
- data/ext/nokogiri/include/libxslt/extra.h +72 -0
- data/ext/nokogiri/include/libxslt/functions.h +78 -0
- data/ext/nokogiri/include/libxslt/imports.h +75 -0
- data/ext/nokogiri/include/libxslt/keys.h +53 -0
- data/ext/nokogiri/include/libxslt/namespaces.h +68 -0
- data/ext/nokogiri/include/libxslt/numbersInternals.h +73 -0
- data/ext/nokogiri/include/libxslt/pattern.h +84 -0
- data/ext/nokogiri/include/libxslt/preproc.h +43 -0
- data/ext/nokogiri/include/libxslt/security.h +104 -0
- data/ext/nokogiri/include/libxslt/templates.h +77 -0
- data/ext/nokogiri/include/libxslt/transform.h +207 -0
- data/ext/nokogiri/include/libxslt/variables.h +118 -0
- data/ext/nokogiri/include/libxslt/xslt.h +110 -0
- data/ext/nokogiri/include/libxslt/xsltInternals.h +1982 -0
- data/ext/nokogiri/include/libxslt/xsltconfig.h +179 -0
- data/ext/nokogiri/include/libxslt/xsltexports.h +64 -0
- data/ext/nokogiri/include/libxslt/xsltlocale.h +76 -0
- data/ext/nokogiri/include/libxslt/xsltutils.h +310 -0
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +259 -0
- data/ext/nokogiri/nokogiri.h +235 -0
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +103 -0
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_cdata.c +57 -0
- data/ext/nokogiri/xml_comment.c +62 -0
- data/ext/nokogiri/xml_document.c +689 -0
- data/ext/nokogiri/xml_document_fragment.c +44 -0
- data/ext/nokogiri/xml_dtd.c +208 -0
- data/ext/nokogiri/xml_element_content.c +128 -0
- data/ext/nokogiri/xml_element_decl.c +69 -0
- data/ext/nokogiri/xml_encoding_handler.c +104 -0
- data/ext/nokogiri/xml_entity_decl.c +112 -0
- data/ext/nokogiri/xml_entity_reference.c +50 -0
- data/ext/nokogiri/xml_namespace.c +186 -0
- data/ext/nokogiri/xml_node.c +2425 -0
- data/ext/nokogiri/xml_node_set.c +496 -0
- data/ext/nokogiri/xml_processing_instruction.c +54 -0
- data/ext/nokogiri/xml_reader.c +794 -0
- data/ext/nokogiri/xml_relax_ng.c +183 -0
- data/ext/nokogiri/xml_sax_parser.c +316 -0
- data/ext/nokogiri/xml_sax_parser_context.c +283 -0
- data/ext/nokogiri/xml_sax_push_parser.c +166 -0
- data/ext/nokogiri/xml_schema.c +282 -0
- data/ext/nokogiri/xml_syntax_error.c +85 -0
- data/ext/nokogiri/xml_text.c +48 -0
- data/ext/nokogiri/xml_xpath_context.c +413 -0
- data/ext/nokogiri/xslt_stylesheet.c +363 -0
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +111 -0
- data/gumbo-parser/THANKS +27 -0
- data/lib/nokogiri/2.7/nokogiri.so +0 -0
- data/lib/nokogiri/3.0/nokogiri.so +0 -0
- data/lib/nokogiri/3.1/nokogiri.so +0 -0
- data/lib/nokogiri/3.2/nokogiri.so +0 -0
- data/lib/nokogiri/class_resolver.rb +67 -0
- data/lib/nokogiri/css/node.rb +54 -0
- data/lib/nokogiri/css/parser.rb +770 -0
- data/lib/nokogiri/css/parser.y +277 -0
- data/lib/nokogiri/css/parser_extras.rb +96 -0
- data/lib/nokogiri/css/syntax_error.rb +9 -0
- data/lib/nokogiri/css/tokenizer.rb +155 -0
- data/lib/nokogiri/css/tokenizer.rex +56 -0
- data/lib/nokogiri/css/xpath_visitor.rb +359 -0
- data/lib/nokogiri/css.rb +66 -0
- data/lib/nokogiri/decorators/slop.rb +44 -0
- 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 +48 -0
- data/lib/nokogiri/html4/builder.rb +37 -0
- data/lib/nokogiri/html4/document.rb +214 -0
- data/lib/nokogiri/html4/document_fragment.rb +54 -0
- data/lib/nokogiri/html4/element_description.rb +25 -0
- data/lib/nokogiri/html4/element_description_defaults.rb +572 -0
- data/lib/nokogiri/html4/encoding_reader.rb +121 -0
- data/lib/nokogiri/html4/entity_lookup.rb +15 -0
- data/lib/nokogiri/html4/sax/parser.rb +63 -0
- data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
- data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
- data/lib/nokogiri/html4.rb +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 +98 -0
- data/lib/nokogiri/html5.rb +389 -0
- data/lib/nokogiri/jruby/dependencies.rb +3 -0
- data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
- data/lib/nokogiri/syntax_error.rb +6 -0
- data/lib/nokogiri/version/constant.rb +6 -0
- data/lib/nokogiri/version/info.rb +223 -0
- data/lib/nokogiri/version.rb +4 -0
- data/lib/nokogiri/xml/attr.rb +66 -0
- data/lib/nokogiri/xml/attribute_decl.rb +20 -0
- data/lib/nokogiri/xml/builder.rb +487 -0
- data/lib/nokogiri/xml/cdata.rb +13 -0
- data/lib/nokogiri/xml/character_data.rb +9 -0
- data/lib/nokogiri/xml/document.rb +471 -0
- data/lib/nokogiri/xml/document_fragment.rb +205 -0
- data/lib/nokogiri/xml/dtd.rb +34 -0
- data/lib/nokogiri/xml/element_content.rb +38 -0
- data/lib/nokogiri/xml/element_decl.rb +15 -0
- data/lib/nokogiri/xml/entity_decl.rb +21 -0
- data/lib/nokogiri/xml/entity_reference.rb +20 -0
- data/lib/nokogiri/xml/namespace.rb +58 -0
- data/lib/nokogiri/xml/node/save_options.rb +68 -0
- data/lib/nokogiri/xml/node.rb +1563 -0
- data/lib/nokogiri/xml/node_set.rb +446 -0
- data/lib/nokogiri/xml/notation.rb +19 -0
- data/lib/nokogiri/xml/parse_options.rb +213 -0
- data/lib/nokogiri/xml/pp/character_data.rb +21 -0
- data/lib/nokogiri/xml/pp/node.rb +57 -0
- data/lib/nokogiri/xml/pp.rb +4 -0
- data/lib/nokogiri/xml/processing_instruction.rb +11 -0
- data/lib/nokogiri/xml/reader.rb +105 -0
- data/lib/nokogiri/xml/relax_ng.rb +38 -0
- data/lib/nokogiri/xml/sax/document.rb +167 -0
- data/lib/nokogiri/xml/sax/parser.rb +125 -0
- data/lib/nokogiri/xml/sax/parser_context.rb +21 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +61 -0
- data/lib/nokogiri/xml/sax.rb +6 -0
- data/lib/nokogiri/xml/schema.rb +73 -0
- data/lib/nokogiri/xml/searchable.rb +270 -0
- data/lib/nokogiri/xml/syntax_error.rb +72 -0
- data/lib/nokogiri/xml/text.rb +11 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +13 -0
- data/lib/nokogiri/xml/xpath.rb +21 -0
- data/lib/nokogiri/xml/xpath_context.rb +16 -0
- data/lib/nokogiri/xml.rb +76 -0
- data/lib/nokogiri/xslt/stylesheet.rb +27 -0
- data/lib/nokogiri/xslt.rb +65 -0
- data/lib/nokogiri.rb +120 -0
- data/lib/xsd/xmlparser/nokogiri.rb +104 -0
- metadata +317 -0
@@ -0,0 +1,363 @@
|
|
1
|
+
#include <nokogiri.h>
|
2
|
+
|
3
|
+
VALUE cNokogiriXsltStylesheet ;
|
4
|
+
|
5
|
+
static void
|
6
|
+
mark(nokogiriXsltStylesheetTuple *wrapper)
|
7
|
+
{
|
8
|
+
rb_gc_mark(wrapper->func_instances);
|
9
|
+
}
|
10
|
+
|
11
|
+
static void
|
12
|
+
dealloc(nokogiriXsltStylesheetTuple *wrapper)
|
13
|
+
{
|
14
|
+
xsltStylesheetPtr doc = wrapper->ss;
|
15
|
+
xsltFreeStylesheet(doc);
|
16
|
+
ruby_xfree(wrapper);
|
17
|
+
}
|
18
|
+
|
19
|
+
PRINTFLIKE_DECL(2, 3)
|
20
|
+
static void
|
21
|
+
xslt_generic_error_handler(void *ctx, const char *msg, ...)
|
22
|
+
{
|
23
|
+
VALUE message;
|
24
|
+
|
25
|
+
#ifdef TRUFFLERUBY_NOKOGIRI_SYSTEM_LIBRARIES
|
26
|
+
/* It is not currently possible to pass var args from native
|
27
|
+
functions to sulong, so we work around the issue here. */
|
28
|
+
message = rb_sprintf("xslt_generic_error_handler: %s", msg);
|
29
|
+
#else
|
30
|
+
va_list args;
|
31
|
+
va_start(args, msg);
|
32
|
+
message = rb_vsprintf(msg, args);
|
33
|
+
va_end(args);
|
34
|
+
#endif
|
35
|
+
|
36
|
+
rb_str_concat((VALUE)ctx, message);
|
37
|
+
}
|
38
|
+
|
39
|
+
VALUE
|
40
|
+
Nokogiri_wrap_xslt_stylesheet(xsltStylesheetPtr ss)
|
41
|
+
{
|
42
|
+
VALUE self;
|
43
|
+
nokogiriXsltStylesheetTuple *wrapper;
|
44
|
+
|
45
|
+
self = Data_Make_Struct(cNokogiriXsltStylesheet, nokogiriXsltStylesheetTuple,
|
46
|
+
mark, dealloc, wrapper);
|
47
|
+
|
48
|
+
ss->_private = (void *)self;
|
49
|
+
wrapper->ss = ss;
|
50
|
+
wrapper->func_instances = rb_ary_new();
|
51
|
+
|
52
|
+
return self;
|
53
|
+
}
|
54
|
+
|
55
|
+
/*
|
56
|
+
* call-seq:
|
57
|
+
* parse_stylesheet_doc(document)
|
58
|
+
*
|
59
|
+
* Parse a stylesheet from +document+.
|
60
|
+
*/
|
61
|
+
static VALUE
|
62
|
+
parse_stylesheet_doc(VALUE klass, VALUE xmldocobj)
|
63
|
+
{
|
64
|
+
xmlDocPtr xml, xml_cpy;
|
65
|
+
VALUE errstr, exception;
|
66
|
+
xsltStylesheetPtr ss ;
|
67
|
+
Data_Get_Struct(xmldocobj, xmlDoc, xml);
|
68
|
+
|
69
|
+
errstr = rb_str_new(0, 0);
|
70
|
+
xsltSetGenericErrorFunc((void *)errstr, xslt_generic_error_handler);
|
71
|
+
|
72
|
+
xml_cpy = xmlCopyDoc(xml, 1); /* 1 => recursive */
|
73
|
+
ss = xsltParseStylesheetDoc(xml_cpy);
|
74
|
+
|
75
|
+
xsltSetGenericErrorFunc(NULL, NULL);
|
76
|
+
|
77
|
+
if (!ss) {
|
78
|
+
xmlFreeDoc(xml_cpy);
|
79
|
+
exception = rb_exc_new3(rb_eRuntimeError, errstr);
|
80
|
+
rb_exc_raise(exception);
|
81
|
+
}
|
82
|
+
|
83
|
+
return Nokogiri_wrap_xslt_stylesheet(ss);
|
84
|
+
}
|
85
|
+
|
86
|
+
|
87
|
+
/*
|
88
|
+
* call-seq:
|
89
|
+
* serialize(document)
|
90
|
+
*
|
91
|
+
* Serialize +document+ to an xml string.
|
92
|
+
*/
|
93
|
+
static VALUE
|
94
|
+
serialize(VALUE self, VALUE xmlobj)
|
95
|
+
{
|
96
|
+
xmlDocPtr xml ;
|
97
|
+
nokogiriXsltStylesheetTuple *wrapper;
|
98
|
+
xmlChar *doc_ptr ;
|
99
|
+
int doc_len ;
|
100
|
+
VALUE rval ;
|
101
|
+
|
102
|
+
Data_Get_Struct(xmlobj, xmlDoc, xml);
|
103
|
+
Data_Get_Struct(self, nokogiriXsltStylesheetTuple, wrapper);
|
104
|
+
xsltSaveResultToString(&doc_ptr, &doc_len, xml, wrapper->ss);
|
105
|
+
rval = NOKOGIRI_STR_NEW(doc_ptr, doc_len);
|
106
|
+
xmlFree(doc_ptr);
|
107
|
+
return rval ;
|
108
|
+
}
|
109
|
+
|
110
|
+
/*
|
111
|
+
* call-seq:
|
112
|
+
* transform(document)
|
113
|
+
* transform(document, params = {})
|
114
|
+
*
|
115
|
+
* Apply an XSLT stylesheet to an XML::Document.
|
116
|
+
*
|
117
|
+
* [Parameters]
|
118
|
+
* - +document+ (Nokogiri::XML::Document) the document to be transformed.
|
119
|
+
* - +params+ (Hash, Array) strings used as XSLT parameters.
|
120
|
+
*
|
121
|
+
* [Returns] Nokogiri::XML::Document
|
122
|
+
*
|
123
|
+
* *Example* of basic transformation:
|
124
|
+
*
|
125
|
+
* xslt = <<~XSLT
|
126
|
+
* <xsl:stylesheet version="1.0"
|
127
|
+
* xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
128
|
+
*
|
129
|
+
* <xsl:param name="title"/>
|
130
|
+
*
|
131
|
+
* <xsl:template match="/">
|
132
|
+
* <html>
|
133
|
+
* <body>
|
134
|
+
* <h1><xsl:value-of select="$title"/></h1>
|
135
|
+
* <ol>
|
136
|
+
* <xsl:for-each select="staff/employee">
|
137
|
+
* <li><xsl:value-of select="employeeId"></li>
|
138
|
+
* </xsl:for-each>
|
139
|
+
* </ol>
|
140
|
+
* </body>
|
141
|
+
* </html>
|
142
|
+
* </xsl:stylesheet>
|
143
|
+
* XSLT
|
144
|
+
*
|
145
|
+
* xml = <<~XML
|
146
|
+
* <?xml version="1.0"?>
|
147
|
+
* <staff>
|
148
|
+
* <employee>
|
149
|
+
* <employeeId>EMP0001</employeeId>
|
150
|
+
* <position>Accountant</position>
|
151
|
+
* </employee>
|
152
|
+
* <employee>
|
153
|
+
* <employeeId>EMP0002</employeeId>
|
154
|
+
* <position>Developer</position>
|
155
|
+
* </employee>
|
156
|
+
* </staff>
|
157
|
+
* XML
|
158
|
+
*
|
159
|
+
* doc = Nokogiri::XML::Document.parse(xml)
|
160
|
+
* stylesheet = Nokogiri::XSLT.parse(xslt)
|
161
|
+
*
|
162
|
+
* ⚠ Note that the +h1+ element is empty because no param has been provided!
|
163
|
+
*
|
164
|
+
* stylesheet.transform(doc).to_xml
|
165
|
+
* # => "<html><body>\n" +
|
166
|
+
* # "<h1></h1>\n" +
|
167
|
+
* # "<ol>\n" +
|
168
|
+
* # "<li>EMP0001</li>\n" +
|
169
|
+
* # "<li>EMP0002</li>\n" +
|
170
|
+
* # "</ol>\n" +
|
171
|
+
* # "</body></html>\n"
|
172
|
+
*
|
173
|
+
* *Example* of using an input parameter hash:
|
174
|
+
*
|
175
|
+
* ⚠ The title is populated, but note how we need to quote-escape the value.
|
176
|
+
*
|
177
|
+
* stylesheet.transform(doc, { "title" => "'Employee List'" }).to_xml
|
178
|
+
* # => "<html><body>\n" +
|
179
|
+
* # "<h1>Employee List</h1>\n" +
|
180
|
+
* # "<ol>\n" +
|
181
|
+
* # "<li>EMP0001</li>\n" +
|
182
|
+
* # "<li>EMP0002</li>\n" +
|
183
|
+
* # "</ol>\n" +
|
184
|
+
* # "</body></html>\n"
|
185
|
+
*
|
186
|
+
* *Example* using the XSLT.quote_params helper method to safely quote-escape strings:
|
187
|
+
*
|
188
|
+
* stylesheet.transform(doc, Nokogiri::XSLT.quote_params({ "title" => "Aaron's List" })).to_xml
|
189
|
+
* # => "<html><body>\n" +
|
190
|
+
* # "<h1>Aaron's List</h1>\n" +
|
191
|
+
* # "<ol>\n" +
|
192
|
+
* # "<li>EMP0001</li>\n" +
|
193
|
+
* # "<li>EMP0002</li>\n" +
|
194
|
+
* # "</ol>\n" +
|
195
|
+
* # "</body></html>\n"
|
196
|
+
*
|
197
|
+
* *Example* using an array of XSLT parameters
|
198
|
+
*
|
199
|
+
* You can also use an array if you want to.
|
200
|
+
*
|
201
|
+
* stylesheet.transform(doc, ["title", "'Employee List'"]).to_xml
|
202
|
+
* # => "<html><body>\n" +
|
203
|
+
* # "<h1>Employee List</h1>\n" +
|
204
|
+
* # "<ol>\n" +
|
205
|
+
* # "<li>EMP0001</li>\n" +
|
206
|
+
* # "<li>EMP0002</li>\n" +
|
207
|
+
* # "</ol>\n" +
|
208
|
+
* # "</body></html>\n"
|
209
|
+
*
|
210
|
+
* Or pass an array to XSLT.quote_params:
|
211
|
+
*
|
212
|
+
* stylesheet.transform(doc, Nokogiri::XSLT.quote_params(["title", "Aaron's List"])).to_xml
|
213
|
+
* # => "<html><body>\n" +
|
214
|
+
* # "<h1>Aaron's List</h1>\n" +
|
215
|
+
* # "<ol>\n" +
|
216
|
+
* # "<li>EMP0001</li>\n" +
|
217
|
+
* # "<li>EMP0002</li>\n" +
|
218
|
+
* # "</ol>\n" +
|
219
|
+
* # "</body></html>\n"
|
220
|
+
*
|
221
|
+
* See: Nokogiri::XSLT.quote_params
|
222
|
+
*/
|
223
|
+
static VALUE
|
224
|
+
transform(int argc, VALUE *argv, VALUE self)
|
225
|
+
{
|
226
|
+
VALUE xmldoc, paramobj, errstr, exception ;
|
227
|
+
xmlDocPtr xml ;
|
228
|
+
xmlDocPtr result ;
|
229
|
+
nokogiriXsltStylesheetTuple *wrapper;
|
230
|
+
const char **params ;
|
231
|
+
long param_len, j ;
|
232
|
+
int parse_error_occurred ;
|
233
|
+
|
234
|
+
rb_scan_args(argc, argv, "11", &xmldoc, ¶mobj);
|
235
|
+
if (NIL_P(paramobj)) { paramobj = rb_ary_new2(0L) ; }
|
236
|
+
if (!rb_obj_is_kind_of(xmldoc, cNokogiriXmlDocument)) {
|
237
|
+
rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::Document");
|
238
|
+
}
|
239
|
+
|
240
|
+
/* handle hashes as arguments. */
|
241
|
+
if (T_HASH == TYPE(paramobj)) {
|
242
|
+
paramobj = rb_funcall(paramobj, rb_intern("to_a"), 0);
|
243
|
+
paramobj = rb_funcall(paramobj, rb_intern("flatten"), 0);
|
244
|
+
}
|
245
|
+
|
246
|
+
Check_Type(paramobj, T_ARRAY);
|
247
|
+
|
248
|
+
Data_Get_Struct(xmldoc, xmlDoc, xml);
|
249
|
+
Data_Get_Struct(self, nokogiriXsltStylesheetTuple, wrapper);
|
250
|
+
|
251
|
+
param_len = RARRAY_LEN(paramobj);
|
252
|
+
params = ruby_xcalloc((size_t)param_len + 1, sizeof(char *));
|
253
|
+
for (j = 0 ; j < param_len ; j++) {
|
254
|
+
VALUE entry = rb_ary_entry(paramobj, j);
|
255
|
+
const char *ptr = StringValueCStr(entry);
|
256
|
+
params[j] = ptr;
|
257
|
+
}
|
258
|
+
params[param_len] = 0 ;
|
259
|
+
|
260
|
+
errstr = rb_str_new(0, 0);
|
261
|
+
xsltSetGenericErrorFunc((void *)errstr, xslt_generic_error_handler);
|
262
|
+
xmlSetGenericErrorFunc((void *)errstr, xslt_generic_error_handler);
|
263
|
+
|
264
|
+
result = xsltApplyStylesheet(wrapper->ss, xml, params);
|
265
|
+
ruby_xfree(params);
|
266
|
+
|
267
|
+
xsltSetGenericErrorFunc(NULL, NULL);
|
268
|
+
xmlSetGenericErrorFunc(NULL, NULL);
|
269
|
+
|
270
|
+
parse_error_occurred = (Qfalse == rb_funcall(errstr, rb_intern("empty?"), 0));
|
271
|
+
|
272
|
+
if (parse_error_occurred) {
|
273
|
+
exception = rb_exc_new3(rb_eRuntimeError, errstr);
|
274
|
+
rb_exc_raise(exception);
|
275
|
+
}
|
276
|
+
|
277
|
+
return noko_xml_document_wrap((VALUE)0, result) ;
|
278
|
+
}
|
279
|
+
|
280
|
+
static void
|
281
|
+
method_caller(xmlXPathParserContextPtr ctxt, int nargs)
|
282
|
+
{
|
283
|
+
VALUE handler;
|
284
|
+
const char *function_name;
|
285
|
+
xsltTransformContextPtr transform;
|
286
|
+
const xmlChar *functionURI;
|
287
|
+
|
288
|
+
transform = xsltXPathGetTransformContext(ctxt);
|
289
|
+
functionURI = ctxt->context->functionURI;
|
290
|
+
handler = (VALUE)xsltGetExtData(transform, functionURI);
|
291
|
+
function_name = (const char *)(ctxt->context->function);
|
292
|
+
|
293
|
+
Nokogiri_marshal_xpath_funcall_and_return_values(ctxt, nargs, handler, (const char *)function_name);
|
294
|
+
}
|
295
|
+
|
296
|
+
static void *
|
297
|
+
initFunc(xsltTransformContextPtr ctxt, const xmlChar *uri)
|
298
|
+
{
|
299
|
+
VALUE modules = rb_iv_get(mNokogiriXslt, "@modules");
|
300
|
+
VALUE obj = rb_hash_aref(modules, rb_str_new2((const char *)uri));
|
301
|
+
VALUE args = { Qfalse };
|
302
|
+
VALUE methods = rb_funcall(obj, rb_intern("instance_methods"), 1, args);
|
303
|
+
VALUE inst;
|
304
|
+
nokogiriXsltStylesheetTuple *wrapper;
|
305
|
+
int i;
|
306
|
+
|
307
|
+
for (i = 0; i < RARRAY_LEN(methods); i++) {
|
308
|
+
VALUE method_name = rb_obj_as_string(rb_ary_entry(methods, i));
|
309
|
+
xsltRegisterExtFunction(ctxt,
|
310
|
+
(unsigned char *)StringValueCStr(method_name), uri, method_caller);
|
311
|
+
}
|
312
|
+
|
313
|
+
Data_Get_Struct((VALUE)ctxt->style->_private, nokogiriXsltStylesheetTuple,
|
314
|
+
wrapper);
|
315
|
+
inst = rb_class_new_instance(0, NULL, obj);
|
316
|
+
rb_ary_push(wrapper->func_instances, inst);
|
317
|
+
|
318
|
+
return (void *)inst;
|
319
|
+
}
|
320
|
+
|
321
|
+
static void
|
322
|
+
shutdownFunc(xsltTransformContextPtr ctxt,
|
323
|
+
const xmlChar *uri, void *data)
|
324
|
+
{
|
325
|
+
nokogiriXsltStylesheetTuple *wrapper;
|
326
|
+
|
327
|
+
Data_Get_Struct((VALUE)ctxt->style->_private, nokogiriXsltStylesheetTuple,
|
328
|
+
wrapper);
|
329
|
+
|
330
|
+
rb_ary_clear(wrapper->func_instances);
|
331
|
+
}
|
332
|
+
|
333
|
+
/*
|
334
|
+
* call-seq:
|
335
|
+
* register(uri, custom_handler_class)
|
336
|
+
*
|
337
|
+
* Register a class that implements custom XSLT transformation functions.
|
338
|
+
*/
|
339
|
+
static VALUE
|
340
|
+
registr(VALUE self, VALUE uri, VALUE obj)
|
341
|
+
{
|
342
|
+
VALUE modules = rb_iv_get(self, "@modules");
|
343
|
+
if (NIL_P(modules)) { rb_raise(rb_eRuntimeError, "wtf! @modules isn't set"); }
|
344
|
+
|
345
|
+
rb_hash_aset(modules, uri, obj);
|
346
|
+
xsltRegisterExtModule((unsigned char *)StringValueCStr(uri), initFunc, shutdownFunc);
|
347
|
+
return self;
|
348
|
+
}
|
349
|
+
|
350
|
+
void
|
351
|
+
noko_init_xslt_stylesheet()
|
352
|
+
{
|
353
|
+
rb_define_singleton_method(mNokogiriXslt, "register", registr, 2);
|
354
|
+
rb_iv_set(mNokogiriXslt, "@modules", rb_hash_new());
|
355
|
+
|
356
|
+
cNokogiriXsltStylesheet = rb_define_class_under(mNokogiriXslt, "Stylesheet", rb_cObject);
|
357
|
+
|
358
|
+
rb_undef_alloc_func(cNokogiriXsltStylesheet);
|
359
|
+
|
360
|
+
rb_define_singleton_method(cNokogiriXsltStylesheet, "parse_stylesheet_doc", parse_stylesheet_doc, 1);
|
361
|
+
rb_define_method(cNokogiriXsltStylesheet, "serialize", serialize, 1);
|
362
|
+
rb_define_method(cNokogiriXsltStylesheet, "transform", transform, -1);
|
363
|
+
}
|
@@ -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.
|
@@ -0,0 +1,111 @@
|
|
1
|
+
.PHONY: all clean check coverage
|
2
|
+
|
3
|
+
gumbo_objs := $(patsubst %.c,build/%.o,$(wildcard src/*.c))
|
4
|
+
test_objs := $(patsubst %.cc,build/%.o,$(wildcard test/*.cc))
|
5
|
+
gtest_lib := googletest/make/gtest_main.a
|
6
|
+
|
7
|
+
# make SANITIZEFLAGS='-fsanitize=undefined -fsanitize=address'
|
8
|
+
SANITIZEFLAGS :=
|
9
|
+
CPPFLAGS := -Isrc
|
10
|
+
CFLAGS := -std=c99 -Os -Wall
|
11
|
+
CXXFLAGS := -isystem googletest/include -std=c++11 -Os -Wall
|
12
|
+
LDFLAGS := -pthread
|
13
|
+
|
14
|
+
all: check
|
15
|
+
|
16
|
+
# don't try to regenerate ragel or gperf files in CI, that should be a development-only action and
|
17
|
+
# the generated files should be committed to SCM
|
18
|
+
ifneq ($(CI),true)
|
19
|
+
src/foreign_attrs.c: src/foreign_attrs.gperf
|
20
|
+
gperf -m100 -n $< | ./gperf-filter.sed > $@
|
21
|
+
|
22
|
+
src/%.c: src/%.gperf
|
23
|
+
gperf -m100 $< | ./gperf-filter.sed > $@
|
24
|
+
|
25
|
+
src/%.c: src/%.rl
|
26
|
+
ragel -F1 -o $@ $<
|
27
|
+
endif
|
28
|
+
|
29
|
+
build/src:
|
30
|
+
mkdir -p $@
|
31
|
+
|
32
|
+
build/test:
|
33
|
+
mkdir -p $@
|
34
|
+
|
35
|
+
build/src/%.o: src/%.c build/src/flags | build/src
|
36
|
+
$(CC) -MMD $(CPPFLAGS) $(CFLAGS) $(SANITIZEFLAGS) -c -o $@ $<
|
37
|
+
|
38
|
+
build/test/%.o: test/%.cc build/test/flags | build/test
|
39
|
+
$(CXX) -MMD $(CPPFLAGS) $(CXXFLAGS) $(SANITIZEFLAGS) -c -o $@ $<
|
40
|
+
|
41
|
+
build/run_tests: $(gumbo_objs) $(test_objs) $(gtest_lib)
|
42
|
+
$(CXX) -o $@ $+ $(LDFLAGS) $(SANITIZEFLAGS)
|
43
|
+
|
44
|
+
check: build/run_tests
|
45
|
+
./build/run_tests
|
46
|
+
|
47
|
+
coverage:
|
48
|
+
$(RM) build/{src,test}/*.gcda
|
49
|
+
$(RM) build/*.info
|
50
|
+
$(MAKE) CPPFLAGS='-Isrc -DNDEBUG=1' \
|
51
|
+
CFLAGS='-std=c99 --coverage -g -O0' \
|
52
|
+
CXXFLAGS='-isystem googletest/include -std=c++11 --coverage -g -O0' \
|
53
|
+
LDFLAGS='--coverage' \
|
54
|
+
build/run_tests
|
55
|
+
lcov --no-external \
|
56
|
+
--initial \
|
57
|
+
--capture \
|
58
|
+
--base-directory . \
|
59
|
+
--directory build \
|
60
|
+
--output-file build/coverage-pre.info
|
61
|
+
awk -F '[:,]' \
|
62
|
+
'/^SF:/ { delete defs } /^FN:/ { defs[$$2]=1 } /^DA:/ { if ($$3 == 0 && $$2 in defs) next } { print }' \
|
63
|
+
build/coverage-pre.info > build/coverage-initial.info
|
64
|
+
./build/run_tests
|
65
|
+
lcov --no-external \
|
66
|
+
--capture \
|
67
|
+
--base-directory . \
|
68
|
+
--directory build \
|
69
|
+
--rc lcov_branch_coverage=1 \
|
70
|
+
--output-file build/coverage-test.info
|
71
|
+
lcov --add-tracefile build/coverage-initial.info \
|
72
|
+
--add-tracefile build/coverage-test.info \
|
73
|
+
--rc lcov_branch_coverage=1 \
|
74
|
+
--output-file build/coverage.info
|
75
|
+
lcov --remove build/coverage.info '$(CURDIR)/googletest/*' \
|
76
|
+
--rc lcov_branch_coverage=1 \
|
77
|
+
--output-file build/coverage.info
|
78
|
+
genhtml --branch-coverage \
|
79
|
+
--output-directory build/coverage \
|
80
|
+
build/coverage.info
|
81
|
+
|
82
|
+
clean:
|
83
|
+
$(RM) -r build
|
84
|
+
|
85
|
+
build/src/flags: | build/src
|
86
|
+
@echo 'old_CC := $(CC)' > $@
|
87
|
+
@echo 'old_CPPFLAGS := $(CPPFLAGS)' >> $@
|
88
|
+
@echo 'old_CFLAGS := $(CFLAGS)' >>$@
|
89
|
+
@echo 'old_SANITIZEFLAGS := $(SANITIZEFLAGS)' >> $@
|
90
|
+
@echo 'old_LDFLAGS := $(LDFLAGS)' >> $@
|
91
|
+
|
92
|
+
build/test/flags: | build/test
|
93
|
+
@echo 'old_CXX := $(CXX)' > $@
|
94
|
+
@echo 'old_CPPFLAGS := $(CPPFLAGS)' >> $@
|
95
|
+
@echo 'old_CXXFLAGS := $(CXXFLAGS)' >> $@
|
96
|
+
@echo 'old_SANITIZEFLAGS := $(SANITIZEFLAGS)' >> $@
|
97
|
+
@echo 'old_LDFLAGS := $(LDFLAGS)' >> $@
|
98
|
+
|
99
|
+
ifeq (,$(filter clean coverage,$(MAKECMDGOALS)))
|
100
|
+
# Ensure that the flags are up to date.
|
101
|
+
-include build/src/flags build/test/flags
|
102
|
+
ifneq ($(old_CC) | $(old_CPPFLAGS) | $(old_CFLAGS) | $(old_SANITIZEFLAGS) | $(old_LDFLAGS),$(CC) | $(CPPFLAGS) | $(CFLAGS) | $(SANITIZEFLAGS) | $(LDFLAGS))
|
103
|
+
.PHONY: build/src/flags
|
104
|
+
endif
|
105
|
+
ifneq ($(old_CXX) | $(old_CPPFLAGS) | $(old_CXXFLAGS) | $(old_SANITIZEFLAGS) | $(old_LDFLAGS),$(CXX) | $(CPPFLAGS) | $(CXXFLAGS) | $(SANITIZEFLAGS) | $(LDFLAGS))
|
106
|
+
.PHONY: build/test/flags
|
107
|
+
endif
|
108
|
+
|
109
|
+
# Include dependencies.
|
110
|
+
-include $(test_objs:.o=.d) $(gumbo_objs:.o=.d)
|
111
|
+
endif
|
data/gumbo-parser/THANKS
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
Gumbo HTML parser THANKS file
|
2
|
+
|
3
|
+
Gumbo was originally written by Jonathan Tang, but many people helped out through suggestions, question-answering, code reviews, bugfixes, and organizational support. Here is a list of these people. Help me keep it complete and exempt of errors.
|
4
|
+
|
5
|
+
Adam Barth
|
6
|
+
Adam Roben
|
7
|
+
Ben Noordhuis
|
8
|
+
Bowen Han
|
9
|
+
Constantinos Michael
|
10
|
+
Craig Barnes
|
11
|
+
Geoffrey Sneddon
|
12
|
+
Ian Hickson
|
13
|
+
Jack Deng
|
14
|
+
Joel Low
|
15
|
+
Jonathan Shneier
|
16
|
+
Kevin Hendricks
|
17
|
+
Mason Tang
|
18
|
+
Maxim Zakharov
|
19
|
+
Michal Zalewski
|
20
|
+
Neal Norwitz
|
21
|
+
Othar Hansson
|
22
|
+
Ryan Grove
|
23
|
+
Stefan Haustein
|
24
|
+
Steffen Meschkat
|
25
|
+
Steven Kabbes
|
26
|
+
Thiago Farina
|
27
|
+
Vicent Marti
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "set"
|
5
|
+
|
6
|
+
module Nokogiri
|
7
|
+
#
|
8
|
+
# Some classes in Nokogiri are namespaced as a group, for example
|
9
|
+
# Document, DocumentFragment, and Builder.
|
10
|
+
#
|
11
|
+
# It's sometimes necessary to look up the related class, e.g.:
|
12
|
+
#
|
13
|
+
# XML::Builder → XML::Document
|
14
|
+
# HTML4::Builder → HTML4::Document
|
15
|
+
# HTML5::Document → HTML5::DocumentFragment
|
16
|
+
#
|
17
|
+
# This module is included into those key classes who need to do this.
|
18
|
+
#
|
19
|
+
module ClassResolver
|
20
|
+
# #related_class restricts matching namespaces to those matching this set.
|
21
|
+
VALID_NAMESPACES = Set.new(["HTML", "HTML4", "HTML5", "XML"])
|
22
|
+
|
23
|
+
# :call-seq:
|
24
|
+
# related_class(class_name) → Class
|
25
|
+
#
|
26
|
+
# Find a class constant within the
|
27
|
+
#
|
28
|
+
# Some examples:
|
29
|
+
#
|
30
|
+
# Nokogiri::XML::Document.new.related_class("DocumentFragment")
|
31
|
+
# # => Nokogiri::XML::DocumentFragment
|
32
|
+
# Nokogiri::HTML4::Document.new.related_class("DocumentFragment")
|
33
|
+
# # => Nokogiri::HTML4::DocumentFragment
|
34
|
+
#
|
35
|
+
# Note this will also work for subclasses that follow the same convention, e.g.:
|
36
|
+
#
|
37
|
+
# Loofah::HTML::Document.new.related_class("DocumentFragment")
|
38
|
+
# # => Loofah::HTML::DocumentFragment
|
39
|
+
#
|
40
|
+
# And even if it's a subclass, this will iterate through the superclasses:
|
41
|
+
#
|
42
|
+
# class ThisIsATopLevelClass < Nokogiri::HTML4::Builder ; end
|
43
|
+
# ThisIsATopLevelClass.new.related_class("Document")
|
44
|
+
# # => Nokogiri::HTML4::Document
|
45
|
+
#
|
46
|
+
def related_class(class_name)
|
47
|
+
klass = nil
|
48
|
+
inspecting = self.class
|
49
|
+
|
50
|
+
while inspecting
|
51
|
+
namespace_path = inspecting.name.split("::")[0..-2]
|
52
|
+
inspecting = inspecting.superclass
|
53
|
+
|
54
|
+
next unless VALID_NAMESPACES.include?(namespace_path.last)
|
55
|
+
|
56
|
+
related_class_name = (namespace_path << class_name).join("::")
|
57
|
+
klass = begin
|
58
|
+
Object.const_get(related_class_name)
|
59
|
+
rescue NameError
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
break if klass
|
63
|
+
end
|
64
|
+
klass
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module CSS
|
5
|
+
class Node # :nodoc:
|
6
|
+
ALLOW_COMBINATOR_ON_SELF = [:DIRECT_ADJACENT_SELECTOR, :FOLLOWING_SELECTOR, :CHILD_SELECTOR]
|
7
|
+
|
8
|
+
# Get the type of this node
|
9
|
+
attr_accessor :type
|
10
|
+
# Get the value of this node
|
11
|
+
attr_accessor :value
|
12
|
+
|
13
|
+
# Create a new Node with +type+ and +value+
|
14
|
+
def initialize(type, value)
|
15
|
+
@type = type
|
16
|
+
@value = value
|
17
|
+
end
|
18
|
+
|
19
|
+
# Accept +visitor+
|
20
|
+
def accept(visitor)
|
21
|
+
visitor.send(:"visit_#{type.to_s.downcase}", self)
|
22
|
+
end
|
23
|
+
|
24
|
+
###
|
25
|
+
# Convert this CSS node to xpath with +prefix+ using +visitor+
|
26
|
+
def to_xpath(prefix, visitor)
|
27
|
+
prefix = "." if ALLOW_COMBINATOR_ON_SELF.include?(type) && value.first.nil?
|
28
|
+
prefix + visitor.accept(self)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Find a node by type using +types+
|
32
|
+
def find_by_type(types)
|
33
|
+
matches = []
|
34
|
+
matches << self if to_type == types
|
35
|
+
@value.each do |v|
|
36
|
+
matches += v.find_by_type(types) if v.respond_to?(:find_by_type)
|
37
|
+
end
|
38
|
+
matches
|
39
|
+
end
|
40
|
+
|
41
|
+
# Convert to_type
|
42
|
+
def to_type
|
43
|
+
[@type] + @value.filter_map do |n|
|
44
|
+
n.to_type if n.respond_to?(:to_type)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Convert to array
|
49
|
+
def to_a
|
50
|
+
[@type] + @value.map { |n| n.respond_to?(:to_a) ? n.to_a : [n] }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|