vtd_xml 0.0.3-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (545) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +23 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.md +29 -0
  6. data/Rakefile +20 -0
  7. data/bundle/bundler/setup.rb +10 -0
  8. data/bundle/jruby/1.9/bin/convert_to_should_syntax +23 -0
  9. data/bundle/jruby/1.9/bin/nokogiri +23 -0
  10. data/bundle/jruby/1.9/bin/rake +23 -0
  11. data/bundle/jruby/1.9/build_info/mini_portile-0.5.2.info +1 -0
  12. data/bundle/jruby/1.9/build_info/nokogiri-1.6.1-java.info +1 -0
  13. data/bundle/jruby/1.9/build_info/rake-10.1.1.info +1 -0
  14. data/bundle/jruby/1.9/build_info/shoulda-context-1.1.6.info +1 -0
  15. data/bundle/jruby/1.9/cache/mini_portile-0.5.2.gem +0 -0
  16. data/bundle/jruby/1.9/cache/nokogiri-1.6.1-java.gem +0 -0
  17. data/bundle/jruby/1.9/cache/rake-10.1.1.gem +0 -0
  18. data/bundle/jruby/1.9/cache/shoulda-context-1.1.6.gem +0 -0
  19. data/bundle/jruby/1.9/gems/mini_portile-0.5.2/History.txt +65 -0
  20. data/bundle/jruby/1.9/gems/mini_portile-0.5.2/LICENSE.txt +20 -0
  21. data/bundle/jruby/1.9/gems/mini_portile-0.5.2/README.rdoc +169 -0
  22. data/bundle/jruby/1.9/gems/mini_portile-0.5.2/Rakefile +44 -0
  23. data/bundle/jruby/1.9/gems/mini_portile-0.5.2/examples/Rakefile +55 -0
  24. data/bundle/jruby/1.9/gems/mini_portile-0.5.2/lib/mini_portile.rb +404 -0
  25. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/CHANGELOG.ja.rdoc +828 -0
  26. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/CHANGELOG.rdoc +835 -0
  27. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/C_CODING_STYLE.rdoc +33 -0
  28. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/Gemfile +21 -0
  29. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/Manifest.txt +315 -0
  30. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/README.ja.rdoc +106 -0
  31. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/README.rdoc +175 -0
  32. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ROADMAP.md +90 -0
  33. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/Rakefile +248 -0
  34. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/STANDARD_RESPONSES.md +47 -0
  35. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/Y_U_NO_GEMSPEC.md +155 -0
  36. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/bin/nokogiri +78 -0
  37. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/build_all +105 -0
  38. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/dependencies.yml +4 -0
  39. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/EncodingHandler.java +124 -0
  40. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/HtmlDocument.java +189 -0
  41. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/HtmlElementDescription.java +145 -0
  42. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/HtmlEntityLookup.java +79 -0
  43. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/HtmlSaxParserContext.java +259 -0
  44. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/NokogiriService.java +605 -0
  45. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlAttr.java +190 -0
  46. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlAttributeDecl.java +130 -0
  47. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlCdata.java +84 -0
  48. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlComment.java +95 -0
  49. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlDocument.java +598 -0
  50. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlDocumentFragment.java +210 -0
  51. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlDtd.java +480 -0
  52. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlElement.java +88 -0
  53. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlElementContent.java +382 -0
  54. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlElementDecl.java +152 -0
  55. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlEntityDecl.java +162 -0
  56. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlEntityReference.java +101 -0
  57. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlNamespace.java +216 -0
  58. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlNode.java +1637 -0
  59. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlNodeSet.java +270 -0
  60. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlProcessingInstruction.java +99 -0
  61. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlReader.java +532 -0
  62. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlRelaxng.java +144 -0
  63. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlSaxParserContext.java +356 -0
  64. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlSaxPushParser.java +232 -0
  65. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlSchema.java +324 -0
  66. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlSyntaxError.java +136 -0
  67. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlText.java +107 -0
  68. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XmlXpathContext.java +203 -0
  69. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/XsltStylesheet.java +360 -0
  70. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/ClosedStreamException.java +10 -0
  71. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/HtmlDomParserContext.java +243 -0
  72. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +151 -0
  73. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriDocumentCache.java +73 -0
  74. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriDomParser.java +116 -0
  75. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriEncodingReaderWrapper.java +109 -0
  76. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriEntityResolver.java +123 -0
  77. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriErrorHandler.java +86 -0
  78. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriHandler.java +341 -0
  79. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriHelpers.java +826 -0
  80. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +180 -0
  81. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +130 -0
  82. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +98 -0
  83. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +121 -0
  84. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +79 -0
  85. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriXPathFunction.java +141 -0
  86. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +73 -0
  87. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +67 -0
  88. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +87 -0
  89. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/ParserContext.java +289 -0
  90. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/ReaderNode.java +534 -0
  91. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/SaveContextVisitor.java +780 -0
  92. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/SchemaErrorHandler.java +76 -0
  93. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/UncloseableInputStream.java +102 -0
  94. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/XmlDeclHandler.java +42 -0
  95. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/XmlDomParserContext.java +275 -0
  96. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/XmlSaxParser.java +65 -0
  97. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/java/nokogiri/internals/XsltExtensionFunction.java +72 -0
  98. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/depend +358 -0
  99. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/extconf.rb +195 -0
  100. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/html_document.c +170 -0
  101. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/html_document.h +10 -0
  102. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/html_element_description.c +279 -0
  103. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/html_element_description.h +10 -0
  104. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/html_entity_lookup.c +32 -0
  105. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/html_entity_lookup.h +8 -0
  106. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/html_sax_parser_context.c +116 -0
  107. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/html_sax_parser_context.h +11 -0
  108. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/html_sax_push_parser.c +87 -0
  109. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/html_sax_push_parser.h +9 -0
  110. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/nokogiri.c +143 -0
  111. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/nokogiri.h +164 -0
  112. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_attr.c +94 -0
  113. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_attr.h +9 -0
  114. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_attribute_decl.c +70 -0
  115. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_attribute_decl.h +9 -0
  116. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_cdata.c +56 -0
  117. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_cdata.h +9 -0
  118. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_comment.c +54 -0
  119. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_comment.h +9 -0
  120. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_document.c +576 -0
  121. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_document.h +23 -0
  122. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_document_fragment.c +48 -0
  123. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_document_fragment.h +10 -0
  124. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_dtd.c +202 -0
  125. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_dtd.h +10 -0
  126. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_element_content.c +123 -0
  127. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_element_content.h +10 -0
  128. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_element_decl.c +69 -0
  129. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_element_decl.h +9 -0
  130. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_encoding_handler.c +79 -0
  131. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_encoding_handler.h +8 -0
  132. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_entity_decl.c +110 -0
  133. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_entity_decl.h +10 -0
  134. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_entity_reference.c +52 -0
  135. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_entity_reference.h +9 -0
  136. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_io.c +56 -0
  137. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_io.h +11 -0
  138. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  139. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  140. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_namespace.c +78 -0
  141. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_namespace.h +13 -0
  142. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_node.c +1534 -0
  143. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_node.h +13 -0
  144. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_node_set.c +467 -0
  145. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_node_set.h +14 -0
  146. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_processing_instruction.c +56 -0
  147. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_processing_instruction.h +9 -0
  148. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_reader.c +681 -0
  149. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_reader.h +10 -0
  150. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_relax_ng.c +161 -0
  151. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_relax_ng.h +9 -0
  152. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_sax_parser.c +312 -0
  153. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_sax_parser.h +39 -0
  154. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_sax_parser_context.c +222 -0
  155. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_sax_parser_context.h +10 -0
  156. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_sax_push_parser.c +115 -0
  157. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_sax_push_parser.h +9 -0
  158. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_schema.c +205 -0
  159. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_schema.h +9 -0
  160. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_syntax_error.c +58 -0
  161. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_syntax_error.h +13 -0
  162. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_text.c +52 -0
  163. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_text.h +9 -0
  164. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_xpath_context.c +319 -0
  165. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xml_xpath_context.h +10 -0
  166. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xslt_stylesheet.c +270 -0
  167. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/ext/nokogiri/xslt_stylesheet.h +14 -0
  168. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/isorelax.jar +0 -0
  169. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/jing.jar +0 -0
  170. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nekodtd.jar +0 -0
  171. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nekohtml.jar +0 -0
  172. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/css/node.rb +102 -0
  173. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/css/parser.rb +720 -0
  174. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/css/parser.y +258 -0
  175. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/css/parser_extras.rb +91 -0
  176. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/css/syntax_error.rb +7 -0
  177. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/css/tokenizer.rb +152 -0
  178. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/css/tokenizer.rex +55 -0
  179. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/css/xpath_visitor.rb +171 -0
  180. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/css.rb +27 -0
  181. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/decorators/slop.rb +35 -0
  182. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/html/builder.rb +35 -0
  183. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/html/document.rb +254 -0
  184. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/html/document_fragment.rb +41 -0
  185. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/html/element_description.rb +23 -0
  186. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/html/element_description_defaults.rb +671 -0
  187. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/html/entity_lookup.rb +13 -0
  188. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/html/sax/parser.rb +52 -0
  189. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/html/sax/parser_context.rb +16 -0
  190. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/html/sax/push_parser.rb +16 -0
  191. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/html.rb +37 -0
  192. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/nokogiri.jar +0 -0
  193. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/syntax_error.rb +4 -0
  194. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/version.rb +106 -0
  195. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/attr.rb +14 -0
  196. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/attribute_decl.rb +18 -0
  197. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/builder.rb +443 -0
  198. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/cdata.rb +11 -0
  199. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/character_data.rb +7 -0
  200. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/document.rb +279 -0
  201. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/document_fragment.rb +112 -0
  202. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/dtd.rb +22 -0
  203. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/element_content.rb +36 -0
  204. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/element_decl.rb +13 -0
  205. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/entity_decl.rb +19 -0
  206. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/namespace.rb +13 -0
  207. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/node/save_options.rb +61 -0
  208. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/node.rb +957 -0
  209. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/node_set.rb +355 -0
  210. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/notation.rb +6 -0
  211. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/parse_options.rb +98 -0
  212. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/pp/character_data.rb +18 -0
  213. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/pp/node.rb +56 -0
  214. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/pp.rb +2 -0
  215. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/processing_instruction.rb +8 -0
  216. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/reader.rb +112 -0
  217. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/relax_ng.rb +32 -0
  218. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/sax/document.rb +171 -0
  219. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/sax/parser.rb +123 -0
  220. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  221. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  222. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/sax.rb +4 -0
  223. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/schema.rb +63 -0
  224. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/syntax_error.rb +47 -0
  225. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/text.rb +9 -0
  226. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  227. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/xpath.rb +10 -0
  228. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml/xpath_context.rb +16 -0
  229. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xml.rb +73 -0
  230. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xslt/stylesheet.rb +25 -0
  231. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri/xslt.rb +56 -0
  232. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/nokogiri.rb +128 -0
  233. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/xercesImpl.jar +0 -0
  234. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/lib/xsd/xmlparser/nokogiri.rb +102 -0
  235. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/tasks/cross_compile.rb +134 -0
  236. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/tasks/nokogiri.org.rb +24 -0
  237. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/tasks/test.rb +95 -0
  238. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/css/test_nthiness.rb +159 -0
  239. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/css/test_parser.rb +341 -0
  240. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/css/test_tokenizer.rb +198 -0
  241. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/css/test_xpath_visitor.rb +91 -0
  242. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/decorators/test_slop.rb +16 -0
  243. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/2ch.html +108 -0
  244. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/address_book.rlx +12 -0
  245. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/address_book.xml +10 -0
  246. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/bar/bar.xsd +4 -0
  247. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/bogus.xml +0 -0
  248. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/dont_hurt_em_why.xml +422 -0
  249. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/encoding.html +82 -0
  250. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/encoding.xhtml +84 -0
  251. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/exslt.xml +8 -0
  252. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/exslt.xslt +35 -0
  253. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/foo/foo.xsd +4 -0
  254. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/metacharset.html +10 -0
  255. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/noencoding.html +47 -0
  256. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/po.xml +32 -0
  257. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/po.xsd +66 -0
  258. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/saml/saml20assertion_schema.xsd +283 -0
  259. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/saml/saml20protocol_schema.xsd +302 -0
  260. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/saml/xenc_schema.xsd +146 -0
  261. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/saml/xmldsig_schema.xsd +318 -0
  262. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/shift_jis.html +10 -0
  263. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/shift_jis.xml +5 -0
  264. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/snuggles.xml +3 -0
  265. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/staff.dtd +10 -0
  266. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/staff.xml +59 -0
  267. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/staff.xslt +32 -0
  268. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/test_document_url/bar.xml +2 -0
  269. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/test_document_url/document.dtd +4 -0
  270. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/test_document_url/document.xml +6 -0
  271. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/tlm.html +850 -0
  272. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/to_be_xincluded.xml +2 -0
  273. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/valid_bar.xml +2 -0
  274. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/files/xinclude.xml +4 -0
  275. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/helper.rb +154 -0
  276. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/html/sax/test_parser.rb +141 -0
  277. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/html/sax/test_parser_context.rb +46 -0
  278. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/html/test_builder.rb +164 -0
  279. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/html/test_document.rb +552 -0
  280. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/html/test_document_encoding.rb +138 -0
  281. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/html/test_document_fragment.rb +261 -0
  282. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/html/test_element_description.rb +105 -0
  283. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/html/test_named_characters.rb +14 -0
  284. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/html/test_node.rb +196 -0
  285. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/html/test_node_encoding.rb +27 -0
  286. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/namespaces/test_additional_namespaces_in_builder_doc.rb +14 -0
  287. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/namespaces/test_namespaces_in_builder_doc.rb +75 -0
  288. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/namespaces/test_namespaces_in_created_doc.rb +75 -0
  289. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/namespaces/test_namespaces_in_parsed_doc.rb +66 -0
  290. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/test_convert_xpath.rb +135 -0
  291. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/test_css_cache.rb +45 -0
  292. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/test_encoding_handler.rb +46 -0
  293. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/test_memory_leak.rb +156 -0
  294. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/test_nokogiri.rb +132 -0
  295. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/test_reader.rb +555 -0
  296. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/test_soap4r_sax.rb +52 -0
  297. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/test_xslt_transforms.rb +254 -0
  298. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/node/test_save_options.rb +28 -0
  299. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/node/test_subclass.rb +44 -0
  300. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/sax/test_parser.rb +366 -0
  301. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/sax/test_parser_context.rb +106 -0
  302. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/sax/test_push_parser.rb +157 -0
  303. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_attr.rb +64 -0
  304. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_attribute_decl.rb +86 -0
  305. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_builder.rb +306 -0
  306. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_c14n.rb +151 -0
  307. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_cdata.rb +48 -0
  308. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_comment.rb +29 -0
  309. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_document.rb +868 -0
  310. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_document_encoding.rb +28 -0
  311. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_document_fragment.rb +223 -0
  312. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_dtd.rb +103 -0
  313. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_dtd_encoding.rb +33 -0
  314. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_element_content.rb +56 -0
  315. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_element_decl.rb +73 -0
  316. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_entity_decl.rb +122 -0
  317. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_entity_reference.rb +245 -0
  318. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_namespace.rb +95 -0
  319. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_node.rb +1137 -0
  320. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_node_attributes.rb +96 -0
  321. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_node_encoding.rb +107 -0
  322. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_node_inheritance.rb +32 -0
  323. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_node_reparenting.rb +374 -0
  324. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_node_set.rb +755 -0
  325. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_parse_options.rb +64 -0
  326. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_processing_instruction.rb +30 -0
  327. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_reader_encoding.rb +142 -0
  328. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_relax_ng.rb +60 -0
  329. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_schema.rb +103 -0
  330. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_syntax_error.rb +12 -0
  331. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_text.rb +45 -0
  332. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_unparented_node.rb +422 -0
  333. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_xinclude.rb +83 -0
  334. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xml/test_xpath.rb +295 -0
  335. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xslt/test_custom_functions.rb +133 -0
  336. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test/xslt/test_exception_handling.rb +37 -0
  337. data/bundle/jruby/1.9/gems/nokogiri-1.6.1-java/test_all +81 -0
  338. data/bundle/jruby/1.9/gems/rake-10.1.1/CHANGES +530 -0
  339. data/bundle/jruby/1.9/gems/rake-10.1.1/MIT-LICENSE +21 -0
  340. data/bundle/jruby/1.9/gems/rake-10.1.1/README.rdoc +187 -0
  341. data/bundle/jruby/1.9/gems/rake-10.1.1/Rakefile +374 -0
  342. data/bundle/jruby/1.9/gems/rake-10.1.1/TODO +21 -0
  343. data/bundle/jruby/1.9/gems/rake-10.1.1/bin/rake +33 -0
  344. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/command_line_usage.rdoc +152 -0
  345. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/example/Rakefile1 +38 -0
  346. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/example/Rakefile2 +35 -0
  347. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/example/a.c +6 -0
  348. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/example/b.c +6 -0
  349. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/example/main.c +11 -0
  350. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/glossary.rdoc +51 -0
  351. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/jamis.rb +591 -0
  352. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/proto_rake.rdoc +127 -0
  353. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/rake.1.gz +0 -0
  354. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/rakefile.rdoc +617 -0
  355. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/rational.rdoc +151 -0
  356. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.4.14.rdoc +23 -0
  357. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.4.15.rdoc +35 -0
  358. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.5.0.rdoc +53 -0
  359. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.5.3.rdoc +78 -0
  360. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.5.4.rdoc +46 -0
  361. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.6.0.rdoc +141 -0
  362. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.7.0.rdoc +119 -0
  363. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.7.1.rdoc +59 -0
  364. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.7.2.rdoc +121 -0
  365. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.7.3.rdoc +47 -0
  366. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.8.0.rdoc +114 -0
  367. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.8.2.rdoc +165 -0
  368. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.8.3.rdoc +112 -0
  369. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.8.4.rdoc +147 -0
  370. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.8.5.rdoc +53 -0
  371. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.8.6.rdoc +55 -0
  372. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.8.7.rdoc +55 -0
  373. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.9.0.rdoc +112 -0
  374. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.9.1.rdoc +52 -0
  375. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.9.2.2.rdoc +55 -0
  376. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.9.2.rdoc +49 -0
  377. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.9.3.rdoc +102 -0
  378. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.9.4.rdoc +110 -0
  379. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.9.5.rdoc +114 -0
  380. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-0.9.6.rdoc +127 -0
  381. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-10.0.0.rdoc +178 -0
  382. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-10.0.1.rdoc +187 -0
  383. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-10.0.2.rdoc +191 -0
  384. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-10.0.3.rdoc +191 -0
  385. data/bundle/jruby/1.9/gems/rake-10.1.1/doc/release_notes/rake-10.1.0.rdoc +61 -0
  386. data/bundle/jruby/1.9/gems/rake-10.1.1/install.rb +80 -0
  387. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/alt_system.rb +108 -0
  388. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/application.rb +728 -0
  389. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/backtrace.rb +20 -0
  390. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/clean.rb +55 -0
  391. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/cloneable.rb +16 -0
  392. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/contrib/compositepublisher.rb +21 -0
  393. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/contrib/ftptools.rb +139 -0
  394. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/contrib/publisher.rb +73 -0
  395. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/contrib/rubyforgepublisher.rb +16 -0
  396. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/contrib/sshpublisher.rb +50 -0
  397. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/contrib/sys.rb +2 -0
  398. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/default_loader.rb +10 -0
  399. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/dsl_definition.rb +157 -0
  400. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/early_time.rb +18 -0
  401. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/ext/core.rb +28 -0
  402. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/ext/module.rb +0 -0
  403. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/ext/string.rb +166 -0
  404. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/ext/time.rb +15 -0
  405. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/file_creation_task.rb +24 -0
  406. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/file_list.rb +416 -0
  407. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/file_task.rb +46 -0
  408. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/file_utils.rb +116 -0
  409. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/file_utils_ext.rb +144 -0
  410. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/gempackagetask.rb +2 -0
  411. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/invocation_chain.rb +57 -0
  412. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/invocation_exception_mixin.rb +16 -0
  413. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/linked_list.rb +103 -0
  414. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/loaders/makefile.rb +40 -0
  415. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/multi_task.rb +13 -0
  416. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/name_space.rb +25 -0
  417. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/packagetask.rb +190 -0
  418. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/pathmap.rb +1 -0
  419. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/phony.rb +15 -0
  420. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/private_reader.rb +20 -0
  421. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/promise.rb +99 -0
  422. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/pseudo_status.rb +29 -0
  423. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/rake_module.rb +37 -0
  424. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/rake_test_loader.rb +22 -0
  425. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/rdoctask.rb +2 -0
  426. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/ruby182_test_unit_fix.rb +27 -0
  427. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/rule_recursion_overflow_error.rb +20 -0
  428. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/runtest.rb +22 -0
  429. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/scope.rb +42 -0
  430. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/task.rb +378 -0
  431. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/task_argument_error.rb +7 -0
  432. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/task_arguments.rb +89 -0
  433. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/task_manager.rb +297 -0
  434. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/tasklib.rb +22 -0
  435. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/testtask.rb +201 -0
  436. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/thread_history_display.rb +48 -0
  437. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/thread_pool.rb +161 -0
  438. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/trace_output.rb +22 -0
  439. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/version.rb +9 -0
  440. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake/win32.rb +56 -0
  441. data/bundle/jruby/1.9/gems/rake-10.1.1/lib/rake.rb +73 -0
  442. data/bundle/jruby/1.9/gems/rake-10.1.1/test/file_creation.rb +34 -0
  443. data/bundle/jruby/1.9/gems/rake-10.1.1/test/helper.rb +128 -0
  444. data/bundle/jruby/1.9/gems/rake-10.1.1/test/support/rakefile_definitions.rb +444 -0
  445. data/bundle/jruby/1.9/gems/rake-10.1.1/test/support/ruby_runner.rb +33 -0
  446. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_private_reader.rb +42 -0
  447. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake.rb +40 -0
  448. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_application.rb +517 -0
  449. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_application_options.rb +457 -0
  450. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_backtrace.rb +113 -0
  451. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_clean.rb +46 -0
  452. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_definitions.rb +79 -0
  453. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_directory_task.rb +57 -0
  454. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_dsl.rb +40 -0
  455. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_early_time.rb +31 -0
  456. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_extension.rb +59 -0
  457. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_file_creation_task.rb +56 -0
  458. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_file_list.rb +627 -0
  459. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_file_list_path_map.rb +8 -0
  460. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_file_task.rb +122 -0
  461. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_file_utils.rb +309 -0
  462. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_ftp_file.rb +74 -0
  463. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_functional.rb +466 -0
  464. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_invocation_chain.rb +64 -0
  465. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_linked_list.rb +84 -0
  466. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_makefile_loader.rb +46 -0
  467. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_multi_task.rb +58 -0
  468. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_name_space.rb +43 -0
  469. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_package_task.rb +79 -0
  470. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_path_map.rb +168 -0
  471. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_path_map_explode.rb +34 -0
  472. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_path_map_partial.rb +18 -0
  473. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_pseudo_status.rb +21 -0
  474. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_rake_test_loader.rb +20 -0
  475. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_reduce_compat.rb +26 -0
  476. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_require.rb +40 -0
  477. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_rules.rb +362 -0
  478. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_scope.rb +44 -0
  479. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_task.rb +376 -0
  480. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_task_argument_parsing.rb +103 -0
  481. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_task_arguments.rb +121 -0
  482. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_task_lib.rb +9 -0
  483. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_task_manager.rb +158 -0
  484. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_task_manager_argument_resolution.rb +19 -0
  485. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_task_with_arguments.rb +171 -0
  486. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_test_task.rb +119 -0
  487. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_thread_pool.rb +142 -0
  488. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_top_level_functions.rb +71 -0
  489. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_rake_win32.rb +72 -0
  490. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_thread_history_display.rb +101 -0
  491. data/bundle/jruby/1.9/gems/rake-10.1.1/test/test_trace_output.rb +52 -0
  492. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/Appraisals +21 -0
  493. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/CONTRIBUTING.md +38 -0
  494. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/Gemfile +3 -0
  495. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/MIT-LICENSE +22 -0
  496. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/README.md +54 -0
  497. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/Rakefile +21 -0
  498. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/bin/convert_to_should_syntax +42 -0
  499. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/gemfiles/3.0.gemfile +7 -0
  500. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/gemfiles/3.0.gemfile.lock +91 -0
  501. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/gemfiles/3.1.gemfile +9 -0
  502. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/gemfiles/3.1.gemfile.lock +112 -0
  503. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/gemfiles/3.2.gemfile +9 -0
  504. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/gemfiles/3.2.gemfile.lock +111 -0
  505. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/gemfiles/4.0.gemfile +9 -0
  506. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/gemfiles/4.0.gemfile.lock +107 -0
  507. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/init.rb +1 -0
  508. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/lib/shoulda/context/assertions.rb +96 -0
  509. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/lib/shoulda/context/autoload_macros.rb +46 -0
  510. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/lib/shoulda/context/context.rb +481 -0
  511. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/lib/shoulda/context/proc_extensions.rb +14 -0
  512. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/lib/shoulda/context/tasks/list_tests.rake +29 -0
  513. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/lib/shoulda/context/tasks/yaml_to_shoulda.rake +28 -0
  514. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/lib/shoulda/context/tasks.rb +3 -0
  515. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/lib/shoulda/context/version.rb +5 -0
  516. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/lib/shoulda/context.rb +33 -0
  517. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/lib/shoulda-context.rb +1 -0
  518. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/rails/init.rb +4 -0
  519. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/shoulda-context.gemspec +27 -0
  520. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/tasks/shoulda.rake +1 -0
  521. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/test/fake_rails_root/test/shoulda_macros/custom_macro.rb +6 -0
  522. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/test/shoulda/autoload_macro_test.rb +18 -0
  523. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/test/shoulda/context_test.rb +360 -0
  524. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/test/shoulda/convert_to_should_syntax_test.rb +63 -0
  525. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/test/shoulda/helpers_test.rb +190 -0
  526. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/test/shoulda/should_test.rb +291 -0
  527. data/bundle/jruby/1.9/gems/shoulda-context-1.1.6/test/test_helper.rb +11 -0
  528. data/bundle/jruby/1.9/specifications/mini_portile-0.5.2.gemspec +22 -0
  529. data/bundle/jruby/1.9/specifications/nokogiri-1.6.1-java.gemspec +69 -0
  530. data/bundle/jruby/1.9/specifications/rake-10.1.1.gemspec +35 -0
  531. data/bundle/jruby/1.9/specifications/shoulda-context-1.1.6.gemspec +44 -0
  532. data/lib/vtd-xml-2.11.jar +0 -0
  533. data/lib/vtd_xml/document.rb +124 -0
  534. data/lib/vtd_xml/extraction_error.rb +4 -0
  535. data/lib/vtd_xml/modify_error.rb +5 -0
  536. data/lib/vtd_xml/parse_error.rb +5 -0
  537. data/lib/vtd_xml/version.rb +4 -0
  538. data/lib/vtd_xml/xpath_error.rb +4 -0
  539. data/lib/vtd_xml.rb +8 -0
  540. data/pkg/vtd_xml-0.0.3-java.gem +0 -0
  541. data/test/test_load_paths.rb +18 -0
  542. data/test/unit/vtd_xml/document_test.rb +266 -0
  543. data/vtd_xml.gemspec +25 -0
  544. data/vtd_xml.iml +16 -0
  545. metadata +648 -0
@@ -0,0 +1,1637 @@
1
+ /**
2
+ * (The MIT License)
3
+ *
4
+ * Copyright (c) 2008 - 2012:
5
+ *
6
+ * * {Aaron Patterson}[http://tenderlovemaking.com]
7
+ * * {Mike Dalessio}[http://mike.daless.io]
8
+ * * {Charles Nutter}[http://blog.headius.com]
9
+ * * {Sergio Arbeo}[http://www.serabe.com]
10
+ * * {Patrick Mahoney}[http://polycrystal.org]
11
+ * * {Yoko Harada}[http://yokolet.blogspot.com]
12
+ *
13
+ * Permission is hereby granted, free of charge, to any person obtaining
14
+ * a copy of this software and associated documentation files (the
15
+ * 'Software'), to deal in the Software without restriction, including
16
+ * without limitation the rights to use, copy, modify, merge, publish,
17
+ * distribute, sublicense, and/or sell copies of the Software, and to
18
+ * permit persons to whom the Software is furnished to do so, subject to
19
+ * the following conditions:
20
+ *
21
+ * The above copyright notice and this permission notice shall be
22
+ * included in all copies or substantial portions of the Software.
23
+ *
24
+ * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
25
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
27
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
28
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
29
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
30
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31
+ */
32
+
33
+ package nokogiri;
34
+
35
+ import static java.lang.Math.max;
36
+ import static nokogiri.internals.NokogiriHelpers.getCachedNodeOrCreate;
37
+ import static nokogiri.internals.NokogiriHelpers.getNokogiriClass;
38
+ import static nokogiri.internals.NokogiriHelpers.nodeArrayToRubyArray;
39
+ import static nokogiri.internals.NokogiriHelpers.nonEmptyStringOrNil;
40
+ import static nokogiri.internals.NokogiriHelpers.rubyStringToString;
41
+ import static nokogiri.internals.NokogiriHelpers.stringOrNil;
42
+
43
+ import java.io.ByteArrayInputStream;
44
+ import java.io.InputStream;
45
+ import java.nio.charset.CharacterCodingException;
46
+ import java.nio.charset.Charset;
47
+ import java.util.ArrayList;
48
+ import java.util.Iterator;
49
+ import java.util.List;
50
+
51
+ import nokogiri.internals.HtmlDomParserContext;
52
+ import nokogiri.internals.NokogiriHelpers;
53
+ import nokogiri.internals.NokogiriNamespaceCache;
54
+ import nokogiri.internals.SaveContextVisitor;
55
+ import nokogiri.internals.XmlDomParserContext;
56
+
57
+ import org.apache.xerces.dom.CoreDocumentImpl;
58
+ import org.jruby.Ruby;
59
+ import org.jruby.RubyArray;
60
+ import org.jruby.RubyClass;
61
+ import org.jruby.RubyFixnum;
62
+ import org.jruby.RubyModule;
63
+ import org.jruby.RubyObject;
64
+ import org.jruby.RubyString;
65
+ import org.jruby.anno.JRubyClass;
66
+ import org.jruby.anno.JRubyMethod;
67
+ import org.jruby.exceptions.RaiseException;
68
+ import org.jruby.javasupport.util.RuntimeHelpers;
69
+ import org.jruby.runtime.Block;
70
+ import org.jruby.runtime.ThreadContext;
71
+ import org.jruby.runtime.Visibility;
72
+ import org.jruby.runtime.builtin.IRubyObject;
73
+ import org.w3c.dom.Attr;
74
+ import org.w3c.dom.Document;
75
+ import org.w3c.dom.DocumentFragment;
76
+ import org.w3c.dom.Element;
77
+ import org.w3c.dom.NamedNodeMap;
78
+ import org.w3c.dom.Node;
79
+ import org.w3c.dom.NodeList;
80
+ import org.w3c.dom.Text;
81
+
82
+ /**
83
+ * Class for Nokogiri::XML::Node
84
+ *
85
+ * @author sergio
86
+ * @author Patrick Mahoney <pat@polycrystal.org>
87
+ * @author Yoko Harada <yokolet@gmail.com>
88
+ */
89
+ @JRubyClass(name="Nokogiri::XML::Node")
90
+ public class XmlNode extends RubyObject {
91
+
92
+ /** The underlying Node object. */
93
+ protected Node node;
94
+
95
+ /* Cached objects */
96
+ protected IRubyObject content = null;
97
+ protected IRubyObject doc = null;
98
+ protected IRubyObject name = null;
99
+
100
+ /*
101
+ * Taken from http://ejohn.org/blog/comparing-document-position/
102
+ * Used for compareDocumentPosition.
103
+ * <ironic>Thanks to both java api and w3 doc for its helpful documentation</ironic>
104
+ */
105
+
106
+ protected static final int IDENTICAL_ELEMENTS = 0;
107
+ protected static final int IN_DIFFERENT_DOCUMENTS = 1;
108
+ protected static final int SECOND_PRECEDES_FIRST = 2;
109
+ protected static final int FIRST_PRECEDES_SECOND = 4;
110
+ protected static final int SECOND_CONTAINS_FIRST = 8;
111
+ protected static final int FIRST_CONTAINS_SECOND = 16;
112
+
113
+ /**
114
+ * Cast <code>node</code> to an XmlNode or raise a type error
115
+ * in <code>context</code>.
116
+ */
117
+ protected static XmlNode asXmlNode(ThreadContext context, IRubyObject node) {
118
+ if (node == null || !(node instanceof XmlNode)) {
119
+ Ruby ruby = context.getRuntime();
120
+ throw ruby.newTypeError(node, getNokogiriClass(ruby, "Nokogiri::XML::Node"));
121
+ } else {
122
+ return (XmlNode) node;
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Cast <code>node</code> to an XmlNode, or null if RubyNil, or
128
+ * raise a type error in <code>context</code>.
129
+ */
130
+ protected static XmlNode asXmlNodeOrNull(ThreadContext context, IRubyObject node) {
131
+ if (node == null || node.isNil()) {
132
+ return null;
133
+ } else {
134
+ return asXmlNode(context, node);
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Coalesce to adjacent TextNodes.
140
+ * @param context
141
+ * @param prev Previous node to cur.
142
+ * @param cur Next node to prev.
143
+ */
144
+ public static void coalesceTextNodes(ThreadContext context, IRubyObject prev, IRubyObject cur) {
145
+ XmlNode p = asXmlNode(context, prev);
146
+ XmlNode c = asXmlNode(context, cur);
147
+
148
+ Node pNode = p.node;
149
+ Node cNode = c.node;
150
+
151
+ pNode.setNodeValue(pNode.getNodeValue()+cNode.getNodeValue());
152
+ p.content = null; // clear cached content
153
+
154
+ c.assimilateXmlNode(context, p);
155
+ }
156
+
157
+ /**
158
+ * Coalesce text nodes around <code>anchorNode</code>. If
159
+ * <code>anchorNode</code> has siblings (previous or next) that
160
+ * are text nodes, the content will be merged into
161
+ * <code>anchorNode</code> and the redundant nodes will be removed
162
+ * from the DOM.
163
+ *
164
+ * To match libxml behavior (?) the final content of
165
+ * <code>anchorNode</code> and any removed nodes will be
166
+ * identical.
167
+ *
168
+ * @param context
169
+ * @param anchorNode
170
+ */
171
+ protected static void coalesceTextNodes(ThreadContext context,
172
+ IRubyObject anchorNode,
173
+ AdoptScheme scheme) {
174
+ XmlNode xa = asXmlNode(context, anchorNode);
175
+
176
+ XmlNode xp = asXmlNodeOrNull(context, xa.previous_sibling(context));
177
+ XmlNode xn = asXmlNodeOrNull(context, xa.next_sibling(context));
178
+
179
+ Node p = xp == null ? null : xp.node;
180
+ Node a = xa.node;
181
+ Node n = xn == null ? null : xn.node;
182
+
183
+ Node parent = a.getParentNode();
184
+
185
+ boolean shouldMergeP = scheme == AdoptScheme.NEXT_SIBLING || scheme == AdoptScheme.CHILD || scheme == AdoptScheme.REPLACEMENT;
186
+ boolean shouldMergeN = scheme == AdoptScheme.PREV_SIBLING || scheme == AdoptScheme.REPLACEMENT;
187
+
188
+ // apply the merge right to left
189
+ if (shouldMergeN && n != null && n.getNodeType() == Node.TEXT_NODE) {
190
+ xa.setContent(a.getNodeValue() + n.getNodeValue());
191
+ parent.removeChild(n);
192
+ xn.assimilateXmlNode(context, xa);
193
+ }
194
+ if (shouldMergeP && p != null && p.getNodeType() == Node.TEXT_NODE) {
195
+ xp.setContent(p.getNodeValue() + a.getNodeValue());
196
+ parent.removeChild(a);
197
+ xa.assimilateXmlNode(context, xp);
198
+ }
199
+ }
200
+
201
+ /**
202
+ * This is the allocator for XmlNode class. It should only be
203
+ * called from Ruby code.
204
+ */
205
+ public XmlNode(Ruby ruby, RubyClass cls) {
206
+ super(ruby, cls);
207
+ }
208
+
209
+ /**
210
+ * This is a constructor to create an XmlNode from an already
211
+ * existing node. It may be called by Java code.
212
+ */
213
+ public XmlNode(Ruby ruby, RubyClass cls, Node node) {
214
+ super(ruby, cls);
215
+ setNode(ruby.getCurrentContext(), node);
216
+ }
217
+
218
+ protected void decorate(Ruby ruby) {
219
+ if (node != null) {
220
+ resetCache();
221
+
222
+ if (node.getNodeType() != Node.DOCUMENT_NODE) {
223
+ doc = document(ruby.getCurrentContext());
224
+
225
+ if (doc != null && doc.isTrue()) {
226
+ RuntimeHelpers.invoke(ruby.getCurrentContext(), doc, "decorate", this);
227
+ }
228
+ }
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Create and return a copy of this object.
234
+ *
235
+ * @return a clone of this object
236
+ */
237
+ @Override
238
+ public Object clone() throws CloneNotSupportedException {
239
+ return super.clone();
240
+ }
241
+
242
+ protected void resetCache() {
243
+ node.setUserData(NokogiriHelpers.CACHED_NODE, this, null);
244
+ }
245
+
246
+ /**
247
+ * Allocate a new object, perform initialization, call that
248
+ * object's initialize method, and call any block passing the
249
+ * object as the only argument. If <code>cls</code> is
250
+ * Nokogiri::XML::Node, creates a new Nokogiri::XML::Element
251
+ * instead.
252
+ *
253
+ * This static method seems to be inherited, strangely enough.
254
+ * E.g. creating a new XmlAttr from Ruby code calls this method if
255
+ * XmlAttr does not define its own 'new' method.
256
+ *
257
+ * Since there is some Java bookkeeping that always needs to
258
+ * happen, we don't define the 'initialize' method in Java because
259
+ * we'd have to count on subclasses calling 'super'.
260
+ *
261
+ * The main consequence of this is that every subclass needs to
262
+ * define its own 'new' method.
263
+ *
264
+ * As a convenience, this method does the following:
265
+ *
266
+ * <ul>
267
+ *
268
+ * <li>allocates a new object using the allocator assigned to
269
+ * <code>cls</code></li>
270
+ *
271
+ * <li>calls the Java method init(); subclasses can override this,
272
+ * otherwise they should implement a specific 'new' method</li>
273
+ *
274
+ * <li>invokes the Ruby initializer</li>
275
+ *
276
+ * <li>if a block is given, calls the block with the new node as
277
+ * the argument</li>
278
+ *
279
+ * </ul>
280
+ *
281
+ * -pmahoney
282
+ */
283
+ @JRubyMethod(name = "new", meta = true, rest = true)
284
+ public static IRubyObject rbNew(ThreadContext context, IRubyObject cls,
285
+ IRubyObject[] args, Block block) {
286
+ Ruby ruby = context.getRuntime();
287
+ RubyClass klazz = (RubyClass) cls;
288
+
289
+ if (cls.equals(getNokogiriClass(ruby, "Nokogiri::XML::Node"))) {
290
+ klazz = getNokogiriClass(ruby, "Nokogiri::XML::Element");
291
+ }
292
+
293
+ XmlNode xmlNode = (XmlNode) klazz.allocate();
294
+ xmlNode.init(context, args);
295
+ xmlNode.callInit(args, block);
296
+ if (xmlNode.node == null) context.getRuntime().newRuntimeError("NODE IS NULL");
297
+ if (block.isGiven()) block.call(context, xmlNode);
298
+ return xmlNode;
299
+ }
300
+
301
+ /**
302
+ * Initialize the object from Ruby arguments. Should be
303
+ * overridden by subclasses. Should check for a minimum number of
304
+ * args but not for an exact number. Any extra args will then be
305
+ * passed to 'initialize'. The way 'new' and this 'init' function
306
+ * interact means that subclasses cannot arbitrarily change the
307
+ * require aruments by defining an 'initialize' method. This is
308
+ * how the C libxml wrapper works also.
309
+ *
310
+ * As written it performs initialization for a new Element with
311
+ * the given <code>name</code> within the document
312
+ * <code>doc</code>. So XmlElement need not override this. This
313
+ * implementation cannot be moved to XmlElement however, because
314
+ * subclassing XmlNode must result in something that behaves much
315
+ * like XmlElement.
316
+ */
317
+ protected void init(ThreadContext context, IRubyObject[] args) {
318
+ if (args.length < 2)
319
+ throw context.getRuntime().newArgumentError(args.length, 2);
320
+
321
+ IRubyObject name = args[0];
322
+ IRubyObject doc = args[1];
323
+
324
+ Document document = asXmlNode(context, doc).getOwnerDocument();
325
+ if (document == null) {
326
+ throw getRuntime().newArgumentError("node must have owner document");
327
+ }
328
+
329
+ Element element = null;
330
+ String node_name = rubyStringToString(name);
331
+ String prefix = NokogiriHelpers.getPrefix(node_name);
332
+ if (prefix == null) {
333
+ element = document.createElement(node_name);
334
+ } else {
335
+ String namespace_uri = null;
336
+ if (document.getDocumentElement() != null) {
337
+ namespace_uri = document.getDocumentElement().lookupNamespaceURI(prefix);
338
+ }
339
+ element = document.createElementNS(namespace_uri, node_name);
340
+ }
341
+ setNode(context, element);
342
+ }
343
+
344
+ /**
345
+ * Set the underlying node of this node to the underlying node of
346
+ * <code>otherNode</code>.
347
+ *
348
+ * FIXME: also update the cached node?
349
+ */
350
+ protected void assimilateXmlNode(ThreadContext context, IRubyObject otherNode) {
351
+ XmlNode toAssimilate = asXmlNode(context, otherNode);
352
+
353
+ this.node = toAssimilate.node;
354
+ content = null; // clear cache
355
+ }
356
+
357
+ /**
358
+ * See org.w3.dom.Node#normalize.
359
+ */
360
+ public void normalize() {
361
+ node.normalize();
362
+ }
363
+
364
+ public Node getNode() {
365
+ return node;
366
+ }
367
+
368
+ public static Node getNodeFromXmlNode(ThreadContext context, IRubyObject xmlNode) {
369
+ return asXmlNode(context, xmlNode).node;
370
+ }
371
+
372
+ protected String indentString(IRubyObject indentStringObject, String xml) {
373
+ String[] lines = xml.split("\n");
374
+
375
+ if(lines.length <= 1) return xml;
376
+
377
+ String[] resultLines = new String[lines.length];
378
+
379
+ String curLine;
380
+ boolean closingTag = false;
381
+ String indentString = rubyStringToString(indentStringObject);
382
+ int lengthInd = indentString.length();
383
+ StringBuffer curInd = new StringBuffer();
384
+
385
+ resultLines[0] = lines[0];
386
+
387
+ for(int i = 1; i < lines.length; i++) {
388
+
389
+ curLine = lines[i].trim();
390
+
391
+ if(curLine.length() == 0) continue;
392
+
393
+ if(curLine.startsWith("</")) {
394
+ closingTag = true;
395
+ curInd.setLength(max(0,curInd.length() - lengthInd));
396
+ }
397
+
398
+ resultLines[i] = curInd.toString() + curLine;
399
+
400
+ if(!curLine.endsWith("/>") && !closingTag) {
401
+ curInd.append(indentString);
402
+ }
403
+
404
+ closingTag = false;
405
+ }
406
+
407
+ StringBuffer result = new StringBuffer();
408
+ for(int i = 0; i < resultLines.length; i++) {
409
+ result.append(resultLines[i]);
410
+ result.append("\n");
411
+ }
412
+
413
+ return result.toString();
414
+ }
415
+
416
+ public boolean isComment() { return false; }
417
+
418
+ public boolean isElement() {
419
+ if (node instanceof Element) return true; // in case of subclassing
420
+ else return false;
421
+ }
422
+
423
+ public boolean isProcessingInstruction() { return false; }
424
+
425
+ /**
426
+ * Return the string value of the attribute <code>key</code> or
427
+ * nil.
428
+ *
429
+ * Only applies where the underlying Node is an Element node, but
430
+ * implemented here in XmlNode because not all nodes with
431
+ * underlying Element nodes subclass XmlElement, such as the DTD
432
+ * declarations like XmlElementDecl.
433
+ */
434
+ protected IRubyObject getAttribute(ThreadContext context, String key) {
435
+ return getAttribute(context.getRuntime(), key);
436
+ }
437
+
438
+ protected IRubyObject getAttribute(Ruby runtime, String key) {
439
+ String value = getAttribute(key);
440
+ return nonEmptyStringOrNil(runtime, value);
441
+ }
442
+
443
+ protected String getAttribute(String key) {
444
+ if (node.getNodeType() != Node.ELEMENT_NODE) return null;
445
+
446
+ String value = ((Element)node).getAttribute(key);
447
+ return value.length() == 0 ? null : value;
448
+ }
449
+
450
+
451
+ public void post_add_child(ThreadContext context, XmlNode current, XmlNode child) {
452
+ }
453
+
454
+ public void relink_namespace(ThreadContext context) {
455
+ if (node instanceof Element) {
456
+ Element e = (Element) node;
457
+ String prefix = e.getPrefix();
458
+ String currentNS = e.getNamespaceURI();
459
+ if (prefix == null && currentNS == null) {
460
+ prefix = NokogiriHelpers.getPrefix(e.getNodeName());
461
+ } else if (currentNS != null) {
462
+ prefix = e.lookupPrefix(currentNS);
463
+ }
464
+ e.getOwnerDocument().setStrictErrorChecking(false);
465
+ String nsURI = e.lookupNamespaceURI(prefix);
466
+ this.node = NokogiriHelpers.renameNode(e, nsURI, e.getNodeName());
467
+
468
+ if (e.hasAttributes()) {
469
+ NamedNodeMap attrs = e.getAttributes();
470
+
471
+ for (int i = 0; i < attrs.getLength(); i++) {
472
+ Attr attr = (Attr) attrs.item(i);
473
+ String nsUri = "";
474
+ String attrPrefix = attr.getPrefix();
475
+ if (attrPrefix == null) {
476
+ attrPrefix = NokogiriHelpers.getPrefix(attr.getNodeName());
477
+ }
478
+ String nodeName = attr.getNodeName();
479
+ if ("xml".equals(prefix)) {
480
+ nsUri = "http://www.w3.org/XML/1998/namespace";
481
+ } else if ("xmlns".equals(attrPrefix) || nodeName.equals("xmlns")) {
482
+ nsUri = "http://www.w3.org/2000/xmlns/";
483
+ } else {
484
+ nsUri = attr.lookupNamespaceURI(attrPrefix);
485
+ }
486
+ if (!(nsUri == null || "".equals(nsUri))) {
487
+ XmlNamespace.createFromAttr(context.getRuntime(), attr);
488
+ }
489
+ NokogiriHelpers.renameNode(attr, nsUri, nodeName);
490
+ }
491
+ }
492
+
493
+ if (this.node.hasChildNodes()) {
494
+ XmlNodeSet nodeSet = (XmlNodeSet)(children(context));
495
+ nodeSet.relink_namespace(context);
496
+ }
497
+ }
498
+ }
499
+
500
+ // Users might extend XmlNode. This method works for such a case.
501
+ public void accept(ThreadContext context, SaveContextVisitor visitor) {
502
+ visitor.enter(node);
503
+ XmlNodeSet xmlNodeSet = (XmlNodeSet) children(context);
504
+ if (xmlNodeSet.length() > 0) {
505
+ RubyArray array = (RubyArray) xmlNodeSet.to_a(context);
506
+ for(int i = 0; i < array.getLength(); i++) {
507
+ Object item = array.get(i);
508
+ if (item instanceof XmlNode) {
509
+ XmlNode cur = (XmlNode) item;
510
+ cur.accept(context, visitor);
511
+ } else if (item instanceof XmlNamespace) {
512
+ XmlNamespace cur = (XmlNamespace)item;
513
+ cur.accept(context, visitor);
514
+ }
515
+ }
516
+ }
517
+ visitor.leave(node);
518
+ }
519
+
520
+ public void setName(IRubyObject name) {
521
+ this.name = name;
522
+ }
523
+
524
+ public void setDocument(ThreadContext context, IRubyObject doc) {
525
+ this.doc = doc;
526
+ setInstanceVariable("@document", doc);
527
+ if (doc != null) {
528
+ RuntimeHelpers.invoke(context, doc, "decorate", this);
529
+ }
530
+ }
531
+
532
+ public void setNode(ThreadContext context, Node node) {
533
+ this.node = node;
534
+
535
+ decorate(context.getRuntime());
536
+
537
+ if (this instanceof XmlAttr) {
538
+ ((XmlAttr)this).setNamespaceIfNecessary(context.getRuntime());
539
+ }
540
+ }
541
+
542
+ public void updateNodeNamespaceIfNecessary(ThreadContext context, XmlNamespace ns) {
543
+ String oldPrefix = this.node.getPrefix();
544
+ String uri = rubyStringToString(ns.href(context));
545
+
546
+ /*
547
+ * Update if both prefixes are null or equal
548
+ */
549
+ boolean update = (oldPrefix == null && ns.prefix(context).isNil()) ||
550
+ (oldPrefix != null && !ns.prefix(context).isNil()
551
+ && oldPrefix.equals(rubyStringToString(ns.prefix(context))));
552
+
553
+ if(update) {
554
+ this.node = NokogiriHelpers.renameNode(this.node, uri, this.node.getNodeName());
555
+ }
556
+ }
557
+
558
+ protected IRubyObject getNodeName(ThreadContext context) {
559
+ if (name != null) return name;
560
+ String str = null;
561
+
562
+ if (this.name == null && node != null) {
563
+ str = node.getNodeName();
564
+ str = NokogiriHelpers.getLocalPart(str);
565
+ }
566
+ if (str == null) str = "";
567
+ name = NokogiriHelpers.stringOrBlank(context.getRuntime(), str);
568
+ return name;
569
+ }
570
+
571
+ /**
572
+ * Add a namespace definition to this node. To the underlying
573
+ * node, add an attribute of the form
574
+ * <code>xmlns:prefix="uri"</code>.
575
+ */
576
+ @JRubyMethod(name = {"add_namespace_definition", "add_namespace"})
577
+ public IRubyObject add_namespace_definition(ThreadContext context,
578
+ IRubyObject prefix,
579
+ IRubyObject href) {
580
+ Node namespaceOwner;
581
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
582
+ namespaceOwner = node;
583
+ Element element = (Element) node;
584
+
585
+ final String uri = "http://www.w3.org/2000/xmlns/";
586
+ String qName =
587
+ prefix.isNil() ? "xmlns" : "xmlns:" + rubyStringToString(prefix);
588
+ element.setAttributeNS(uri, qName, rubyStringToString(href));
589
+ }
590
+ else if (node.getNodeType() == Node.ATTRIBUTE_NODE) namespaceOwner = ((Attr)node).getOwnerElement();
591
+ else namespaceOwner = node.getParentNode();
592
+ XmlNamespace ns = XmlNamespace.createFromPrefixAndHref(namespaceOwner, prefix, href);
593
+ if (node != namespaceOwner) {
594
+ this.node = NokogiriHelpers.renameNode(node, ns.getHref(), ns.getPrefix() + node.getLocalName());
595
+ }
596
+
597
+ updateNodeNamespaceIfNecessary(context, ns);
598
+
599
+ return ns;
600
+ }
601
+
602
+ @JRubyMethod(name = {"attribute", "attr"})
603
+ public IRubyObject attribute(ThreadContext context, IRubyObject name){
604
+ NamedNodeMap attrs = this.node.getAttributes();
605
+ Node attr = attrs.getNamedItem(rubyStringToString(name));
606
+ if(attr == null) {
607
+ return context.getRuntime().getNil();
608
+ }
609
+ return getCachedNodeOrCreate(context.getRuntime(), attr);
610
+ }
611
+
612
+ @JRubyMethod
613
+ public IRubyObject attribute_nodes(ThreadContext context) {
614
+ NamedNodeMap nodeMap = this.node.getAttributes();
615
+
616
+ Ruby ruby = context.getRuntime();
617
+ if(nodeMap == null){
618
+ return ruby.newEmptyArray();
619
+ }
620
+
621
+ RubyArray attr = ruby.newArray();
622
+
623
+ for(int i = 0; i < nodeMap.getLength(); i++) {
624
+ if ((doc instanceof HtmlDocument) || !NokogiriHelpers.isNamespace(nodeMap.item(i))) {
625
+ attr.append(getCachedNodeOrCreate(context.getRuntime(), nodeMap.item(i)));
626
+ }
627
+ }
628
+
629
+ return attr;
630
+ }
631
+
632
+ @JRubyMethod
633
+ public IRubyObject attribute_with_ns(ThreadContext context, IRubyObject name, IRubyObject namespace) {
634
+ String namej = rubyStringToString(name);
635
+ String nsj = (namespace.isNil()) ? null : rubyStringToString(namespace);
636
+
637
+ Node el = this.node.getAttributes().getNamedItemNS(nsj, namej);
638
+
639
+ if(el == null) {
640
+ return context.getRuntime().getNil();
641
+ }
642
+ return NokogiriHelpers.getCachedNodeOrCreate(context.getRuntime(), el);
643
+ }
644
+
645
+ @JRubyMethod(name = "blank?")
646
+ public IRubyObject blank_p(ThreadContext context) {
647
+ // according to libxml doc,
648
+ // a node is blank if if it is a Text or CDATA node consisting of whitespace only
649
+ if (node.getNodeType() == Node.TEXT_NODE || node.getNodeType() == Node.CDATA_SECTION_NODE) {
650
+ String data = node.getTextContent();
651
+ if (data == null) return context.getRuntime().getTrue();
652
+ if ("".equals(data.trim())) return context.getRuntime().getTrue();
653
+ }
654
+ return context.getRuntime().getFalse();
655
+ }
656
+
657
+ @JRubyMethod
658
+ public IRubyObject child(ThreadContext context) {
659
+ return getCachedNodeOrCreate(context.getRuntime(), node.getFirstChild());
660
+ }
661
+
662
+ @JRubyMethod
663
+ public IRubyObject children(ThreadContext context) {
664
+ XmlNodeSet xmlNodeSet = (XmlNodeSet) NokogiriService.XML_NODESET_ALLOCATOR.allocate(context.getRuntime(), getNokogiriClass(context.getRuntime(), "Nokogiri::XML::NodeSet"));
665
+ xmlNodeSet.setNodeList(node.getChildNodes());
666
+ return xmlNodeSet;
667
+ }
668
+
669
+ @JRubyMethod
670
+ public IRubyObject first_element_child(ThreadContext context) {
671
+ List<Node> elementNodes = new ArrayList<Node>();
672
+ addElements(node, elementNodes, true);
673
+ if (elementNodes.size() == 0) return context.getRuntime().getNil();
674
+ return getCachedNodeOrCreate(context.getRuntime(), elementNodes.get(0));
675
+ }
676
+
677
+ @JRubyMethod
678
+ public IRubyObject last_element_child(ThreadContext context) {
679
+ List<Node> elementNodes = new ArrayList<Node>();
680
+ addElements(node, elementNodes, false);
681
+ if (elementNodes.size() == 0) return context.getRuntime().getNil();
682
+ return getCachedNodeOrCreate(context.getRuntime(), elementNodes.get(elementNodes.size()-1));
683
+ }
684
+
685
+ @JRubyMethod(name = {"element_children", "elements"})
686
+ public IRubyObject element_children(ThreadContext context) {
687
+ List<Node> elementNodes = new ArrayList<Node>();
688
+ addElements(node, elementNodes, false);
689
+ if (elementNodes.size() == 0) return XmlNodeSet.newEmptyNodeSet(context);
690
+ RubyArray array = NokogiriHelpers.nodeArrayToRubyArray(context.getRuntime(), elementNodes.toArray(new Node[0]));
691
+ XmlNodeSet xmlNodeSet = XmlNodeSet.newXmlNodeSet(context, array);
692
+ return xmlNodeSet;
693
+ }
694
+
695
+ private void addElements(Node n, List<Node> nodes, boolean isFirstOnly) {
696
+ NodeList children = n.getChildNodes();
697
+ if (children.getLength() == 0) return;
698
+ for (int i=0; i< children.getLength(); i++) {
699
+ Node child = children.item(i);
700
+ if (child.getNodeType() == Node.ELEMENT_NODE) {
701
+ nodes.add(child);
702
+ if (isFirstOnly) return;
703
+ }
704
+ }
705
+ }
706
+
707
+ /**
708
+ * call-seq:
709
+ * compare(other)
710
+ *
711
+ * Compare this Node to +other+ with respect to their Document
712
+ */
713
+ @JRubyMethod(visibility=Visibility.PRIVATE)
714
+ public IRubyObject compare(ThreadContext context, IRubyObject other) {
715
+ if (!(other instanceof XmlNode)) {
716
+ return context.getRuntime().newFixnum(-2);
717
+ }
718
+
719
+ Node otherNode = asXmlNode(context, other).node;
720
+
721
+ // Do not touch this if, if it's not for a good reason.
722
+ if (node.getNodeType() == Node.DOCUMENT_NODE ||
723
+ otherNode.getNodeType() == Node.DOCUMENT_NODE) {
724
+ return context.getRuntime().newFixnum(-1);
725
+ }
726
+
727
+ try{
728
+ int res = node.compareDocumentPosition(otherNode);
729
+ if ((res & FIRST_PRECEDES_SECOND) == FIRST_PRECEDES_SECOND) {
730
+ return context.getRuntime().newFixnum(-1);
731
+ } else if ((res & SECOND_PRECEDES_FIRST) == SECOND_PRECEDES_FIRST) {
732
+ return context.getRuntime().newFixnum(1);
733
+ } else if (res == IDENTICAL_ELEMENTS) {
734
+ return context.getRuntime().newFixnum(0);
735
+ }
736
+
737
+ return context.getRuntime().newFixnum(-2);
738
+ } catch (Exception ex) {
739
+ return context.getRuntime().newFixnum(-2);
740
+ }
741
+ }
742
+
743
+ /**
744
+ * TODO: this is a stub implementation. It's not clear what
745
+ * 'in_context' is supposed to do. Also should take
746
+ * <code>options</code> into account.
747
+ */
748
+ @JRubyMethod(required = 2, visibility = Visibility.PRIVATE)
749
+ public IRubyObject in_context(ThreadContext context,
750
+ IRubyObject str,
751
+ IRubyObject options) {
752
+ RubyModule klass;
753
+ XmlDomParserContext ctx;
754
+ InputStream istream;
755
+ XmlDocument document;
756
+
757
+ IRubyObject d = document(context);
758
+ Ruby runtime = context.getRuntime();
759
+ if (d != null && d instanceof XmlDocument) {
760
+ document = (XmlDocument)d;
761
+ } else {
762
+ return runtime.getNil();
763
+ }
764
+
765
+ if (document instanceof HtmlDocument) {
766
+ klass = getNokogiriClass(runtime, "Nokogiri::HTML::Document");
767
+ ctx = new HtmlDomParserContext(runtime, options);
768
+ ((HtmlDomParserContext)ctx).enableDocumentFragment();
769
+ istream = new ByteArrayInputStream((rubyStringToString(str)).getBytes());
770
+ } else if (document instanceof XmlDocument) {
771
+ klass = getNokogiriClass(runtime, "Nokogiri::XML::Document");
772
+ ctx = new XmlDomParserContext(runtime, options);
773
+ String input = rubyStringToString(str);
774
+ istream = new ByteArrayInputStream(input.getBytes());
775
+ } else {
776
+ return runtime.getNil();
777
+ }
778
+
779
+ ctx.setInputSource(istream);
780
+ XmlDocument doc = ctx.parse(context, klass, runtime.getNil());
781
+
782
+ RubyArray documentErrors = getErrorArray(document);
783
+ RubyArray docErrors = getErrorArray(doc);
784
+ if (isErrorIncreased(documentErrors, docErrors)) {
785
+ for (int i = 0; i < docErrors.getLength(); i++) {
786
+ documentErrors.add(docErrors.get(i));
787
+ }
788
+ document.setInstanceVariable("@errors", documentErrors);
789
+ XmlNodeSet xmlNodeSet = XmlNodeSet.newXmlNodeSet(context, RubyArray.newArray(runtime));
790
+ return xmlNodeSet;
791
+ }
792
+
793
+ // The first child might be document type node (dtd declaration).
794
+ // XmlNodeSet to be return should not have dtd decl in its list.
795
+ Node first;
796
+ if (doc.node.getFirstChild().getNodeType() == Node.DOCUMENT_TYPE_NODE) {
797
+ first = doc.node.getFirstChild().getNextSibling();
798
+ } else {
799
+ first = doc.node.getFirstChild();
800
+ }
801
+ RubyArray nodeArray = RubyArray.newArray(runtime);
802
+ nodeArray.add(NokogiriHelpers.getCachedNodeOrCreate(runtime, first));
803
+
804
+ XmlNodeSet xmlNodeSet = XmlNodeSet.newXmlNodeSet(context, nodeArray);
805
+ return xmlNodeSet;
806
+ }
807
+
808
+ private RubyArray getErrorArray(XmlDocument document) {
809
+ IRubyObject obj = document.getInstanceVariable("@errors");
810
+ if (obj != null && obj instanceof RubyArray) {
811
+ return (RubyArray)obj;
812
+ }
813
+ return RubyArray.newArray(document.getRuntime());
814
+ }
815
+
816
+ private boolean isErrorIncreased(RubyArray baseErrors, RubyArray createdErrors) {
817
+ RubyFixnum length = ((RubyArray)createdErrors.op_diff(baseErrors)).length();
818
+ int diff_in_length = (Integer)length.toJava(Integer.class);
819
+ return diff_in_length > 0;
820
+ }
821
+
822
+ @JRubyMethod(name = {"content", "text", "inner_text"})
823
+ public IRubyObject content(ThreadContext context) {
824
+ if (!node.hasChildNodes() && node.getNodeValue() == null &&
825
+ (node.getNodeType() == Node.TEXT_NODE || node.getNodeType() == Node.CDATA_SECTION_NODE))
826
+ return context.nil;
827
+ String textContent;
828
+ if (this instanceof XmlDocument) {
829
+ Node node = ((Document)this.node).getDocumentElement();
830
+ if (node == null) {
831
+ textContent = "";
832
+ } else {
833
+ Node documentElement = ((Document)this.node).getDocumentElement();
834
+ StringBuffer buffer = new StringBuffer();
835
+ getTextContentRecursively(context, buffer, documentElement);
836
+ textContent = buffer.toString();
837
+ }
838
+ } else {
839
+ StringBuffer buffer = new StringBuffer();
840
+ getTextContentRecursively(context, buffer, node);
841
+ textContent = buffer.toString();
842
+ }
843
+ NokogiriHelpers.convertEncodingByNKFIfNecessary(context.getRuntime(), (XmlDocument)document(context), textContent);
844
+ return stringOrNil(context.getRuntime(), textContent);
845
+ }
846
+
847
+ private void getTextContentRecursively(ThreadContext context, StringBuffer buffer, Node currentNode) {
848
+ String textContent = currentNode.getNodeValue();
849
+ if (textContent != null && NokogiriHelpers.shouldDecode(currentNode))
850
+ textContent = NokogiriHelpers.decodeJavaString(textContent);
851
+ if (textContent != null)
852
+ buffer.append(textContent);
853
+ NodeList children = currentNode.getChildNodes();
854
+ for (int i = 0; i < children.getLength(); i++) {
855
+ Node child = children.item(i);
856
+ if (hasTextContent(child))
857
+ getTextContentRecursively(context, buffer, child);
858
+ }
859
+ }
860
+
861
+ private boolean hasTextContent(Node child) {
862
+ return child.getNodeType() != Node.COMMENT_NODE &&
863
+ child.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE;
864
+ }
865
+
866
+ @JRubyMethod
867
+ public IRubyObject document(ThreadContext context) {
868
+ if (doc == null) {
869
+ doc = (XmlDocument) node.getOwnerDocument().getUserData(NokogiriHelpers.CACHED_NODE);
870
+ }
871
+ if (doc == null) {
872
+ doc = getCachedNodeOrCreate(context.getRuntime(), node.getOwnerDocument());
873
+ node.getOwnerDocument().setUserData(NokogiriHelpers.CACHED_NODE, doc, null);
874
+ }
875
+ return doc;
876
+ }
877
+
878
+ @JRubyMethod
879
+ public IRubyObject dup(ThreadContext context) {
880
+ return this.dup_implementation(context, true);
881
+ }
882
+
883
+ @JRubyMethod
884
+ public IRubyObject dup(ThreadContext context, IRubyObject depth) {
885
+ boolean deep = (Integer)depth.toJava(Integer.class) != 0;
886
+
887
+ return this.dup_implementation(context, deep);
888
+ }
889
+
890
+ protected IRubyObject dup_implementation(ThreadContext context, boolean deep) {
891
+ XmlNode clone;
892
+ try {
893
+ clone = (XmlNode) clone();
894
+ } catch (CloneNotSupportedException e) {
895
+ throw context.getRuntime().newRuntimeError(e.toString());
896
+ }
897
+ if (node == null) throw context.getRuntime().newRuntimeError("FFFFFFFFFUUUUUUU");
898
+ Node newNode = node.cloneNode(deep);
899
+ clone.node = newNode;
900
+ return clone;
901
+ }
902
+
903
+ public static IRubyObject encode_special_chars(ThreadContext context,
904
+ IRubyObject string) {
905
+ String s = rubyStringToString(string);
906
+ String enc = NokogiriHelpers.encodeJavaString(s);
907
+ return context.getRuntime().newString(enc);
908
+ }
909
+
910
+ /**
911
+ * Instance method version of the above static method.
912
+ */
913
+ @JRubyMethod(name="encode_special_chars")
914
+ public IRubyObject i_encode_special_chars(ThreadContext context,
915
+ IRubyObject string) {
916
+ return encode_special_chars(context, string);
917
+ }
918
+
919
+ /**
920
+ * Get the attribute at the given key, <code>key</code>.
921
+ * Assumes that this node has attributes (i.e. that key? returned
922
+ * true).
923
+ */
924
+ @JRubyMethod(visibility = Visibility.PRIVATE)
925
+ public IRubyObject get(ThreadContext context, IRubyObject rbkey) {
926
+ if (node instanceof Element) {
927
+ if (rbkey == null || rbkey.isNil()) context.getRuntime().getNil();
928
+ String key = rubyStringToString(rbkey);
929
+ Element element = (Element) node;
930
+ if (!element.hasAttribute(key)) return context.getRuntime().getNil();
931
+ String value = element.getAttribute(key);
932
+ return stringOrNil(context.getRuntime(), value);
933
+ }
934
+ return context.getRuntime().getNil();
935
+ }
936
+
937
+ /**
938
+ * Returns the owner document, checking if this node is the
939
+ * document, or returns null if there is no owner.
940
+ */
941
+ protected Document getOwnerDocument() {
942
+ if (node.getNodeType() == Node.DOCUMENT_NODE) {
943
+ return (Document) node;
944
+ } else {
945
+ return node.getOwnerDocument();
946
+ }
947
+ }
948
+
949
+ @JRubyMethod
950
+ public IRubyObject internal_subset(ThreadContext context) {
951
+ Document document = getOwnerDocument();
952
+
953
+ if(document == null) {
954
+ return context.getRuntime().getNil();
955
+ }
956
+
957
+ XmlDocument xdoc =
958
+ (XmlDocument) getCachedNodeOrCreate(context.getRuntime(), document);
959
+ IRubyObject xdtd = xdoc.getInternalSubset(context);
960
+ return xdtd;
961
+ }
962
+
963
+ @JRubyMethod
964
+ public IRubyObject create_internal_subset(ThreadContext context,
965
+ IRubyObject name,
966
+ IRubyObject external_id,
967
+ IRubyObject system_id) {
968
+ IRubyObject subset = internal_subset(context);
969
+ if (!subset.isNil()) {
970
+ throw context.getRuntime()
971
+ .newRuntimeError("Document already has internal subset");
972
+ }
973
+
974
+ Document document = getOwnerDocument();
975
+ if(document == null) {
976
+ return context.getRuntime().getNil();
977
+ }
978
+
979
+ XmlDocument xdoc =
980
+ (XmlDocument) getCachedNodeOrCreate(context.getRuntime(), document);
981
+ IRubyObject xdtd = xdoc.createInternalSubset(context, name,
982
+ external_id, system_id);
983
+ return xdtd;
984
+ }
985
+
986
+ @JRubyMethod
987
+ public IRubyObject external_subset(ThreadContext context) {
988
+ Document document = getOwnerDocument();
989
+
990
+ if (document == null) {
991
+ return context.getRuntime().getNil();
992
+ }
993
+
994
+ XmlDocument xdoc =
995
+ (XmlDocument) getCachedNodeOrCreate(context.getRuntime(), document);
996
+ IRubyObject xdtd = xdoc.getExternalSubset(context);
997
+ return xdtd;
998
+ }
999
+
1000
+ @JRubyMethod
1001
+ public IRubyObject create_external_subset(ThreadContext context,
1002
+ IRubyObject name,
1003
+ IRubyObject external_id,
1004
+ IRubyObject system_id) {
1005
+ IRubyObject subset = external_subset(context);
1006
+ if (!subset.isNil()) {
1007
+ throw context.getRuntime()
1008
+ .newRuntimeError("Document already has external subset");
1009
+ }
1010
+
1011
+ Document document = getOwnerDocument();
1012
+ if(document == null) {
1013
+ return context.getRuntime().getNil();
1014
+ }
1015
+ XmlDocument xdoc = (XmlDocument) getCachedNodeOrCreate(context.getRuntime(), document);
1016
+ IRubyObject xdtd = xdoc.createExternalSubset(context, name, external_id, system_id);
1017
+ return xdtd;
1018
+ }
1019
+
1020
+ /**
1021
+ * Test if this node has an attribute named <code>rbkey</code>.
1022
+ * Overridden in XmlElement.
1023
+ */
1024
+ @JRubyMethod(name = {"key?", "has_attribute?"})
1025
+ public IRubyObject key_p(ThreadContext context, IRubyObject rbkey) {
1026
+ if (node instanceof Element) {
1027
+ String key = rubyStringToString(rbkey);
1028
+ Element element = (Element) node;
1029
+ return context.getRuntime().newBoolean(element.hasAttribute(key));
1030
+ } else {
1031
+ return context.getRuntime().getNil();
1032
+ }
1033
+ }
1034
+
1035
+ @JRubyMethod
1036
+ public IRubyObject namespace(ThreadContext context) {
1037
+ if (doc instanceof HtmlDocument) return context.getRuntime().getNil();
1038
+ XmlDocument xmlDocument = (XmlDocument) doc;
1039
+ NokogiriNamespaceCache nsCache = xmlDocument.getNamespaceCache();
1040
+ String prefix = node.getPrefix();
1041
+ XmlNamespace namespace = nsCache.get(prefix == null ? "" : prefix, node.getNamespaceURI());
1042
+ if (namespace == null || namespace.isEmpty()) {
1043
+ return context.getRuntime().getNil();
1044
+ }
1045
+
1046
+ return namespace;
1047
+ }
1048
+
1049
+ /**
1050
+ * Return an array of XmlNamespace nodes based on the attributes
1051
+ * of this node.
1052
+ */
1053
+ @JRubyMethod
1054
+ public IRubyObject namespace_definitions(ThreadContext context) {
1055
+ // don't use namespace_definitions cache anymore since
1056
+ // namespaces might be deleted. Reflecting the result of
1057
+ // namesapce removals is complicated, so the cache might not be
1058
+ // updated.
1059
+ Ruby ruby = context.getRuntime();
1060
+ RubyArray namespace_definitions = ruby.newArray();
1061
+ if (doc == null) return namespace_definitions;
1062
+ if (doc instanceof HtmlDocument) return namespace_definitions;
1063
+ List<XmlNamespace> namespaces = ((XmlDocument)doc).getNamespaceCache().get(node);
1064
+ for (XmlNamespace namespace : namespaces) {
1065
+ namespace_definitions.append(namespace);
1066
+ }
1067
+
1068
+ return namespace_definitions;
1069
+ }
1070
+
1071
+ /**
1072
+ * Return an array of XmlNamespace nodes defined on this node and
1073
+ * on any ancestor node.
1074
+ */
1075
+ @JRubyMethod
1076
+ public IRubyObject namespace_scopes(ThreadContext context) {
1077
+ RubyArray parentNamespaces;
1078
+ RubyArray namespaces = (RubyArray) namespace_definitions(context);
1079
+
1080
+ IRubyObject parent = parent(context);
1081
+ if (!parent.isNil()) {
1082
+ parentNamespaces = (RubyArray)
1083
+ ((XmlNode) parent).namespace_scopes(context);
1084
+ } else {
1085
+ parentNamespaces = getRuntime().newEmptyArray();
1086
+ }
1087
+
1088
+ return parentNamespaces.op_plus(namespaces);
1089
+ }
1090
+
1091
+ @JRubyMethod(name="namespaced_key?")
1092
+ public IRubyObject namespaced_key_p(ThreadContext context, IRubyObject elementLName, IRubyObject namespaceUri) {
1093
+ return this.attribute_with_ns(context, elementLName, namespaceUri).isNil() ?
1094
+ context.getRuntime().getFalse() : context.getRuntime().getTrue();
1095
+ }
1096
+
1097
+ protected void setContent(IRubyObject content) {
1098
+ String javaContent = rubyStringToString(content);
1099
+ node.setTextContent(javaContent);
1100
+ if (javaContent.length() == 0) return;
1101
+ if (node.getNodeType() == Node.TEXT_NODE || node.getNodeType() == Node.CDATA_SECTION_NODE) return;
1102
+ if (node.getFirstChild() != null) {
1103
+ node.getFirstChild().setUserData(NokogiriHelpers.ENCODED_STRING, true, null);
1104
+ }
1105
+ }
1106
+
1107
+ private void setContent(String content) {
1108
+ node.setTextContent(content);
1109
+ this.content = null; // clear cache
1110
+ }
1111
+
1112
+ @JRubyMethod(name = "native_content=")
1113
+ public IRubyObject native_content_set(ThreadContext context, IRubyObject content) {
1114
+ setContent(content);
1115
+ return content;
1116
+ }
1117
+
1118
+ /**
1119
+ * @param args {IRubyObject io,
1120
+ * IRubyObject encoding,
1121
+ * IRubyObject indentString,
1122
+ * IRubyObject options}
1123
+ */
1124
+ @JRubyMethod(required=4, visibility=Visibility.PRIVATE)
1125
+ public IRubyObject native_write_to(ThreadContext context, IRubyObject[] args) {
1126
+
1127
+ IRubyObject io = args[0];
1128
+ IRubyObject encoding = args[1];
1129
+ IRubyObject indentString = args[2];
1130
+ IRubyObject options = args[3];
1131
+
1132
+ String encString = encoding.isNil() ? null : rubyStringToString(encoding);
1133
+
1134
+ SaveContextVisitor visitor =
1135
+ new SaveContextVisitor((Integer) options.toJava(Integer.class), rubyStringToString(indentString), encString, isHtmlDoc(context), isFragment(), 0);
1136
+ accept(context, visitor);
1137
+
1138
+ IRubyObject rubyString = null;
1139
+ if (NokogiriHelpers.isUTF8(encString)) {
1140
+ rubyString = stringOrNil(context.getRuntime(), visitor.toString());
1141
+ } else {
1142
+ try {
1143
+ byte[] bytes = NokogiriHelpers.convertEncoding(Charset.forName(encString), visitor.toString());
1144
+ rubyString = stringOrNil(context.getRuntime(), bytes);
1145
+ } catch (CharacterCodingException e) {
1146
+ throw context.getRuntime().newRuntimeError(e.getMessage());
1147
+ }
1148
+ }
1149
+ RuntimeHelpers.invoke(context, io, "write", rubyString);
1150
+
1151
+ return io;
1152
+ }
1153
+
1154
+ private boolean isHtmlDoc(ThreadContext context) {
1155
+ return document(context).getMetaClass().isKindOfModule(getNokogiriClass(context.getRuntime(), "Nokogiri::HTML::Document"));
1156
+ }
1157
+
1158
+ private boolean isFragment() {
1159
+ if (node instanceof DocumentFragment) return true;
1160
+ if (node.getParentNode() != null && node.getParentNode() instanceof DocumentFragment) return true;
1161
+ return false;
1162
+ }
1163
+
1164
+ @JRubyMethod(name = {"next_sibling", "next"})
1165
+ public IRubyObject next_sibling(ThreadContext context) {
1166
+ return getCachedNodeOrCreate(context.getRuntime(), node.getNextSibling());
1167
+ }
1168
+
1169
+ @JRubyMethod(name = {"previous_sibling", "previous"})
1170
+ public IRubyObject previous_sibling(ThreadContext context) {
1171
+ return getCachedNodeOrCreate(context.getRuntime(), node.getPreviousSibling());
1172
+ }
1173
+
1174
+ @JRubyMethod(meta = true, rest = true)
1175
+ public static IRubyObject new_from_str(ThreadContext context,
1176
+ IRubyObject cls,
1177
+ IRubyObject[] args) {
1178
+ XmlDocument doc = (XmlDocument) XmlDocument.read_memory(context, args);
1179
+ return doc.root(context);
1180
+ }
1181
+
1182
+ @JRubyMethod(name = {"node_name", "name"})
1183
+ public IRubyObject node_name(ThreadContext context) {
1184
+ return getNodeName(context);
1185
+ }
1186
+
1187
+ @JRubyMethod(name = {"node_name=", "name="})
1188
+ public IRubyObject node_name_set(ThreadContext context, IRubyObject nodeName) {
1189
+ String newName = rubyStringToString(nodeName);
1190
+ this.node = NokogiriHelpers.renameNode(node, null, newName);
1191
+ setName(nodeName);
1192
+ return this;
1193
+ }
1194
+
1195
+ @JRubyMethod(visibility = Visibility.PRIVATE)
1196
+ public IRubyObject set(ThreadContext context, IRubyObject rbkey, IRubyObject rbval) {
1197
+ if (node instanceof Element) {
1198
+ String key = rubyStringToString(rbkey);
1199
+ String val = rubyStringToString(rbval);
1200
+ Element element = (Element) node;
1201
+
1202
+ String uri = null;
1203
+ int colonIndex = key.indexOf(":");
1204
+ if (colonIndex > 0) {
1205
+ String prefix = key.substring(0, colonIndex);
1206
+ if (prefix.equals("xml")) {
1207
+ uri = "http://www.w3.org/XML/1998/namespace";
1208
+ } else if (prefix.equals("xmlns")) {
1209
+ uri = "http://www.w3.org/2000/xmlns/";
1210
+ } else {
1211
+ uri = findNamespaceHref(context, prefix);
1212
+ }
1213
+ }
1214
+
1215
+ if (uri != null) {
1216
+ element.setAttributeNS(uri, key, val);
1217
+ } else {
1218
+ element.setAttribute(key, val);
1219
+ }
1220
+ return this;
1221
+ } else {
1222
+ return rbval;
1223
+ }
1224
+ }
1225
+
1226
+ private String findNamespaceHref(ThreadContext context, String prefix) {
1227
+ XmlNode currentNode = this;
1228
+ while(currentNode != document(context)) {
1229
+ RubyArray namespaces = (RubyArray) currentNode.namespace_scopes(context);
1230
+ Iterator iterator = namespaces.iterator();
1231
+ while(iterator.hasNext()) {
1232
+ XmlNamespace namespace = (XmlNamespace) iterator.next();
1233
+ if (namespace.getPrefix().equals(prefix)) {
1234
+ return namespace.getHref();
1235
+ }
1236
+ }
1237
+ if (currentNode.parent(context).isNil()) {
1238
+ break;
1239
+ } else {
1240
+ currentNode = (XmlNode) currentNode.parent(context);
1241
+ }
1242
+ }
1243
+ return null;
1244
+ }
1245
+
1246
+ @JRubyMethod
1247
+ public IRubyObject parent(ThreadContext context) {
1248
+ /*
1249
+ * Check if this node is the root node of the document.
1250
+ * If so, parent is the document.
1251
+ */
1252
+ if (node.getOwnerDocument() != null &&
1253
+ node.getOwnerDocument().getDocumentElement() == node) {
1254
+ return document(context);
1255
+ } else {
1256
+ return getCachedNodeOrCreate(context.getRuntime(), node.getParentNode());
1257
+ }
1258
+ }
1259
+
1260
+ @JRubyMethod
1261
+ public IRubyObject path(ThreadContext context) {
1262
+ return RubyString.newString(context.getRuntime(), NokogiriHelpers.getNodeCompletePath(this.node));
1263
+ }
1264
+
1265
+ @JRubyMethod
1266
+ public IRubyObject pointer_id(ThreadContext context) {
1267
+ return RubyFixnum.newFixnum(context.getRuntime(), this.node.hashCode());
1268
+ }
1269
+
1270
+ @JRubyMethod(name = {"remove_attribute", "delete"})
1271
+ public IRubyObject remove_attribute(ThreadContext context, IRubyObject name) {
1272
+ if (node instanceof Element) {
1273
+ String key = name.convertToString().asJavaString();
1274
+ Element element = (Element) node;
1275
+ element.removeAttribute(key);
1276
+ }
1277
+ return this;
1278
+ }
1279
+
1280
+ @JRubyMethod(visibility=Visibility.PRIVATE)
1281
+ public IRubyObject set_namespace(ThreadContext context, IRubyObject namespace) {
1282
+ if (namespace.isNil()) {
1283
+ if (doc != null) {
1284
+ Node n = node;
1285
+ String prefix = n.getPrefix();
1286
+ String href = n.getNamespaceURI();
1287
+ ((XmlDocument)doc).getNamespaceCache().remove(prefix == null ? "" : prefix, href);
1288
+ this.node = NokogiriHelpers.renameNode(n, null, NokogiriHelpers.getLocalPart(n.getNodeName()));
1289
+ }
1290
+ } else {
1291
+ XmlNamespace ns = (XmlNamespace) namespace;
1292
+ String prefix = rubyStringToString(ns.prefix(context));
1293
+ String href = rubyStringToString(ns.href(context));
1294
+
1295
+ // Assigning node = ...renameNode() or not seems to make no
1296
+ // difference. Why not? -pmahoney
1297
+
1298
+ // It actually makes a great deal of difference. renameNode()
1299
+ // will operate in place if it can, but sometimes it can't.
1300
+ // The node you passed in *might* come back as you expect, but
1301
+ // it might not. It's much safer to throw away the original
1302
+ // and keep the return value. -mbklein
1303
+ String new_name = NokogiriHelpers.newQName(prefix, node);
1304
+ this.node = NokogiriHelpers.renameNode(node, href, new_name);
1305
+ }
1306
+
1307
+ return this;
1308
+ }
1309
+
1310
+ @JRubyMethod(name = {"unlink", "remove"})
1311
+ public IRubyObject unlink(ThreadContext context) {
1312
+ if(node.getParentNode() == null) {
1313
+ throw context.getRuntime().newRuntimeError("TYPE: " + node.getNodeType()+ " PARENT NULL");
1314
+ } else {
1315
+ node.getParentNode().removeChild(node);
1316
+ }
1317
+
1318
+ return this;
1319
+ }
1320
+
1321
+ /**
1322
+ * The C-library simply returns libxml2 magic numbers. Here we
1323
+ * convert Java Xml nodes to the appropriate constant defined in
1324
+ * xml/node.rb.
1325
+ */
1326
+ @JRubyMethod(name = {"node_type", "type"})
1327
+ public IRubyObject node_type(ThreadContext context) {
1328
+ String type;
1329
+ switch (node.getNodeType()) {
1330
+ case Node.ELEMENT_NODE:
1331
+ if (this instanceof XmlElementDecl)
1332
+ type = "ELEMENT_DECL";
1333
+ else if (this instanceof XmlAttributeDecl)
1334
+ type = "ATTRIBUTE_DECL";
1335
+ else if (this instanceof XmlEntityDecl)
1336
+ type = "ENTITY_DECL";
1337
+ else
1338
+ type = "ELEMENT_NODE";
1339
+ break;
1340
+ case Node.ATTRIBUTE_NODE: type = "ATTRIBUTE_NODE"; break;
1341
+ case Node.TEXT_NODE: type = "TEXT_NODE"; break;
1342
+ case Node.CDATA_SECTION_NODE: type = "CDATA_SECTION_NODE"; break;
1343
+ case Node.ENTITY_REFERENCE_NODE: type = "ENTITY_REF_NODE"; break;
1344
+ case Node.ENTITY_NODE: type = "ENTITY_NODE"; break;
1345
+ case Node.PROCESSING_INSTRUCTION_NODE: type = "PI_NODE"; break;
1346
+ case Node.COMMENT_NODE: type = "COMMENT_NODE"; break;
1347
+ case Node.DOCUMENT_NODE:
1348
+ if (this instanceof HtmlDocument)
1349
+ type = "HTML_DOCUMENT_NODE";
1350
+ else
1351
+ type = "DOCUMENT_NODE";
1352
+ break;
1353
+ case Node.DOCUMENT_TYPE_NODE: type = "DOCUMENT_TYPE_NODE"; break;
1354
+ case Node.DOCUMENT_FRAGMENT_NODE: type = "DOCUMENT_FRAG_NODE"; break;
1355
+ case Node.NOTATION_NODE: type = "NOTATION_NODE"; break;
1356
+ default:
1357
+ return context.getRuntime().newFixnum(0);
1358
+ }
1359
+
1360
+ return getNokogiriClass(context.getRuntime(), "Nokogiri::XML::Node").getConstant(type);
1361
+ }
1362
+
1363
+ @JRubyMethod
1364
+ public IRubyObject line(ThreadContext context) {
1365
+ Node root = getOwnerDocument();
1366
+ int[] counter = new int[1];
1367
+ count(root, counter);
1368
+ return RubyFixnum.newFixnum(context.getRuntime(), counter[0]+1);
1369
+ }
1370
+
1371
+ private boolean count(Node node, int[] counter) {
1372
+ if (node == this.node) {
1373
+ return true;
1374
+ }
1375
+ NodeList list = node.getChildNodes();
1376
+ for (int i=0; i<list.getLength(); i++) {
1377
+ Node n = list.item(i);
1378
+ if (n instanceof Text
1379
+ && ((Text)n).getData().contains("\n")) {
1380
+ counter[0] += 1;
1381
+ }
1382
+ if (count(n, counter)) return true;
1383
+ }
1384
+ return false;
1385
+ }
1386
+
1387
+ @JRubyMethod
1388
+ public IRubyObject next_element(ThreadContext context) {
1389
+ Node nextNode = node.getNextSibling();
1390
+ Ruby ruby = context.getRuntime();
1391
+ if (nextNode == null) return ruby.getNil();
1392
+ if (nextNode instanceof Element) {
1393
+ return getCachedNodeOrCreate(context.getRuntime(), nextNode);
1394
+ }
1395
+ Node deeper = nextNode.getNextSibling();
1396
+ if (deeper == null) return ruby.getNil();
1397
+ return getCachedNodeOrCreate(context.getRuntime(), deeper);
1398
+ }
1399
+
1400
+ @JRubyMethod
1401
+ public IRubyObject previous_element(ThreadContext context) {
1402
+ Node prevNode = node.getPreviousSibling();
1403
+ Ruby ruby = context.getRuntime();
1404
+ if (prevNode == null) return ruby.getNil();
1405
+ if (prevNode instanceof Element) {
1406
+ return getCachedNodeOrCreate(context.getRuntime(), prevNode);
1407
+ }
1408
+ Node shallower = prevNode.getPreviousSibling();
1409
+ if (shallower == null) return ruby.getNil();
1410
+ return getCachedNodeOrCreate(context.getRuntime(), shallower);
1411
+ }
1412
+
1413
+ protected enum AdoptScheme {
1414
+ CHILD, PREV_SIBLING, NEXT_SIBLING, REPLACEMENT;
1415
+ }
1416
+
1417
+ /**
1418
+ * Adopt XmlNode <code>other</code> into the document of
1419
+ * <code>this</code> using the specified scheme.
1420
+ */
1421
+ protected IRubyObject adoptAs(ThreadContext context, AdoptScheme scheme,
1422
+ IRubyObject other_) {
1423
+ XmlNode other = asXmlNode(context, other_);
1424
+ // this.doc might be null since this node can be empty node.
1425
+ if (this.doc != null) {
1426
+ other.setDocument(context, this.doc);
1427
+ }
1428
+ IRubyObject nodeOrTags = other;
1429
+ Node thisNode = node;
1430
+ Node otherNode = other.node;
1431
+
1432
+ try {
1433
+ Document prev = otherNode.getOwnerDocument();
1434
+ Document doc = thisNode.getOwnerDocument();
1435
+ if (doc != null && doc != otherNode.getOwnerDocument()) {
1436
+ Node ret = doc.adoptNode(otherNode);
1437
+ // FIXME: this is really a hack, see documentation of fixUserData() for more details.
1438
+ fixUserData(prev, ret);
1439
+ if (ret == null) {
1440
+ throw context.getRuntime().newRuntimeError("Failed to take ownership of node");
1441
+ }
1442
+ otherNode = ret;
1443
+ }
1444
+
1445
+ Node parent = thisNode.getParentNode();
1446
+
1447
+ switch (scheme) {
1448
+ case CHILD:
1449
+ Node[] children = adoptAsChild(context, thisNode, otherNode);
1450
+ if (children.length == 1 && otherNode == children[0]) {
1451
+ break;
1452
+ } else {
1453
+ nodeOrTags = nodeArrayToRubyArray(context.getRuntime(), children);
1454
+ }
1455
+ break;
1456
+ case PREV_SIBLING:
1457
+ adoptAsPrevSibling(context, parent, thisNode, otherNode);
1458
+ break;
1459
+ case NEXT_SIBLING:
1460
+ adoptAsNextSibling(context, parent, thisNode, otherNode);
1461
+ break;
1462
+ case REPLACEMENT:
1463
+ adoptAsReplacement(context, parent, thisNode, otherNode);
1464
+ break;
1465
+ }
1466
+ } catch (Exception e) {
1467
+ throw context.getRuntime().newRuntimeError(e.toString());
1468
+ }
1469
+
1470
+ if (otherNode.getNodeType() == Node.TEXT_NODE) {
1471
+ coalesceTextNodes(context, other, scheme);
1472
+ }
1473
+
1474
+ relink_namespace(context);
1475
+ // post_add_child(context, this, other);
1476
+
1477
+ return nodeOrTags;
1478
+ }
1479
+
1480
+ /**
1481
+ * This is a hack to fix #839. We should submit a patch to Xerces.
1482
+ * It looks like CoreDocumentImpl.adoptNode() doesn't copy
1483
+ * the user data associated with child nodes (recursively).
1484
+ */
1485
+ private void fixUserData(Document previous, Node ret) {
1486
+ String key = NokogiriHelpers.ENCODED_STRING;
1487
+ for (Node child = ret.getFirstChild(); child != null; child = child.getNextSibling()) {
1488
+ CoreDocumentImpl previousDocument = (CoreDocumentImpl) previous;
1489
+ child.setUserData(key, previousDocument.getUserData(child, key), null);
1490
+ fixUserData(previous, child);
1491
+ }
1492
+ }
1493
+
1494
+ protected Node[] adoptAsChild(ThreadContext context, Node parent,
1495
+ Node otherNode) {
1496
+ /*
1497
+ * This is a bit of a hack. C-Nokogiri allows adding a bare
1498
+ * text node as the root element. Java (and XML spec?) does
1499
+ * not. So we wrap the text node in an element.
1500
+ */
1501
+ if (parent.getNodeType() == Node.DOCUMENT_NODE &&
1502
+ otherNode.getNodeType() == Node.TEXT_NODE) {
1503
+ Element e = ((Document)parent).createElement("nokogiri_text_wrapper");
1504
+ e.appendChild(otherNode);
1505
+ otherNode = e;
1506
+ }
1507
+ addNamespaceURIIfNeeded(otherNode);
1508
+ parent.appendChild(otherNode);
1509
+ Node[] nodes = new Node[1];
1510
+ nodes[0] = otherNode;
1511
+ return nodes;
1512
+ }
1513
+
1514
+ private void addNamespaceURIIfNeeded(Node child) {
1515
+ if (this instanceof XmlDocumentFragment && ((XmlDocumentFragment)this).getFragmentContext() != null) {
1516
+ XmlElement fragmentContext = ((XmlDocumentFragment)this).getFragmentContext();
1517
+ String namespace_uri = fragmentContext.node.getNamespaceURI();
1518
+ if (namespace_uri != null && namespace_uri.length() > 0) {
1519
+ NokogiriHelpers.renameNode(child, namespace_uri, child.getNodeName());
1520
+ }
1521
+ }
1522
+ }
1523
+
1524
+ protected void adoptAsPrevSibling(ThreadContext context,
1525
+ Node parent,
1526
+ Node thisNode, Node otherNode) {
1527
+ if (parent == null) {
1528
+ /* I'm not sure what do do here... A node with no
1529
+ * parent can't exactly have a 'sibling', so we make
1530
+ * otherNode parentless also. */
1531
+ if (otherNode.getParentNode() != null)
1532
+ otherNode.getParentNode().removeChild(otherNode);
1533
+ return;
1534
+ }
1535
+
1536
+ parent.insertBefore(otherNode, thisNode);
1537
+ }
1538
+
1539
+ protected void adoptAsNextSibling(ThreadContext context,
1540
+ Node parent,
1541
+ Node thisNode, Node otherNode) {
1542
+ if (parent == null) {
1543
+ /* I'm not sure what do do here... A node with no
1544
+ * parent can't exactly have a 'sibling', so we make
1545
+ * otherNode parentless also. */
1546
+ if (otherNode.getParentNode() != null)
1547
+ otherNode.getParentNode().removeChild(otherNode);
1548
+
1549
+ return;
1550
+ }
1551
+
1552
+ Node nextSib = thisNode.getNextSibling();
1553
+
1554
+ if (nextSib != null &&
1555
+ nextSib.getNodeType() == Node.TEXT_NODE &&
1556
+ otherNode.getNodeType() == Node.TEXT_NODE) return;
1557
+
1558
+ if (nextSib != null) {
1559
+ parent.insertBefore(otherNode, nextSib);
1560
+ } else {
1561
+ parent.appendChild(otherNode);
1562
+ }
1563
+ }
1564
+
1565
+ protected void adoptAsReplacement(ThreadContext context,
1566
+ Node parentNode,
1567
+ Node thisNode, Node otherNode) {
1568
+ if (parentNode == null) {
1569
+ /* nothing to replace? */
1570
+ return;
1571
+ }
1572
+
1573
+ try {
1574
+ parentNode.replaceChild(otherNode, thisNode);
1575
+ if (otherNode.getNodeType() != Node.TEXT_NODE) {
1576
+ NokogiriHelpers.renameNode(otherNode, thisNode.getNamespaceURI(), otherNode.getNodeName());
1577
+ }
1578
+ } catch (Exception e) {
1579
+ String prefix = "could not replace child: ";
1580
+ throw context.getRuntime().newRuntimeError(prefix + e.toString());
1581
+ }
1582
+ }
1583
+
1584
+ /**
1585
+ * Add <code>other</code> as a child of <code>this</code>.
1586
+ */
1587
+ @JRubyMethod(visibility=Visibility.PRIVATE)
1588
+ public IRubyObject add_child_node(ThreadContext context, IRubyObject other) {
1589
+ return adoptAs(context, AdoptScheme.CHILD, other);
1590
+ }
1591
+
1592
+ /**
1593
+ * Replace <code>this</code> with <code>other</code>.
1594
+ */
1595
+ @JRubyMethod(visibility=Visibility.PRIVATE)
1596
+ public IRubyObject replace_node(ThreadContext context, IRubyObject other) {
1597
+ return adoptAs(context, AdoptScheme.REPLACEMENT, other);
1598
+ }
1599
+
1600
+ /**
1601
+ * Add <code>other</code> as a sibling before <code>this</code>.
1602
+ */
1603
+ @JRubyMethod(visibility=Visibility.PRIVATE)
1604
+ public IRubyObject add_previous_sibling_node(ThreadContext context, IRubyObject other) {
1605
+ return adoptAs(context, AdoptScheme.PREV_SIBLING, other);
1606
+ }
1607
+
1608
+ /**
1609
+ * Add <code>other</code> as a sibling after <code>this</code>.
1610
+ */
1611
+ @JRubyMethod(visibility=Visibility.PRIVATE)
1612
+ public IRubyObject add_next_sibling_node(ThreadContext context, IRubyObject other) {
1613
+ return adoptAs(context, AdoptScheme.NEXT_SIBLING, other);
1614
+ }
1615
+
1616
+ /**
1617
+ * call-seq:
1618
+ * process_xincludes(options)
1619
+ *
1620
+ * Loads and substitutes all xinclude elements below the node. The
1621
+ * parser context will be initialized with +options+.
1622
+ *
1623
+ */
1624
+ @JRubyMethod(visibility=Visibility.PRIVATE)
1625
+ public IRubyObject process_xincludes(ThreadContext context, IRubyObject options) {
1626
+ XmlDocument xmlDocument = (XmlDocument)document(context);
1627
+ RubyArray errors = (RubyArray)xmlDocument.getInstanceVariable("@errors");
1628
+ while(errors.getLength() > 0) {
1629
+ XmlSyntaxError error = (XmlSyntaxError)errors.shift(context);
1630
+ if (error.toString().contains("Include operation failed")) {
1631
+ throw new RaiseException(error);
1632
+ }
1633
+ }
1634
+ return this;
1635
+ }
1636
+
1637
+ }