nokogiri 1.11.0.rc3-java → 1.11.4-java

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/LICENSE-DEPENDENCIES.md +1015 -947
  4. data/LICENSE.md +1 -1
  5. data/README.md +168 -91
  6. data/dependencies.yml +12 -12
  7. data/ext/java/nokogiri/EncodingHandler.java +76 -89
  8. data/ext/java/nokogiri/HtmlDocument.java +135 -144
  9. data/ext/java/nokogiri/HtmlElementDescription.java +102 -117
  10. data/ext/java/nokogiri/HtmlEntityLookup.java +33 -60
  11. data/ext/java/nokogiri/HtmlSaxParserContext.java +218 -222
  12. data/ext/java/nokogiri/HtmlSaxPushParser.java +162 -169
  13. data/ext/java/nokogiri/NokogiriService.java +595 -556
  14. data/ext/java/nokogiri/XmlAttr.java +118 -126
  15. data/ext/java/nokogiri/XmlAttributeDecl.java +95 -106
  16. data/ext/java/nokogiri/XmlCdata.java +35 -58
  17. data/ext/java/nokogiri/XmlComment.java +46 -67
  18. data/ext/java/nokogiri/XmlDocument.java +645 -572
  19. data/ext/java/nokogiri/XmlDocumentFragment.java +125 -137
  20. data/ext/java/nokogiri/XmlDtd.java +448 -414
  21. data/ext/java/nokogiri/XmlElement.java +23 -48
  22. data/ext/java/nokogiri/XmlElementContent.java +343 -316
  23. data/ext/java/nokogiri/XmlElementDecl.java +124 -125
  24. data/ext/java/nokogiri/XmlEntityDecl.java +119 -127
  25. data/ext/java/nokogiri/XmlEntityReference.java +49 -72
  26. data/ext/java/nokogiri/XmlNamespace.java +175 -175
  27. data/ext/java/nokogiri/XmlNode.java +1843 -1622
  28. data/ext/java/nokogiri/XmlNodeSet.java +361 -331
  29. data/ext/java/nokogiri/XmlProcessingInstruction.java +47 -69
  30. data/ext/java/nokogiri/XmlReader.java +513 -450
  31. data/ext/java/nokogiri/XmlRelaxng.java +89 -101
  32. data/ext/java/nokogiri/XmlSaxParserContext.java +328 -310
  33. data/ext/java/nokogiri/XmlSaxPushParser.java +227 -220
  34. data/ext/java/nokogiri/XmlSchema.java +335 -242
  35. data/ext/java/nokogiri/XmlSyntaxError.java +113 -119
  36. data/ext/java/nokogiri/XmlText.java +55 -76
  37. data/ext/java/nokogiri/XmlXpathContext.java +242 -210
  38. data/ext/java/nokogiri/XsltStylesheet.java +280 -269
  39. data/ext/java/nokogiri/internals/ClosedStreamException.java +5 -2
  40. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +201 -190
  41. data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +17 -10
  42. data/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +43 -16
  43. data/ext/java/nokogiri/internals/NokogiriDomParser.java +63 -80
  44. data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +107 -88
  45. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +27 -52
  46. data/ext/java/nokogiri/internals/NokogiriHandler.java +316 -286
  47. data/ext/java/nokogiri/internals/NokogiriHelpers.java +736 -652
  48. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +184 -173
  49. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +79 -89
  50. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +64 -79
  51. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +84 -99
  52. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +48 -65
  53. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +119 -78
  54. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +34 -54
  55. data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +23 -46
  56. data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +55 -72
  57. data/ext/java/nokogiri/internals/ParserContext.java +206 -211
  58. data/ext/java/nokogiri/internals/ReaderNode.java +478 -403
  59. data/ext/java/nokogiri/internals/SaveContextVisitor.java +822 -739
  60. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +31 -54
  61. data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +129 -123
  62. data/ext/java/nokogiri/internals/XmlDeclHandler.java +3 -34
  63. data/ext/java/nokogiri/internals/XmlDomParserContext.java +206 -207
  64. data/ext/java/nokogiri/internals/XmlSaxParser.java +22 -47
  65. data/ext/java/nokogiri/internals/c14n/AttrCompare.java +71 -68
  66. data/ext/java/nokogiri/internals/c14n/C14nHelper.java +137 -118
  67. data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +27 -21
  68. data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +74 -61
  69. data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +230 -205
  70. data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +572 -547
  71. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +17 -10
  72. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +17 -10
  73. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +323 -302
  74. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +232 -219
  75. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +22 -15
  76. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +23 -16
  77. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +23 -16
  78. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +22 -15
  79. data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +575 -545
  80. data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +141 -120
  81. data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +39 -38
  82. data/ext/java/nokogiri/internals/c14n/Constants.java +13 -10
  83. data/ext/java/nokogiri/internals/c14n/ElementProxy.java +279 -247
  84. data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +66 -53
  85. data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +44 -37
  86. data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +135 -120
  87. data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +59 -48
  88. data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +384 -334
  89. data/ext/java/nokogiri/internals/c14n/NodeFilter.java +25 -24
  90. data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +151 -140
  91. data/ext/java/nokogiri/internals/c14n/XMLUtils.java +456 -423
  92. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTM.java +1466 -1500
  93. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java +626 -574
  94. data/ext/nokogiri/depend +37 -358
  95. data/ext/nokogiri/extconf.rb +581 -374
  96. data/ext/nokogiri/html_document.c +78 -82
  97. data/ext/nokogiri/html_element_description.c +84 -71
  98. data/ext/nokogiri/html_entity_lookup.c +21 -16
  99. data/ext/nokogiri/html_sax_parser_context.c +69 -66
  100. data/ext/nokogiri/html_sax_push_parser.c +42 -34
  101. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  102. data/ext/nokogiri/nokogiri.c +192 -93
  103. data/ext/nokogiri/test_global_handlers.c +40 -0
  104. data/ext/nokogiri/xml_attr.c +15 -15
  105. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  106. data/ext/nokogiri/xml_cdata.c +13 -18
  107. data/ext/nokogiri/xml_comment.c +19 -26
  108. data/ext/nokogiri/xml_document.c +246 -188
  109. data/ext/nokogiri/xml_document_fragment.c +13 -15
  110. data/ext/nokogiri/xml_dtd.c +54 -48
  111. data/ext/nokogiri/xml_element_content.c +30 -27
  112. data/ext/nokogiri/xml_element_decl.c +22 -22
  113. data/ext/nokogiri/xml_encoding_handler.c +17 -11
  114. data/ext/nokogiri/xml_entity_decl.c +32 -30
  115. data/ext/nokogiri/xml_entity_reference.c +16 -18
  116. data/ext/nokogiri/xml_namespace.c +56 -49
  117. data/ext/nokogiri/xml_node.c +371 -320
  118. data/ext/nokogiri/xml_node_set.c +168 -156
  119. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  120. data/ext/nokogiri/xml_reader.c +191 -157
  121. data/ext/nokogiri/xml_relax_ng.c +52 -28
  122. data/ext/nokogiri/xml_sax_parser.c +118 -118
  123. data/ext/nokogiri/xml_sax_parser_context.c +103 -86
  124. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  125. data/ext/nokogiri/xml_schema.c +95 -47
  126. data/ext/nokogiri/xml_syntax_error.c +42 -21
  127. data/ext/nokogiri/xml_text.c +13 -17
  128. data/ext/nokogiri/xml_xpath_context.c +206 -123
  129. data/ext/nokogiri/xslt_stylesheet.c +158 -161
  130. data/lib/nokogiri.rb +3 -7
  131. data/lib/nokogiri/css/parser.rb +3 -3
  132. data/lib/nokogiri/css/parser.y +2 -2
  133. data/lib/nokogiri/css/xpath_visitor.rb +70 -42
  134. data/lib/nokogiri/extension.rb +26 -0
  135. data/lib/nokogiri/html/document.rb +12 -26
  136. data/lib/nokogiri/html/document_fragment.rb +15 -15
  137. data/lib/nokogiri/nokogiri.jar +0 -0
  138. data/lib/nokogiri/version.rb +2 -149
  139. data/lib/nokogiri/version/constant.rb +5 -0
  140. data/lib/nokogiri/version/info.rb +205 -0
  141. data/lib/nokogiri/xml/document.rb +91 -35
  142. data/lib/nokogiri/xml/document_fragment.rb +4 -6
  143. data/lib/nokogiri/xml/node.rb +89 -69
  144. data/lib/nokogiri/xml/parse_options.rb +6 -0
  145. data/lib/nokogiri/xml/reader.rb +2 -9
  146. data/lib/nokogiri/xml/relax_ng.rb +6 -2
  147. data/lib/nokogiri/xml/schema.rb +12 -4
  148. data/lib/nokogiri/xml/searchable.rb +3 -1
  149. data/lib/nokogiri/xml/xpath.rb +1 -3
  150. data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
  151. metadata +86 -177
  152. data/ext/nokogiri/html_document.h +0 -10
  153. data/ext/nokogiri/html_element_description.h +0 -10
  154. data/ext/nokogiri/html_entity_lookup.h +0 -8
  155. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  156. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  157. data/ext/nokogiri/nokogiri.h +0 -134
  158. data/ext/nokogiri/xml_attr.h +0 -9
  159. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  160. data/ext/nokogiri/xml_cdata.h +0 -9
  161. data/ext/nokogiri/xml_comment.h +0 -9
  162. data/ext/nokogiri/xml_document.h +0 -23
  163. data/ext/nokogiri/xml_document_fragment.h +0 -10
  164. data/ext/nokogiri/xml_dtd.h +0 -10
  165. data/ext/nokogiri/xml_element_content.h +0 -10
  166. data/ext/nokogiri/xml_element_decl.h +0 -9
  167. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  168. data/ext/nokogiri/xml_entity_decl.h +0 -10
  169. data/ext/nokogiri/xml_entity_reference.h +0 -9
  170. data/ext/nokogiri/xml_io.c +0 -63
  171. data/ext/nokogiri/xml_io.h +0 -11
  172. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  173. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  174. data/ext/nokogiri/xml_namespace.h +0 -14
  175. data/ext/nokogiri/xml_node.h +0 -13
  176. data/ext/nokogiri/xml_node_set.h +0 -12
  177. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  178. data/ext/nokogiri/xml_reader.h +0 -10
  179. data/ext/nokogiri/xml_relax_ng.h +0 -9
  180. data/ext/nokogiri/xml_sax_parser.h +0 -39
  181. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  182. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  183. data/ext/nokogiri/xml_schema.h +0 -9
  184. data/ext/nokogiri/xml_syntax_error.h +0 -13
  185. data/ext/nokogiri/xml_text.h +0 -9
  186. data/ext/nokogiri/xml_xpath_context.h +0 -10
  187. data/ext/nokogiri/xslt_stylesheet.h +0 -14
@@ -1,35 +1,3 @@
1
- /**
2
- * (The MIT License)
3
- *
4
- * Copyright (c) 2008 - 2011:
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
1
  package nokogiri.internals;
34
2
 
35
3
  import java.util.ArrayList;
@@ -40,30 +8,37 @@ import org.xml.sax.ErrorHandler;
40
8
 
41
9
  /**
42
10
  * Super class of error handlers.
43
- *
11
+ *
44
12
  * XMLErrorHandler is used by nokogiri.internals.HtmlDomParserContext since NekoHtml
45
13
  * uses this type of the error handler.
46
- *
14
+ *
47
15
  * @author sergio
48
16
  * @author Yoko Harada <yokolet@gmail.com>
49
17
  */
50
- public abstract class NokogiriErrorHandler implements ErrorHandler, XMLErrorHandler {
51
- protected final List<Exception> errors;
52
- protected boolean noerror;
53
- protected boolean nowarning;
54
-
55
- public NokogiriErrorHandler(boolean noerror, boolean nowarning) {
56
- this.errors = new ArrayList<Exception>(4);
57
- this.noerror = noerror;
58
- this.nowarning = nowarning;
59
- }
60
-
61
- List<Exception> getErrors() { return errors; }
62
-
63
- public void addError(Exception ex) { errors.add(ex); }
64
-
65
- protected boolean usesNekoHtml(String domain) {
66
- return "http://cyberneko.org/html".equals(domain);
67
- }
18
+ public abstract class NokogiriErrorHandler implements ErrorHandler, XMLErrorHandler
19
+ {
20
+ protected final List<Exception> errors;
21
+ protected boolean noerror;
22
+ protected boolean nowarning;
23
+
24
+ public
25
+ NokogiriErrorHandler(boolean noerror, boolean nowarning)
26
+ {
27
+ this.errors = new ArrayList<Exception>(4);
28
+ this.noerror = noerror;
29
+ this.nowarning = nowarning;
30
+ }
31
+
32
+ List<Exception>
33
+ getErrors() { return errors; }
34
+
35
+ public void
36
+ addError(Exception ex) { errors.add(ex); }
37
+
38
+ protected boolean
39
+ usesNekoHtml(String domain)
40
+ {
41
+ return "http://cyberneko.org/html".equals(domain);
42
+ }
68
43
 
69
44
  }
@@ -1,35 +1,3 @@
1
- /**
2
- * (The MIT License)
3
- *
4
- * Copyright (c) 2008 - 2011:
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
1
  package nokogiri.internals;
34
2
 
35
3
  import static nokogiri.internals.NokogiriHelpers.getLocalPart;
@@ -63,265 +31,327 @@ import nokogiri.XmlSyntaxError;
63
31
  * @author sergio
64
32
  * @author Yoko Harada <yokolet@gmail.com>
65
33
  */
66
- public class NokogiriHandler extends DefaultHandler2 implements XmlDeclHandler {
67
-
68
- StringBuilder charactersBuilder;
69
- private final Ruby runtime;
70
- private final RubyClass attrClass;
71
- private final IRubyObject object;
72
-
73
- /**
74
- * Stores parse errors with the most-recent error last.
75
- *
76
- * TODO: should these be stored in the document 'errors' array?
77
- * Currently only string messages are stored there.
78
- */
79
- private final LinkedList<RaiseException> errors = new LinkedList<RaiseException>();
80
-
81
- private Locator locator;
82
- private boolean needEmptyAttrCheck;
83
-
84
- public NokogiriHandler(Ruby runtime, IRubyObject object) {
85
- assert object != null;
86
- this.runtime = runtime;
87
- this.attrClass = (RubyClass) runtime.getClassFromPath("Nokogiri::XML::SAX::Parser::Attribute");
88
- this.object = object;
89
- charactersBuilder = new StringBuilder();
90
- String objectName = object.getMetaClass().getName();
91
- if ("Nokogiri::HTML::SAX::Parser".equals(objectName)) needEmptyAttrCheck = true;
92
- }
93
-
94
- @Override
95
- public void skippedEntity(String skippedEntity) {
96
- call("error", runtime.newString("Entity '" + skippedEntity + "' not defined\n"));
97
- }
98
-
99
- @Override
100
- public void setDocumentLocator(Locator locator) {
101
- this.locator = locator;
102
- }
103
-
104
- @Override
105
- public void startDocument() {
106
- call("start_document");
107
- }
108
-
109
- @Override
110
- public void xmlDecl(String version, String encoding, String standalone) {
111
- call("xmldecl", stringOrNil(runtime, version), stringOrNil(runtime, encoding), stringOrNil(runtime, standalone));
112
- }
113
-
114
- @Override
115
- public void endDocument() {
116
- populateCharacters();
117
- call("end_document");
118
- }
119
-
120
- @Override
121
- public void processingInstruction(String target, String data) {
122
- call("processing_instruction", runtime.newString(target), runtime.newString(data));
123
- }
124
-
125
- /*
126
- * This calls "start_element_namespace".
127
- *
128
- * Attributes that define namespaces are passed in a separate
129
- * array of <code>[:prefix, :uri]</code> arrays and are not
130
- * passed with the other attributes.
131
- */
132
- @Override
133
- public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
134
- final Ruby runtime = this.runtime;
135
- final ThreadContext context = runtime.getCurrentContext();
136
-
137
- // for attributes other than namespace attrs
138
- RubyArray rubyAttr = RubyArray.newArray(runtime);
139
- // for namespace defining attributes
140
- RubyArray rubyNSAttr = RubyArray.newArray(runtime);
141
-
142
- boolean fromFragmentHandler = false; // isFromFragmentHandler();
143
-
144
- for (int i = 0; i < attrs.getLength(); i++) {
145
- String u = attrs.getURI(i);
146
- String qn = attrs.getQName(i);
147
- String ln = attrs.getLocalName(i);
148
- String val = attrs.getValue(i);
149
- String pre;
150
-
151
- pre = getPrefix(qn);
152
- if (ln == null || ln.isEmpty()) ln = getLocalPart(qn);
153
-
154
- if (isNamespace(qn) && !fromFragmentHandler) {
155
- // I haven't figured the reason out yet, but, in somewhere,
156
- // namespace is converted to array in array and cause
157
- // TypeError at line 45 in fragment_handler.rb
158
- if (ln.equals("xmlns")) ln = null;
159
- rubyNSAttr.append( runtime.newArray( stringOrNil(runtime, ln), runtime.newString(val) ) );
160
- } else {
161
- IRubyObject[] args = null;
162
- if (needEmptyAttrCheck) {
163
- if (isEmptyAttr(ln)) {
164
- args = new IRubyObject[] {
165
- stringOrNil(runtime, ln),
166
- stringOrNil(runtime, pre),
167
- stringOrNil(runtime, u)
168
- };
169
- }
170
- }
171
- if (args == null) {
172
- args = new IRubyObject[] {
173
- stringOrNil(runtime, ln),
174
- stringOrNil(runtime, pre),
175
- stringOrNil(runtime, u),
176
- stringOrNil(runtime, val)
177
- };
178
- }
179
-
180
- rubyAttr.append( Helpers.invoke(context, attrClass, "new", args) );
181
- }
34
+ public class NokogiriHandler extends DefaultHandler2 implements XmlDeclHandler
35
+ {
36
+
37
+ StringBuilder charactersBuilder;
38
+ private final Ruby runtime;
39
+ private final RubyClass attrClass;
40
+ private final IRubyObject object;
41
+
42
+ /**
43
+ * Stores parse errors with the most-recent error last.
44
+ *
45
+ * TODO: should these be stored in the document 'errors' array?
46
+ * Currently only string messages are stored there.
47
+ */
48
+ private final LinkedList<RaiseException> errors = new LinkedList<RaiseException>();
49
+
50
+ private Locator locator;
51
+ private boolean needEmptyAttrCheck;
52
+
53
+ public
54
+ NokogiriHandler(Ruby runtime, IRubyObject object)
55
+ {
56
+ assert object != null;
57
+ this.runtime = runtime;
58
+ this.attrClass = (RubyClass) runtime.getClassFromPath("Nokogiri::XML::SAX::Parser::Attribute");
59
+ this.object = object;
60
+ charactersBuilder = new StringBuilder();
61
+ String objectName = object.getMetaClass().getName();
62
+ if ("Nokogiri::HTML::SAX::Parser".equals(objectName)) { needEmptyAttrCheck = true; }
63
+ }
64
+
65
+ @Override
66
+ public void
67
+ skippedEntity(String skippedEntity)
68
+ {
69
+ call("error", runtime.newString("Entity '" + skippedEntity + "' not defined\n"));
70
+ }
71
+
72
+ @Override
73
+ public void
74
+ setDocumentLocator(Locator locator)
75
+ {
76
+ this.locator = locator;
77
+ }
78
+
79
+ @Override
80
+ public void
81
+ startDocument()
82
+ {
83
+ call("start_document");
84
+ }
85
+
86
+ @Override
87
+ public void
88
+ xmlDecl(String version, String encoding, String standalone)
89
+ {
90
+ call("xmldecl", stringOrNil(runtime, version), stringOrNil(runtime, encoding), stringOrNil(runtime, standalone));
91
+ }
92
+
93
+ @Override
94
+ public void
95
+ endDocument()
96
+ {
97
+ populateCharacters();
98
+ call("end_document");
99
+ }
100
+
101
+ @Override
102
+ public void
103
+ processingInstruction(String target, String data)
104
+ {
105
+ call("processing_instruction", runtime.newString(target), runtime.newString(data));
106
+ }
107
+
108
+ /*
109
+ * This calls "start_element_namespace".
110
+ *
111
+ * Attributes that define namespaces are passed in a separate
112
+ * array of <code>[:prefix, :uri]</code> arrays and are not
113
+ * passed with the other attributes.
114
+ */
115
+ @Override
116
+ public void
117
+ startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
118
+ {
119
+ final Ruby runtime = this.runtime;
120
+ final ThreadContext context = runtime.getCurrentContext();
121
+
122
+ // for attributes other than namespace attrs
123
+ RubyArray rubyAttr = RubyArray.newArray(runtime);
124
+ // for namespace defining attributes
125
+ RubyArray rubyNSAttr = RubyArray.newArray(runtime);
126
+
127
+ boolean fromFragmentHandler = false; // isFromFragmentHandler();
128
+
129
+ for (int i = 0; i < attrs.getLength(); i++) {
130
+ String u = attrs.getURI(i);
131
+ String qn = attrs.getQName(i);
132
+ String ln = attrs.getLocalName(i);
133
+ String val = attrs.getValue(i);
134
+ String pre;
135
+
136
+ pre = getPrefix(qn);
137
+ if (ln == null || ln.isEmpty()) { ln = getLocalPart(qn); }
138
+
139
+ if (isNamespace(qn) && !fromFragmentHandler) {
140
+ // I haven't figured the reason out yet, but, in somewhere,
141
+ // namespace is converted to array in array and cause
142
+ // TypeError at line 45 in fragment_handler.rb
143
+ if (ln.equals("xmlns")) { ln = null; }
144
+ rubyNSAttr.append(runtime.newArray(stringOrNil(runtime, ln), runtime.newString(val)));
145
+ } else {
146
+ IRubyObject[] args = null;
147
+ if (needEmptyAttrCheck) {
148
+ if (isEmptyAttr(ln)) {
149
+ args = new IRubyObject[] {
150
+ stringOrNil(runtime, ln),
151
+ stringOrNil(runtime, pre),
152
+ stringOrNil(runtime, u)
153
+ };
154
+ }
182
155
  }
183
-
184
- if (localName == null || localName.isEmpty()) localName = getLocalPart(qName);
185
- populateCharacters();
186
- call("start_element_namespace",
187
- stringOrNil(runtime, localName),
188
- rubyAttr,
189
- stringOrNil(runtime, getPrefix(qName)),
190
- stringOrNil(runtime, uri),
191
- rubyNSAttr);
192
- }
193
-
194
- static final Set<String> EMPTY_ATTRS;
195
- static {
196
- final String[] emptyAttrs = {
197
- "checked", "compact", "declare", "defer", "disabled", "ismap", "multiple",
198
- "noresize", "nohref", "noshade", "nowrap", "readonly", "selected"
199
- };
200
- EMPTY_ATTRS = new HashSet<String>(Arrays.asList(emptyAttrs));
201
- }
202
-
203
- private static boolean isEmptyAttr(String name) {
204
- return EMPTY_ATTRS.contains(name);
205
- }
206
-
207
- public final Integer getLine() { // -1 if none is available
208
- final int line = locator.getLineNumber();
209
- return line == -1 ? null : line;
210
- }
211
-
212
- public final Integer getColumn() { // -1 if none is available
213
- final int column = locator.getColumnNumber();
214
- return column == -1 ? null : column - 1;
215
- }
216
-
217
- @Override
218
- public void endElement(String uri, String localName, String qName) {
219
- populateCharacters();
220
- call("end_element_namespace",
221
- stringOrNil(runtime, localName),
222
- stringOrNil(runtime, getPrefix(qName)),
223
- stringOrNil(runtime, uri));
224
- }
225
-
226
- @Override
227
- public void characters(char[] ch, int start, int length) {
228
- charactersBuilder.append(ch, start, length);
229
- }
230
-
231
- @Override
232
- public void comment(char[] ch, int start, int length) {
233
- populateCharacters();
234
- call("comment", runtime.newString(new String(ch, start, length)));
235
- }
236
-
237
- @Override
238
- public void startCDATA() {
239
- populateCharacters();
240
- }
241
-
242
- @Override
243
- public void endCDATA() {
244
- call("cdata_block", runtime.newString(charactersBuilder.toString()));
245
- charactersBuilder.setLength(0);
246
- }
247
-
248
- void handleError(SAXParseException ex) {
249
- try {
250
- final String msg = ex.getMessage();
251
- call("error", runtime.newString(msg == null ? "" : msg));
252
- addError(new RaiseException(XmlSyntaxError.createError(runtime, ex), true));
253
- } catch( RaiseException e) {
254
- addError(e);
255
- throw e;
156
+ if (args == null) {
157
+ args = new IRubyObject[] {
158
+ stringOrNil(runtime, ln),
159
+ stringOrNil(runtime, pre),
160
+ stringOrNil(runtime, u),
161
+ stringOrNil(runtime, val)
162
+ };
256
163
  }
257
- }
258
-
259
- @Override
260
- public void error(SAXParseException ex) {
261
- handleError(ex);
262
- }
263
-
264
- @Override
265
- public void fatalError(SAXParseException ex) {
266
- handleError(ex);
267
- }
268
-
269
- @Override
270
- public void warning(SAXParseException ex) {
271
- final String msg = ex.getMessage();
272
- call("warning", runtime.newString(msg == null ? "" : msg));
273
- }
274
164
 
275
- protected synchronized void addError(RaiseException e) {
276
- errors.add(e);
165
+ rubyAttr.append(Helpers.invoke(context, attrClass, "new", args));
166
+ }
277
167
  }
278
168
 
279
- public synchronized int getErrorCount() {
280
- return errors.size();
169
+ if (localName == null || localName.isEmpty()) { localName = getLocalPart(qName); }
170
+ populateCharacters();
171
+ call("start_element_namespace",
172
+ stringOrNil(runtime, localName),
173
+ rubyAttr,
174
+ stringOrNil(runtime, getPrefix(qName)),
175
+ stringOrNil(runtime, uri),
176
+ rubyNSAttr);
177
+ }
178
+
179
+ static final Set<String> EMPTY_ATTRS;
180
+ static
181
+ {
182
+ final String[] emptyAttrs = {
183
+ "checked", "compact", "declare", "defer", "disabled", "ismap", "multiple",
184
+ "noresize", "nohref", "noshade", "nowrap", "readonly", "selected"
185
+ };
186
+ EMPTY_ATTRS = new HashSet<String>(Arrays.asList(emptyAttrs));
187
+ }
188
+
189
+ private static boolean
190
+ isEmptyAttr(String name)
191
+ {
192
+ return EMPTY_ATTRS.contains(name);
193
+ }
194
+
195
+ public final Integer
196
+ getLine() // -1 if none is available
197
+ {
198
+ final int line = locator.getLineNumber();
199
+ return line == -1 ? null : line;
200
+ }
201
+
202
+ public final Integer
203
+ getColumn() // -1 if none is available
204
+ {
205
+ final int column = locator.getColumnNumber();
206
+ return column == -1 ? null : column - 1;
207
+ }
208
+
209
+ @Override
210
+ public void
211
+ endElement(String uri, String localName, String qName)
212
+ {
213
+ populateCharacters();
214
+ call("end_element_namespace",
215
+ stringOrNil(runtime, localName),
216
+ stringOrNil(runtime, getPrefix(qName)),
217
+ stringOrNil(runtime, uri));
218
+ }
219
+
220
+ @Override
221
+ public void
222
+ characters(char[] ch, int start, int length)
223
+ {
224
+ charactersBuilder.append(ch, start, length);
225
+ }
226
+
227
+ @Override
228
+ public void
229
+ comment(char[] ch, int start, int length)
230
+ {
231
+ populateCharacters();
232
+ call("comment", runtime.newString(new String(ch, start, length)));
233
+ }
234
+
235
+ @Override
236
+ public void
237
+ startCDATA()
238
+ {
239
+ populateCharacters();
240
+ }
241
+
242
+ @Override
243
+ public void
244
+ endCDATA()
245
+ {
246
+ call("cdata_block", runtime.newString(charactersBuilder.toString()));
247
+ charactersBuilder.setLength(0);
248
+ }
249
+
250
+ void
251
+ handleError(SAXParseException ex)
252
+ {
253
+ try {
254
+ final String msg = ex.getMessage();
255
+ call("error", runtime.newString(msg == null ? "" : msg));
256
+ addError(XmlSyntaxError.createError(runtime, ex).toThrowable());
257
+ } catch (RaiseException e) {
258
+ addError(e);
259
+ throw e;
281
260
  }
282
-
283
- public synchronized RaiseException getLastError() {
284
- return errors.getLast();
285
- }
286
-
287
- private void call(String methodName) {
288
- ThreadContext context = runtime.getCurrentContext();
289
- Helpers.invoke(context, document(context), methodName);
290
- }
291
-
292
- private void call(String methodName, IRubyObject argument) {
293
- ThreadContext context = runtime.getCurrentContext();
294
- Helpers.invoke(context, document(context), methodName, argument);
295
- }
296
-
297
- private void call(String methodName, IRubyObject arg1, IRubyObject arg2) {
298
- ThreadContext context = runtime.getCurrentContext();
299
- Helpers.invoke(context, document(context), methodName, arg1, arg2);
300
- }
301
-
302
- private void call(String methodName, IRubyObject arg1, IRubyObject arg2, IRubyObject arg3) {
303
- ThreadContext context = runtime.getCurrentContext();
304
- Helpers.invoke(context, document(context), methodName, arg1, arg2, arg3);
305
- }
306
-
307
- private void call(String methodName,
308
- IRubyObject arg0,
309
- IRubyObject arg1,
310
- IRubyObject arg2,
311
- IRubyObject arg3,
312
- IRubyObject arg4) {
313
- ThreadContext context = runtime.getCurrentContext();
314
- Helpers.invoke(context, document(context), methodName, arg0, arg1, arg2, arg3, arg4);
315
- }
316
-
317
- private IRubyObject document(ThreadContext context) {
318
- return object.getInstanceVariables().getInstanceVariable("@document");
319
- }
320
-
321
- protected void populateCharacters() {
322
- if (charactersBuilder.length() > 0) {
323
- call("characters", runtime.newString(charactersBuilder.toString()));
324
- charactersBuilder.setLength(0);
325
- }
261
+ }
262
+
263
+ @Override
264
+ public void
265
+ error(SAXParseException ex)
266
+ {
267
+ handleError(ex);
268
+ }
269
+
270
+ @Override
271
+ public void
272
+ fatalError(SAXParseException ex)
273
+ {
274
+ handleError(ex);
275
+ }
276
+
277
+ @Override
278
+ public void
279
+ warning(SAXParseException ex)
280
+ {
281
+ final String msg = ex.getMessage();
282
+ call("warning", runtime.newString(msg == null ? "" : msg));
283
+ }
284
+
285
+ protected synchronized void
286
+ addError(RaiseException e)
287
+ {
288
+ errors.add(e);
289
+ }
290
+
291
+ public synchronized int
292
+ getErrorCount()
293
+ {
294
+ return errors.size();
295
+ }
296
+
297
+ public synchronized RaiseException
298
+ getLastError()
299
+ {
300
+ return errors.getLast();
301
+ }
302
+
303
+ private void
304
+ call(String methodName)
305
+ {
306
+ ThreadContext context = runtime.getCurrentContext();
307
+ Helpers.invoke(context, document(context), methodName);
308
+ }
309
+
310
+ private void
311
+ call(String methodName, IRubyObject argument)
312
+ {
313
+ ThreadContext context = runtime.getCurrentContext();
314
+ Helpers.invoke(context, document(context), methodName, argument);
315
+ }
316
+
317
+ private void
318
+ call(String methodName, IRubyObject arg1, IRubyObject arg2)
319
+ {
320
+ ThreadContext context = runtime.getCurrentContext();
321
+ Helpers.invoke(context, document(context), methodName, arg1, arg2);
322
+ }
323
+
324
+ private void
325
+ call(String methodName, IRubyObject arg1, IRubyObject arg2, IRubyObject arg3)
326
+ {
327
+ ThreadContext context = runtime.getCurrentContext();
328
+ Helpers.invoke(context, document(context), methodName, arg1, arg2, arg3);
329
+ }
330
+
331
+ private void
332
+ call(String methodName,
333
+ IRubyObject arg0,
334
+ IRubyObject arg1,
335
+ IRubyObject arg2,
336
+ IRubyObject arg3,
337
+ IRubyObject arg4)
338
+ {
339
+ ThreadContext context = runtime.getCurrentContext();
340
+ Helpers.invoke(context, document(context), methodName, arg0, arg1, arg2, arg3, arg4);
341
+ }
342
+
343
+ private IRubyObject
344
+ document(ThreadContext context)
345
+ {
346
+ return object.getInstanceVariables().getInstanceVariable("@document");
347
+ }
348
+
349
+ protected void
350
+ populateCharacters()
351
+ {
352
+ if (charactersBuilder.length() > 0) {
353
+ call("characters", runtime.newString(charactersBuilder.toString()));
354
+ charactersBuilder.setLength(0);
326
355
  }
356
+ }
327
357
  }