nokogiri 1.4.3.1-java → 1.5.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. data/.gemtest +0 -0
  2. data/CHANGELOG.ja.rdoc +113 -0
  3. data/CHANGELOG.rdoc +113 -1
  4. data/Manifest.txt +72 -68
  5. data/README.ja.rdoc +4 -4
  6. data/README.rdoc +31 -7
  7. data/Rakefile +110 -132
  8. data/bin/nokogiri +7 -3
  9. data/ext/java/nokogiri/EncodingHandler.java +124 -0
  10. data/ext/java/nokogiri/HtmlDocument.java +119 -0
  11. data/ext/java/nokogiri/HtmlElementDescription.java +145 -0
  12. data/ext/java/nokogiri/HtmlEntityLookup.java +79 -0
  13. data/ext/java/nokogiri/HtmlSaxParserContext.java +259 -0
  14. data/ext/java/nokogiri/NokogiriService.java +590 -0
  15. data/ext/java/nokogiri/XmlAttr.java +180 -0
  16. data/ext/java/nokogiri/XmlAttributeDecl.java +130 -0
  17. data/ext/java/nokogiri/XmlCdata.java +84 -0
  18. data/ext/java/nokogiri/XmlComment.java +86 -0
  19. data/ext/java/nokogiri/XmlDocument.java +519 -0
  20. data/ext/java/nokogiri/XmlDocumentFragment.java +223 -0
  21. data/ext/java/nokogiri/XmlDtd.java +469 -0
  22. data/ext/java/nokogiri/XmlElement.java +195 -0
  23. data/ext/java/nokogiri/XmlElementContent.java +382 -0
  24. data/ext/java/nokogiri/XmlElementDecl.java +152 -0
  25. data/ext/java/nokogiri/XmlEntityDecl.java +162 -0
  26. data/ext/java/nokogiri/XmlEntityReference.java +97 -0
  27. data/ext/java/nokogiri/XmlNamespace.java +183 -0
  28. data/ext/java/nokogiri/XmlNode.java +1378 -0
  29. data/ext/java/nokogiri/XmlNodeSet.java +267 -0
  30. data/ext/java/nokogiri/XmlProcessingInstruction.java +99 -0
  31. data/ext/java/nokogiri/XmlReader.java +408 -0
  32. data/ext/java/nokogiri/XmlRelaxng.java +144 -0
  33. data/ext/java/nokogiri/XmlSaxParserContext.java +367 -0
  34. data/ext/java/nokogiri/XmlSaxPushParser.java +184 -0
  35. data/ext/java/nokogiri/XmlSchema.java +324 -0
  36. data/ext/java/nokogiri/XmlSyntaxError.java +119 -0
  37. data/ext/java/nokogiri/XmlText.java +119 -0
  38. data/ext/java/nokogiri/XmlXpathContext.java +199 -0
  39. data/ext/java/nokogiri/XsltStylesheet.java +197 -0
  40. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +204 -0
  41. data/ext/java/nokogiri/internals/NokogiriDocumentCache.java +73 -0
  42. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +86 -0
  43. data/ext/java/nokogiri/internals/NokogiriHandler.java +327 -0
  44. data/ext/java/nokogiri/internals/NokogiriHelpers.java +639 -0
  45. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +167 -0
  46. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +130 -0
  47. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +74 -0
  48. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +121 -0
  49. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +79 -0
  50. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +141 -0
  51. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +73 -0
  52. data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +67 -0
  53. data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +86 -0
  54. data/ext/java/nokogiri/internals/ParserContext.java +276 -0
  55. data/ext/java/nokogiri/internals/PushInputStream.java +411 -0
  56. data/ext/java/nokogiri/internals/ReaderNode.java +531 -0
  57. data/ext/java/nokogiri/internals/SaveContextVisitor.java +567 -0
  58. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +76 -0
  59. data/ext/java/nokogiri/internals/XmlDeclHandler.java +42 -0
  60. data/ext/java/nokogiri/internals/XmlDomParser.java +76 -0
  61. data/ext/java/nokogiri/internals/XmlDomParserContext.java +244 -0
  62. data/ext/java/nokogiri/internals/XmlSaxParser.java +65 -0
  63. data/ext/java/nokogiri/internals/XsltExtensionFunction.java +72 -0
  64. data/ext/nokogiri/depend +358 -32
  65. data/ext/nokogiri/extconf.rb +10 -6
  66. data/ext/nokogiri/nokogiri.c +23 -3
  67. data/ext/nokogiri/nokogiri.h +7 -2
  68. data/ext/nokogiri/xml_document.c +9 -0
  69. data/ext/nokogiri/xml_dtd.c +2 -2
  70. data/ext/nokogiri/xml_io.c +32 -7
  71. data/ext/nokogiri/xml_node.c +45 -25
  72. data/ext/nokogiri/xml_node_set.c +1 -1
  73. data/ext/nokogiri/xml_relax_ng.c +0 -7
  74. data/ext/nokogiri/xml_sax_parser.c +14 -7
  75. data/ext/nokogiri/xml_sax_parser_context.c +40 -0
  76. data/ext/nokogiri/xml_xpath_context.c +33 -2
  77. data/ext/nokogiri/xslt_stylesheet.c +128 -6
  78. data/lib/isorelax.jar +0 -0
  79. data/lib/jing.jar +0 -0
  80. data/lib/nekodtd.jar +0 -0
  81. data/lib/nekohtml.jar +0 -0
  82. data/lib/nokogiri/css/parser.rb +665 -70
  83. data/lib/nokogiri/css/parser.y +3 -1
  84. data/lib/nokogiri/css/parser_extras.rb +91 -0
  85. data/lib/nokogiri/css/tokenizer.rb +148 -3
  86. data/lib/nokogiri/css/tokenizer.rex +1 -1
  87. data/lib/nokogiri/css/xpath_visitor.rb +15 -7
  88. data/lib/nokogiri/css.rb +5 -3
  89. data/lib/nokogiri/decorators/slop.rb +5 -3
  90. data/lib/nokogiri/html/document.rb +142 -19
  91. data/lib/nokogiri/html/document_fragment.rb +19 -17
  92. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  93. data/lib/nokogiri/html/sax/parser.rb +6 -2
  94. data/lib/nokogiri/html.rb +1 -0
  95. data/lib/nokogiri/nokogiri.jar +0 -0
  96. data/lib/nokogiri/version.rb +76 -26
  97. data/lib/nokogiri/xml/attribute_decl.rb +1 -1
  98. data/lib/nokogiri/xml/builder.rb +7 -0
  99. data/lib/nokogiri/xml/document.rb +43 -2
  100. data/lib/nokogiri/xml/document_fragment.rb +16 -2
  101. data/lib/nokogiri/xml/dtd.rb +12 -1
  102. data/lib/nokogiri/xml/element_decl.rb +1 -1
  103. data/lib/nokogiri/xml/entity_decl.rb +1 -1
  104. data/lib/nokogiri/xml/node/save_options.rb +20 -1
  105. data/lib/nokogiri/xml/node.rb +198 -78
  106. data/lib/nokogiri/xml/node_set.rb +10 -3
  107. data/lib/nokogiri/xml/parse_options.rb +8 -0
  108. data/lib/nokogiri/xml/reader.rb +42 -6
  109. data/lib/nokogiri/xml/sax/document.rb +4 -2
  110. data/lib/nokogiri/xml/schema.rb +7 -1
  111. data/lib/nokogiri/xslt/stylesheet.rb +1 -1
  112. data/lib/nokogiri/xslt.rb +9 -5
  113. data/lib/nokogiri.rb +19 -25
  114. data/lib/xercesImpl.jar +0 -0
  115. data/nokogiri_help_responses.md +40 -0
  116. data/tasks/cross_compile.rb +130 -136
  117. data/tasks/nokogiri.org.rb +18 -0
  118. data/tasks/test.rb +2 -2
  119. data/test/css/test_parser.rb +29 -18
  120. data/test/css/test_tokenizer.rb +8 -0
  121. data/test/decorators/test_slop.rb +16 -0
  122. data/test/files/encoding.html +82 -0
  123. data/test/files/encoding.xhtml +84 -0
  124. data/test/files/metacharset.html +10 -0
  125. data/test/files/noencoding.html +47 -0
  126. data/test/helper.rb +5 -1
  127. data/test/html/sax/test_parser.rb +65 -3
  128. data/test/html/test_document.rb +75 -1
  129. data/test/html/test_document_encoding.rb +61 -0
  130. data/test/html/test_document_fragment.rb +50 -5
  131. data/test/html/test_element_description.rb +4 -2
  132. data/test/html/test_node.rb +9 -0
  133. data/test/test_memory_leak.rb +20 -35
  134. data/test/test_nokogiri.rb +14 -20
  135. data/test/test_reader.rb +23 -6
  136. data/test/test_xslt_transforms.rb +6 -2
  137. data/test/xml/node/test_save_options.rb +10 -2
  138. data/test/xml/sax/test_parser.rb +39 -8
  139. data/test/xml/sax/test_parser_context.rb +50 -0
  140. data/test/xml/sax/test_push_parser.rb +18 -1
  141. data/test/xml/test_attribute_decl.rb +7 -3
  142. data/test/xml/test_builder.rb +17 -0
  143. data/test/xml/test_document.rb +34 -5
  144. data/test/xml/test_document_fragment.rb +14 -2
  145. data/test/xml/test_dtd.rb +28 -3
  146. data/test/xml/test_element_content.rb +1 -1
  147. data/test/xml/test_element_decl.rb +1 -1
  148. data/test/xml/test_entity_decl.rb +12 -10
  149. data/test/xml/test_namespace.rb +7 -5
  150. data/test/xml/test_node.rb +65 -13
  151. data/test/xml/test_node_reparenting.rb +72 -31
  152. data/test/xml/test_node_set.rb +57 -0
  153. data/test/xml/test_schema.rb +5 -0
  154. data/test/xml/test_xpath.rb +32 -0
  155. data/test/xslt/test_custom_functions.rb +94 -0
  156. data/test/xslt/test_exception_handling.rb +37 -0
  157. metadata +512 -517
  158. data/deps.rip +0 -5
  159. data/ext/nokogiri/libcharset-1.dll +0 -0
  160. data/ext/nokogiri/libexslt.dll +0 -0
  161. data/ext/nokogiri/libiconv-2.dll +0 -0
  162. data/ext/nokogiri/libxml2.dll +0 -0
  163. data/ext/nokogiri/libxslt.dll +0 -0
  164. data/ext/nokogiri/zlib1.dll +0 -0
  165. data/lib/nokogiri/css/generated_parser.rb +0 -676
  166. data/lib/nokogiri/css/generated_tokenizer.rb +0 -146
  167. data/lib/nokogiri/ffi/encoding_handler.rb +0 -42
  168. data/lib/nokogiri/ffi/html/document.rb +0 -28
  169. data/lib/nokogiri/ffi/html/element_description.rb +0 -81
  170. data/lib/nokogiri/ffi/html/entity_lookup.rb +0 -16
  171. data/lib/nokogiri/ffi/html/sax/parser_context.rb +0 -38
  172. data/lib/nokogiri/ffi/io_callbacks.rb +0 -42
  173. data/lib/nokogiri/ffi/libxml.rb +0 -411
  174. data/lib/nokogiri/ffi/structs/common_node.rb +0 -38
  175. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +0 -24
  176. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +0 -13
  177. data/lib/nokogiri/ffi/structs/xml_alloc.rb +0 -16
  178. data/lib/nokogiri/ffi/structs/xml_attr.rb +0 -19
  179. data/lib/nokogiri/ffi/structs/xml_attribute.rb +0 -27
  180. data/lib/nokogiri/ffi/structs/xml_buffer.rb +0 -16
  181. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +0 -11
  182. data/lib/nokogiri/ffi/structs/xml_document.rb +0 -117
  183. data/lib/nokogiri/ffi/structs/xml_dtd.rb +0 -28
  184. data/lib/nokogiri/ffi/structs/xml_element.rb +0 -26
  185. data/lib/nokogiri/ffi/structs/xml_element_content.rb +0 -17
  186. data/lib/nokogiri/ffi/structs/xml_entity.rb +0 -32
  187. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +0 -12
  188. data/lib/nokogiri/ffi/structs/xml_node.rb +0 -28
  189. data/lib/nokogiri/ffi/structs/xml_node_set.rb +0 -53
  190. data/lib/nokogiri/ffi/structs/xml_notation.rb +0 -11
  191. data/lib/nokogiri/ffi/structs/xml_ns.rb +0 -15
  192. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +0 -19
  193. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +0 -14
  194. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +0 -51
  195. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +0 -124
  196. data/lib/nokogiri/ffi/structs/xml_schema.rb +0 -13
  197. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +0 -31
  198. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +0 -12
  199. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +0 -38
  200. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +0 -35
  201. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +0 -20
  202. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +0 -13
  203. data/lib/nokogiri/ffi/weak_bucket.rb +0 -40
  204. data/lib/nokogiri/ffi/xml/attr.rb +0 -41
  205. data/lib/nokogiri/ffi/xml/attribute_decl.rb +0 -27
  206. data/lib/nokogiri/ffi/xml/cdata.rb +0 -19
  207. data/lib/nokogiri/ffi/xml/comment.rb +0 -18
  208. data/lib/nokogiri/ffi/xml/document.rb +0 -166
  209. data/lib/nokogiri/ffi/xml/document_fragment.rb +0 -21
  210. data/lib/nokogiri/ffi/xml/dtd.rb +0 -67
  211. data/lib/nokogiri/ffi/xml/element_content.rb +0 -43
  212. data/lib/nokogiri/ffi/xml/element_decl.rb +0 -19
  213. data/lib/nokogiri/ffi/xml/entity_decl.rb +0 -36
  214. data/lib/nokogiri/ffi/xml/entity_reference.rb +0 -19
  215. data/lib/nokogiri/ffi/xml/namespace.rb +0 -44
  216. data/lib/nokogiri/ffi/xml/node.rb +0 -554
  217. data/lib/nokogiri/ffi/xml/node_set.rb +0 -149
  218. data/lib/nokogiri/ffi/xml/processing_instruction.rb +0 -20
  219. data/lib/nokogiri/ffi/xml/reader.rb +0 -236
  220. data/lib/nokogiri/ffi/xml/relax_ng.rb +0 -85
  221. data/lib/nokogiri/ffi/xml/sax/parser.rb +0 -135
  222. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +0 -67
  223. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +0 -51
  224. data/lib/nokogiri/ffi/xml/schema.rb +0 -109
  225. data/lib/nokogiri/ffi/xml/syntax_error.rb +0 -98
  226. data/lib/nokogiri/ffi/xml/text.rb +0 -18
  227. data/lib/nokogiri/ffi/xml/xpath.rb +0 -9
  228. data/lib/nokogiri/ffi/xml/xpath_context.rb +0 -148
  229. data/lib/nokogiri/ffi/xslt/stylesheet.rb +0 -53
  230. data/lib/nokogiri/version_warning.rb +0 -14
  231. data/test/ffi/test_document.rb +0 -35
@@ -14,10 +14,7 @@ static void debug_node_dealloc(xmlNodePtr x)
14
14
 
15
15
  static void mark(xmlNodePtr node)
16
16
  {
17
- /* it's OK if the document isn't fully realized (as in XML::Reader). */
18
- /* see http://github.com/tenderlove/nokogiri/issues/closed/#issue/95 */
19
- if (DOC_RUBY_OBJECT_TEST(node->doc) && DOC_RUBY_OBJECT(node->doc))
20
- rb_gc_mark(DOC_RUBY_OBJECT(node->doc));
17
+ rb_gc_mark(DOC_RUBY_OBJECT(node->doc));
21
18
  }
22
19
 
23
20
  /* :nodoc: */
@@ -169,12 +166,6 @@ static VALUE reparent_node_with(VALUE pivot_obj, VALUE reparentee_obj, pivot_rep
169
166
  xmlAddNextSibling(pivot, new_next_text);
170
167
  }
171
168
 
172
- /* TODO: I really want to remove this. We shouldn't support 2.6.16 anymore */
173
- if ( reparentee->type == XML_TEXT_NODE && pivot->type == XML_TEXT_NODE && is_2_6_16() ) {
174
- /* work around a string-handling bug in libxml 2.6.16. we'd rather leak than segfault. */
175
- pivot->content = xmlStrdup(pivot->content);
176
- }
177
-
178
169
  if(!(reparented = (*prf)(pivot, reparentee))) {
179
170
  rb_raise(rb_eRuntimeError, "Could not reparent node");
180
171
  }
@@ -251,7 +242,13 @@ static VALUE encode_special_chars(VALUE self, VALUE string)
251
242
  * call-seq:
252
243
  * create_internal_subset(name, external_id, system_id)
253
244
  *
254
- * Create an internal subset
245
+ * Create the internal subset of a document.
246
+ *
247
+ * doc.create_internal_subset("chapter", "-//OASIS//DTD DocBook XML//EN", "chapter.dtd")
248
+ * # => <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML//EN" "chapter.dtd">
249
+ *
250
+ * doc.create_internal_subset("chapter", nil, "chapter.dtd")
251
+ * # => <!DOCTYPE chapter SYSTEM "chapter.dtd">
255
252
  */
256
253
  static VALUE create_internal_subset(VALUE self, VALUE name, VALUE external_id, VALUE system_id)
257
254
  {
@@ -377,6 +374,8 @@ static VALUE duplicate_node(int argc, VALUE *argv, VALUE self)
377
374
  dup = xmlDocCopyNode(node, node->doc, (int)NUM2INT(level));
378
375
  if(dup == NULL) return Qnil;
379
376
 
377
+ NOKOGIRI_ROOT_NODE(dup);
378
+
380
379
  return Nokogiri_wrap_xml_node(rb_obj_class(self), dup);
381
380
  }
382
381
 
@@ -774,7 +773,8 @@ static VALUE attribute_nodes(VALUE self)
774
773
  * call-seq:
775
774
  * namespace()
776
775
  *
777
- * returns the Nokogiri::XML::Namespace for the node, if one exists.
776
+ * returns the default namespace set on this node (as with an "xmlns="
777
+ * attribute), as a Namespace object.
778
778
  */
779
779
  static VALUE namespace(VALUE self)
780
780
  {
@@ -791,7 +791,7 @@ static VALUE namespace(VALUE self)
791
791
  * call-seq:
792
792
  * namespace_definitions()
793
793
  *
794
- * returns a list of Namespace nodes defined on _self_
794
+ * returns namespaces defined on self element directly, as an array of Namespace objects. Includes both a default namespace (as in"xmlns="), and prefixed namespaces (as in "xmlns:prefix=").
795
795
  */
796
796
  static VALUE namespace_definitions(VALUE self)
797
797
  {
@@ -820,8 +820,10 @@ static VALUE namespace_definitions(VALUE self)
820
820
  * call-seq:
821
821
  * namespace_scopes()
822
822
  *
823
- * returns a list of Namespace nodes in scope for _self_. this is all
824
- * namespaces defined in the node, or in any ancestor node.
823
+ * returns namespaces in scope for self -- those defined on self element
824
+ * directly or any ancestor node -- as an array of Namespace objects. Default
825
+ * namespaces ("xmlns=" style) for self are included in this array; Default
826
+ * namespaces for ancestors, however, are not. See also #namespaces
825
827
  */
826
828
  static VALUE namespace_scopes(VALUE self)
827
829
  {
@@ -1045,7 +1047,12 @@ static VALUE line(VALUE self)
1045
1047
  * call-seq:
1046
1048
  * add_namespace_definition(prefix, href)
1047
1049
  *
1048
- * Adds a namespace definition with +prefix+ using +href+
1050
+ * Adds a namespace definition with +prefix+ using +href+ value. The result is
1051
+ * as if parsed XML for this node had included an attribute
1052
+ * 'xmlns:prefix=value'. A default namespace for this node ("xmlns=") can be
1053
+ * added by passing 'nil' for prefix. Namespaces added this way will not
1054
+ * show up in #attributes, but they will be included as an xmlns attribute
1055
+ * when the node is serialized to XML.
1049
1056
  */
1050
1057
  static VALUE add_namespace_definition(VALUE self, VALUE prefix, VALUE href)
1051
1058
  {
@@ -1155,6 +1162,7 @@ static VALUE in_context(VALUE self, VALUE _str, VALUE _options)
1155
1162
  {
1156
1163
  xmlNodePtr node;
1157
1164
  xmlNodePtr list;
1165
+ xmlNodePtr child_iter;
1158
1166
  xmlNodeSetPtr set;
1159
1167
  xmlParserErrors error;
1160
1168
  VALUE doc, err;
@@ -1180,6 +1188,14 @@ static VALUE in_context(VALUE self, VALUE _str, VALUE _options)
1180
1188
  (int)NUM2INT(_options),
1181
1189
  &list);
1182
1190
 
1191
+ /* make sure parent/child pointers are coherent so an unlink will work properly (#331) */
1192
+ child_iter = node->doc->children ;
1193
+ while (child_iter) {
1194
+ if (child_iter->parent != (xmlNodePtr)node->doc)
1195
+ child_iter->parent = (xmlNodePtr)node->doc ;
1196
+ child_iter = child_iter->next ;
1197
+ }
1198
+
1183
1199
  #ifndef HTML_PARSE_NOIMPLIED
1184
1200
  htmlHandleOmittedElem(1);
1185
1201
  #endif
@@ -1216,6 +1232,8 @@ VALUE Nokogiri_wrap_xml_node(VALUE klass, xmlNodePtr node)
1216
1232
  VALUE document = Qnil ;
1217
1233
  VALUE node_cache = Qnil ;
1218
1234
  VALUE rb_node = Qnil ;
1235
+ int node_has_a_document = 0 ;
1236
+ void (*mark_method)(xmlNodePtr) = NULL ;
1219
1237
 
1220
1238
  assert(node);
1221
1239
 
@@ -1224,11 +1242,9 @@ VALUE Nokogiri_wrap_xml_node(VALUE klass, xmlNodePtr node)
1224
1242
 
1225
1243
  if(NULL != node->_private) return (VALUE)node->_private;
1226
1244
 
1227
- if(RTEST(klass))
1228
- rb_node = Data_Wrap_Struct(klass, mark, debug_node_dealloc, node) ;
1229
-
1230
- else switch(node->type)
1231
- {
1245
+ if(!RTEST(klass)) {
1246
+ switch(node->type)
1247
+ {
1232
1248
  case XML_ELEMENT_NODE:
1233
1249
  klass = cNokogiriXmlElement;
1234
1250
  break;
@@ -1267,15 +1283,19 @@ VALUE Nokogiri_wrap_xml_node(VALUE klass, xmlNodePtr node)
1267
1283
  break;
1268
1284
  default:
1269
1285
  klass = cNokogiriXmlNode;
1286
+ }
1270
1287
  }
1271
1288
 
1272
- rb_node = Data_Wrap_Struct(klass, mark, debug_node_dealloc, node) ;
1289
+ /* It's OK if the node doesn't have a fully-realized document (as in XML::Reader). */
1290
+ /* see https://github.com/tenderlove/nokogiri/issues/95 */
1291
+ /* and https://github.com/tenderlove/nokogiri/issues/439 */
1292
+ node_has_a_document = (DOC_RUBY_OBJECT_TEST(node->doc) && DOC_RUBY_OBJECT(node->doc)) ? 1 : 0 ;
1293
+ mark_method = node_has_a_document ? mark : NULL ;
1273
1294
 
1295
+ rb_node = Data_Wrap_Struct(klass, mark_method, debug_node_dealloc, node) ;
1274
1296
  node->_private = (void *)rb_node;
1275
1297
 
1276
- if (DOC_RUBY_OBJECT_TEST(node->doc) && DOC_RUBY_OBJECT(node->doc)) {
1277
- /* it's OK if the document isn't fully realized (as in XML::Reader). */
1278
- /* see http://github.com/tenderlove/nokogiri/issues/closed/#issue/95 */
1298
+ if (node_has_a_document) {
1279
1299
  document = DOC_RUBY_OBJECT(node->doc);
1280
1300
  node_cache = DOC_NODE_CACHE(node->doc);
1281
1301
  rb_ary_push(node_cache, rb_node);
@@ -257,7 +257,7 @@ static VALUE slice(int argc, VALUE *argv, VALUE self)
257
257
  }
258
258
 
259
259
  /* if arg is Range */
260
- switch (rb_range_beg_len(arg, &beg, &len, node_set->nodeNr, 0)) {
260
+ switch (rb_range_beg_len(arg, &beg, &len, (long)node_set->nodeNr, 0)) {
261
261
  case Qfalse:
262
262
  break;
263
263
  case Qnil:
@@ -129,9 +129,6 @@ static VALUE from_document(VALUE klass, VALUE document)
129
129
  schema = xmlRelaxNGParse(ctx);
130
130
 
131
131
  xmlSetStructuredErrorFunc(NULL, NULL);
132
- if (! is_2_6_16()) {
133
- xmlRelaxNGFreeParserCtxt(ctx);
134
- }
135
132
 
136
133
  if(NULL == schema) {
137
134
  xmlErrorPtr error = xmlGetLastError();
@@ -143,10 +140,6 @@ static VALUE from_document(VALUE klass, VALUE document)
143
140
  return Qnil;
144
141
  }
145
142
 
146
- if (is_2_6_16()) {
147
- xmlRelaxNGFreeParserCtxt(ctx);
148
- }
149
-
150
143
  rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
151
144
  rb_iv_set(rb_schema, "@errors", errors);
152
145
 
@@ -1,6 +1,7 @@
1
1
  #include <xml_sax_parser.h>
2
2
 
3
3
  int vasprintf (char **strp, const char *fmt, va_list ap);
4
+ void vasprintf_free (void *p);
4
5
 
5
6
  static ID id_start_document, id_end_document, id_start_element, id_end_element;
6
7
  static ID id_start_element_namespace, id_end_element_namespace;
@@ -62,8 +63,10 @@ static void start_element(void * ctx, const xmlChar *name, const xmlChar **atts)
62
63
  int i = 0;
63
64
  if(atts) {
64
65
  while((attr = atts[i]) != NULL) {
65
- rb_ary_push(attributes, NOKOGIRI_STR_NEW2(attr));
66
- i++;
66
+ const xmlChar * val = atts[i+1];
67
+ VALUE value = val != NULL ? NOKOGIRI_STR_NEW2(val) : Qnil;
68
+ rb_ary_push(attributes, rb_ary_new3(2, NOKOGIRI_STR_NEW2(attr), value));
69
+ i+=2;
67
70
  }
68
71
  }
69
72
 
@@ -196,14 +199,16 @@ static void warning_func(void * ctx, const char *msg, ...)
196
199
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
197
200
  VALUE doc = rb_iv_get(self, "@document");
198
201
  char * message;
202
+ VALUE ruby_message;
199
203
 
200
204
  va_list args;
201
205
  va_start(args, msg);
202
206
  vasprintf(&message, msg, args);
203
207
  va_end(args);
204
208
 
205
- rb_funcall(doc, id_warning, 1, NOKOGIRI_STR_NEW2(message));
206
- free(message);
209
+ ruby_message = NOKOGIRI_STR_NEW2(message);
210
+ vasprintf_free(message);
211
+ rb_funcall(doc, id_warning, 1, ruby_message);
207
212
  }
208
213
 
209
214
  static void error_func(void * ctx, const char *msg, ...)
@@ -211,14 +216,16 @@ static void error_func(void * ctx, const char *msg, ...)
211
216
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
212
217
  VALUE doc = rb_iv_get(self, "@document");
213
218
  char * message;
219
+ VALUE ruby_message;
214
220
 
215
221
  va_list args;
216
222
  va_start(args, msg);
217
223
  vasprintf(&message, msg, args);
218
224
  va_end(args);
219
225
 
220
- rb_funcall(doc, id_error, 1, NOKOGIRI_STR_NEW2(message));
221
- free(message);
226
+ ruby_message = NOKOGIRI_STR_NEW2(message);
227
+ vasprintf_free(message);
228
+ rb_funcall(doc, id_error, 1, ruby_message);
222
229
  }
223
230
 
224
231
  static void cdata_block(void * ctx, const xmlChar * value, int len)
@@ -238,7 +245,7 @@ static void deallocate(xmlSAXHandlerPtr handler)
238
245
 
239
246
  static VALUE allocate(VALUE klass)
240
247
  {
241
- xmlSAXHandlerPtr handler = calloc(1, sizeof(xmlSAXHandler));
248
+ xmlSAXHandlerPtr handler = calloc((size_t)1, sizeof(xmlSAXHandler));
242
249
 
243
250
  xmlSetStructuredErrorFunc(NULL, NULL);
244
251
 
@@ -140,6 +140,44 @@ static VALUE get_replace_entities(VALUE self)
140
140
  return Qtrue;
141
141
  }
142
142
 
143
+ /*
144
+ * call-seq: line
145
+ *
146
+ * Get the current line the parser context is processing.
147
+ */
148
+ static VALUE line(VALUE self)
149
+ {
150
+ xmlParserCtxtPtr ctxt;
151
+ xmlParserInputPtr io;
152
+
153
+ Data_Get_Struct(self, xmlParserCtxt, ctxt);
154
+
155
+ io = ctxt->input;
156
+ if(io)
157
+ return INT2NUM(io->line);
158
+
159
+ return Qnil;
160
+ }
161
+
162
+ /*
163
+ * call-seq: column
164
+ *
165
+ * Get the current column the parser context is processing.
166
+ */
167
+ static VALUE column(VALUE self)
168
+ {
169
+ xmlParserCtxtPtr ctxt;
170
+ xmlParserInputPtr io;
171
+
172
+ Data_Get_Struct(self, xmlParserCtxt, ctxt);
173
+
174
+ io = ctxt->input;
175
+ if(io)
176
+ return INT2NUM(io->col);
177
+
178
+ return Qnil;
179
+ }
180
+
143
181
  void init_xml_sax_parser_context()
144
182
  {
145
183
  VALUE nokogiri = rb_define_module("Nokogiri");
@@ -156,4 +194,6 @@ void init_xml_sax_parser_context()
156
194
  rb_define_method(klass, "parse_with", parse_with, 1);
157
195
  rb_define_method(klass, "replace_entities=", set_replace_entities, 1);
158
196
  rb_define_method(klass, "replace_entities", get_replace_entities, 0);
197
+ rb_define_method(klass, "line", line, 0);
198
+ rb_define_method(klass, "column", column, 0);
159
199
  }
@@ -27,6 +27,28 @@ static VALUE register_ns(VALUE self, VALUE prefix, VALUE uri)
27
27
  return self;
28
28
  }
29
29
 
30
+ /*
31
+ * call-seq:
32
+ * register_variable(name, value)
33
+ *
34
+ * Register the variable +name+ with +value+.
35
+ */
36
+ static VALUE register_variable(VALUE self, VALUE name, VALUE value)
37
+ {
38
+ xmlXPathContextPtr ctx;
39
+ xmlXPathObjectPtr xmlValue;
40
+ Data_Get_Struct(self, xmlXPathContext, ctx);
41
+
42
+ xmlValue = xmlXPathNewCString(StringValuePtr(value));
43
+
44
+ xmlXPathRegisterVariable( ctx,
45
+ (const xmlChar *)StringValuePtr(name),
46
+ xmlValue
47
+ );
48
+
49
+ return self;
50
+ }
51
+
30
52
  static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
31
53
  {
32
54
  VALUE xpath_handler = Qnil;
@@ -46,7 +68,11 @@ static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
46
68
 
47
69
  xpath_handler = (VALUE)(ctx->context->userData);
48
70
 
49
- argv = (VALUE *)calloc((unsigned int)nargs, sizeof(VALUE));
71
+ argv = (VALUE *)calloc((size_t)nargs, sizeof(VALUE));
72
+ for (i = 0 ; i < nargs ; ++i) {
73
+ rb_gc_register_address(&argv[i]);
74
+ }
75
+
50
76
  doc = DOC_RUBY_OBJECT(ctx->context->doc);
51
77
 
52
78
  i = nargs - 1;
@@ -77,6 +103,10 @@ static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
77
103
  nargs,
78
104
  argv
79
105
  );
106
+
107
+ for (i = 0 ; i < nargs ; ++i) {
108
+ rb_gc_unregister_address(&argv[i]);
109
+ }
80
110
  free(argv);
81
111
 
82
112
  switch(TYPE(result)) {
@@ -156,7 +186,7 @@ static void xpath_generic_exception_handler(void * ctx, const char *msg, ...)
156
186
 
157
187
  /*
158
188
  * call-seq:
159
- * evaluate(search_path)
189
+ * evaluate(search_path, handler = nil)
160
190
  *
161
191
  * Evaluate the +search_path+ returning an XML::XPath object.
162
192
  */
@@ -274,5 +304,6 @@ void init_xml_xpath_context(void)
274
304
 
275
305
  rb_define_singleton_method(klass, "new", new, 1);
276
306
  rb_define_method(klass, "evaluate", evaluate, -1);
307
+ rb_define_method(klass, "register_variable", register_variable, 2);
277
308
  rb_define_method(klass, "register_ns", register_ns, 2);
278
309
  }
@@ -5,7 +5,10 @@
5
5
  #include <libxslt/transform.h>
6
6
  #include <libexslt/exslt.h>
7
7
 
8
+ VALUE xslt;
9
+
8
10
  int vasprintf (char **strp, const char *fmt, va_list ap);
11
+ void vasprintf_free (void *p);
9
12
 
10
13
  static void dealloc(xsltStylesheetPtr doc)
11
14
  {
@@ -18,13 +21,16 @@ NORETURN(static void xslt_generic_error_handler(void * ctx, const char *msg, ...
18
21
  static void xslt_generic_error_handler(void * ctx, const char *msg, ...)
19
22
  {
20
23
  char * message;
24
+ VALUE exception;
21
25
 
22
26
  va_list args;
23
27
  va_start(args, msg);
24
28
  vasprintf(&message, msg, args);
25
29
  va_end(args);
26
30
 
27
- rb_raise(rb_eRuntimeError, message);
31
+ exception = rb_exc_new2(rb_eRuntimeError, message);
32
+ vasprintf_free(message);
33
+ rb_exc_raise(exception);
28
34
  }
29
35
 
30
36
  /*
@@ -97,7 +103,9 @@ static VALUE transform(int argc, VALUE* argv, VALUE self)
97
103
  long param_len, j ;
98
104
 
99
105
  rb_scan_args(argc, argv, "11", &xmldoc, &paramobj);
100
- if (NIL_P(paramobj)) { paramobj = rb_ary_new2(0) ; }
106
+ if (NIL_P(paramobj)) { paramobj = rb_ary_new2(0L) ; }
107
+ if (!rb_obj_is_kind_of(xmldoc, cNokogiriXmlDocument))
108
+ rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::Document");
101
109
 
102
110
  /* handle hashes as arguments. */
103
111
  if(T_HASH == TYPE(paramobj)) {
@@ -124,19 +132,133 @@ static VALUE transform(int argc, VALUE* argv, VALUE self)
124
132
 
125
133
  if (!result) rb_raise(rb_eRuntimeError, "could not perform xslt transform on document");
126
134
 
127
- return Nokogiri_wrap_xml_document(0, result) ;
135
+ return Nokogiri_wrap_xml_document((VALUE)0, result) ;
136
+ }
137
+
138
+ static void method_caller(xmlXPathParserContextPtr ctxt, int nargs)
139
+ {
140
+ const xmlChar * function;
141
+ const xmlChar * functionURI;
142
+ size_t i, count;
143
+
144
+ xsltTransformContextPtr transform;
145
+ xmlXPathObjectPtr xpath;
146
+ VALUE obj;
147
+ VALUE *args;
148
+ VALUE result;
149
+
150
+ transform = xsltXPathGetTransformContext(ctxt);
151
+
152
+ function = ctxt->context->function;
153
+ functionURI = ctxt->context->functionURI;
154
+ obj = (VALUE)xsltGetExtData(transform, functionURI);
155
+
156
+ count = (size_t)ctxt->valueNr;
157
+ args = calloc(count, sizeof(VALUE *));
158
+
159
+ for(i = 0; i < count; i++) {
160
+ VALUE thing;
161
+
162
+ xpath = valuePop(ctxt);
163
+ switch(xpath->type) {
164
+ case XPATH_STRING:
165
+ thing = NOKOGIRI_STR_NEW2(xpath->stringval);
166
+ break;
167
+ case XPATH_NODESET:
168
+ if(NULL == xpath->nodesetval) {
169
+ thing = Nokogiri_wrap_xml_node_set(
170
+ xmlXPathNodeSetCreate(NULL),
171
+ DOC_RUBY_OBJECT(ctxt->context->doc));
172
+ } else {
173
+ thing = Nokogiri_wrap_xml_node_set(xpath->nodesetval,
174
+ DOC_RUBY_OBJECT(ctxt->context->doc));
175
+ }
176
+ break;
177
+ default:
178
+ rb_raise(rb_eRuntimeError, "do not handle type: %d", xpath->type);
179
+ }
180
+ args[i] = thing;
181
+ }
182
+ result = rb_funcall3(obj, rb_intern((const char *)function), (int)count, args);
183
+ switch(TYPE(result)) {
184
+ case T_FLOAT:
185
+ case T_BIGNUM:
186
+ case T_FIXNUM:
187
+ xmlXPathReturnNumber(ctxt, NUM2DBL(result));
188
+ break;
189
+ case T_STRING:
190
+ xmlXPathReturnString(
191
+ ctxt,
192
+ xmlStrdup((xmlChar *)StringValuePtr(result))
193
+ );
194
+ break;
195
+ case T_TRUE:
196
+ xmlXPathReturnTrue(ctxt);
197
+ break;
198
+ case T_FALSE:
199
+ xmlXPathReturnFalse(ctxt);
200
+ break;
201
+ case T_NIL:
202
+ break;
203
+ default:
204
+ rb_raise(rb_eRuntimeError, "Invalid return type");
205
+ }
206
+ }
207
+
208
+ static void * initFunc(xsltTransformContextPtr ctxt, const xmlChar *uri)
209
+ {
210
+ VALUE modules = rb_iv_get(xslt, "@modules");
211
+ VALUE obj = rb_hash_aref(modules, rb_str_new2((const char *)uri));
212
+ VALUE args = { Qfalse };
213
+ VALUE methods = rb_funcall(obj, rb_intern("instance_methods"), 1, args);
214
+ int i;
215
+
216
+ for(i = 0; i < RARRAY_LEN(methods); i++) {
217
+ VALUE method_name = rb_obj_as_string(RARRAY_PTR(methods)[i]);
218
+ xsltRegisterExtFunction(ctxt,
219
+ (unsigned char *)StringValuePtr(method_name), uri, method_caller);
220
+ }
221
+
222
+ return (void *)rb_class_new_instance(0, NULL, obj);
223
+ }
224
+
225
+ static void shutdownFunc(xsltTransformContextPtr ctxt,
226
+ const xmlChar *uri, void *data)
227
+ {
228
+ }
229
+
230
+ /*
231
+ * call-seq:
232
+ * register(uri, custom_handler_class)
233
+ *
234
+ * Register a class that implements custom XLST transformation functions.
235
+ */
236
+ static VALUE registr(VALUE self, VALUE uri, VALUE obj)
237
+ {
238
+ VALUE modules = rb_iv_get(self, "@modules");
239
+ if(NIL_P(modules)) rb_raise(rb_eRuntimeError, "wtf! @modules isn't set");
240
+
241
+ rb_hash_aset(modules, uri, obj);
242
+ xsltRegisterExtModule((unsigned char *)StringValuePtr(uri), initFunc, shutdownFunc);
243
+ return self;
128
244
  }
129
245
 
130
246
  VALUE cNokogiriXsltStylesheet ;
131
247
  void init_xslt_stylesheet()
132
248
  {
133
- VALUE nokogiri = rb_define_module("Nokogiri");
134
- VALUE xslt = rb_define_module_under(nokogiri, "XSLT");
135
- VALUE klass = rb_define_class_under(xslt, "Stylesheet", rb_cObject);
249
+ VALUE nokogiri;
250
+ VALUE klass;
251
+
252
+ nokogiri = rb_define_module("Nokogiri");
253
+ xslt = rb_define_module_under(nokogiri, "XSLT");
254
+ klass = rb_define_class_under(xslt, "Stylesheet", rb_cObject);
255
+
256
+ rb_iv_set(xslt, "@modules", rb_hash_new());
136
257
 
137
258
  cNokogiriXsltStylesheet = klass;
138
259
 
139
260
  rb_define_singleton_method(klass, "parse_stylesheet_doc", parse_stylesheet_doc, 1);
261
+ rb_define_singleton_method(xslt, "register", registr, 2);
140
262
  rb_define_method(klass, "serialize", serialize, 1);
141
263
  rb_define_method(klass, "transform", transform, -1);
142
264
  }
data/lib/isorelax.jar ADDED
Binary file
data/lib/jing.jar ADDED
Binary file
data/lib/nekodtd.jar ADDED
Binary file
data/lib/nekohtml.jar ADDED
Binary file