nokogiri 1.11.0.rc2-java → 1.11.3-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +171 -94
  6. data/ext/java/nokogiri/EncodingHandler.java +76 -89
  7. data/ext/java/nokogiri/HtmlDocument.java +135 -144
  8. data/ext/java/nokogiri/HtmlElementDescription.java +102 -117
  9. data/ext/java/nokogiri/HtmlEntityLookup.java +33 -60
  10. data/ext/java/nokogiri/HtmlSaxParserContext.java +218 -222
  11. data/ext/java/nokogiri/HtmlSaxPushParser.java +162 -169
  12. data/ext/java/nokogiri/NokogiriService.java +595 -556
  13. data/ext/java/nokogiri/XmlAttr.java +118 -126
  14. data/ext/java/nokogiri/XmlAttributeDecl.java +95 -106
  15. data/ext/java/nokogiri/XmlCdata.java +35 -58
  16. data/ext/java/nokogiri/XmlComment.java +46 -67
  17. data/ext/java/nokogiri/XmlDocument.java +645 -572
  18. data/ext/java/nokogiri/XmlDocumentFragment.java +125 -137
  19. data/ext/java/nokogiri/XmlDtd.java +448 -414
  20. data/ext/java/nokogiri/XmlElement.java +23 -48
  21. data/ext/java/nokogiri/XmlElementContent.java +343 -316
  22. data/ext/java/nokogiri/XmlElementDecl.java +124 -125
  23. data/ext/java/nokogiri/XmlEntityDecl.java +119 -127
  24. data/ext/java/nokogiri/XmlEntityReference.java +49 -72
  25. data/ext/java/nokogiri/XmlNamespace.java +175 -175
  26. data/ext/java/nokogiri/XmlNode.java +1843 -1622
  27. data/ext/java/nokogiri/XmlNodeSet.java +361 -331
  28. data/ext/java/nokogiri/XmlProcessingInstruction.java +47 -69
  29. data/ext/java/nokogiri/XmlReader.java +513 -450
  30. data/ext/java/nokogiri/XmlRelaxng.java +89 -101
  31. data/ext/java/nokogiri/XmlSaxParserContext.java +328 -310
  32. data/ext/java/nokogiri/XmlSaxPushParser.java +227 -220
  33. data/ext/java/nokogiri/XmlSchema.java +335 -242
  34. data/ext/java/nokogiri/XmlSyntaxError.java +113 -119
  35. data/ext/java/nokogiri/XmlText.java +55 -76
  36. data/ext/java/nokogiri/XmlXpathContext.java +242 -210
  37. data/ext/java/nokogiri/XsltStylesheet.java +280 -269
  38. data/ext/java/nokogiri/internals/ClosedStreamException.java +5 -2
  39. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +201 -190
  40. data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +17 -10
  41. data/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +43 -16
  42. data/ext/java/nokogiri/internals/NokogiriDomParser.java +63 -80
  43. data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +107 -88
  44. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +27 -52
  45. data/ext/java/nokogiri/internals/NokogiriHandler.java +316 -286
  46. data/ext/java/nokogiri/internals/NokogiriHelpers.java +736 -652
  47. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +184 -173
  48. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +79 -89
  49. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +64 -79
  50. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +84 -99
  51. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +48 -65
  52. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +119 -78
  53. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +34 -54
  54. data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +23 -46
  55. data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +55 -72
  56. data/ext/java/nokogiri/internals/ParserContext.java +206 -211
  57. data/ext/java/nokogiri/internals/ReaderNode.java +478 -403
  58. data/ext/java/nokogiri/internals/SaveContextVisitor.java +822 -739
  59. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +31 -54
  60. data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +129 -123
  61. data/ext/java/nokogiri/internals/XmlDeclHandler.java +3 -34
  62. data/ext/java/nokogiri/internals/XmlDomParserContext.java +206 -207
  63. data/ext/java/nokogiri/internals/XmlSaxParser.java +22 -47
  64. data/ext/java/nokogiri/internals/c14n/AttrCompare.java +71 -68
  65. data/ext/java/nokogiri/internals/c14n/C14nHelper.java +137 -118
  66. data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +27 -21
  67. data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +74 -61
  68. data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +230 -205
  69. data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +572 -547
  70. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +17 -10
  71. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +17 -10
  72. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +323 -302
  73. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +232 -219
  74. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +22 -15
  75. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +23 -16
  76. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +23 -16
  77. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +22 -15
  78. data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +575 -545
  79. data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +141 -120
  80. data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +39 -38
  81. data/ext/java/nokogiri/internals/c14n/Constants.java +13 -10
  82. data/ext/java/nokogiri/internals/c14n/ElementProxy.java +279 -247
  83. data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +66 -53
  84. data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +44 -37
  85. data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +135 -120
  86. data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +59 -48
  87. data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +384 -334
  88. data/ext/java/nokogiri/internals/c14n/NodeFilter.java +25 -24
  89. data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +151 -140
  90. data/ext/java/nokogiri/internals/c14n/XMLUtils.java +456 -423
  91. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTM.java +1466 -1500
  92. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java +626 -574
  93. data/ext/nokogiri/depend +37 -358
  94. data/ext/nokogiri/extconf.rb +581 -374
  95. data/ext/nokogiri/html_document.c +78 -82
  96. data/ext/nokogiri/html_element_description.c +84 -71
  97. data/ext/nokogiri/html_entity_lookup.c +21 -16
  98. data/ext/nokogiri/html_sax_parser_context.c +69 -66
  99. data/ext/nokogiri/html_sax_push_parser.c +42 -34
  100. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  101. data/ext/nokogiri/nokogiri.c +192 -93
  102. data/ext/nokogiri/test_global_handlers.c +40 -0
  103. data/ext/nokogiri/xml_attr.c +15 -15
  104. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  105. data/ext/nokogiri/xml_cdata.c +13 -18
  106. data/ext/nokogiri/xml_comment.c +19 -26
  107. data/ext/nokogiri/xml_document.c +250 -187
  108. data/ext/nokogiri/xml_document_fragment.c +13 -15
  109. data/ext/nokogiri/xml_dtd.c +54 -48
  110. data/ext/nokogiri/xml_element_content.c +30 -27
  111. data/ext/nokogiri/xml_element_decl.c +22 -22
  112. data/ext/nokogiri/xml_encoding_handler.c +17 -11
  113. data/ext/nokogiri/xml_entity_decl.c +32 -30
  114. data/ext/nokogiri/xml_entity_reference.c +16 -18
  115. data/ext/nokogiri/xml_namespace.c +56 -49
  116. data/ext/nokogiri/xml_node.c +371 -320
  117. data/ext/nokogiri/xml_node_set.c +168 -156
  118. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  119. data/ext/nokogiri/xml_reader.c +191 -157
  120. data/ext/nokogiri/xml_relax_ng.c +52 -28
  121. data/ext/nokogiri/xml_sax_parser.c +118 -118
  122. data/ext/nokogiri/xml_sax_parser_context.c +103 -86
  123. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  124. data/ext/nokogiri/xml_schema.c +95 -47
  125. data/ext/nokogiri/xml_syntax_error.c +42 -21
  126. data/ext/nokogiri/xml_text.c +13 -17
  127. data/ext/nokogiri/xml_xpath_context.c +206 -123
  128. data/ext/nokogiri/xslt_stylesheet.c +158 -161
  129. data/lib/nokogiri.rb +4 -8
  130. data/lib/nokogiri/css/parser.rb +62 -62
  131. data/lib/nokogiri/css/parser.y +2 -2
  132. data/lib/nokogiri/css/xpath_visitor.rb +70 -42
  133. data/lib/nokogiri/extension.rb +26 -0
  134. data/lib/nokogiri/html/document.rb +12 -26
  135. data/lib/nokogiri/html/document_fragment.rb +15 -15
  136. data/lib/nokogiri/nokogiri.jar +0 -0
  137. data/lib/nokogiri/version.rb +2 -148
  138. data/lib/nokogiri/version/constant.rb +5 -0
  139. data/lib/nokogiri/version/info.rb +205 -0
  140. data/lib/nokogiri/xml/builder.rb +2 -2
  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 +87 -164
  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 -61
  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
  }