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.

Files changed (200) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +38 -0
  3. data/LICENSE-DEPENDENCIES.md +2224 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +287 -0
  6. data/bin/nokogiri +131 -0
  7. data/dependencies.yml +41 -0
  8. data/ext/nokogiri/depend +38 -0
  9. data/ext/nokogiri/extconf.rb +1082 -0
  10. data/ext/nokogiri/gumbo.c +594 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +114 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/include/libexslt/exslt.h +108 -0
  17. data/ext/nokogiri/include/libexslt/exsltconfig.h +70 -0
  18. data/ext/nokogiri/include/libexslt/exsltexports.h +63 -0
  19. data/ext/nokogiri/include/libxml2/libxml/HTMLparser.h +306 -0
  20. data/ext/nokogiri/include/libxml2/libxml/HTMLtree.h +147 -0
  21. data/ext/nokogiri/include/libxml2/libxml/SAX.h +204 -0
  22. data/ext/nokogiri/include/libxml2/libxml/SAX2.h +172 -0
  23. data/ext/nokogiri/include/libxml2/libxml/c14n.h +128 -0
  24. data/ext/nokogiri/include/libxml2/libxml/catalog.h +182 -0
  25. data/ext/nokogiri/include/libxml2/libxml/chvalid.h +230 -0
  26. data/ext/nokogiri/include/libxml2/libxml/debugXML.h +217 -0
  27. data/ext/nokogiri/include/libxml2/libxml/dict.h +81 -0
  28. data/ext/nokogiri/include/libxml2/libxml/encoding.h +232 -0
  29. data/ext/nokogiri/include/libxml2/libxml/entities.h +153 -0
  30. data/ext/nokogiri/include/libxml2/libxml/globals.h +499 -0
  31. data/ext/nokogiri/include/libxml2/libxml/hash.h +236 -0
  32. data/ext/nokogiri/include/libxml2/libxml/list.h +137 -0
  33. data/ext/nokogiri/include/libxml2/libxml/nanoftp.h +186 -0
  34. data/ext/nokogiri/include/libxml2/libxml/nanohttp.h +81 -0
  35. data/ext/nokogiri/include/libxml2/libxml/parser.h +1244 -0
  36. data/ext/nokogiri/include/libxml2/libxml/parserInternals.h +656 -0
  37. data/ext/nokogiri/include/libxml2/libxml/pattern.h +100 -0
  38. data/ext/nokogiri/include/libxml2/libxml/relaxng.h +218 -0
  39. data/ext/nokogiri/include/libxml2/libxml/schemasInternals.h +958 -0
  40. data/ext/nokogiri/include/libxml2/libxml/schematron.h +142 -0
  41. data/ext/nokogiri/include/libxml2/libxml/threads.h +91 -0
  42. data/ext/nokogiri/include/libxml2/libxml/tree.h +1312 -0
  43. data/ext/nokogiri/include/libxml2/libxml/uri.h +94 -0
  44. data/ext/nokogiri/include/libxml2/libxml/valid.h +463 -0
  45. data/ext/nokogiri/include/libxml2/libxml/xinclude.h +129 -0
  46. data/ext/nokogiri/include/libxml2/libxml/xlink.h +189 -0
  47. data/ext/nokogiri/include/libxml2/libxml/xmlIO.h +368 -0
  48. data/ext/nokogiri/include/libxml2/libxml/xmlautomata.h +146 -0
  49. data/ext/nokogiri/include/libxml2/libxml/xmlerror.h +947 -0
  50. data/ext/nokogiri/include/libxml2/libxml/xmlexports.h +77 -0
  51. data/ext/nokogiri/include/libxml2/libxml/xmlmemory.h +226 -0
  52. data/ext/nokogiri/include/libxml2/libxml/xmlmodule.h +57 -0
  53. data/ext/nokogiri/include/libxml2/libxml/xmlreader.h +428 -0
  54. data/ext/nokogiri/include/libxml2/libxml/xmlregexp.h +222 -0
  55. data/ext/nokogiri/include/libxml2/libxml/xmlsave.h +88 -0
  56. data/ext/nokogiri/include/libxml2/libxml/xmlschemas.h +246 -0
  57. data/ext/nokogiri/include/libxml2/libxml/xmlschemastypes.h +152 -0
  58. data/ext/nokogiri/include/libxml2/libxml/xmlstring.h +140 -0
  59. data/ext/nokogiri/include/libxml2/libxml/xmlunicode.h +202 -0
  60. data/ext/nokogiri/include/libxml2/libxml/xmlversion.h +503 -0
  61. data/ext/nokogiri/include/libxml2/libxml/xmlwriter.h +488 -0
  62. data/ext/nokogiri/include/libxml2/libxml/xpath.h +575 -0
  63. data/ext/nokogiri/include/libxml2/libxml/xpathInternals.h +632 -0
  64. data/ext/nokogiri/include/libxml2/libxml/xpointer.h +137 -0
  65. data/ext/nokogiri/include/libxslt/attributes.h +38 -0
  66. data/ext/nokogiri/include/libxslt/documents.h +93 -0
  67. data/ext/nokogiri/include/libxslt/extensions.h +262 -0
  68. data/ext/nokogiri/include/libxslt/extra.h +72 -0
  69. data/ext/nokogiri/include/libxslt/functions.h +78 -0
  70. data/ext/nokogiri/include/libxslt/imports.h +75 -0
  71. data/ext/nokogiri/include/libxslt/keys.h +53 -0
  72. data/ext/nokogiri/include/libxslt/namespaces.h +68 -0
  73. data/ext/nokogiri/include/libxslt/numbersInternals.h +73 -0
  74. data/ext/nokogiri/include/libxslt/pattern.h +84 -0
  75. data/ext/nokogiri/include/libxslt/preproc.h +43 -0
  76. data/ext/nokogiri/include/libxslt/security.h +104 -0
  77. data/ext/nokogiri/include/libxslt/templates.h +77 -0
  78. data/ext/nokogiri/include/libxslt/transform.h +207 -0
  79. data/ext/nokogiri/include/libxslt/variables.h +118 -0
  80. data/ext/nokogiri/include/libxslt/xslt.h +110 -0
  81. data/ext/nokogiri/include/libxslt/xsltInternals.h +1982 -0
  82. data/ext/nokogiri/include/libxslt/xsltconfig.h +179 -0
  83. data/ext/nokogiri/include/libxslt/xsltexports.h +64 -0
  84. data/ext/nokogiri/include/libxslt/xsltlocale.h +76 -0
  85. data/ext/nokogiri/include/libxslt/xsltutils.h +310 -0
  86. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  87. data/ext/nokogiri/nokogiri.c +259 -0
  88. data/ext/nokogiri/nokogiri.h +235 -0
  89. data/ext/nokogiri/test_global_handlers.c +40 -0
  90. data/ext/nokogiri/xml_attr.c +103 -0
  91. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  92. data/ext/nokogiri/xml_cdata.c +57 -0
  93. data/ext/nokogiri/xml_comment.c +62 -0
  94. data/ext/nokogiri/xml_document.c +689 -0
  95. data/ext/nokogiri/xml_document_fragment.c +44 -0
  96. data/ext/nokogiri/xml_dtd.c +208 -0
  97. data/ext/nokogiri/xml_element_content.c +128 -0
  98. data/ext/nokogiri/xml_element_decl.c +69 -0
  99. data/ext/nokogiri/xml_encoding_handler.c +104 -0
  100. data/ext/nokogiri/xml_entity_decl.c +112 -0
  101. data/ext/nokogiri/xml_entity_reference.c +50 -0
  102. data/ext/nokogiri/xml_namespace.c +186 -0
  103. data/ext/nokogiri/xml_node.c +2425 -0
  104. data/ext/nokogiri/xml_node_set.c +496 -0
  105. data/ext/nokogiri/xml_processing_instruction.c +54 -0
  106. data/ext/nokogiri/xml_reader.c +794 -0
  107. data/ext/nokogiri/xml_relax_ng.c +183 -0
  108. data/ext/nokogiri/xml_sax_parser.c +316 -0
  109. data/ext/nokogiri/xml_sax_parser_context.c +283 -0
  110. data/ext/nokogiri/xml_sax_push_parser.c +166 -0
  111. data/ext/nokogiri/xml_schema.c +282 -0
  112. data/ext/nokogiri/xml_syntax_error.c +85 -0
  113. data/ext/nokogiri/xml_text.c +48 -0
  114. data/ext/nokogiri/xml_xpath_context.c +413 -0
  115. data/ext/nokogiri/xslt_stylesheet.c +363 -0
  116. data/gumbo-parser/CHANGES.md +63 -0
  117. data/gumbo-parser/Makefile +111 -0
  118. data/gumbo-parser/THANKS +27 -0
  119. data/lib/nokogiri/2.7/nokogiri.so +0 -0
  120. data/lib/nokogiri/3.0/nokogiri.so +0 -0
  121. data/lib/nokogiri/3.1/nokogiri.so +0 -0
  122. data/lib/nokogiri/3.2/nokogiri.so +0 -0
  123. data/lib/nokogiri/class_resolver.rb +67 -0
  124. data/lib/nokogiri/css/node.rb +54 -0
  125. data/lib/nokogiri/css/parser.rb +770 -0
  126. data/lib/nokogiri/css/parser.y +277 -0
  127. data/lib/nokogiri/css/parser_extras.rb +96 -0
  128. data/lib/nokogiri/css/syntax_error.rb +9 -0
  129. data/lib/nokogiri/css/tokenizer.rb +155 -0
  130. data/lib/nokogiri/css/tokenizer.rex +56 -0
  131. data/lib/nokogiri/css/xpath_visitor.rb +359 -0
  132. data/lib/nokogiri/css.rb +66 -0
  133. data/lib/nokogiri/decorators/slop.rb +44 -0
  134. data/lib/nokogiri/encoding_handler.rb +57 -0
  135. data/lib/nokogiri/extension.rb +32 -0
  136. data/lib/nokogiri/gumbo.rb +15 -0
  137. data/lib/nokogiri/html.rb +48 -0
  138. data/lib/nokogiri/html4/builder.rb +37 -0
  139. data/lib/nokogiri/html4/document.rb +214 -0
  140. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  141. data/lib/nokogiri/html4/element_description.rb +25 -0
  142. data/lib/nokogiri/html4/element_description_defaults.rb +572 -0
  143. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  144. data/lib/nokogiri/html4/entity_lookup.rb +15 -0
  145. data/lib/nokogiri/html4/sax/parser.rb +63 -0
  146. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  147. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  148. data/lib/nokogiri/html4.rb +47 -0
  149. data/lib/nokogiri/html5/document.rb +168 -0
  150. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  151. data/lib/nokogiri/html5/node.rb +98 -0
  152. data/lib/nokogiri/html5.rb +389 -0
  153. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  154. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  155. data/lib/nokogiri/syntax_error.rb +6 -0
  156. data/lib/nokogiri/version/constant.rb +6 -0
  157. data/lib/nokogiri/version/info.rb +223 -0
  158. data/lib/nokogiri/version.rb +4 -0
  159. data/lib/nokogiri/xml/attr.rb +66 -0
  160. data/lib/nokogiri/xml/attribute_decl.rb +20 -0
  161. data/lib/nokogiri/xml/builder.rb +487 -0
  162. data/lib/nokogiri/xml/cdata.rb +13 -0
  163. data/lib/nokogiri/xml/character_data.rb +9 -0
  164. data/lib/nokogiri/xml/document.rb +471 -0
  165. data/lib/nokogiri/xml/document_fragment.rb +205 -0
  166. data/lib/nokogiri/xml/dtd.rb +34 -0
  167. data/lib/nokogiri/xml/element_content.rb +38 -0
  168. data/lib/nokogiri/xml/element_decl.rb +15 -0
  169. data/lib/nokogiri/xml/entity_decl.rb +21 -0
  170. data/lib/nokogiri/xml/entity_reference.rb +20 -0
  171. data/lib/nokogiri/xml/namespace.rb +58 -0
  172. data/lib/nokogiri/xml/node/save_options.rb +68 -0
  173. data/lib/nokogiri/xml/node.rb +1563 -0
  174. data/lib/nokogiri/xml/node_set.rb +446 -0
  175. data/lib/nokogiri/xml/notation.rb +19 -0
  176. data/lib/nokogiri/xml/parse_options.rb +213 -0
  177. data/lib/nokogiri/xml/pp/character_data.rb +21 -0
  178. data/lib/nokogiri/xml/pp/node.rb +57 -0
  179. data/lib/nokogiri/xml/pp.rb +4 -0
  180. data/lib/nokogiri/xml/processing_instruction.rb +11 -0
  181. data/lib/nokogiri/xml/reader.rb +105 -0
  182. data/lib/nokogiri/xml/relax_ng.rb +38 -0
  183. data/lib/nokogiri/xml/sax/document.rb +167 -0
  184. data/lib/nokogiri/xml/sax/parser.rb +125 -0
  185. data/lib/nokogiri/xml/sax/parser_context.rb +21 -0
  186. data/lib/nokogiri/xml/sax/push_parser.rb +61 -0
  187. data/lib/nokogiri/xml/sax.rb +6 -0
  188. data/lib/nokogiri/xml/schema.rb +73 -0
  189. data/lib/nokogiri/xml/searchable.rb +270 -0
  190. data/lib/nokogiri/xml/syntax_error.rb +72 -0
  191. data/lib/nokogiri/xml/text.rb +11 -0
  192. data/lib/nokogiri/xml/xpath/syntax_error.rb +13 -0
  193. data/lib/nokogiri/xml/xpath.rb +21 -0
  194. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  195. data/lib/nokogiri/xml.rb +76 -0
  196. data/lib/nokogiri/xslt/stylesheet.rb +27 -0
  197. data/lib/nokogiri/xslt.rb +65 -0
  198. data/lib/nokogiri.rb +120 -0
  199. data/lib/xsd/xmlparser/nokogiri.rb +104 -0
  200. 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, &paramobj);
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 `&AElig;` 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
@@ -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