nokogiri 1.18.0-aarch64-linux-gnu

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 (203) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +39 -0
  3. data/LICENSE-DEPENDENCIES.md +2224 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +293 -0
  6. data/bin/nokogiri +131 -0
  7. data/dependencies.yml +42 -0
  8. data/ext/nokogiri/depend +38 -0
  9. data/ext/nokogiri/extconf.rb +1173 -0
  10. data/ext/nokogiri/gumbo.c +610 -0
  11. data/ext/nokogiri/html4_document.c +171 -0
  12. data/ext/nokogiri/html4_element_description.c +299 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser.c +40 -0
  15. data/ext/nokogiri/html4_sax_parser_context.c +98 -0
  16. data/ext/nokogiri/html4_sax_push_parser.c +96 -0
  17. data/ext/nokogiri/include/libexslt/exslt.h +108 -0
  18. data/ext/nokogiri/include/libexslt/exsltconfig.h +70 -0
  19. data/ext/nokogiri/include/libexslt/exsltexports.h +63 -0
  20. data/ext/nokogiri/include/libxml2/libxml/HTMLparser.h +336 -0
  21. data/ext/nokogiri/include/libxml2/libxml/HTMLtree.h +147 -0
  22. data/ext/nokogiri/include/libxml2/libxml/SAX.h +202 -0
  23. data/ext/nokogiri/include/libxml2/libxml/SAX2.h +171 -0
  24. data/ext/nokogiri/include/libxml2/libxml/c14n.h +115 -0
  25. data/ext/nokogiri/include/libxml2/libxml/catalog.h +182 -0
  26. data/ext/nokogiri/include/libxml2/libxml/chvalid.h +230 -0
  27. data/ext/nokogiri/include/libxml2/libxml/debugXML.h +217 -0
  28. data/ext/nokogiri/include/libxml2/libxml/dict.h +82 -0
  29. data/ext/nokogiri/include/libxml2/libxml/encoding.h +244 -0
  30. data/ext/nokogiri/include/libxml2/libxml/entities.h +166 -0
  31. data/ext/nokogiri/include/libxml2/libxml/globals.h +41 -0
  32. data/ext/nokogiri/include/libxml2/libxml/hash.h +251 -0
  33. data/ext/nokogiri/include/libxml2/libxml/list.h +137 -0
  34. data/ext/nokogiri/include/libxml2/libxml/nanoftp.h +186 -0
  35. data/ext/nokogiri/include/libxml2/libxml/nanohttp.h +98 -0
  36. data/ext/nokogiri/include/libxml2/libxml/parser.h +1390 -0
  37. data/ext/nokogiri/include/libxml2/libxml/parserInternals.h +671 -0
  38. data/ext/nokogiri/include/libxml2/libxml/pattern.h +106 -0
  39. data/ext/nokogiri/include/libxml2/libxml/relaxng.h +219 -0
  40. data/ext/nokogiri/include/libxml2/libxml/schemasInternals.h +959 -0
  41. data/ext/nokogiri/include/libxml2/libxml/schematron.h +143 -0
  42. data/ext/nokogiri/include/libxml2/libxml/threads.h +87 -0
  43. data/ext/nokogiri/include/libxml2/libxml/tree.h +1382 -0
  44. data/ext/nokogiri/include/libxml2/libxml/uri.h +106 -0
  45. data/ext/nokogiri/include/libxml2/libxml/valid.h +477 -0
  46. data/ext/nokogiri/include/libxml2/libxml/xinclude.h +136 -0
  47. data/ext/nokogiri/include/libxml2/libxml/xlink.h +189 -0
  48. data/ext/nokogiri/include/libxml2/libxml/xmlIO.h +438 -0
  49. data/ext/nokogiri/include/libxml2/libxml/xmlautomata.h +146 -0
  50. data/ext/nokogiri/include/libxml2/libxml/xmlerror.h +962 -0
  51. data/ext/nokogiri/include/libxml2/libxml/xmlexports.h +146 -0
  52. data/ext/nokogiri/include/libxml2/libxml/xmlmemory.h +188 -0
  53. data/ext/nokogiri/include/libxml2/libxml/xmlmodule.h +57 -0
  54. data/ext/nokogiri/include/libxml2/libxml/xmlreader.h +436 -0
  55. data/ext/nokogiri/include/libxml2/libxml/xmlregexp.h +215 -0
  56. data/ext/nokogiri/include/libxml2/libxml/xmlsave.h +102 -0
  57. data/ext/nokogiri/include/libxml2/libxml/xmlschemas.h +249 -0
  58. data/ext/nokogiri/include/libxml2/libxml/xmlschemastypes.h +152 -0
  59. data/ext/nokogiri/include/libxml2/libxml/xmlstring.h +140 -0
  60. data/ext/nokogiri/include/libxml2/libxml/xmlunicode.h +366 -0
  61. data/ext/nokogiri/include/libxml2/libxml/xmlversion.h +347 -0
  62. data/ext/nokogiri/include/libxml2/libxml/xmlwriter.h +489 -0
  63. data/ext/nokogiri/include/libxml2/libxml/xpath.h +579 -0
  64. data/ext/nokogiri/include/libxml2/libxml/xpathInternals.h +633 -0
  65. data/ext/nokogiri/include/libxml2/libxml/xpointer.h +138 -0
  66. data/ext/nokogiri/include/libxslt/attributes.h +39 -0
  67. data/ext/nokogiri/include/libxslt/documents.h +93 -0
  68. data/ext/nokogiri/include/libxslt/extensions.h +262 -0
  69. data/ext/nokogiri/include/libxslt/extra.h +72 -0
  70. data/ext/nokogiri/include/libxslt/functions.h +78 -0
  71. data/ext/nokogiri/include/libxslt/imports.h +75 -0
  72. data/ext/nokogiri/include/libxslt/keys.h +53 -0
  73. data/ext/nokogiri/include/libxslt/namespaces.h +68 -0
  74. data/ext/nokogiri/include/libxslt/numbersInternals.h +73 -0
  75. data/ext/nokogiri/include/libxslt/pattern.h +84 -0
  76. data/ext/nokogiri/include/libxslt/preproc.h +43 -0
  77. data/ext/nokogiri/include/libxslt/security.h +104 -0
  78. data/ext/nokogiri/include/libxslt/templates.h +77 -0
  79. data/ext/nokogiri/include/libxslt/transform.h +207 -0
  80. data/ext/nokogiri/include/libxslt/variables.h +118 -0
  81. data/ext/nokogiri/include/libxslt/xslt.h +110 -0
  82. data/ext/nokogiri/include/libxslt/xsltInternals.h +1995 -0
  83. data/ext/nokogiri/include/libxslt/xsltconfig.h +146 -0
  84. data/ext/nokogiri/include/libxslt/xsltexports.h +64 -0
  85. data/ext/nokogiri/include/libxslt/xsltlocale.h +44 -0
  86. data/ext/nokogiri/include/libxslt/xsltutils.h +343 -0
  87. data/ext/nokogiri/libxml2_polyfill.c +114 -0
  88. data/ext/nokogiri/nokogiri.c +294 -0
  89. data/ext/nokogiri/nokogiri.h +238 -0
  90. data/ext/nokogiri/test_global_handlers.c +40 -0
  91. data/ext/nokogiri/xml_attr.c +103 -0
  92. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  93. data/ext/nokogiri/xml_cdata.c +62 -0
  94. data/ext/nokogiri/xml_comment.c +57 -0
  95. data/ext/nokogiri/xml_document.c +784 -0
  96. data/ext/nokogiri/xml_document_fragment.c +29 -0
  97. data/ext/nokogiri/xml_dtd.c +208 -0
  98. data/ext/nokogiri/xml_element_content.c +131 -0
  99. data/ext/nokogiri/xml_element_decl.c +69 -0
  100. data/ext/nokogiri/xml_encoding_handler.c +112 -0
  101. data/ext/nokogiri/xml_entity_decl.c +112 -0
  102. data/ext/nokogiri/xml_entity_reference.c +50 -0
  103. data/ext/nokogiri/xml_namespace.c +181 -0
  104. data/ext/nokogiri/xml_node.c +2459 -0
  105. data/ext/nokogiri/xml_node_set.c +518 -0
  106. data/ext/nokogiri/xml_processing_instruction.c +54 -0
  107. data/ext/nokogiri/xml_reader.c +777 -0
  108. data/ext/nokogiri/xml_relax_ng.c +149 -0
  109. data/ext/nokogiri/xml_sax_parser.c +403 -0
  110. data/ext/nokogiri/xml_sax_parser_context.c +390 -0
  111. data/ext/nokogiri/xml_sax_push_parser.c +206 -0
  112. data/ext/nokogiri/xml_schema.c +226 -0
  113. data/ext/nokogiri/xml_syntax_error.c +93 -0
  114. data/ext/nokogiri/xml_text.c +59 -0
  115. data/ext/nokogiri/xml_xpath_context.c +486 -0
  116. data/ext/nokogiri/xslt_stylesheet.c +421 -0
  117. data/gumbo-parser/CHANGES.md +63 -0
  118. data/gumbo-parser/Makefile +129 -0
  119. data/gumbo-parser/THANKS +27 -0
  120. data/lib/nokogiri/3.1/nokogiri.so +0 -0
  121. data/lib/nokogiri/3.2/nokogiri.so +0 -0
  122. data/lib/nokogiri/3.3/nokogiri.so +0 -0
  123. data/lib/nokogiri/3.4/nokogiri.so +0 -0
  124. data/lib/nokogiri/class_resolver.rb +67 -0
  125. data/lib/nokogiri/css/node.rb +58 -0
  126. data/lib/nokogiri/css/parser.rb +772 -0
  127. data/lib/nokogiri/css/parser.y +277 -0
  128. data/lib/nokogiri/css/parser_extras.rb +36 -0
  129. data/lib/nokogiri/css/selector_cache.rb +38 -0
  130. data/lib/nokogiri/css/syntax_error.rb +9 -0
  131. data/lib/nokogiri/css/tokenizer.rb +155 -0
  132. data/lib/nokogiri/css/tokenizer.rex +57 -0
  133. data/lib/nokogiri/css/xpath_visitor.rb +375 -0
  134. data/lib/nokogiri/css.rb +132 -0
  135. data/lib/nokogiri/decorators/slop.rb +42 -0
  136. data/lib/nokogiri/encoding_handler.rb +57 -0
  137. data/lib/nokogiri/extension.rb +32 -0
  138. data/lib/nokogiri/gumbo.rb +15 -0
  139. data/lib/nokogiri/html.rb +48 -0
  140. data/lib/nokogiri/html4/builder.rb +37 -0
  141. data/lib/nokogiri/html4/document.rb +235 -0
  142. data/lib/nokogiri/html4/document_fragment.rb +166 -0
  143. data/lib/nokogiri/html4/element_description.rb +25 -0
  144. data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
  145. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  146. data/lib/nokogiri/html4/entity_lookup.rb +15 -0
  147. data/lib/nokogiri/html4/sax/parser.rb +48 -0
  148. data/lib/nokogiri/html4/sax/parser_context.rb +15 -0
  149. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  150. data/lib/nokogiri/html4.rb +42 -0
  151. data/lib/nokogiri/html5/builder.rb +40 -0
  152. data/lib/nokogiri/html5/document.rb +199 -0
  153. data/lib/nokogiri/html5/document_fragment.rb +200 -0
  154. data/lib/nokogiri/html5/node.rb +103 -0
  155. data/lib/nokogiri/html5.rb +368 -0
  156. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  157. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  158. data/lib/nokogiri/syntax_error.rb +6 -0
  159. data/lib/nokogiri/version/constant.rb +6 -0
  160. data/lib/nokogiri/version/info.rb +224 -0
  161. data/lib/nokogiri/version.rb +4 -0
  162. data/lib/nokogiri/xml/attr.rb +66 -0
  163. data/lib/nokogiri/xml/attribute_decl.rb +22 -0
  164. data/lib/nokogiri/xml/builder.rb +494 -0
  165. data/lib/nokogiri/xml/cdata.rb +13 -0
  166. data/lib/nokogiri/xml/character_data.rb +9 -0
  167. data/lib/nokogiri/xml/document.rb +514 -0
  168. data/lib/nokogiri/xml/document_fragment.rb +276 -0
  169. data/lib/nokogiri/xml/dtd.rb +34 -0
  170. data/lib/nokogiri/xml/element_content.rb +46 -0
  171. data/lib/nokogiri/xml/element_decl.rb +17 -0
  172. data/lib/nokogiri/xml/entity_decl.rb +23 -0
  173. data/lib/nokogiri/xml/entity_reference.rb +20 -0
  174. data/lib/nokogiri/xml/namespace.rb +57 -0
  175. data/lib/nokogiri/xml/node/save_options.rb +76 -0
  176. data/lib/nokogiri/xml/node.rb +1650 -0
  177. data/lib/nokogiri/xml/node_set.rb +449 -0
  178. data/lib/nokogiri/xml/notation.rb +19 -0
  179. data/lib/nokogiri/xml/parse_options.rb +213 -0
  180. data/lib/nokogiri/xml/pp/character_data.rb +21 -0
  181. data/lib/nokogiri/xml/pp/node.rb +73 -0
  182. data/lib/nokogiri/xml/pp.rb +4 -0
  183. data/lib/nokogiri/xml/processing_instruction.rb +11 -0
  184. data/lib/nokogiri/xml/reader.rb +139 -0
  185. data/lib/nokogiri/xml/relax_ng.rb +75 -0
  186. data/lib/nokogiri/xml/sax/document.rb +258 -0
  187. data/lib/nokogiri/xml/sax/parser.rb +199 -0
  188. data/lib/nokogiri/xml/sax/parser_context.rb +129 -0
  189. data/lib/nokogiri/xml/sax/push_parser.rb +64 -0
  190. data/lib/nokogiri/xml/sax.rb +54 -0
  191. data/lib/nokogiri/xml/schema.rb +140 -0
  192. data/lib/nokogiri/xml/searchable.rb +274 -0
  193. data/lib/nokogiri/xml/syntax_error.rb +94 -0
  194. data/lib/nokogiri/xml/text.rb +11 -0
  195. data/lib/nokogiri/xml/xpath/syntax_error.rb +13 -0
  196. data/lib/nokogiri/xml/xpath.rb +21 -0
  197. data/lib/nokogiri/xml/xpath_context.rb +27 -0
  198. data/lib/nokogiri/xml.rb +65 -0
  199. data/lib/nokogiri/xslt/stylesheet.rb +49 -0
  200. data/lib/nokogiri/xslt.rb +129 -0
  201. data/lib/nokogiri.rb +128 -0
  202. data/lib/xsd/xmlparser/nokogiri.rb +105 -0
  203. metadata +321 -0
@@ -0,0 +1,518 @@
1
+ #include <nokogiri.h>
2
+
3
+ VALUE cNokogiriXmlNodeSet ;
4
+
5
+ static ID decorate ;
6
+
7
+ static void
8
+ Check_Node_Set_Node_Type(VALUE node)
9
+ {
10
+ if (!(rb_obj_is_kind_of(node, cNokogiriXmlNode) ||
11
+ rb_obj_is_kind_of(node, cNokogiriXmlNamespace))) {
12
+ rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace");
13
+ }
14
+ }
15
+
16
+
17
+ static
18
+ VALUE
19
+ ruby_object_get(xmlNodePtr c_node)
20
+ {
21
+ /* see xmlElementType in libxml2 tree.h */
22
+ switch (c_node->type) {
23
+ case XML_NAMESPACE_DECL:
24
+ /* _private is later in the namespace struct */
25
+ return (VALUE)(((xmlNsPtr)c_node)->_private);
26
+
27
+ case XML_DOCUMENT_NODE:
28
+ case XML_HTML_DOCUMENT_NODE:
29
+ /* in documents we use _private to store a tuple */
30
+ if (DOC_RUBY_OBJECT_TEST(((xmlDocPtr)c_node))) {
31
+ return DOC_RUBY_OBJECT((xmlDocPtr)c_node);
32
+ }
33
+ return (VALUE)NULL;
34
+
35
+ default:
36
+ return (VALUE)(c_node->_private);
37
+ }
38
+ }
39
+
40
+
41
+ static void
42
+ xml_node_set_mark(void *data)
43
+ {
44
+ xmlNodeSetPtr node_set = data;
45
+ VALUE rb_node;
46
+ int jnode;
47
+
48
+ for (jnode = 0; jnode < node_set->nodeNr; jnode++) {
49
+ rb_node = ruby_object_get(node_set->nodeTab[jnode]);
50
+ if (rb_node) {
51
+ rb_gc_mark(rb_node);
52
+ }
53
+ }
54
+ }
55
+
56
+ static void
57
+ xml_node_set_deallocate(void *data)
58
+ {
59
+ xmlNodeSetPtr node_set = data;
60
+ /*
61
+ * For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the
62
+ * offending call to xmlXPathNodeSetFreeNs().
63
+ */
64
+ if (node_set->nodeTab != NULL) {
65
+ xmlFree(node_set->nodeTab);
66
+ }
67
+
68
+ xmlFree(node_set);
69
+ }
70
+
71
+ static const rb_data_type_t xml_node_set_type = {
72
+ .wrap_struct_name = "xmlNodeSet",
73
+ .function = {
74
+ .dmark = xml_node_set_mark,
75
+ .dfree = xml_node_set_deallocate,
76
+ },
77
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY,
78
+ };
79
+
80
+ static VALUE
81
+ xml_node_set_allocate(VALUE klass)
82
+ {
83
+ return TypedData_Wrap_Struct(klass, &xml_node_set_type, xmlXPathNodeSetCreate(NULL));
84
+ }
85
+
86
+ /* :nodoc: */
87
+ static VALUE
88
+ rb_xml_node_set_initialize_copy(VALUE rb_self, VALUE rb_other)
89
+ {
90
+ xmlNodeSetPtr c_self, c_other;
91
+ VALUE rb_document;
92
+
93
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
94
+ TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
95
+
96
+ xmlXPathNodeSetMerge(c_self, c_other);
97
+
98
+ rb_document = rb_iv_get(rb_other, "@document");
99
+ if (!NIL_P(rb_document)) {
100
+ rb_iv_set(rb_self, "@document", rb_document);
101
+ rb_funcall(rb_document, decorate, 1, rb_self);
102
+ }
103
+
104
+ return rb_self;
105
+ }
106
+
107
+ static void
108
+ xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val)
109
+ {
110
+ /*
111
+ * For reasons outlined in xml_namespace.c, here we reproduce xmlXPathNodeSetDel() except for the
112
+ * offending call to xmlXPathNodeSetFreeNs().
113
+ */
114
+ int i;
115
+
116
+ if (cur == NULL) { return; }
117
+ if (val == NULL) { return; }
118
+
119
+ /*
120
+ * find node in nodeTab
121
+ */
122
+ for (i = 0; i < cur->nodeNr; i++)
123
+ if (cur->nodeTab[i] == val) { break; }
124
+
125
+ if (i >= cur->nodeNr) { /* not found */
126
+ return;
127
+ }
128
+ cur->nodeNr--;
129
+ for (; i < cur->nodeNr; i++) {
130
+ cur->nodeTab[i] = cur->nodeTab[i + 1];
131
+ }
132
+ cur->nodeTab[cur->nodeNr] = NULL;
133
+ }
134
+
135
+ /*
136
+ * call-seq:
137
+ * length
138
+ *
139
+ * Get the length of the node set
140
+ */
141
+ static VALUE
142
+ length(VALUE rb_self)
143
+ {
144
+ xmlNodeSetPtr c_self;
145
+
146
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
147
+
148
+ return c_self ? INT2NUM(c_self->nodeNr) : INT2NUM(0);
149
+ }
150
+
151
+ /*
152
+ * call-seq:
153
+ * push(node)
154
+ *
155
+ * Append +node+ to the NodeSet.
156
+ */
157
+ static VALUE
158
+ push(VALUE rb_self, VALUE rb_node)
159
+ {
160
+ xmlNodeSetPtr c_self;
161
+ xmlNodePtr node;
162
+
163
+ Check_Node_Set_Node_Type(rb_node);
164
+
165
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
166
+ Noko_Node_Get_Struct(rb_node, xmlNode, node);
167
+
168
+ xmlXPathNodeSetAdd(c_self, node);
169
+
170
+ return rb_self;
171
+ }
172
+
173
+ /*
174
+ * call-seq:
175
+ * delete(node)
176
+ *
177
+ * Delete +node+ from the Nodeset, if it is a member. Returns the deleted node
178
+ * if found, otherwise returns nil.
179
+ */
180
+ static VALUE
181
+ delete (VALUE rb_self, VALUE rb_node)
182
+ {
183
+ xmlNodeSetPtr c_self;
184
+ xmlNodePtr node;
185
+
186
+ Check_Node_Set_Node_Type(rb_node);
187
+
188
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
189
+ Noko_Node_Get_Struct(rb_node, xmlNode, node);
190
+
191
+ if (xmlXPathNodeSetContains(c_self, node)) {
192
+ xpath_node_set_del(c_self, node);
193
+ return rb_node;
194
+ }
195
+ return Qnil ;
196
+ }
197
+
198
+
199
+ /*
200
+ * call-seq:
201
+ * &(node_set)
202
+ *
203
+ * Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.
204
+ */
205
+ static VALUE
206
+ intersection(VALUE rb_self, VALUE rb_other)
207
+ {
208
+ xmlNodeSetPtr c_self, c_other ;
209
+ xmlNodeSetPtr intersection;
210
+
211
+ if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
212
+ rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
213
+ }
214
+
215
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
216
+ TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
217
+
218
+ intersection = xmlXPathIntersection(c_self, c_other);
219
+ return noko_xml_node_set_wrap(intersection, rb_iv_get(rb_self, "@document"));
220
+ }
221
+
222
+
223
+ /*
224
+ * call-seq:
225
+ * include?(node)
226
+ *
227
+ * Returns true if any member of node set equals +node+.
228
+ */
229
+ static VALUE
230
+ include_eh(VALUE rb_self, VALUE rb_node)
231
+ {
232
+ xmlNodeSetPtr c_self;
233
+ xmlNodePtr node;
234
+
235
+ Check_Node_Set_Node_Type(rb_node);
236
+
237
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
238
+ Noko_Node_Get_Struct(rb_node, xmlNode, node);
239
+
240
+ return (xmlXPathNodeSetContains(c_self, node) ? Qtrue : Qfalse);
241
+ }
242
+
243
+
244
+ /*
245
+ * call-seq:
246
+ * |(node_set)
247
+ *
248
+ * Returns a new set built by merging the set and the elements of the given
249
+ * set.
250
+ */
251
+ static VALUE
252
+ rb_xml_node_set_union(VALUE rb_self, VALUE rb_other)
253
+ {
254
+ xmlNodeSetPtr c_self, c_other;
255
+ xmlNodeSetPtr c_new_node_set;
256
+
257
+ if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
258
+ rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
259
+ }
260
+
261
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
262
+ TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
263
+
264
+ c_new_node_set = xmlXPathNodeSetMerge(NULL, c_self);
265
+ c_new_node_set = xmlXPathNodeSetMerge(c_new_node_set, c_other);
266
+
267
+ return noko_xml_node_set_wrap(c_new_node_set, rb_iv_get(rb_self, "@document"));
268
+ }
269
+
270
+ /*
271
+ * call-seq:
272
+ * -(node_set)
273
+ *
274
+ * Difference - returns a new NodeSet that is a copy of this NodeSet, removing
275
+ * each item that also appears in +node_set+
276
+ */
277
+ static VALUE
278
+ minus(VALUE rb_self, VALUE rb_other)
279
+ {
280
+ xmlNodeSetPtr c_self, c_other;
281
+ xmlNodeSetPtr new;
282
+ int j ;
283
+
284
+ if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
285
+ rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
286
+ }
287
+
288
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
289
+ TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
290
+
291
+ new = xmlXPathNodeSetMerge(NULL, c_self);
292
+ for (j = 0 ; j < c_other->nodeNr ; ++j) {
293
+ xpath_node_set_del(new, c_other->nodeTab[j]);
294
+ }
295
+
296
+ return noko_xml_node_set_wrap(new, rb_iv_get(rb_self, "@document"));
297
+ }
298
+
299
+
300
+ static VALUE
301
+ index_at(VALUE rb_self, long offset)
302
+ {
303
+ xmlNodeSetPtr c_self;
304
+
305
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
306
+
307
+ if (offset >= c_self->nodeNr || abs((int)offset) > c_self->nodeNr) {
308
+ return Qnil;
309
+ }
310
+
311
+ if (offset < 0) { offset += c_self->nodeNr ; }
312
+
313
+ return noko_xml_node_wrap_node_set_result(c_self->nodeTab[offset], rb_self);
314
+ }
315
+
316
+ static VALUE
317
+ subseq(VALUE rb_self, long beg, long len)
318
+ {
319
+ long j;
320
+ xmlNodeSetPtr c_self;
321
+ xmlNodeSetPtr new_set ;
322
+
323
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
324
+
325
+ if (beg > c_self->nodeNr) { return Qnil ; }
326
+ if (beg < 0 || len < 0) { return Qnil ; }
327
+
328
+ if ((beg + len) > c_self->nodeNr) {
329
+ len = c_self->nodeNr - beg ;
330
+ }
331
+
332
+ new_set = xmlXPathNodeSetCreate(NULL);
333
+ for (j = beg ; j < beg + len ; ++j) {
334
+ xmlXPathNodeSetAddUnique(new_set, c_self->nodeTab[j]);
335
+ }
336
+ return noko_xml_node_set_wrap(new_set, rb_iv_get(rb_self, "@document"));
337
+ }
338
+
339
+ /*
340
+ * call-seq:
341
+ * [index] -> Node or nil
342
+ * [start, length] -> NodeSet or nil
343
+ * [range] -> NodeSet or nil
344
+ * slice(index) -> Node or nil
345
+ * slice(start, length) -> NodeSet or nil
346
+ * slice(range) -> NodeSet or nil
347
+ *
348
+ * Element reference - returns the node at +index+, or returns a NodeSet
349
+ * containing nodes starting at +start+ and continuing for +length+ elements, or
350
+ * returns a NodeSet containing nodes specified by +range+. Negative +indices+
351
+ * count backward from the end of the +node_set+ (-1 is the last node). Returns
352
+ * nil if the +index+ (or +start+) are out of range.
353
+ */
354
+ static VALUE
355
+ slice(int argc, VALUE *argv, VALUE rb_self)
356
+ {
357
+ VALUE arg ;
358
+ long beg, len ;
359
+ xmlNodeSetPtr c_self;
360
+
361
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
362
+
363
+ if (argc == 2) {
364
+ beg = NUM2LONG(argv[0]);
365
+ len = NUM2LONG(argv[1]);
366
+ if (beg < 0) {
367
+ beg += c_self->nodeNr ;
368
+ }
369
+ return subseq(rb_self, beg, len);
370
+ }
371
+
372
+ if (argc != 1) {
373
+ rb_scan_args(argc, argv, "11", NULL, NULL);
374
+ }
375
+ arg = argv[0];
376
+
377
+ if (FIXNUM_P(arg)) {
378
+ return index_at(rb_self, FIX2LONG(arg));
379
+ }
380
+
381
+ /* if arg is Range */
382
+ switch (rb_range_beg_len(arg, &beg, &len, (long)c_self->nodeNr, 0)) {
383
+ case Qfalse:
384
+ break;
385
+ case Qnil:
386
+ return Qnil;
387
+ default:
388
+ return subseq(rb_self, beg, len);
389
+ }
390
+
391
+ return index_at(rb_self, NUM2LONG(arg));
392
+ }
393
+
394
+
395
+ /*
396
+ * call-seq:
397
+ * to_a
398
+ *
399
+ * Return this list as an Array
400
+ */
401
+ static VALUE
402
+ to_array(VALUE rb_self)
403
+ {
404
+ xmlNodeSetPtr c_self ;
405
+ VALUE list;
406
+ int i;
407
+
408
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
409
+
410
+ list = rb_ary_new2(c_self->nodeNr);
411
+ for (i = 0; i < c_self->nodeNr; i++) {
412
+ VALUE elt = noko_xml_node_wrap_node_set_result(c_self->nodeTab[i], rb_self);
413
+ rb_ary_push(list, elt);
414
+ }
415
+
416
+ return list;
417
+ }
418
+
419
+ /*
420
+ * call-seq:
421
+ * unlink
422
+ *
423
+ * Unlink this NodeSet and all Node objects it contains from their current context.
424
+ */
425
+ static VALUE
426
+ unlink_nodeset(VALUE rb_self)
427
+ {
428
+ xmlNodeSetPtr c_self;
429
+ int j, nodeNr ;
430
+
431
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
432
+
433
+ nodeNr = c_self->nodeNr ;
434
+ for (j = 0 ; j < nodeNr ; j++) {
435
+ if (! NOKOGIRI_NAMESPACE_EH(c_self->nodeTab[j])) {
436
+ VALUE node ;
437
+ xmlNodePtr node_ptr;
438
+ node = noko_xml_node_wrap(Qnil, c_self->nodeTab[j]);
439
+ rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */
440
+ Noko_Node_Get_Struct(node, xmlNode, node_ptr);
441
+ c_self->nodeTab[j] = node_ptr ;
442
+ }
443
+ }
444
+ return rb_self ;
445
+ }
446
+
447
+
448
+ VALUE
449
+ noko_xml_node_set_wrap(xmlNodeSetPtr c_node_set, VALUE document)
450
+ {
451
+ int j;
452
+ VALUE rb_node_set ;
453
+
454
+ if (c_node_set == NULL) {
455
+ rb_node_set = xml_node_set_allocate(cNokogiriXmlNodeSet);
456
+ } else {
457
+ rb_node_set = TypedData_Wrap_Struct(cNokogiriXmlNodeSet, &xml_node_set_type, c_node_set);
458
+ }
459
+
460
+ if (!NIL_P(document)) {
461
+ rb_iv_set(rb_node_set, "@document", document);
462
+ rb_funcall(document, decorate, 1, rb_node_set);
463
+ }
464
+
465
+ if (c_node_set) {
466
+ /* create ruby objects for all the results, so they'll be marked during the GC mark phase */
467
+ for (j = 0 ; j < c_node_set->nodeNr ; j++) {
468
+ noko_xml_node_wrap_node_set_result(c_node_set->nodeTab[j], rb_node_set);
469
+ }
470
+ }
471
+
472
+ return rb_node_set ;
473
+ }
474
+
475
+
476
+ VALUE
477
+ noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set)
478
+ {
479
+ if (NOKOGIRI_NAMESPACE_EH(node)) {
480
+ return noko_xml_namespace_wrap_xpath_copy((xmlNsPtr)node);
481
+ } else {
482
+ return noko_xml_node_wrap(Qnil, node);
483
+ }
484
+ }
485
+
486
+
487
+ xmlNodeSetPtr
488
+ noko_xml_node_set_unwrap(VALUE rb_node_set)
489
+ {
490
+ xmlNodeSetPtr c_node_set;
491
+ TypedData_Get_Struct(rb_node_set, xmlNodeSet, &xml_node_set_type, c_node_set);
492
+ return c_node_set;
493
+ }
494
+
495
+
496
+ void
497
+ noko_init_xml_node_set(void)
498
+ {
499
+ cNokogiriXmlNodeSet = rb_define_class_under(mNokogiriXml, "NodeSet", rb_cObject);
500
+
501
+ rb_define_alloc_func(cNokogiriXmlNodeSet, xml_node_set_allocate);
502
+
503
+ rb_define_method(cNokogiriXmlNodeSet, "&", intersection, 1);
504
+ rb_define_method(cNokogiriXmlNodeSet, "-", minus, 1);
505
+ rb_define_method(cNokogiriXmlNodeSet, "[]", slice, -1);
506
+ rb_define_method(cNokogiriXmlNodeSet, "delete", delete, 1);
507
+ rb_define_method(cNokogiriXmlNodeSet, "include?", include_eh, 1);
508
+ rb_define_method(cNokogiriXmlNodeSet, "length", length, 0);
509
+ rb_define_method(cNokogiriXmlNodeSet, "push", push, 1);
510
+ rb_define_method(cNokogiriXmlNodeSet, "slice", slice, -1);
511
+ rb_define_method(cNokogiriXmlNodeSet, "to_a", to_array, 0);
512
+ rb_define_method(cNokogiriXmlNodeSet, "unlink", unlink_nodeset, 0);
513
+ rb_define_method(cNokogiriXmlNodeSet, "|", rb_xml_node_set_union, 1);
514
+
515
+ rb_define_private_method(cNokogiriXmlNodeSet, "initialize_copy", rb_xml_node_set_initialize_copy, 1);
516
+
517
+ decorate = rb_intern("decorate");
518
+ }
@@ -0,0 +1,54 @@
1
+ #include <nokogiri.h>
2
+
3
+ VALUE cNokogiriXmlProcessingInstruction;
4
+
5
+ /*
6
+ * call-seq:
7
+ * new(document, name, content)
8
+ *
9
+ * Create a new ProcessingInstruction element on the +document+ with +name+
10
+ * and +content+
11
+ */
12
+ static VALUE
13
+ new (int argc, VALUE *argv, VALUE klass)
14
+ {
15
+ xmlDocPtr xml_doc;
16
+ xmlNodePtr node;
17
+ VALUE document;
18
+ VALUE name;
19
+ VALUE content;
20
+ VALUE rest;
21
+ VALUE rb_node;
22
+
23
+ rb_scan_args(argc, argv, "3*", &document, &name, &content, &rest);
24
+
25
+ xml_doc = noko_xml_document_unwrap(document);
26
+
27
+ node = xmlNewDocPI(
28
+ xml_doc,
29
+ (const xmlChar *)StringValueCStr(name),
30
+ (const xmlChar *)StringValueCStr(content)
31
+ );
32
+
33
+ noko_xml_document_pin_node(node);
34
+
35
+ rb_node = noko_xml_node_wrap(klass, node);
36
+ rb_obj_call_init(rb_node, argc, argv);
37
+
38
+ if (rb_block_given_p()) { rb_yield(rb_node); }
39
+
40
+ return rb_node;
41
+ }
42
+
43
+ void
44
+ noko_init_xml_processing_instruction(void)
45
+ {
46
+ assert(cNokogiriXmlNode);
47
+ /*
48
+ * ProcessingInstruction represents a ProcessingInstruction node in an xml
49
+ * document.
50
+ */
51
+ cNokogiriXmlProcessingInstruction = rb_define_class_under(mNokogiriXml, "ProcessingInstruction", cNokogiriXmlNode);
52
+
53
+ rb_define_singleton_method(cNokogiriXmlProcessingInstruction, "new", new, -1);
54
+ }