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.
@@ -47,55 +47,64 @@ import org.w3c.dom.Node;
47
47
 
48
48
  /**
49
49
  * Class for Nokogiri::XML::EntityReference
50
- *
50
+ *
51
51
  * @author sergio
52
52
  * @author Patrick Mahoney <pat@polycrystal.org>
53
53
  * @author Yoko Harada <yokolet@gmail.com>
54
54
  */
55
- @JRubyClass(name="Nokogiri::XML::EntityReference", parent="Nokogiri::XML::Node")
56
- public class XmlEntityReference extends XmlNode {
55
+ @JRubyClass(name = "Nokogiri::XML::EntityReference", parent = "Nokogiri::XML::Node")
56
+ public class XmlEntityReference extends XmlNode
57
+ {
57
58
 
58
- public XmlEntityReference(Ruby ruby, RubyClass klazz) {
59
- super(ruby, klazz);
60
- }
59
+ public
60
+ XmlEntityReference(Ruby ruby, RubyClass klazz)
61
+ {
62
+ super(ruby, klazz);
63
+ }
64
+
65
+ public
66
+ XmlEntityReference(Ruby ruby, RubyClass klass, Node node)
67
+ {
68
+ super(ruby, klass, node);
69
+ }
61
70
 
62
- public XmlEntityReference(Ruby ruby, RubyClass klass, Node node) {
63
- super(ruby, klass, node);
71
+ protected void
72
+ init(ThreadContext context, IRubyObject[] args)
73
+ {
74
+ if (args.length < 2) {
75
+ throw context.runtime.newArgumentError(args.length, 2);
64
76
  }
65
77
 
66
- protected void init(ThreadContext context, IRubyObject[] args) {
67
- if (args.length < 2) {
68
- throw context.runtime.newArgumentError(args.length, 2);
69
- }
78
+ IRubyObject doc = args[0];
79
+ IRubyObject name = args[1];
70
80
 
71
- IRubyObject doc = args[0];
72
- IRubyObject name = args[1];
81
+ Document document = ((XmlNode) doc).getOwnerDocument();
82
+ // FIXME: disable error checking as a workaround for #719. this depends on the internals of Xerces.
83
+ CoreDocumentImpl internalDocument = (CoreDocumentImpl) document;
84
+ boolean oldErrorChecking = internalDocument.getErrorChecking();
85
+ internalDocument.setErrorChecking(false);
86
+ Node node = document.createEntityReference(rubyStringToString(name));
87
+ internalDocument.setErrorChecking(oldErrorChecking);
88
+ setNode(context.runtime, node);
89
+ }
73
90
 
74
- Document document = ((XmlNode) doc).getOwnerDocument();
75
- // FIXME: disable error checking as a workaround for #719. this depends on the internals of Xerces.
76
- CoreDocumentImpl internalDocument = (CoreDocumentImpl) document;
77
- boolean oldErrorChecking = internalDocument.getErrorChecking();
78
- internalDocument.setErrorChecking(false);
79
- Node node = document.createEntityReference(rubyStringToString(name));
80
- internalDocument.setErrorChecking(oldErrorChecking);
81
- setNode(context.runtime, node);
82
- }
83
-
84
- @Override
85
- public void accept(ThreadContext context, SaveContextVisitor visitor) {
86
- visitor.enter(node);
87
- Node child = node.getFirstChild();
88
- while (child != null) {
89
- IRubyObject nokoNode = getCachedNodeOrCreate(context.getRuntime(), child);
90
- if (nokoNode instanceof XmlNode) {
91
- XmlNode cur = (XmlNode) nokoNode;
92
- cur.accept(context, visitor);
93
- } else if (nokoNode instanceof XmlNamespace) {
94
- XmlNamespace cur = (XmlNamespace) nokoNode;
95
- cur.accept(context, visitor);
96
- }
97
- child = child.getNextSibling();
98
- }
99
- visitor.leave(node);
91
+ @Override
92
+ public void
93
+ accept(ThreadContext context, SaveContextVisitor visitor)
94
+ {
95
+ visitor.enter(node);
96
+ Node child = node.getFirstChild();
97
+ while (child != null) {
98
+ IRubyObject nokoNode = getCachedNodeOrCreate(context.getRuntime(), child);
99
+ if (nokoNode instanceof XmlNode) {
100
+ XmlNode cur = (XmlNode) nokoNode;
101
+ cur.accept(context, visitor);
102
+ } else if (nokoNode instanceof XmlNamespace) {
103
+ XmlNamespace cur = (XmlNamespace) nokoNode;
104
+ cur.accept(context, visitor);
105
+ }
106
+ child = child.getNextSibling();
100
107
  }
108
+ visitor.leave(node);
109
+ }
101
110
  }
@@ -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.
@@ -50,150 +50,182 @@ import org.w3c.dom.Node;
50
50
 
51
51
  /**
52
52
  * Class for Nokogiri::XML::Namespace
53
- *
53
+ *
54
54
  * @author serabe
55
55
  * @author Yoko Harada <yokolet@gmail.com>
56
56
  */
57
- @JRubyClass(name="Nokogiri::XML::Namespace")
58
- public class XmlNamespace extends RubyObject {
59
- private Attr attr;
60
- private transient IRubyObject prefixRuby;
61
- private transient IRubyObject hrefRuby;
62
- private String prefix;
63
- private String href;
64
-
65
- public XmlNamespace(Ruby runtime, RubyClass klazz) {
66
- super(runtime, klazz);
67
- }
68
-
69
- XmlNamespace(Ruby runtime, Attr attr, String prefix, String href, IRubyObject document) {
70
- this(runtime, attr, prefix, null, href, null, document);
71
- }
72
-
73
- private XmlNamespace(Ruby runtime, Attr attr, String prefix, IRubyObject prefixRuby,
74
- String href, IRubyObject hrefRuby, IRubyObject document) {
75
- super(runtime, getNokogiriClass(runtime, "Nokogiri::XML::Namespace"));
76
-
77
- this.attr = attr;
78
- this.prefix = prefix;
79
- this.href = href;
80
- this.prefixRuby = prefixRuby;
81
- this.hrefRuby = hrefRuby;
82
- setInstanceVariable("@document", document);
83
- }
84
-
85
- public Node getNode() {
86
- return attr;
87
- }
88
-
89
- public String getPrefix() {
90
- return prefix;
91
- }
92
-
93
- boolean hasPrefix(String prefix) {
94
- return prefix == null ? this.prefix == null : prefix.equals(this.prefix);
95
- }
96
-
97
- public String getHref() {
98
- return href;
99
- }
100
-
101
- void deleteHref() {
102
- href = "http://www.w3.org/XML/1998/namespace";
103
- hrefRuby = null;
104
- attr.getOwnerElement().removeAttributeNode(attr);
105
- }
106
-
107
- public static XmlNamespace createFromAttr(Ruby runtime, Attr attr) {
108
- String prefixStr = getLocalNameForNamespace(attr.getName(), null);
109
- IRubyObject prefix = prefixStr == null ? runtime.getNil() : null;
110
- String hrefStr = attr.getValue();
111
- // check namespace cache
112
- XmlDocument xmlDocument = (XmlDocument) getCachedNodeOrCreate(runtime, attr.getOwnerDocument());
113
- XmlNamespace namespace = xmlDocument.getNamespaceCache().get(prefixStr, hrefStr);
114
- if (namespace != null) return namespace;
115
-
116
- namespace = new XmlNamespace(runtime, attr, prefixStr, prefix, hrefStr, null, xmlDocument);
117
- xmlDocument.getNamespaceCache().put(namespace, attr.getOwnerElement());
118
- return namespace;
119
- }
120
-
121
- static XmlNamespace createImpl(Node owner, IRubyObject prefix, String prefixStr, IRubyObject href, String hrefStr) {
122
- final Ruby runtime = prefix.getRuntime();
123
-
124
- Document document = owner.getOwnerDocument();
125
- XmlDocument xmlDocument = (XmlDocument) getCachedNodeOrCreate(runtime, document);
126
-
127
- assert xmlDocument.getNamespaceCache().get(prefixStr, hrefStr) == null;
128
-
129
- // creating XmlNamespace instance
130
- String attrName = "xmlns";
131
- if (prefixStr != null && !prefixStr.isEmpty()) attrName = attrName + ':' + prefixStr;
132
-
133
- Attr attrNode = document.createAttribute(attrName);
134
- attrNode.setNodeValue(hrefStr);
135
-
136
- XmlNamespace namespace = new XmlNamespace(runtime, attrNode, prefixStr, prefix, hrefStr, href, xmlDocument);
137
- xmlDocument.getNamespaceCache().put(namespace, owner);
138
- return namespace;
139
- }
140
-
141
- // owner should be an Attr node
142
- public static XmlNamespace createDefaultNamespace(Ruby runtime, Node owner) {
143
- String prefixStr = owner.getPrefix();
144
- String hrefStr = owner.getNamespaceURI();
145
- // check namespace cache
146
- XmlDocument xmlDocument = (XmlDocument) getCachedNodeOrCreate(runtime, owner.getOwnerDocument());
147
- XmlNamespace namespace = xmlDocument.getNamespaceCache().get(prefixStr, hrefStr);
148
- if (namespace != null) return namespace;
149
-
150
- namespace = new XmlNamespace(runtime, (Attr) owner, prefixStr, hrefStr, xmlDocument);
151
- xmlDocument.getNamespaceCache().put(namespace, owner);
152
- return namespace;
153
- }
154
-
155
- /**
156
- * Create and return a copy of this object.
157
- *
158
- * @return a clone of this object
159
- */
160
- @Override
161
- public Object clone() throws CloneNotSupportedException {
162
- return super.clone();
163
- }
164
-
165
- public boolean isEmpty() {
166
- return prefix == null && href == null;
167
- }
168
-
169
- @JRubyMethod
170
- public IRubyObject href(ThreadContext context) {
171
- if (hrefRuby == null) {
172
- if (href == null) return hrefRuby = context.nil;
173
- return hrefRuby = context.runtime.newString(href);
174
- }
175
- return hrefRuby;
176
- }
177
-
178
- @JRubyMethod
179
- public IRubyObject prefix(ThreadContext context) {
180
- if (prefixRuby == null) {
181
- if (prefix == null) return prefixRuby = context.nil;
182
- return prefixRuby = context.runtime.newString(prefix);
183
- }
184
- return prefixRuby;
185
- }
186
-
187
- public void accept(ThreadContext context, SaveContextVisitor visitor) {
188
- String prefix = this.prefix;
189
- if (prefix == null) prefix = "";
190
- String href = this.href;
191
- if (href == null) href = "";
192
- String string = ' ' + prefix + '=' + '"' + href + '"';
193
- visitor.enter(string);
194
- visitor.leave(string);
195
- // is below better?
196
- //visitor.enter(attr);
197
- //visitor.leave(attr);
198
- }
57
+ @JRubyClass(name = "Nokogiri::XML::Namespace")
58
+ public class XmlNamespace extends RubyObject
59
+ {
60
+ private Attr attr;
61
+ private transient IRubyObject prefixRuby;
62
+ private transient IRubyObject hrefRuby;
63
+ private String prefix;
64
+ private String href;
65
+
66
+ public
67
+ XmlNamespace(Ruby runtime, RubyClass klazz)
68
+ {
69
+ super(runtime, klazz);
70
+ }
71
+
72
+ XmlNamespace(Ruby runtime, Attr attr, String prefix, String href, IRubyObject document)
73
+ {
74
+ this(runtime, attr, prefix, null, href, null, document);
75
+ }
76
+
77
+ private
78
+ XmlNamespace(Ruby runtime, Attr attr, String prefix, IRubyObject prefixRuby,
79
+ String href, IRubyObject hrefRuby, IRubyObject document)
80
+ {
81
+ super(runtime, getNokogiriClass(runtime, "Nokogiri::XML::Namespace"));
82
+
83
+ this.attr = attr;
84
+ this.prefix = prefix;
85
+ this.href = href;
86
+ this.prefixRuby = prefixRuby;
87
+ this.hrefRuby = hrefRuby;
88
+ setInstanceVariable("@document", document);
89
+ }
90
+
91
+ public Node
92
+ getNode()
93
+ {
94
+ return attr;
95
+ }
96
+
97
+ public String
98
+ getPrefix()
99
+ {
100
+ return prefix;
101
+ }
102
+
103
+ boolean
104
+ hasPrefix(String prefix)
105
+ {
106
+ return prefix == null ? this.prefix == null : prefix.equals(this.prefix);
107
+ }
108
+
109
+ public String
110
+ getHref()
111
+ {
112
+ return href;
113
+ }
114
+
115
+ void
116
+ deleteHref()
117
+ {
118
+ href = "http://www.w3.org/XML/1998/namespace";
119
+ hrefRuby = null;
120
+ attr.getOwnerElement().removeAttributeNode(attr);
121
+ }
122
+
123
+ public static XmlNamespace
124
+ createFromAttr(Ruby runtime, Attr attr)
125
+ {
126
+ String prefixStr = getLocalNameForNamespace(attr.getName(), null);
127
+ IRubyObject prefix = prefixStr == null ? runtime.getNil() : null;
128
+ String hrefStr = attr.getValue();
129
+ // check namespace cache
130
+ XmlDocument xmlDocument = (XmlDocument) getCachedNodeOrCreate(runtime, attr.getOwnerDocument());
131
+ XmlNamespace namespace = xmlDocument.getNamespaceCache().get(prefixStr, hrefStr);
132
+ if (namespace != null) { return namespace; }
133
+
134
+ namespace = new XmlNamespace(runtime, attr, prefixStr, prefix, hrefStr, null, xmlDocument);
135
+ xmlDocument.getNamespaceCache().put(namespace, attr.getOwnerElement());
136
+ return namespace;
137
+ }
138
+
139
+ static XmlNamespace
140
+ createImpl(Node owner, IRubyObject prefix, String prefixStr, IRubyObject href, String hrefStr)
141
+ {
142
+ final Ruby runtime = prefix.getRuntime();
143
+
144
+ Document document = owner.getOwnerDocument();
145
+ XmlDocument xmlDocument = (XmlDocument) getCachedNodeOrCreate(runtime, document);
146
+
147
+ assert xmlDocument.getNamespaceCache().get(prefixStr, hrefStr) == null;
148
+
149
+ // creating XmlNamespace instance
150
+ String attrName = "xmlns";
151
+ if (prefixStr != null && !prefixStr.isEmpty()) { attrName = attrName + ':' + prefixStr; }
152
+
153
+ Attr attrNode = document.createAttribute(attrName);
154
+ attrNode.setNodeValue(hrefStr);
155
+
156
+ XmlNamespace namespace = new XmlNamespace(runtime, attrNode, prefixStr, prefix, hrefStr, href, xmlDocument);
157
+ xmlDocument.getNamespaceCache().put(namespace, owner);
158
+ return namespace;
159
+ }
160
+
161
+ // owner should be an Attr node
162
+ public static XmlNamespace
163
+ createDefaultNamespace(Ruby runtime, Node owner)
164
+ {
165
+ String prefixStr = owner.getPrefix();
166
+ String hrefStr = owner.getNamespaceURI();
167
+ // check namespace cache
168
+ XmlDocument xmlDocument = (XmlDocument) getCachedNodeOrCreate(runtime, owner.getOwnerDocument());
169
+ XmlNamespace namespace = xmlDocument.getNamespaceCache().get(prefixStr, hrefStr);
170
+ if (namespace != null) { return namespace; }
171
+
172
+ namespace = new XmlNamespace(runtime, (Attr) owner, prefixStr, hrefStr, xmlDocument);
173
+ xmlDocument.getNamespaceCache().put(namespace, owner);
174
+ return namespace;
175
+ }
176
+
177
+ /**
178
+ * Create and return a copy of this object.
179
+ *
180
+ * @return a clone of this object
181
+ */
182
+ @Override
183
+ public Object
184
+ clone() throws CloneNotSupportedException
185
+ {
186
+ return super.clone();
187
+ }
188
+
189
+ public boolean
190
+ isEmpty()
191
+ {
192
+ return prefix == null && href == null;
193
+ }
194
+
195
+ @JRubyMethod
196
+ public IRubyObject
197
+ href(ThreadContext context)
198
+ {
199
+ if (hrefRuby == null) {
200
+ if (href == null) { return hrefRuby = context.nil; }
201
+ return hrefRuby = context.runtime.newString(href);
202
+ }
203
+ return hrefRuby;
204
+ }
205
+
206
+ @JRubyMethod
207
+ public IRubyObject
208
+ prefix(ThreadContext context)
209
+ {
210
+ if (prefixRuby == null) {
211
+ if (prefix == null) { return prefixRuby = context.nil; }
212
+ return prefixRuby = context.runtime.newString(prefix);
213
+ }
214
+ return prefixRuby;
215
+ }
216
+
217
+ public void
218
+ accept(ThreadContext context, SaveContextVisitor visitor)
219
+ {
220
+ String prefix = this.prefix;
221
+ if (prefix == null) { prefix = ""; }
222
+ String href = this.href;
223
+ if (href == null) { href = ""; }
224
+ String string = ' ' + prefix + '=' + '"' + href + '"';
225
+ visitor.enter(string);
226
+ visitor.leave(string);
227
+ // is below better?
228
+ //visitor.enter(attr);
229
+ //visitor.leave(attr);
230
+ }
199
231
  }