Nokogiri_precompiled_aarch64_dedshit 1.14.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (263) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +44 -0
  3. data/LICENSE-DEPENDENCIES.md +2224 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +287 -0
  6. data/bin/nokogiri +131 -0
  7. data/dependencies.yml +41 -0
  8. data/ext/java/nokogiri/Html4Document.java +157 -0
  9. data/ext/java/nokogiri/Html4ElementDescription.java +133 -0
  10. data/ext/java/nokogiri/Html4EntityLookup.java +63 -0
  11. data/ext/java/nokogiri/Html4SaxParserContext.java +289 -0
  12. data/ext/java/nokogiri/Html4SaxPushParser.java +213 -0
  13. data/ext/java/nokogiri/NokogiriService.java +613 -0
  14. data/ext/java/nokogiri/XmlAttr.java +154 -0
  15. data/ext/java/nokogiri/XmlAttributeDecl.java +119 -0
  16. data/ext/java/nokogiri/XmlCdata.java +60 -0
  17. data/ext/java/nokogiri/XmlComment.java +77 -0
  18. data/ext/java/nokogiri/XmlDocument.java +705 -0
  19. data/ext/java/nokogiri/XmlDocumentFragment.java +163 -0
  20. data/ext/java/nokogiri/XmlDtd.java +516 -0
  21. data/ext/java/nokogiri/XmlElement.java +44 -0
  22. data/ext/java/nokogiri/XmlElementContent.java +412 -0
  23. data/ext/java/nokogiri/XmlElementDecl.java +148 -0
  24. data/ext/java/nokogiri/XmlEntityDecl.java +151 -0
  25. data/ext/java/nokogiri/XmlEntityReference.java +79 -0
  26. data/ext/java/nokogiri/XmlNamespace.java +193 -0
  27. data/ext/java/nokogiri/XmlNode.java +1938 -0
  28. data/ext/java/nokogiri/XmlNodeSet.java +463 -0
  29. data/ext/java/nokogiri/XmlProcessingInstruction.java +79 -0
  30. data/ext/java/nokogiri/XmlReader.java +615 -0
  31. data/ext/java/nokogiri/XmlRelaxng.java +133 -0
  32. data/ext/java/nokogiri/XmlSaxParserContext.java +329 -0
  33. data/ext/java/nokogiri/XmlSaxPushParser.java +288 -0
  34. data/ext/java/nokogiri/XmlSchema.java +423 -0
  35. data/ext/java/nokogiri/XmlSyntaxError.java +137 -0
  36. data/ext/java/nokogiri/XmlText.java +90 -0
  37. data/ext/java/nokogiri/XmlXpathContext.java +305 -0
  38. data/ext/java/nokogiri/XsltStylesheet.java +368 -0
  39. data/ext/java/nokogiri/internals/ClosedStreamException.java +13 -0
  40. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +252 -0
  41. data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +27 -0
  42. data/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +178 -0
  43. data/ext/java/nokogiri/internals/NokogiriDomParser.java +99 -0
  44. data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +140 -0
  45. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +65 -0
  46. data/ext/java/nokogiri/internals/NokogiriHandler.java +339 -0
  47. data/ext/java/nokogiri/internals/NokogiriHelpers.java +817 -0
  48. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +228 -0
  49. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +110 -0
  50. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +86 -0
  51. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +107 -0
  52. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +62 -0
  53. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +165 -0
  54. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +50 -0
  55. data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +37 -0
  56. data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +70 -0
  57. data/ext/java/nokogiri/internals/ParserContext.java +262 -0
  58. data/ext/java/nokogiri/internals/ReaderNode.java +564 -0
  59. data/ext/java/nokogiri/internals/SaveContextVisitor.java +865 -0
  60. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +50 -0
  61. data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +174 -0
  62. data/ext/java/nokogiri/internals/XmlDeclHandler.java +11 -0
  63. data/ext/java/nokogiri/internals/XmlDomParserContext.java +265 -0
  64. data/ext/java/nokogiri/internals/XmlSaxParser.java +40 -0
  65. data/ext/java/nokogiri/internals/c14n/AttrCompare.java +122 -0
  66. data/ext/java/nokogiri/internals/c14n/C14nHelper.java +178 -0
  67. data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +43 -0
  68. data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +106 -0
  69. data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +278 -0
  70. data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +664 -0
  71. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +45 -0
  72. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +45 -0
  73. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +388 -0
  74. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +308 -0
  75. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +47 -0
  76. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +51 -0
  77. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +51 -0
  78. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +50 -0
  79. data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +660 -0
  80. data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +194 -0
  81. data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +77 -0
  82. data/ext/java/nokogiri/internals/c14n/Constants.java +45 -0
  83. data/ext/java/nokogiri/internals/c14n/ElementProxy.java +325 -0
  84. data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +106 -0
  85. data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +86 -0
  86. data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +181 -0
  87. data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +87 -0
  88. data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +452 -0
  89. data/ext/java/nokogiri/internals/c14n/NodeFilter.java +52 -0
  90. data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +190 -0
  91. data/ext/java/nokogiri/internals/c14n/XMLUtils.java +540 -0
  92. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTM.java +1712 -0
  93. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java +737 -0
  94. data/ext/nokogiri/depend +38 -0
  95. data/ext/nokogiri/extconf.rb +1086 -0
  96. data/ext/nokogiri/gumbo.c +594 -0
  97. data/ext/nokogiri/html4_document.c +167 -0
  98. data/ext/nokogiri/html4_element_description.c +294 -0
  99. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  100. data/ext/nokogiri/html4_sax_parser_context.c +116 -0
  101. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  102. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  103. data/ext/nokogiri/nokogiri.c +265 -0
  104. data/ext/nokogiri/nokogiri.h +235 -0
  105. data/ext/nokogiri/test_global_handlers.c +42 -0
  106. data/ext/nokogiri/xml_attr.c +103 -0
  107. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  108. data/ext/nokogiri/xml_cdata.c +57 -0
  109. data/ext/nokogiri/xml_comment.c +62 -0
  110. data/ext/nokogiri/xml_document.c +689 -0
  111. data/ext/nokogiri/xml_document_fragment.c +44 -0
  112. data/ext/nokogiri/xml_dtd.c +210 -0
  113. data/ext/nokogiri/xml_element_content.c +128 -0
  114. data/ext/nokogiri/xml_element_decl.c +69 -0
  115. data/ext/nokogiri/xml_encoding_handler.c +104 -0
  116. data/ext/nokogiri/xml_entity_decl.c +112 -0
  117. data/ext/nokogiri/xml_entity_reference.c +50 -0
  118. data/ext/nokogiri/xml_namespace.c +186 -0
  119. data/ext/nokogiri/xml_node.c +2426 -0
  120. data/ext/nokogiri/xml_node_set.c +496 -0
  121. data/ext/nokogiri/xml_processing_instruction.c +54 -0
  122. data/ext/nokogiri/xml_reader.c +794 -0
  123. data/ext/nokogiri/xml_relax_ng.c +164 -0
  124. data/ext/nokogiri/xml_sax_parser.c +316 -0
  125. data/ext/nokogiri/xml_sax_parser_context.c +283 -0
  126. data/ext/nokogiri/xml_sax_push_parser.c +166 -0
  127. data/ext/nokogiri/xml_schema.c +260 -0
  128. data/ext/nokogiri/xml_syntax_error.c +85 -0
  129. data/ext/nokogiri/xml_text.c +48 -0
  130. data/ext/nokogiri/xml_xpath_context.c +415 -0
  131. data/ext/nokogiri/xslt_stylesheet.c +363 -0
  132. data/gumbo-parser/CHANGES.md +63 -0
  133. data/gumbo-parser/Makefile +111 -0
  134. data/gumbo-parser/THANKS +27 -0
  135. data/gumbo-parser/src/Makefile +34 -0
  136. data/gumbo-parser/src/README.md +41 -0
  137. data/gumbo-parser/src/ascii.c +75 -0
  138. data/gumbo-parser/src/ascii.h +115 -0
  139. data/gumbo-parser/src/attribute.c +42 -0
  140. data/gumbo-parser/src/attribute.h +17 -0
  141. data/gumbo-parser/src/char_ref.c +22225 -0
  142. data/gumbo-parser/src/char_ref.h +29 -0
  143. data/gumbo-parser/src/char_ref.rl +2154 -0
  144. data/gumbo-parser/src/error.c +626 -0
  145. data/gumbo-parser/src/error.h +148 -0
  146. data/gumbo-parser/src/foreign_attrs.c +104 -0
  147. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  148. data/gumbo-parser/src/insertion_mode.h +33 -0
  149. data/gumbo-parser/src/macros.h +91 -0
  150. data/gumbo-parser/src/nokogiri_gumbo.h +944 -0
  151. data/gumbo-parser/src/parser.c +4878 -0
  152. data/gumbo-parser/src/parser.h +41 -0
  153. data/gumbo-parser/src/replacement.h +33 -0
  154. data/gumbo-parser/src/string_buffer.c +103 -0
  155. data/gumbo-parser/src/string_buffer.h +68 -0
  156. data/gumbo-parser/src/string_piece.c +48 -0
  157. data/gumbo-parser/src/svg_attrs.c +174 -0
  158. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  159. data/gumbo-parser/src/svg_tags.c +137 -0
  160. data/gumbo-parser/src/svg_tags.gperf +55 -0
  161. data/gumbo-parser/src/tag.c +223 -0
  162. data/gumbo-parser/src/tag_lookup.c +382 -0
  163. data/gumbo-parser/src/tag_lookup.gperf +170 -0
  164. data/gumbo-parser/src/tag_lookup.h +13 -0
  165. data/gumbo-parser/src/token_buffer.c +79 -0
  166. data/gumbo-parser/src/token_buffer.h +71 -0
  167. data/gumbo-parser/src/token_type.h +17 -0
  168. data/gumbo-parser/src/tokenizer.c +3463 -0
  169. data/gumbo-parser/src/tokenizer.h +112 -0
  170. data/gumbo-parser/src/tokenizer_states.h +339 -0
  171. data/gumbo-parser/src/utf8.c +245 -0
  172. data/gumbo-parser/src/utf8.h +164 -0
  173. data/gumbo-parser/src/util.c +66 -0
  174. data/gumbo-parser/src/util.h +34 -0
  175. data/gumbo-parser/src/vector.c +111 -0
  176. data/gumbo-parser/src/vector.h +45 -0
  177. data/lib/nokogiri/class_resolver.rb +67 -0
  178. data/lib/nokogiri/css/node.rb +54 -0
  179. data/lib/nokogiri/css/parser.rb +770 -0
  180. data/lib/nokogiri/css/parser.y +277 -0
  181. data/lib/nokogiri/css/parser_extras.rb +96 -0
  182. data/lib/nokogiri/css/syntax_error.rb +9 -0
  183. data/lib/nokogiri/css/tokenizer.rb +155 -0
  184. data/lib/nokogiri/css/tokenizer.rex +56 -0
  185. data/lib/nokogiri/css/xpath_visitor.rb +359 -0
  186. data/lib/nokogiri/css.rb +66 -0
  187. data/lib/nokogiri/decorators/slop.rb +44 -0
  188. data/lib/nokogiri/encoding_handler.rb +57 -0
  189. data/lib/nokogiri/extension.rb +32 -0
  190. data/lib/nokogiri/gumbo.rb +15 -0
  191. data/lib/nokogiri/html.rb +48 -0
  192. data/lib/nokogiri/html4/builder.rb +37 -0
  193. data/lib/nokogiri/html4/document.rb +214 -0
  194. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  195. data/lib/nokogiri/html4/element_description.rb +25 -0
  196. data/lib/nokogiri/html4/element_description_defaults.rb +572 -0
  197. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  198. data/lib/nokogiri/html4/entity_lookup.rb +15 -0
  199. data/lib/nokogiri/html4/sax/parser.rb +63 -0
  200. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  201. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  202. data/lib/nokogiri/html4.rb +47 -0
  203. data/lib/nokogiri/html5/document.rb +168 -0
  204. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  205. data/lib/nokogiri/html5/node.rb +98 -0
  206. data/lib/nokogiri/html5.rb +389 -0
  207. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  208. data/lib/nokogiri/jruby/isorelax/isorelax/20030108/isorelax-20030108.jar +0 -0
  209. data/lib/nokogiri/jruby/net/sf/saxon/Saxon-HE/9.6.0-4/Saxon-HE-9.6.0-4.jar +0 -0
  210. data/lib/nokogiri/jruby/net/sourceforge/htmlunit/neko-htmlunit/2.63.0/neko-htmlunit-2.63.0.jar +0 -0
  211. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  212. data/lib/nokogiri/jruby/nu/validator/jing/20200702VNU/jing-20200702VNU.jar +0 -0
  213. data/lib/nokogiri/jruby/org/nokogiri/nekodtd/0.1.11.noko2/nekodtd-0.1.11.noko2.jar +0 -0
  214. data/lib/nokogiri/jruby/xalan/serializer/2.7.3/serializer-2.7.3.jar +0 -0
  215. data/lib/nokogiri/jruby/xalan/xalan/2.7.3/xalan-2.7.3.jar +0 -0
  216. data/lib/nokogiri/jruby/xerces/xercesImpl/2.12.2/xercesImpl-2.12.2.jar +0 -0
  217. data/lib/nokogiri/jruby/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar +0 -0
  218. data/lib/nokogiri/syntax_error.rb +6 -0
  219. data/lib/nokogiri/version/constant.rb +6 -0
  220. data/lib/nokogiri/version/info.rb +223 -0
  221. data/lib/nokogiri/version.rb +4 -0
  222. data/lib/nokogiri/xml/attr.rb +66 -0
  223. data/lib/nokogiri/xml/attribute_decl.rb +20 -0
  224. data/lib/nokogiri/xml/builder.rb +487 -0
  225. data/lib/nokogiri/xml/cdata.rb +13 -0
  226. data/lib/nokogiri/xml/character_data.rb +9 -0
  227. data/lib/nokogiri/xml/document.rb +471 -0
  228. data/lib/nokogiri/xml/document_fragment.rb +205 -0
  229. data/lib/nokogiri/xml/dtd.rb +34 -0
  230. data/lib/nokogiri/xml/element_content.rb +38 -0
  231. data/lib/nokogiri/xml/element_decl.rb +15 -0
  232. data/lib/nokogiri/xml/entity_decl.rb +21 -0
  233. data/lib/nokogiri/xml/entity_reference.rb +20 -0
  234. data/lib/nokogiri/xml/namespace.rb +58 -0
  235. data/lib/nokogiri/xml/node/save_options.rb +68 -0
  236. data/lib/nokogiri/xml/node.rb +1563 -0
  237. data/lib/nokogiri/xml/node_set.rb +447 -0
  238. data/lib/nokogiri/xml/notation.rb +19 -0
  239. data/lib/nokogiri/xml/parse_options.rb +213 -0
  240. data/lib/nokogiri/xml/pp/character_data.rb +21 -0
  241. data/lib/nokogiri/xml/pp/node.rb +57 -0
  242. data/lib/nokogiri/xml/pp.rb +4 -0
  243. data/lib/nokogiri/xml/processing_instruction.rb +11 -0
  244. data/lib/nokogiri/xml/reader.rb +105 -0
  245. data/lib/nokogiri/xml/relax_ng.rb +38 -0
  246. data/lib/nokogiri/xml/sax/document.rb +167 -0
  247. data/lib/nokogiri/xml/sax/parser.rb +125 -0
  248. data/lib/nokogiri/xml/sax/parser_context.rb +21 -0
  249. data/lib/nokogiri/xml/sax/push_parser.rb +61 -0
  250. data/lib/nokogiri/xml/sax.rb +6 -0
  251. data/lib/nokogiri/xml/schema.rb +73 -0
  252. data/lib/nokogiri/xml/searchable.rb +270 -0
  253. data/lib/nokogiri/xml/syntax_error.rb +72 -0
  254. data/lib/nokogiri/xml/text.rb +11 -0
  255. data/lib/nokogiri/xml/xpath/syntax_error.rb +13 -0
  256. data/lib/nokogiri/xml/xpath.rb +21 -0
  257. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  258. data/lib/nokogiri/xml.rb +76 -0
  259. data/lib/nokogiri/xslt/stylesheet.rb +27 -0
  260. data/lib/nokogiri/xslt.rb +65 -0
  261. data/lib/nokogiri.rb +120 -0
  262. data/lib/xsd/xmlparser/nokogiri.rb +106 -0
  263. metadata +391 -0
@@ -0,0 +1,368 @@
1
+ package nokogiri;
2
+
3
+ import static nokogiri.internals.NokogiriHelpers.getNokogiriClass;
4
+ import static nokogiri.internals.NokogiriHelpers.stringOrBlank;
5
+
6
+ import java.io.ByteArrayOutputStream;
7
+ import java.io.IOException;
8
+ import java.io.PipedReader;
9
+ import java.io.PipedWriter;
10
+ import java.io.StringReader;
11
+ import java.util.Set;
12
+ import java.util.Map;
13
+ import java.util.regex.Matcher;
14
+ import java.util.regex.Pattern;
15
+
16
+ import javax.xml.transform.OutputKeys;
17
+ import javax.xml.transform.Templates;
18
+ import javax.xml.transform.Transformer;
19
+ import javax.xml.transform.TransformerConfigurationException;
20
+ import javax.xml.transform.TransformerException;
21
+ import javax.xml.transform.TransformerFactory;
22
+ import javax.xml.transform.dom.DOMResult;
23
+ import javax.xml.transform.dom.DOMSource;
24
+ import javax.xml.transform.stream.StreamResult;
25
+ import javax.xml.transform.stream.StreamSource;
26
+
27
+ import org.apache.xml.serializer.SerializationHandler;
28
+ import org.apache.xml.serializer.Serializer;
29
+ import org.apache.xml.serializer.SerializerFactory;
30
+
31
+ import org.jruby.Ruby;
32
+ import org.jruby.RubyArray;
33
+ import org.jruby.RubyClass;
34
+ import org.jruby.RubyHash;
35
+ import org.jruby.RubyObject;
36
+ import org.jruby.RubyString;
37
+ import org.jruby.anno.JRubyClass;
38
+ import org.jruby.anno.JRubyMethod;
39
+ import org.jruby.runtime.Helpers;
40
+ import org.jruby.runtime.ThreadContext;
41
+ import org.jruby.runtime.builtin.IRubyObject;
42
+ import org.w3c.dom.Document;
43
+
44
+ import nokogiri.internals.NokogiriXsltErrorListener;
45
+
46
+ /**
47
+ * Class for Nokogiri::XSLT::Stylesheet
48
+ *
49
+ * @author sergio
50
+ * @author Yoko Harada <yokolet@gmail.com>
51
+ */
52
+ @JRubyClass(name = "Nokogiri::XSLT::Stylesheet")
53
+ public class XsltStylesheet extends RubyObject
54
+ {
55
+ private static final long serialVersionUID = 1L;
56
+
57
+ private TransformerFactory factory = null;
58
+ private Templates sheet = null;
59
+ private IRubyObject stylesheet = null;
60
+ private boolean htmlish = false;
61
+
62
+ public
63
+ XsltStylesheet(Ruby ruby, RubyClass rubyClass)
64
+ {
65
+ super(ruby, rubyClass);
66
+ }
67
+
68
+ /**
69
+ * Create and return a copy of this object.
70
+ *
71
+ * @return a clone of this object
72
+ */
73
+ @Override
74
+ public Object
75
+ clone() throws CloneNotSupportedException
76
+ {
77
+ return super.clone();
78
+ }
79
+
80
+ private void
81
+ addParametersToTransformer(ThreadContext context, Transformer transf, IRubyObject parameters)
82
+ {
83
+ Ruby runtime = context.getRuntime();
84
+
85
+ if (parameters instanceof RubyHash) {
86
+ setHashParameters(transf, (RubyHash)parameters);
87
+ } else if (parameters instanceof RubyArray) {
88
+ setArrayParameters(transf, runtime, (RubyArray)parameters);
89
+ } else {
90
+ throw runtime.newTypeError("parameters should be given either Array or Hash");
91
+ }
92
+ }
93
+
94
+ @SuppressWarnings("unchecked")
95
+ private void
96
+ setHashParameters(Transformer transformer, RubyHash hash)
97
+ {
98
+ for (Map.Entry<Object, Object> entry : (Set<Map.Entry<Object, Object>>)hash.entrySet()) {
99
+ transformer.setParameter((String)entry.getKey(), unparseValue((String)entry.getValue()));
100
+ }
101
+ }
102
+
103
+ private void
104
+ setArrayParameters(Transformer transformer, Ruby runtime, RubyArray<?> params)
105
+ {
106
+ int limit = params.getLength();
107
+ if (limit % 2 == 1) { limit--; }
108
+
109
+ for (int i = 0; i < limit; i += 2) {
110
+ String name = params.aref(runtime.newFixnum(i)).asJavaString();
111
+ String value = params.aref(runtime.newFixnum(i + 1)).asJavaString();
112
+ transformer.setParameter(name, unparseValue(value));
113
+ }
114
+ }
115
+
116
+ private static final Pattern QUOTED = Pattern.compile("'.{1,}'");
117
+
118
+ private String
119
+ unparseValue(String orig)
120
+ {
121
+ if ((orig.startsWith("\"") && orig.endsWith("\"")) || QUOTED.matcher(orig).matches()) {
122
+ orig = orig.substring(1, orig.length() - 1);
123
+ }
124
+
125
+ return orig;
126
+ }
127
+
128
+ @JRubyMethod(meta = true, rest = true)
129
+ public static IRubyObject
130
+ parse_stylesheet_doc(ThreadContext context, IRubyObject klazz, IRubyObject[] args)
131
+ {
132
+
133
+ Ruby runtime = context.getRuntime();
134
+
135
+ ensureFirstArgIsDocument(runtime, args[0]);
136
+
137
+ XmlDocument xmlDoc = (XmlDocument) args[0];
138
+ ensureDocumentHasNoError(context, xmlDoc);
139
+
140
+ Document doc = ((XmlDocument) xmlDoc.dup_implementation(context, true)).getDocument();
141
+
142
+ XsltStylesheet xslt =
143
+ (XsltStylesheet) NokogiriService.XSLT_STYLESHEET_ALLOCATOR.allocate(runtime, (RubyClass)klazz);
144
+
145
+ try {
146
+ xslt.init(args[1], doc);
147
+ } catch (TransformerConfigurationException ex) {
148
+ throw runtime.newRuntimeError("could not parse xslt stylesheet");
149
+ }
150
+
151
+ return xslt;
152
+ }
153
+
154
+ private void
155
+ init(IRubyObject stylesheet, Document document) throws TransformerConfigurationException
156
+ {
157
+ this.stylesheet = stylesheet; // either RubyString or RubyFile
158
+ if (factory == null) { factory = TransformerFactory.newInstance(); }
159
+ NokogiriXsltErrorListener elistener = new NokogiriXsltErrorListener();
160
+ factory.setErrorListener(elistener);
161
+ sheet = factory.newTemplates(new DOMSource(document));
162
+ }
163
+
164
+ private static void
165
+ ensureFirstArgIsDocument(Ruby runtime, IRubyObject arg)
166
+ {
167
+ if (arg instanceof XmlDocument) { return; }
168
+ throw runtime.newArgumentError("doc must be a Nokogiri::XML::Document instance");
169
+ }
170
+
171
+ private static void
172
+ ensureDocumentHasNoError(ThreadContext context, XmlDocument xmlDoc)
173
+ {
174
+ Ruby runtime = context.getRuntime();
175
+ RubyArray<?> errors_of_xmlDoc = (RubyArray) xmlDoc.getInstanceVariable("@errors");
176
+ if (!errors_of_xmlDoc.isEmpty()) {
177
+ throw runtime.newRuntimeError(errors_of_xmlDoc.first().asString().asJavaString());
178
+ }
179
+ }
180
+
181
+ @JRubyMethod
182
+ public IRubyObject
183
+ serialize(ThreadContext context, IRubyObject doc) throws IOException
184
+ {
185
+ XmlDocument xmlDoc = (XmlDocument) doc;
186
+ ByteArrayOutputStream writer = new ByteArrayOutputStream();
187
+
188
+ java.util.Properties props = this.sheet.getOutputProperties();
189
+ if (props.getProperty(OutputKeys.METHOD) == null) {
190
+ props.setProperty(OutputKeys.METHOD, org.apache.xml.serializer.Method.UNKNOWN);
191
+ }
192
+
193
+ Serializer serializer = SerializerFactory.getSerializer(props);
194
+ serializer.setOutputStream(writer);
195
+ ((SerializationHandler) serializer).serialize(xmlDoc.getNode());
196
+
197
+ return context.getRuntime().newString(writer.toString());
198
+ }
199
+
200
+ @JRubyMethod(rest = true, required = 1, optional = 2)
201
+ public IRubyObject
202
+ transform(ThreadContext context, IRubyObject[] args)
203
+ {
204
+ Ruby runtime = context.getRuntime();
205
+
206
+ argumentTypeCheck(runtime, args[0]);
207
+
208
+ NokogiriXsltErrorListener elistener = new NokogiriXsltErrorListener();
209
+ DOMSource domSource = new DOMSource(((XmlDocument) args[0]).getDocument());
210
+ final DOMResult result;
211
+ String stringResult = null;
212
+ try {
213
+ result = tryXsltTransformation(context, args, domSource, elistener); // DOMResult
214
+ if (result.getNode().getFirstChild() == null) {
215
+ stringResult = retryXsltTransformation(context, args, domSource, elistener); // StreamResult
216
+ }
217
+ } catch (TransformerConfigurationException ex) {
218
+ throw runtime.newRuntimeError(ex.getMessage());
219
+ } catch (TransformerException ex) {
220
+ throw runtime.newRuntimeError(ex.getMessage());
221
+ } catch (IOException ex) {
222
+ throw runtime.newRuntimeError(ex.getMessage());
223
+ }
224
+
225
+ switch (elistener.getErrorType()) {
226
+ case ERROR:
227
+ case FATAL:
228
+ throw runtime.newRuntimeError(elistener.getErrorMessage());
229
+ case WARNING:
230
+ default:
231
+ // no-op
232
+ }
233
+
234
+ if (stringResult == null) {
235
+ return createDocumentFromDomResult(context, runtime, result);
236
+ } else {
237
+ return createDocumentFromString(context, runtime, stringResult);
238
+ }
239
+ }
240
+
241
+ private DOMResult
242
+ tryXsltTransformation(ThreadContext context, IRubyObject[] args, DOMSource domSource,
243
+ NokogiriXsltErrorListener elistener) throws TransformerException
244
+ {
245
+ Transformer transf = sheet.newTransformer();
246
+ transf.reset();
247
+ transf.setErrorListener(elistener);
248
+ if (args.length > 1) {
249
+ addParametersToTransformer(context, transf, args[1]);
250
+ }
251
+
252
+ DOMResult result = new DOMResult();
253
+ transf.transform(domSource, result);
254
+ return result;
255
+ }
256
+
257
+ private String
258
+ retryXsltTransformation(ThreadContext context,
259
+ IRubyObject[] args,
260
+ DOMSource domSource,
261
+ NokogiriXsltErrorListener elistener)
262
+ throws TransformerException, IOException
263
+ {
264
+ Templates templates = getTemplatesFromStreamSource();
265
+ Transformer transf = templates.newTransformer();
266
+ transf.setErrorListener(elistener);
267
+ if (args.length > 1) {
268
+ addParametersToTransformer(context, transf, args[1]);
269
+ }
270
+ PipedWriter pwriter = new PipedWriter();
271
+ PipedReader preader = new PipedReader();
272
+ pwriter.connect(preader);
273
+ StreamResult result = new StreamResult(pwriter);
274
+ transf.transform(domSource, result);
275
+
276
+ char[] cbuf = new char[1024];
277
+ int len = preader.read(cbuf, 0, 1024);
278
+ StringBuilder builder = new StringBuilder(len);
279
+ builder.append(cbuf, 0, len);
280
+ htmlish = isHtml(builder); // judge from the first chunk
281
+
282
+ while (len == 1024) {
283
+ len = preader.read(cbuf, 0, 1024);
284
+ if (len > 0) {
285
+ builder.append(cbuf, 0, len);
286
+ }
287
+ }
288
+
289
+ preader.close();
290
+ pwriter.close();
291
+
292
+ return builder.toString();
293
+ }
294
+
295
+ private IRubyObject
296
+ createDocumentFromDomResult(ThreadContext context, Ruby runtime, DOMResult domResult)
297
+ {
298
+ if ("html".equals(domResult.getNode().getFirstChild().getNodeName())) {
299
+ return new Html4Document(context.runtime, (Document) domResult.getNode());
300
+ } else {
301
+ return new XmlDocument(context.runtime, (Document) domResult.getNode());
302
+ }
303
+ }
304
+
305
+ private Templates
306
+ getTemplatesFromStreamSource() throws TransformerConfigurationException
307
+ {
308
+ if (stylesheet instanceof RubyString) {
309
+ StringReader reader = new StringReader(stylesheet.asJavaString());
310
+ StreamSource xsltStreamSource = new StreamSource(reader);
311
+ return factory.newTemplates(xsltStreamSource);
312
+ }
313
+ return null;
314
+ }
315
+
316
+ private static final Pattern HTML_TAG = Pattern.compile("<(%s)*html", Pattern.CASE_INSENSITIVE);
317
+
318
+ private static boolean
319
+ isHtml(CharSequence chunk)
320
+ {
321
+ Matcher match = HTML_TAG.matcher(chunk);
322
+ return match.find();
323
+ }
324
+
325
+ private IRubyObject
326
+ createDocumentFromString(ThreadContext context, Ruby runtime, String stringResult)
327
+ {
328
+ IRubyObject[] args = new IRubyObject[4];
329
+ args[0] = stringOrBlank(runtime, stringResult);
330
+ args[1] = runtime.getNil(); // url
331
+ args[2] = runtime.getNil(); // encoding
332
+ RubyClass parse_options = (RubyClass)runtime.getClassFromPath("Nokogiri::XML::ParseOptions");
333
+ if (htmlish) {
334
+ args[3] = parse_options.getConstant("DEFAULT_HTML");
335
+ RubyClass htmlDocumentClass = getNokogiriClass(runtime, "Nokogiri::HTML4::Document");
336
+ return Helpers.invoke(context, htmlDocumentClass, "parse", args);
337
+ } else {
338
+ args[3] = parse_options.getConstant("DEFAULT_XML");
339
+ RubyClass xmlDocumentClass = getNokogiriClass(runtime, "Nokogiri::XML::Document");
340
+ XmlDocument xmlDocument = (XmlDocument) Helpers.invoke(context, xmlDocumentClass, "parse", args);
341
+ if (((Document)xmlDocument.getNode()).getDocumentElement() == null) {
342
+ RubyArray<?> errors = (RubyArray) xmlDocument.getInstanceVariable("@errors");
343
+ Helpers.invoke(context, errors, "<<", args[0]);
344
+ }
345
+ return xmlDocument;
346
+ }
347
+ }
348
+
349
+ private static void
350
+ argumentTypeCheck(Ruby runtime, IRubyObject arg)
351
+ {
352
+ if (arg instanceof XmlDocument) { return; }
353
+ throw runtime.newArgumentError("argument must be a Nokogiri::XML::Document");
354
+ }
355
+
356
+ @JRubyMethod(name = {"registr", "register"}, meta = true)
357
+ public static IRubyObject
358
+ register(ThreadContext context, IRubyObject cls, IRubyObject uri, IRubyObject receiver)
359
+ {
360
+ throw context.getRuntime().newNotImplementedError("Nokogiri::XSLT.register method is not implemented");
361
+ /* When API conflict is solved, this method should be below:
362
+ // ThreadContext is used while executing xslt extension function
363
+ registry.put("context", context);
364
+ registry.put("receiver", receiver);
365
+ return context.getRuntime().getNil();
366
+ */
367
+ }
368
+ }
@@ -0,0 +1,13 @@
1
+ package nokogiri.internals;
2
+
3
+ @SuppressWarnings("serial")
4
+ public class ClosedStreamException extends Exception
5
+ {
6
+
7
+ public
8
+ ClosedStreamException(String message)
9
+ {
10
+ super(message);
11
+ }
12
+
13
+ }
@@ -0,0 +1,252 @@
1
+ package nokogiri.internals;
2
+
3
+ import static nokogiri.internals.NokogiriHelpers.getNokogiriClass;
4
+ import static nokogiri.internals.NokogiriHelpers.isNamespace;
5
+ import static nokogiri.internals.NokogiriHelpers.stringOrNil;
6
+
7
+ import nokogiri.Html4Document;
8
+ import nokogiri.NokogiriService;
9
+ import nokogiri.XmlDocument;
10
+ import nokogiri.XmlSyntaxError;
11
+
12
+ import org.apache.xerces.xni.Augmentations;
13
+ import org.apache.xerces.xni.QName;
14
+ import org.apache.xerces.xni.XMLAttributes;
15
+ import org.apache.xerces.xni.XNIException;
16
+ import org.apache.xerces.xni.parser.XMLDocumentFilter;
17
+ import org.apache.xerces.xni.parser.XMLParserConfiguration;
18
+ import net.sourceforge.htmlunit.cyberneko.HTMLConfiguration;
19
+ import net.sourceforge.htmlunit.cyberneko.filters.DefaultFilter;
20
+ import org.jruby.Ruby;
21
+ import org.jruby.RubyClass;
22
+ import org.jruby.runtime.ThreadContext;
23
+ import org.jruby.runtime.Helpers;
24
+ import org.jruby.runtime.builtin.IRubyObject;
25
+ import org.w3c.dom.Document;
26
+ import org.w3c.dom.NamedNodeMap;
27
+ import org.w3c.dom.Node;
28
+ import org.w3c.dom.NodeList;
29
+
30
+ /**
31
+ * Parser for Html4Document. This class actually parses Html4Document using NekoHtml.
32
+ *
33
+ * @author sergio
34
+ * @author Patrick Mahoney <pat@polycrystal.org>
35
+ * @author Yoko Harada <yokolet@gmail.com>
36
+ */
37
+ public class HtmlDomParserContext extends XmlDomParserContext
38
+ {
39
+ private static final long serialVersionUID = 1L;
40
+
41
+ public
42
+ HtmlDomParserContext(Ruby runtime, IRubyObject options)
43
+ {
44
+ this(runtime, runtime.getNil(), options);
45
+ }
46
+
47
+ public
48
+ HtmlDomParserContext(Ruby runtime, IRubyObject encoding, IRubyObject options)
49
+ {
50
+ super(runtime, encoding, options);
51
+ java_encoding = NokogiriHelpers.getValidEncoding(encoding);
52
+ }
53
+
54
+ @Override
55
+ protected void
56
+ initParser(Ruby runtime)
57
+ {
58
+ XMLParserConfiguration config = new HTMLConfiguration();
59
+ //XMLDocumentFilter removeNSAttrsFilter = new RemoveNSAttrsFilter();
60
+ XMLDocumentFilter elementValidityCheckFilter = new ElementValidityCheckFilter(errorHandler);
61
+ //XMLDocumentFilter[] filters = { removeNSAttrsFilter, elementValidityCheckFilter};
62
+ XMLDocumentFilter[] filters = { elementValidityCheckFilter};
63
+
64
+ config.setErrorHandler(this.errorHandler);
65
+
66
+ parser = new NokogiriDomParser(config);
67
+
68
+ // see http://nekohtml.sourceforge.net/settings.html for details
69
+ setProperty("http://cyberneko.org/html/properties/default-encoding", java_encoding);
70
+ setProperty("http://cyberneko.org/html/properties/names/elems", "lower");
71
+ setProperty("http://cyberneko.org/html/properties/names/attrs", "lower");
72
+ setProperty("http://cyberneko.org/html/properties/filters", filters);
73
+ setFeature("http://cyberneko.org/html/features/report-errors", true);
74
+ setFeature("http://xml.org/sax/features/namespaces", false);
75
+ }
76
+
77
+ @Override
78
+ public void
79
+ setEncoding(String encoding)
80
+ {
81
+ super.setEncoding(encoding);
82
+ }
83
+
84
+ /**
85
+ * Enable NekoHTML feature for balancing tags in a document fragment.
86
+ *
87
+ * This method is used in XmlNode#in_context method.
88
+ */
89
+ public void
90
+ enableDocumentFragment()
91
+ {
92
+ setFeature("http://cyberneko.org/html/features/balance-tags/document-fragment", true);
93
+ }
94
+
95
+ @Override
96
+ public XmlDocument
97
+ parse(ThreadContext context, RubyClass klass, IRubyObject url)
98
+ {
99
+ XmlDocument xmlDoc = super.parse(context, klass, url);
100
+
101
+ // let's be consistent in how we handle RECOVER and NORECOVER (a.k.a. STRICT)
102
+ // https://github.com/sparklemotion/nokogiri/issues/2130
103
+ if (!options.recover && errorHandler.getErrors().size() > 0) {
104
+ XmlSyntaxError xmlSyntaxError = XmlSyntaxError.createXMLSyntaxError(context.runtime);
105
+ String exceptionMsg = String.format("%s: '%s'",
106
+ "Parser without recover option encountered error or warning",
107
+ errorHandler.getErrors().get(0));
108
+ xmlSyntaxError.setException(new Exception(exceptionMsg));
109
+ throw xmlSyntaxError.toThrowable();
110
+ }
111
+
112
+ return xmlDoc;
113
+ }
114
+
115
+ @Override
116
+ protected XmlDocument
117
+ wrapDocument(ThreadContext context, RubyClass klass, Document document)
118
+ {
119
+ Html4Document htmlDocument = new Html4Document(context.runtime, klass, document);
120
+ htmlDocument.setDocumentNode(context.runtime, document);
121
+ Helpers.invoke(context, htmlDocument, "initialize");
122
+
123
+ if (ruby_encoding.isNil()) {
124
+ // ruby_encoding might have detected by Html4Document::EncodingReader
125
+ if (detected_encoding != null && !detected_encoding.isNil()) {
126
+ ruby_encoding = detected_encoding;
127
+ } else {
128
+ // no encoding given & no encoding detected, then try to get it
129
+ String charset = tryGetCharsetFromHtml5MetaTag(document);
130
+ ruby_encoding = stringOrNil(context.runtime, charset);
131
+ }
132
+ }
133
+ htmlDocument.setEncoding(ruby_encoding);
134
+ htmlDocument.setParsedEncoding(java_encoding);
135
+ return htmlDocument;
136
+ }
137
+
138
+ // NekoHtml doesn't understand HTML5 meta tag format. This fails to detect charset
139
+ // from an HTML5 style meta tag. Luckily, the meta tag and charset exists in DOM tree
140
+ // so, this method attempts to find the charset.
141
+ private static String
142
+ tryGetCharsetFromHtml5MetaTag(Document document)
143
+ {
144
+ if (!"html".equalsIgnoreCase(document.getDocumentElement().getNodeName())) { return null; }
145
+ NodeList list = document.getDocumentElement().getChildNodes();
146
+ Node item;
147
+ for (int i = 0; i < list.getLength(); i++) {
148
+ if ("head".equalsIgnoreCase((item = list.item(i)).getNodeName())) {
149
+ NodeList headers = item.getChildNodes();
150
+ for (int j = 0; j < headers.getLength(); j++) {
151
+ if ("meta".equalsIgnoreCase((item = headers.item(j)).getNodeName())) {
152
+ NamedNodeMap nodeMap = item.getAttributes();
153
+ for (int k = 0; k < nodeMap.getLength(); k++) {
154
+ if ("charset".equalsIgnoreCase((item = nodeMap.item(k)).getNodeName())) {
155
+ return item.getNodeValue();
156
+ }
157
+ }
158
+ }
159
+ }
160
+ }
161
+ }
162
+ return null;
163
+ }
164
+
165
+ /**
166
+ * Filter to strip out attributes that pertain to XML namespaces.
167
+ */
168
+ public static class RemoveNSAttrsFilter extends DefaultFilter
169
+ {
170
+ @Override
171
+ public void
172
+ startElement(QName element, XMLAttributes attrs,
173
+ Augmentations augs) throws XNIException
174
+ {
175
+ int i;
176
+ for (i = 0; i < attrs.getLength(); ++i) {
177
+ if (isNamespace(attrs.getQName(i))) {
178
+ attrs.removeAttributeAt(i);
179
+ --i;
180
+ }
181
+ }
182
+
183
+ element.uri = null;
184
+ super.startElement(element, attrs, augs);
185
+ }
186
+ }
187
+
188
+ public static class ElementValidityCheckFilter extends DefaultFilter
189
+ {
190
+ private NokogiriErrorHandler errorHandler;
191
+
192
+ private
193
+ ElementValidityCheckFilter(NokogiriErrorHandler errorHandler)
194
+ {
195
+ this.errorHandler = errorHandler;
196
+ }
197
+
198
+ // element names from xhtml1-strict.dtd
199
+ private static String[][] element_names = {
200
+ {"a", "abbr", "acronym", "address", "area"},
201
+ {"b", "base", "basefont", "bdo", "big", "blockquote", "body", "br", "button"},
202
+ {"caption", "cite", "code", "col", "colgroup"},
203
+ {"dd", "del", "dfn", "div", "dl", "dt"},
204
+ {"em"},
205
+ {"fieldset", "font", "form", "frame", "frameset"},
206
+ {}, // g
207
+ {"h1", "h2", "h3", "h4", "h5", "h6", "head", "hr", "html"},
208
+ {"i", "iframe", "img", "input", "ins"},
209
+ {}, // j
210
+ {"kbd"},
211
+ {"label", "legend", "li", "link"},
212
+ {"map", "meta"},
213
+ {"noframes", "noscript"},
214
+ {"object", "ol", "optgroup", "option"},
215
+ {"p", "param", "pre"},
216
+ {"q"},
217
+ {}, // r
218
+ {"s", "samp", "script", "select", "small", "span", "strike", "strong", "style", "sub", "sup"},
219
+ {"table", "tbody", "td", "textarea", "tfoot", "th", "thead", "title", "tr", "tt"},
220
+ {"u", "ul"},
221
+ {"var"},
222
+ {}, // w
223
+ {}, // x
224
+ {}, // y
225
+ {} // z
226
+ };
227
+
228
+ private static boolean
229
+ isValid(final String name)
230
+ {
231
+ int index = name.charAt(0) - 97;
232
+ if (index >= element_names.length) { return false; }
233
+ String[] elementNames = element_names[index];
234
+ for (int i = 0; i < elementNames.length; i++) {
235
+ if (name.equals(elementNames[i])) {
236
+ return true;
237
+ }
238
+ }
239
+ return false;
240
+ }
241
+
242
+ @Override
243
+ public void
244
+ startElement(QName name, XMLAttributes attrs, Augmentations augs) throws XNIException
245
+ {
246
+ if (!isValid(name.rawname)) {
247
+ errorHandler.addError(new Exception("Tag " + name.rawname + " invalid"));
248
+ }
249
+ super.startElement(name, attrs, augs);
250
+ }
251
+ }
252
+ }
@@ -0,0 +1,27 @@
1
+ package nokogiri.internals;
2
+
3
+ import org.xml.sax.ErrorHandler;
4
+ import org.xml.sax.SAXException;
5
+ import org.xml.sax.SAXParseException;
6
+
7
+ public class IgnoreSchemaErrorsErrorHandler implements ErrorHandler
8
+ {
9
+
10
+ @Override
11
+ public void
12
+ warning(SAXParseException exception) throws SAXException
13
+ {
14
+ }
15
+
16
+ @Override
17
+ public void
18
+ error(SAXParseException exception) throws SAXException
19
+ {
20
+ }
21
+
22
+ @Override
23
+ public void
24
+ fatalError(SAXParseException exception) throws SAXException
25
+ {
26
+ }
27
+ }