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.
- checksums.yaml +4 -4
- data/LICENSE-DEPENDENCIES.md +12 -12
- data/LICENSE.md +1 -1
- data/README.md +20 -15
- data/ext/java/nokogiri/EncodingHandler.java +78 -59
- data/ext/java/nokogiri/HtmlDocument.java +137 -114
- data/ext/java/nokogiri/HtmlElementDescription.java +104 -87
- data/ext/java/nokogiri/HtmlEntityLookup.java +31 -26
- data/ext/java/nokogiri/HtmlSaxParserContext.java +220 -192
- data/ext/java/nokogiri/HtmlSaxPushParser.java +164 -139
- data/ext/java/nokogiri/NokogiriService.java +597 -526
- data/ext/java/nokogiri/XmlAttr.java +120 -96
- data/ext/java/nokogiri/XmlAttributeDecl.java +97 -76
- data/ext/java/nokogiri/XmlCdata.java +35 -26
- data/ext/java/nokogiri/XmlComment.java +48 -37
- data/ext/java/nokogiri/XmlDocument.java +642 -540
- data/ext/java/nokogiri/XmlDocumentFragment.java +127 -107
- data/ext/java/nokogiri/XmlDtd.java +450 -384
- data/ext/java/nokogiri/XmlElement.java +25 -18
- data/ext/java/nokogiri/XmlElementContent.java +345 -286
- data/ext/java/nokogiri/XmlElementDecl.java +126 -95
- data/ext/java/nokogiri/XmlEntityDecl.java +121 -97
- data/ext/java/nokogiri/XmlEntityReference.java +51 -42
- data/ext/java/nokogiri/XmlNamespace.java +177 -145
- data/ext/java/nokogiri/XmlNode.java +1843 -1588
- data/ext/java/nokogiri/XmlNodeSet.java +361 -299
- data/ext/java/nokogiri/XmlProcessingInstruction.java +49 -39
- data/ext/java/nokogiri/XmlReader.java +513 -418
- data/ext/java/nokogiri/XmlRelaxng.java +91 -78
- data/ext/java/nokogiri/XmlSaxParserContext.java +330 -285
- data/ext/java/nokogiri/XmlSaxPushParser.java +229 -190
- data/ext/java/nokogiri/XmlSchema.java +328 -263
- data/ext/java/nokogiri/XmlSyntaxError.java +113 -83
- data/ext/java/nokogiri/XmlText.java +57 -46
- data/ext/java/nokogiri/XmlXpathContext.java +240 -206
- data/ext/java/nokogiri/XsltStylesheet.java +282 -239
- data/ext/java/nokogiri/internals/ClosedStreamException.java +5 -2
- data/ext/java/nokogiri/internals/HtmlDomParserContext.java +199 -168
- data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +17 -10
- data/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +43 -16
- data/ext/java/nokogiri/internals/NokogiriDomParser.java +65 -50
- data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +107 -88
- data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +25 -18
- data/ext/java/nokogiri/internals/NokogiriHandler.java +316 -254
- data/ext/java/nokogiri/internals/NokogiriHelpers.java +738 -622
- data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +186 -143
- data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +83 -68
- data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +66 -49
- data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +86 -69
- data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +44 -29
- data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +118 -101
- data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +34 -24
- data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +25 -17
- data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +57 -42
- data/ext/java/nokogiri/internals/ParserContext.java +206 -179
- data/ext/java/nokogiri/internals/ReaderNode.java +478 -371
- data/ext/java/nokogiri/internals/SaveContextVisitor.java +822 -707
- data/ext/java/nokogiri/internals/SchemaErrorHandler.java +28 -19
- data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +129 -123
- data/ext/java/nokogiri/internals/XmlDeclHandler.java +5 -4
- data/ext/java/nokogiri/internals/XmlDomParserContext.java +208 -177
- data/ext/java/nokogiri/internals/XmlSaxParser.java +24 -17
- data/ext/java/nokogiri/internals/c14n/AttrCompare.java +71 -68
- data/ext/java/nokogiri/internals/c14n/C14nHelper.java +137 -118
- data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +27 -21
- data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +74 -61
- data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +230 -205
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +572 -547
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +17 -10
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +17 -10
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +323 -302
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +232 -219
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +22 -15
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +23 -16
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +23 -16
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +22 -15
- data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +575 -545
- data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +141 -120
- data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +39 -38
- data/ext/java/nokogiri/internals/c14n/Constants.java +13 -10
- data/ext/java/nokogiri/internals/c14n/ElementProxy.java +279 -247
- data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +66 -53
- data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +44 -37
- data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +135 -120
- data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +59 -48
- data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +384 -334
- data/ext/java/nokogiri/internals/c14n/NodeFilter.java +25 -24
- data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +151 -140
- data/ext/java/nokogiri/internals/c14n/XMLUtils.java +456 -423
- data/ext/java/nokogiri/internals/dom2dtm/DOM2DTM.java +1466 -1500
- data/ext/java/nokogiri/internals/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java +626 -570
- data/ext/nokogiri/depend +34 -474
- data/ext/nokogiri/extconf.rb +253 -183
- data/ext/nokogiri/html_document.c +10 -15
- data/ext/nokogiri/html_element_description.c +84 -71
- data/ext/nokogiri/html_entity_lookup.c +21 -16
- data/ext/nokogiri/html_sax_parser_context.c +66 -65
- data/ext/nokogiri/html_sax_push_parser.c +29 -27
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +171 -63
- data/ext/nokogiri/test_global_handlers.c +3 -4
- data/ext/nokogiri/xml_attr.c +15 -15
- data/ext/nokogiri/xml_attribute_decl.c +18 -18
- data/ext/nokogiri/xml_cdata.c +13 -18
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +221 -164
- data/ext/nokogiri/xml_document_fragment.c +13 -15
- data/ext/nokogiri/xml_dtd.c +54 -48
- data/ext/nokogiri/xml_element_content.c +30 -27
- data/ext/nokogiri/xml_element_decl.c +22 -22
- data/ext/nokogiri/xml_encoding_handler.c +17 -11
- data/ext/nokogiri/xml_entity_decl.c +32 -30
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +56 -49
- data/ext/nokogiri/xml_node.c +338 -286
- data/ext/nokogiri/xml_node_set.c +168 -156
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +191 -157
- data/ext/nokogiri/xml_relax_ng.c +29 -23
- data/ext/nokogiri/xml_sax_parser.c +117 -112
- data/ext/nokogiri/xml_sax_parser_context.c +100 -85
- data/ext/nokogiri/xml_sax_push_parser.c +34 -27
- data/ext/nokogiri/xml_schema.c +48 -42
- data/ext/nokogiri/xml_syntax_error.c +21 -23
- data/ext/nokogiri/xml_text.c +13 -17
- data/ext/nokogiri/xml_xpath_context.c +134 -127
- data/ext/nokogiri/xslt_stylesheet.c +157 -157
- data/lib/nokogiri.rb +1 -22
- data/lib/nokogiri/css/parser.rb +1 -1
- data/lib/nokogiri/extension.rb +26 -0
- data/lib/nokogiri/html/document_fragment.rb +15 -15
- data/lib/nokogiri/nokogiri.jar +0 -0
- data/lib/nokogiri/version/constant.rb +1 -1
- data/lib/nokogiri/version/info.rb +31 -8
- data/lib/nokogiri/xml/document.rb +31 -11
- data/lib/nokogiri/xml/node.rb +38 -42
- data/lib/nokogiri/xml/reader.rb +2 -9
- data/lib/nokogiri/xml/xpath.rb +1 -3
- data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
- metadata +7 -8
- data/ext/nokogiri/xml_io.c +0 -63
- 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
|
-
|
52
|
-
|
53
|
-
|
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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
|
-
|
64
|
+
List<Exception>
|
65
|
+
getErrors() { return errors; }
|
62
66
|
|
63
|
-
|
67
|
+
public void
|
68
|
+
addError(Exception ex) { errors.add(ex); }
|
64
69
|
|
65
|
-
|
66
|
-
|
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
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
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
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
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
|
-
|
265
|
-
|
266
|
-
handleError(ex);
|
197
|
+
rubyAttr.append(Helpers.invoke(context, attrClass, "new", args));
|
198
|
+
}
|
267
199
|
}
|
268
200
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
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
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
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
|
}
|