nokogiri 1.11.0.rc1-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 (188) 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 +78 -59
  7. data/ext/java/nokogiri/HtmlDocument.java +137 -114
  8. data/ext/java/nokogiri/HtmlElementDescription.java +104 -87
  9. data/ext/java/nokogiri/HtmlEntityLookup.java +31 -26
  10. data/ext/java/nokogiri/HtmlSaxParserContext.java +220 -192
  11. data/ext/java/nokogiri/HtmlSaxPushParser.java +164 -139
  12. data/ext/java/nokogiri/NokogiriService.java +597 -526
  13. data/ext/java/nokogiri/XmlAttr.java +120 -96
  14. data/ext/java/nokogiri/XmlAttributeDecl.java +97 -76
  15. data/ext/java/nokogiri/XmlCdata.java +35 -26
  16. data/ext/java/nokogiri/XmlComment.java +48 -37
  17. data/ext/java/nokogiri/XmlDocument.java +642 -540
  18. data/ext/java/nokogiri/XmlDocumentFragment.java +127 -107
  19. data/ext/java/nokogiri/XmlDtd.java +450 -384
  20. data/ext/java/nokogiri/XmlElement.java +25 -18
  21. data/ext/java/nokogiri/XmlElementContent.java +345 -286
  22. data/ext/java/nokogiri/XmlElementDecl.java +126 -95
  23. data/ext/java/nokogiri/XmlEntityDecl.java +121 -97
  24. data/ext/java/nokogiri/XmlEntityReference.java +51 -42
  25. data/ext/java/nokogiri/XmlNamespace.java +177 -145
  26. data/ext/java/nokogiri/XmlNode.java +1843 -1590
  27. data/ext/java/nokogiri/XmlNodeSet.java +361 -299
  28. data/ext/java/nokogiri/XmlProcessingInstruction.java +49 -39
  29. data/ext/java/nokogiri/XmlReader.java +513 -418
  30. data/ext/java/nokogiri/XmlRelaxng.java +92 -72
  31. data/ext/java/nokogiri/XmlSaxParserContext.java +330 -280
  32. data/ext/java/nokogiri/XmlSaxPushParser.java +229 -190
  33. data/ext/java/nokogiri/XmlSchema.java +335 -210
  34. data/ext/java/nokogiri/XmlSyntaxError.java +113 -87
  35. data/ext/java/nokogiri/XmlText.java +57 -46
  36. data/ext/java/nokogiri/XmlXpathContext.java +242 -178
  37. data/ext/java/nokogiri/XsltStylesheet.java +282 -239
  38. data/ext/java/nokogiri/internals/ClosedStreamException.java +5 -2
  39. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +203 -160
  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 +65 -50
  43. data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +107 -88
  44. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +25 -18
  45. data/ext/java/nokogiri/internals/NokogiriHandler.java +316 -254
  46. data/ext/java/nokogiri/internals/NokogiriHelpers.java +738 -622
  47. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +186 -143
  48. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +81 -59
  49. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +66 -49
  50. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +86 -69
  51. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +44 -29
  52. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +121 -48
  53. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +34 -22
  54. data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +25 -17
  55. data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +57 -42
  56. data/ext/java/nokogiri/internals/ParserContext.java +206 -179
  57. data/ext/java/nokogiri/internals/ReaderNode.java +478 -371
  58. data/ext/java/nokogiri/internals/SaveContextVisitor.java +822 -707
  59. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +28 -19
  60. data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +129 -123
  61. data/ext/java/nokogiri/internals/XmlDeclHandler.java +5 -4
  62. data/ext/java/nokogiri/internals/XmlDomParserContext.java +208 -177
  63. data/ext/java/nokogiri/internals/XmlSaxParser.java +24 -17
  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 -570
  93. data/ext/nokogiri/depend +37 -358
  94. data/ext/nokogiri/extconf.rb +585 -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 +225 -163
  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 +338 -286
  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 +195 -172
  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 +111 -34
  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/parser_extras.rb +38 -36
  133. data/lib/nokogiri/css/xpath_visitor.rb +70 -42
  134. data/lib/nokogiri/extension.rb +26 -0
  135. data/lib/nokogiri/html/document.rb +12 -26
  136. data/lib/nokogiri/html/document_fragment.rb +15 -15
  137. data/lib/nokogiri/nokogiri.jar +0 -0
  138. data/lib/nokogiri/version.rb +2 -148
  139. data/lib/nokogiri/version/constant.rb +5 -0
  140. data/lib/nokogiri/version/info.rb +205 -0
  141. data/lib/nokogiri/xml/builder.rb +2 -2
  142. data/lib/nokogiri/xml/document.rb +48 -18
  143. data/lib/nokogiri/xml/document_fragment.rb +4 -6
  144. data/lib/nokogiri/xml/node.rb +599 -279
  145. data/lib/nokogiri/xml/parse_options.rb +6 -0
  146. data/lib/nokogiri/xml/reader.rb +2 -9
  147. data/lib/nokogiri/xml/relax_ng.rb +6 -2
  148. data/lib/nokogiri/xml/schema.rb +12 -4
  149. data/lib/nokogiri/xml/searchable.rb +24 -16
  150. data/lib/nokogiri/xml/xpath.rb +1 -3
  151. data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
  152. metadata +87 -158
  153. data/ext/nokogiri/html_document.h +0 -10
  154. data/ext/nokogiri/html_element_description.h +0 -10
  155. data/ext/nokogiri/html_entity_lookup.h +0 -8
  156. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  157. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  158. data/ext/nokogiri/nokogiri.h +0 -122
  159. data/ext/nokogiri/xml_attr.h +0 -9
  160. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  161. data/ext/nokogiri/xml_cdata.h +0 -9
  162. data/ext/nokogiri/xml_comment.h +0 -9
  163. data/ext/nokogiri/xml_document.h +0 -23
  164. data/ext/nokogiri/xml_document_fragment.h +0 -10
  165. data/ext/nokogiri/xml_dtd.h +0 -10
  166. data/ext/nokogiri/xml_element_content.h +0 -10
  167. data/ext/nokogiri/xml_element_decl.h +0 -9
  168. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  169. data/ext/nokogiri/xml_entity_decl.h +0 -10
  170. data/ext/nokogiri/xml_entity_reference.h +0 -9
  171. data/ext/nokogiri/xml_io.c +0 -61
  172. data/ext/nokogiri/xml_io.h +0 -11
  173. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  174. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  175. data/ext/nokogiri/xml_namespace.h +0 -14
  176. data/ext/nokogiri/xml_node.h +0 -13
  177. data/ext/nokogiri/xml_node_set.h +0 -12
  178. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  179. data/ext/nokogiri/xml_reader.h +0 -10
  180. data/ext/nokogiri/xml_relax_ng.h +0 -9
  181. data/ext/nokogiri/xml_sax_parser.h +0 -39
  182. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  183. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  184. data/ext/nokogiri/xml_schema.h +0 -9
  185. data/ext/nokogiri/xml_syntax_error.h +0 -13
  186. data/ext/nokogiri/xml_text.h +0 -9
  187. data/ext/nokogiri/xml_xpath_context.h +0 -10
  188. data/ext/nokogiri/xslt_stylesheet.h +0 -14
@@ -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(new RaiseException(XmlSyntaxError.createError(runtime, ex), true));
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
  }