nokogiri 1.10.3 → 1.12.5

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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/LICENSE-DEPENDENCIES.md +1173 -884
  4. data/LICENSE.md +1 -1
  5. data/README.md +176 -96
  6. data/dependencies.yml +28 -26
  7. data/ext/nokogiri/depend +38 -358
  8. data/ext/nokogiri/extconf.rb +716 -414
  9. data/ext/nokogiri/gumbo.c +584 -0
  10. data/ext/nokogiri/html4_document.c +166 -0
  11. data/ext/nokogiri/html4_element_description.c +294 -0
  12. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  13. data/ext/nokogiri/html4_sax_parser_context.c +120 -0
  14. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  15. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  16. data/ext/nokogiri/nokogiri.c +228 -91
  17. data/ext/nokogiri/nokogiri.h +191 -89
  18. data/ext/nokogiri/test_global_handlers.c +40 -0
  19. data/ext/nokogiri/xml_attr.c +15 -15
  20. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  21. data/ext/nokogiri/xml_cdata.c +13 -18
  22. data/ext/nokogiri/xml_comment.c +19 -26
  23. data/ext/nokogiri/xml_document.c +267 -195
  24. data/ext/nokogiri/xml_document_fragment.c +13 -15
  25. data/ext/nokogiri/xml_dtd.c +54 -48
  26. data/ext/nokogiri/xml_element_content.c +31 -26
  27. data/ext/nokogiri/xml_element_decl.c +22 -22
  28. data/ext/nokogiri/xml_encoding_handler.c +28 -17
  29. data/ext/nokogiri/xml_entity_decl.c +32 -30
  30. data/ext/nokogiri/xml_entity_reference.c +16 -18
  31. data/ext/nokogiri/xml_namespace.c +60 -51
  32. data/ext/nokogiri/xml_node.c +493 -407
  33. data/ext/nokogiri/xml_node_set.c +174 -162
  34. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  35. data/ext/nokogiri/xml_reader.c +197 -172
  36. data/ext/nokogiri/xml_relax_ng.c +52 -28
  37. data/ext/nokogiri/xml_sax_parser.c +112 -112
  38. data/ext/nokogiri/xml_sax_parser_context.c +105 -86
  39. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  40. data/ext/nokogiri/xml_schema.c +112 -33
  41. data/ext/nokogiri/xml_syntax_error.c +42 -21
  42. data/ext/nokogiri/xml_text.c +13 -17
  43. data/ext/nokogiri/xml_xpath_context.c +158 -73
  44. data/ext/nokogiri/xslt_stylesheet.c +158 -164
  45. data/gumbo-parser/CHANGES.md +63 -0
  46. data/gumbo-parser/Makefile +101 -0
  47. data/gumbo-parser/THANKS +27 -0
  48. data/gumbo-parser/src/Makefile +34 -0
  49. data/gumbo-parser/src/README.md +41 -0
  50. data/gumbo-parser/src/ascii.c +75 -0
  51. data/gumbo-parser/src/ascii.h +115 -0
  52. data/gumbo-parser/src/attribute.c +42 -0
  53. data/gumbo-parser/src/attribute.h +17 -0
  54. data/gumbo-parser/src/char_ref.c +22225 -0
  55. data/gumbo-parser/src/char_ref.h +29 -0
  56. data/gumbo-parser/src/char_ref.rl +2154 -0
  57. data/gumbo-parser/src/error.c +626 -0
  58. data/gumbo-parser/src/error.h +148 -0
  59. data/gumbo-parser/src/foreign_attrs.c +104 -0
  60. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  61. data/gumbo-parser/src/gumbo.h +943 -0
  62. data/gumbo-parser/src/insertion_mode.h +33 -0
  63. data/gumbo-parser/src/macros.h +91 -0
  64. data/gumbo-parser/src/parser.c +4886 -0
  65. data/gumbo-parser/src/parser.h +41 -0
  66. data/gumbo-parser/src/replacement.h +33 -0
  67. data/gumbo-parser/src/string_buffer.c +103 -0
  68. data/gumbo-parser/src/string_buffer.h +68 -0
  69. data/gumbo-parser/src/string_piece.c +48 -0
  70. data/gumbo-parser/src/svg_attrs.c +174 -0
  71. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  72. data/gumbo-parser/src/svg_tags.c +137 -0
  73. data/gumbo-parser/src/svg_tags.gperf +55 -0
  74. data/gumbo-parser/src/tag.c +222 -0
  75. data/gumbo-parser/src/tag_lookup.c +382 -0
  76. data/gumbo-parser/src/tag_lookup.gperf +169 -0
  77. data/gumbo-parser/src/tag_lookup.h +13 -0
  78. data/gumbo-parser/src/token_buffer.c +79 -0
  79. data/gumbo-parser/src/token_buffer.h +71 -0
  80. data/gumbo-parser/src/token_type.h +17 -0
  81. data/gumbo-parser/src/tokenizer.c +3463 -0
  82. data/gumbo-parser/src/tokenizer.h +112 -0
  83. data/gumbo-parser/src/tokenizer_states.h +339 -0
  84. data/gumbo-parser/src/utf8.c +245 -0
  85. data/gumbo-parser/src/utf8.h +164 -0
  86. data/gumbo-parser/src/util.c +68 -0
  87. data/gumbo-parser/src/util.h +30 -0
  88. data/gumbo-parser/src/vector.c +111 -0
  89. data/gumbo-parser/src/vector.h +45 -0
  90. data/lib/nokogiri/css/node.rb +1 -0
  91. data/lib/nokogiri/css/parser.rb +64 -63
  92. data/lib/nokogiri/css/parser.y +3 -3
  93. data/lib/nokogiri/css/parser_extras.rb +39 -36
  94. data/lib/nokogiri/css/syntax_error.rb +2 -1
  95. data/lib/nokogiri/css/tokenizer.rb +105 -103
  96. data/lib/nokogiri/css/xpath_visitor.rb +73 -43
  97. data/lib/nokogiri/css.rb +15 -14
  98. data/lib/nokogiri/decorators/slop.rb +1 -0
  99. data/lib/nokogiri/extension.rb +31 -0
  100. data/lib/nokogiri/gumbo.rb +14 -0
  101. data/lib/nokogiri/html.rb +32 -27
  102. data/lib/nokogiri/{html → html4}/builder.rb +3 -2
  103. data/lib/nokogiri/{html → html4}/document.rb +17 -30
  104. data/lib/nokogiri/{html → html4}/document_fragment.rb +18 -17
  105. data/lib/nokogiri/{html → html4}/element_description.rb +2 -1
  106. data/lib/nokogiri/{html → html4}/element_description_defaults.rb +2 -1
  107. data/lib/nokogiri/{html → html4}/entity_lookup.rb +2 -1
  108. data/lib/nokogiri/{html → html4}/sax/parser.rb +12 -14
  109. data/lib/nokogiri/html4/sax/parser_context.rb +19 -0
  110. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +6 -5
  111. data/lib/nokogiri/html4.rb +40 -0
  112. data/lib/nokogiri/html5/document.rb +74 -0
  113. data/lib/nokogiri/html5/document_fragment.rb +80 -0
  114. data/lib/nokogiri/html5/node.rb +93 -0
  115. data/lib/nokogiri/html5.rb +473 -0
  116. data/lib/nokogiri/jruby/dependencies.rb +20 -0
  117. data/lib/nokogiri/syntax_error.rb +1 -0
  118. data/lib/nokogiri/version/constant.rb +5 -0
  119. data/lib/nokogiri/version/info.rb +215 -0
  120. data/lib/nokogiri/version.rb +3 -109
  121. data/lib/nokogiri/xml/attr.rb +1 -0
  122. data/lib/nokogiri/xml/attribute_decl.rb +1 -0
  123. data/lib/nokogiri/xml/builder.rb +74 -32
  124. data/lib/nokogiri/xml/cdata.rb +1 -0
  125. data/lib/nokogiri/xml/character_data.rb +1 -0
  126. data/lib/nokogiri/xml/document.rb +138 -41
  127. data/lib/nokogiri/xml/document_fragment.rb +5 -6
  128. data/lib/nokogiri/xml/dtd.rb +1 -0
  129. data/lib/nokogiri/xml/element_content.rb +1 -0
  130. data/lib/nokogiri/xml/element_decl.rb +1 -0
  131. data/lib/nokogiri/xml/entity_decl.rb +1 -0
  132. data/lib/nokogiri/xml/entity_reference.rb +1 -0
  133. data/lib/nokogiri/xml/namespace.rb +1 -0
  134. data/lib/nokogiri/xml/node/save_options.rb +2 -1
  135. data/lib/nokogiri/xml/node.rb +629 -293
  136. data/lib/nokogiri/xml/node_set.rb +1 -0
  137. data/lib/nokogiri/xml/notation.rb +1 -0
  138. data/lib/nokogiri/xml/parse_options.rb +12 -3
  139. data/lib/nokogiri/xml/pp/character_data.rb +1 -0
  140. data/lib/nokogiri/xml/pp/node.rb +1 -0
  141. data/lib/nokogiri/xml/pp.rb +3 -2
  142. data/lib/nokogiri/xml/processing_instruction.rb +1 -0
  143. data/lib/nokogiri/xml/reader.rb +9 -12
  144. data/lib/nokogiri/xml/relax_ng.rb +7 -2
  145. data/lib/nokogiri/xml/sax/document.rb +25 -30
  146. data/lib/nokogiri/xml/sax/parser.rb +1 -0
  147. data/lib/nokogiri/xml/sax/parser_context.rb +1 -0
  148. data/lib/nokogiri/xml/sax/push_parser.rb +1 -0
  149. data/lib/nokogiri/xml/sax.rb +5 -4
  150. data/lib/nokogiri/xml/schema.rb +13 -4
  151. data/lib/nokogiri/xml/searchable.rb +25 -16
  152. data/lib/nokogiri/xml/syntax_error.rb +1 -0
  153. data/lib/nokogiri/xml/text.rb +1 -0
  154. data/lib/nokogiri/xml/xpath/syntax_error.rb +2 -1
  155. data/lib/nokogiri/xml/xpath.rb +4 -5
  156. data/lib/nokogiri/xml/xpath_context.rb +1 -0
  157. data/lib/nokogiri/xml.rb +36 -36
  158. data/lib/nokogiri/xslt/stylesheet.rb +2 -1
  159. data/lib/nokogiri/xslt.rb +17 -16
  160. data/lib/nokogiri.rb +32 -51
  161. data/lib/xsd/xmlparser/nokogiri.rb +1 -0
  162. data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
  163. data/patches/libxml2/{0003-Update-entities-to-remove-handling-of-ssi.patch → 0002-Update-entities-to-remove-handling-of-ssi.patch} +0 -0
  164. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  165. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  166. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  167. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +2511 -0
  168. data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +31 -0
  169. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
  170. data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +19 -0
  171. data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
  172. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
  173. metadata +151 -153
  174. data/ext/nokogiri/html_document.c +0 -170
  175. data/ext/nokogiri/html_document.h +0 -10
  176. data/ext/nokogiri/html_element_description.c +0 -279
  177. data/ext/nokogiri/html_element_description.h +0 -10
  178. data/ext/nokogiri/html_entity_lookup.c +0 -32
  179. data/ext/nokogiri/html_entity_lookup.h +0 -8
  180. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  181. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  182. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  183. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  184. data/ext/nokogiri/xml_attr.h +0 -9
  185. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  186. data/ext/nokogiri/xml_cdata.h +0 -9
  187. data/ext/nokogiri/xml_comment.h +0 -9
  188. data/ext/nokogiri/xml_document.h +0 -23
  189. data/ext/nokogiri/xml_document_fragment.h +0 -10
  190. data/ext/nokogiri/xml_dtd.h +0 -10
  191. data/ext/nokogiri/xml_element_content.h +0 -10
  192. data/ext/nokogiri/xml_element_decl.h +0 -9
  193. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  194. data/ext/nokogiri/xml_entity_decl.h +0 -10
  195. data/ext/nokogiri/xml_entity_reference.h +0 -9
  196. data/ext/nokogiri/xml_io.c +0 -61
  197. data/ext/nokogiri/xml_io.h +0 -11
  198. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  199. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  200. data/ext/nokogiri/xml_namespace.h +0 -14
  201. data/ext/nokogiri/xml_node.h +0 -13
  202. data/ext/nokogiri/xml_node_set.h +0 -12
  203. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  204. data/ext/nokogiri/xml_reader.h +0 -10
  205. data/ext/nokogiri/xml_relax_ng.h +0 -9
  206. data/ext/nokogiri/xml_sax_parser.h +0 -39
  207. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  208. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  209. data/ext/nokogiri/xml_schema.h +0 -9
  210. data/ext/nokogiri/xml_syntax_error.h +0 -13
  211. data/ext/nokogiri/xml_text.h +0 -9
  212. data/ext/nokogiri/xml_xpath_context.h +0 -10
  213. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  214. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  215. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  216. data/patches/libxslt/0001-Fix-security-framework-bypass.patch +0 -120
  217. data/ports/archives/libxml2-2.9.9.tar.gz +0 -0
  218. data/ports/archives/libxslt-1.1.33.tar.gz +0 -0
@@ -1,29 +1,107 @@
1
- #include <xml_xpath_context.h>
1
+ #include <nokogiri.h>
2
2
 
3
- int vasprintf (char **strp, const char *fmt, va_list ap);
3
+ VALUE cNokogiriXmlXpathContext;
4
+
5
+ /*
6
+ * these constants have matching declarations in
7
+ * ext/java/nokogiri/internals/NokogiriNamespaceContext.java
8
+ */
9
+ static const xmlChar *NOKOGIRI_BUILTIN_PREFIX = (const xmlChar *)"nokogiri-builtin";
10
+ static const xmlChar *NOKOGIRI_BUILTIN_URI = (const xmlChar *)"https://www.nokogiri.org/default_ns/ruby/builtins";
4
11
 
5
- static void deallocate(xmlXPathContextPtr ctx)
12
+ static void
13
+ deallocate(xmlXPathContextPtr ctx)
6
14
  {
7
15
  NOKOGIRI_DEBUG_START(ctx);
8
16
  xmlXPathFreeContext(ctx);
9
17
  NOKOGIRI_DEBUG_END(ctx);
10
18
  }
11
19
 
20
+ /* find a CSS class in an HTML element's `class` attribute */
21
+ static const xmlChar *
22
+ builtin_css_class(const xmlChar *str, const xmlChar *val)
23
+ {
24
+ int val_len;
25
+
26
+ if (str == NULL) { return (NULL); }
27
+ if (val == NULL) { return (NULL); }
28
+
29
+ val_len = xmlStrlen(val);
30
+ if (val_len == 0) { return (str); }
31
+
32
+ while (*str != 0) {
33
+ if ((*str == *val) && !xmlStrncmp(str, val, val_len)) {
34
+ const xmlChar *next_byte = str + val_len;
35
+
36
+ /* only match if the next byte is whitespace or end of string */
37
+ if ((*next_byte == 0) || (IS_BLANK_CH(*next_byte))) {
38
+ return ((const xmlChar *)str);
39
+ }
40
+ }
41
+
42
+ /* advance str to whitespace */
43
+ while ((*str != 0) && !IS_BLANK_CH(*str)) {
44
+ str++;
45
+ }
46
+
47
+ /* advance str to start of next word or end of string */
48
+ while ((*str != 0) && IS_BLANK_CH(*str)) {
49
+ str++;
50
+ }
51
+ }
52
+
53
+ return (NULL);
54
+ }
55
+
56
+ /* xmlXPathFunction to wrap builtin_css_class() */
57
+ static void
58
+ xpath_builtin_css_class(xmlXPathParserContextPtr ctxt, int nargs)
59
+ {
60
+ xmlXPathObjectPtr hay, needle;
61
+
62
+ CHECK_ARITY(2);
63
+
64
+ CAST_TO_STRING;
65
+ needle = valuePop(ctxt);
66
+ if ((needle == NULL) || (needle->type != XPATH_STRING)) {
67
+ xmlXPathFreeObject(needle);
68
+ XP_ERROR(XPATH_INVALID_TYPE);
69
+ }
70
+
71
+ CAST_TO_STRING;
72
+ hay = valuePop(ctxt);
73
+ if ((hay == NULL) || (hay->type != XPATH_STRING)) {
74
+ xmlXPathFreeObject(hay);
75
+ xmlXPathFreeObject(needle);
76
+ XP_ERROR(XPATH_INVALID_TYPE);
77
+ }
78
+
79
+ if (builtin_css_class(hay->stringval, needle->stringval)) {
80
+ valuePush(ctxt, xmlXPathNewBoolean(1));
81
+ } else {
82
+ valuePush(ctxt, xmlXPathNewBoolean(0));
83
+ }
84
+
85
+ xmlXPathFreeObject(hay);
86
+ xmlXPathFreeObject(needle);
87
+ }
88
+
12
89
  /*
13
90
  * call-seq:
14
91
  * register_ns(prefix, uri)
15
92
  *
16
93
  * Register the namespace with +prefix+ and +uri+.
17
94
  */
18
- static VALUE register_ns(VALUE self, VALUE prefix, VALUE uri)
95
+ static VALUE
96
+ register_ns(VALUE self, VALUE prefix, VALUE uri)
19
97
  {
20
98
  xmlXPathContextPtr ctx;
21
99
  Data_Get_Struct(self, xmlXPathContext, ctx);
22
100
 
23
- xmlXPathRegisterNs( ctx,
24
- (const xmlChar *)StringValueCStr(prefix),
25
- (const xmlChar *)StringValueCStr(uri)
26
- );
101
+ xmlXPathRegisterNs(ctx,
102
+ (const xmlChar *)StringValueCStr(prefix),
103
+ (const xmlChar *)StringValueCStr(uri)
104
+ );
27
105
  return self;
28
106
  }
29
107
 
@@ -33,23 +111,26 @@ static VALUE register_ns(VALUE self, VALUE prefix, VALUE uri)
33
111
  *
34
112
  * Register the variable +name+ with +value+.
35
113
  */
36
- static VALUE register_variable(VALUE self, VALUE name, VALUE value)
114
+ static VALUE
115
+ register_variable(VALUE self, VALUE name, VALUE value)
37
116
  {
38
- xmlXPathContextPtr ctx;
39
- xmlXPathObjectPtr xmlValue;
40
- Data_Get_Struct(self, xmlXPathContext, ctx);
117
+ xmlXPathContextPtr ctx;
118
+ xmlXPathObjectPtr xmlValue;
119
+ Data_Get_Struct(self, xmlXPathContext, ctx);
41
120
 
42
- xmlValue = xmlXPathNewCString(StringValueCStr(value));
121
+ xmlValue = xmlXPathNewCString(StringValueCStr(value));
43
122
 
44
- xmlXPathRegisterVariable( ctx,
45
- (const xmlChar *)StringValueCStr(name),
46
- xmlValue
47
- );
123
+ xmlXPathRegisterVariable(ctx,
124
+ (const xmlChar *)StringValueCStr(name),
125
+ xmlValue
126
+ );
48
127
 
49
- return self;
128
+ return self;
50
129
  }
51
130
 
52
- void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr ctx, int nargs, VALUE handler, const char* function_name)
131
+ void
132
+ Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr ctx, int nargs, VALUE handler,
133
+ const char *function_name)
53
134
  {
54
135
  int i;
55
136
  VALUE result, doc;
@@ -72,7 +153,7 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c
72
153
  i = nargs - 1;
73
154
  do {
74
155
  obj = valuePop(ctx);
75
- switch(obj->type) {
156
+ switch (obj->type) {
76
157
  case XPATH_STRING:
77
158
  argv[i] = NOKOGIRI_STR_NEW2(obj->stringval);
78
159
  break;
@@ -83,23 +164,23 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c
83
164
  argv[i] = rb_float_new(obj->floatval);
84
165
  break;
85
166
  case XPATH_NODESET:
86
- argv[i] = Nokogiri_wrap_xml_node_set(obj->nodesetval, doc);
167
+ argv[i] = noko_xml_node_set_wrap(obj->nodesetval, doc);
87
168
  break;
88
169
  default:
89
170
  argv[i] = NOKOGIRI_STR_NEW2(xmlXPathCastToString(obj));
90
171
  }
91
172
  xmlXPathFreeNodeSetList(obj);
92
- } while(i-- > 0);
173
+ } while (i-- > 0);
93
174
  }
94
175
 
95
- result = rb_funcall2(handler, rb_intern((const char*)function_name), nargs, argv);
176
+ result = rb_funcall2(handler, rb_intern((const char *)function_name), nargs, argv);
96
177
 
97
178
  for (i = 0 ; i < nargs ; ++i) {
98
179
  rb_gc_unregister_address(&argv[i]);
99
180
  }
100
181
  free(argv);
101
182
 
102
- switch(TYPE(result)) {
183
+ switch (TYPE(result)) {
103
184
  case T_FLOAT:
104
185
  case T_BIGNUM:
105
186
  case T_FIXNUM:
@@ -107,8 +188,8 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c
107
188
  break;
108
189
  case T_STRING:
109
190
  xmlXPathReturnString(
110
- ctx,
111
- xmlCharStrdup(StringValueCStr(result))
191
+ ctx,
192
+ xmlCharStrdup(StringValueCStr(result))
112
193
  );
113
194
  break;
114
195
  case T_TRUE:
@@ -119,18 +200,17 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c
119
200
  break;
120
201
  case T_NIL:
121
202
  break;
122
- case T_ARRAY:
123
- {
124
- VALUE args[2];
125
- args[0] = doc;
126
- args[1] = result;
127
- node_set = rb_class_new_instance(2, args, cNokogiriXmlNodeSet);
128
- Data_Get_Struct(node_set, xmlNodeSet, xml_node_set);
129
- xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
130
- }
203
+ case T_ARRAY: {
204
+ VALUE args[2];
205
+ args[0] = doc;
206
+ args[1] = result;
207
+ node_set = rb_class_new_instance(2, args, cNokogiriXmlNodeSet);
208
+ Data_Get_Struct(node_set, xmlNodeSet, xml_node_set);
209
+ xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
210
+ }
131
211
  break;
132
212
  case T_DATA:
133
- if(rb_obj_is_kind_of(result, cNokogiriXmlNodeSet)) {
213
+ if (rb_obj_is_kind_of(result, cNokogiriXmlNodeSet)) {
134
214
  Data_Get_Struct(result, xmlNodeSet, xml_node_set);
135
215
  /* Copy the node set, otherwise it will get GC'd. */
136
216
  xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
@@ -138,10 +218,11 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c
138
218
  }
139
219
  default:
140
220
  rb_raise(rb_eRuntimeError, "Invalid return type");
141
- }
221
+ }
142
222
  }
143
223
 
144
- static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
224
+ static void
225
+ ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
145
226
  {
146
227
  VALUE handler = Qnil;
147
228
  const char *function = NULL ;
@@ -152,26 +233,29 @@ static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
152
233
  assert(ctx->context->function);
153
234
 
154
235
  handler = (VALUE)(ctx->context->userData);
155
- function = (const char*)(ctx->context->function);
236
+ function = (const char *)(ctx->context->function);
156
237
 
157
238
  Nokogiri_marshal_xpath_funcall_and_return_values(ctx, nargs, handler, function);
158
239
  }
159
240
 
160
- static xmlXPathFunction lookup( void *ctx,
161
- const xmlChar * name,
162
- const xmlChar* ns_uri )
241
+ static xmlXPathFunction
242
+ lookup(void *ctx,
243
+ const xmlChar *name,
244
+ const xmlChar *ns_uri)
163
245
  {
164
246
  VALUE xpath_handler = (VALUE)ctx;
165
- if(rb_respond_to(xpath_handler, rb_intern((const char *)name)))
247
+ if (rb_respond_to(xpath_handler, rb_intern((const char *)name))) {
166
248
  return ruby_funcall;
249
+ }
167
250
 
168
251
  return NULL;
169
252
  }
170
253
 
171
- NORETURN(static void xpath_generic_exception_handler(void * ctx, const char *msg, ...));
172
- static void xpath_generic_exception_handler(void * ctx, const char *msg, ...)
254
+ NORETURN(static void xpath_generic_exception_handler(void *ctx, const char *msg, ...));
255
+ static void
256
+ xpath_generic_exception_handler(void *ctx, const char *msg, ...)
173
257
  {
174
- char * message;
258
+ char *message;
175
259
 
176
260
  va_list args;
177
261
  va_start(args, msg);
@@ -187,7 +271,8 @@ static void xpath_generic_exception_handler(void * ctx, const char *msg, ...)
187
271
  *
188
272
  * Evaluate the +search_path+ returning an XML::XPath object.
189
273
  */
190
- static VALUE evaluate(int argc, VALUE *argv, VALUE self)
274
+ static VALUE
275
+ evaluate(int argc, VALUE *argv, VALUE self)
191
276
  {
192
277
  VALUE search_path, xpath_handler;
193
278
  VALUE thing = Qnil;
@@ -197,12 +282,13 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
197
282
 
198
283
  Data_Get_Struct(self, xmlXPathContext, ctx);
199
284
 
200
- if(rb_scan_args(argc, argv, "11", &search_path, &xpath_handler) == 1)
285
+ if (rb_scan_args(argc, argv, "11", &search_path, &xpath_handler) == 1) {
201
286
  xpath_handler = Qnil;
287
+ }
202
288
 
203
289
  query = (xmlChar *)StringValueCStr(search_path);
204
290
 
205
- if(Qnil != xpath_handler) {
291
+ if (Qnil != xpath_handler) {
206
292
  /* FIXME: not sure if this is the correct place to shove private data. */
207
293
  ctx->userData = (void *)xpath_handler;
208
294
  xmlXPathRegisterFuncLookup(ctx, lookup, (void *)xpath_handler);
@@ -219,7 +305,7 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
219
305
  xmlSetStructuredErrorFunc(NULL, NULL);
220
306
  xmlSetGenericErrorFunc(NULL, NULL);
221
307
 
222
- if(xpath == NULL) {
308
+ if (xpath == NULL) {
223
309
  xmlErrorPtr error = xmlGetLastError();
224
310
  rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
225
311
  }
@@ -227,14 +313,14 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
227
313
  assert(ctx->doc);
228
314
  assert(DOC_RUBY_OBJECT_TEST(ctx->doc));
229
315
 
230
- switch(xpath->type) {
316
+ switch (xpath->type) {
231
317
  case XPATH_STRING:
232
318
  thing = NOKOGIRI_STR_NEW2(xpath->stringval);
233
319
  xmlFree(xpath->stringval);
234
320
  break;
235
321
  case XPATH_NODESET:
236
- thing = Nokogiri_wrap_xml_node_set(xpath->nodesetval,
237
- DOC_RUBY_OBJECT(ctx->doc));
322
+ thing = noko_xml_node_set_wrap(xpath->nodesetval,
323
+ DOC_RUBY_OBJECT(ctx->doc));
238
324
  break;
239
325
  case XPATH_NUMBER:
240
326
  thing = rb_float_new(xpath->floatval);
@@ -243,7 +329,7 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
243
329
  thing = xpath->boolval == 1 ? Qtrue : Qfalse;
244
330
  break;
245
331
  default:
246
- thing = Nokogiri_wrap_xml_node_set(NULL, DOC_RUBY_OBJECT(ctx->doc));
332
+ thing = noko_xml_node_set_wrap(NULL, DOC_RUBY_OBJECT(ctx->doc));
247
333
  }
248
334
 
249
335
  xmlXPathFreeNodeSetList(xpath);
@@ -257,42 +343,41 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
257
343
  *
258
344
  * Create a new XPathContext with +node+ as the reference point.
259
345
  */
260
- static VALUE new(VALUE klass, VALUE nodeobj)
346
+ static VALUE
347
+ new (VALUE klass, VALUE nodeobj)
261
348
  {
262
349
  xmlNodePtr node;
263
350
  xmlXPathContextPtr ctx;
264
351
  VALUE self;
265
352
 
266
- xmlXPathInit();
267
-
268
353
  Data_Get_Struct(nodeobj, xmlNode, node);
269
354
 
355
+ xmlXPathInit();
356
+
270
357
  ctx = xmlXPathNewContext(node->doc);
271
358
  ctx->node = node;
359
+
360
+ xmlXPathRegisterNs(ctx, NOKOGIRI_BUILTIN_PREFIX, NOKOGIRI_BUILTIN_URI);
361
+ xmlXPathRegisterFuncNS(ctx, (const xmlChar *)"css-class", NOKOGIRI_BUILTIN_URI,
362
+ xpath_builtin_css_class);
363
+
272
364
  self = Data_Wrap_Struct(klass, 0, deallocate, ctx);
273
- /*rb_iv_set(self, "@xpath_handler", Qnil); */
274
365
  return self;
275
366
  }
276
367
 
277
- VALUE cNokogiriXmlXpathContext;
278
- void init_xml_xpath_context(void)
368
+ void
369
+ noko_init_xml_xpath_context(void)
279
370
  {
280
- VALUE module = rb_define_module("Nokogiri");
281
-
282
- /*
283
- * Nokogiri::XML
284
- */
285
- VALUE xml = rb_define_module_under(module, "XML");
286
-
287
371
  /*
288
372
  * XPathContext is the entry point for searching a Document by using XPath.
289
373
  */
290
- VALUE klass = rb_define_class_under(xml, "XPathContext", rb_cObject);
374
+ cNokogiriXmlXpathContext = rb_define_class_under(mNokogiriXml, "XPathContext", rb_cObject);
375
+
376
+ rb_undef_alloc_func(cNokogiriXmlXpathContext);
291
377
 
292
- cNokogiriXmlXpathContext = klass;
378
+ rb_define_singleton_method(cNokogiriXmlXpathContext, "new", new, 1);
293
379
 
294
- rb_define_singleton_method(klass, "new", new, 1);
295
- rb_define_method(klass, "evaluate", evaluate, -1);
296
- rb_define_method(klass, "register_variable", register_variable, 2);
297
- rb_define_method(klass, "register_ns", register_ns, 2);
380
+ rb_define_method(cNokogiriXmlXpathContext, "evaluate", evaluate, -1);
381
+ rb_define_method(cNokogiriXmlXpathContext, "register_variable", register_variable, 2);
382
+ rb_define_method(cNokogiriXmlXpathContext, "register_ns", register_ns, 2);
298
383
  }