nokogiri 1.11.1-java → 1.11.6-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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE-DEPENDENCIES.md +12 -12
  3. data/LICENSE.md +1 -1
  4. data/README.md +21 -16
  5. data/dependencies.yml +12 -12
  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 -1620
  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 +85 -104
  31. data/ext/java/nokogiri/XmlSaxParserContext.java +328 -315
  32. data/ext/java/nokogiri/XmlSaxPushParser.java +227 -220
  33. data/ext/java/nokogiri/XmlSchema.java +328 -295
  34. data/ext/java/nokogiri/XmlSyntaxError.java +113 -115
  35. data/ext/java/nokogiri/XmlText.java +55 -76
  36. data/ext/java/nokogiri/XmlXpathContext.java +240 -238
  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 -202
  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 +81 -98
  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 +116 -131
  53. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +34 -56
  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 +34 -474
  94. data/ext/nokogiri/extconf.rb +253 -183
  95. data/ext/nokogiri/html_document.c +10 -15
  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 +66 -65
  99. data/ext/nokogiri/html_sax_push_parser.c +29 -27
  100. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  101. data/ext/nokogiri/nokogiri.c +190 -63
  102. data/ext/nokogiri/test_global_handlers.c +3 -4
  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 +246 -188
  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 +385 -326
  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 +29 -23
  121. data/ext/nokogiri/xml_sax_parser.c +117 -112
  122. data/ext/nokogiri/xml_sax_parser_context.c +100 -85
  123. data/ext/nokogiri/xml_sax_push_parser.c +34 -27
  124. data/ext/nokogiri/xml_schema.c +48 -42
  125. data/ext/nokogiri/xml_syntax_error.c +21 -23
  126. data/ext/nokogiri/xml_text.c +13 -17
  127. data/ext/nokogiri/xml_xpath_context.c +134 -127
  128. data/ext/nokogiri/xslt_stylesheet.c +157 -157
  129. data/lib/nokogiri.rb +1 -22
  130. data/lib/nokogiri/css/parser.rb +1 -1
  131. data/lib/nokogiri/extension.rb +26 -0
  132. data/lib/nokogiri/html/document_fragment.rb +15 -15
  133. data/lib/nokogiri/nokogiri.jar +0 -0
  134. data/lib/nokogiri/version/constant.rb +1 -1
  135. data/lib/nokogiri/version/info.rb +32 -8
  136. data/lib/nokogiri/xml/document.rb +74 -28
  137. data/lib/nokogiri/xml/node.rb +39 -42
  138. data/lib/nokogiri/xml/reader.rb +2 -9
  139. data/lib/nokogiri/xml/xpath.rb +1 -3
  140. data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
  141. metadata +7 -8
  142. data/ext/nokogiri/xml_io.c +0 -63
  143. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
@@ -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(XmlSyntaxError.createError(runtime, ex).toThrowable());
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
  }