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