nokogiri 1.11.0.rc4-java → 1.11.5-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 (144) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/LICENSE-DEPENDENCIES.md +12 -12
  4. data/LICENSE.md +1 -1
  5. data/README.md +168 -91
  6. data/dependencies.yml +12 -12
  7. data/ext/java/nokogiri/EncodingHandler.java +76 -89
  8. data/ext/java/nokogiri/HtmlDocument.java +135 -144
  9. data/ext/java/nokogiri/HtmlElementDescription.java +102 -117
  10. data/ext/java/nokogiri/HtmlEntityLookup.java +33 -60
  11. data/ext/java/nokogiri/HtmlSaxParserContext.java +218 -222
  12. data/ext/java/nokogiri/HtmlSaxPushParser.java +162 -169
  13. data/ext/java/nokogiri/NokogiriService.java +595 -556
  14. data/ext/java/nokogiri/XmlAttr.java +118 -126
  15. data/ext/java/nokogiri/XmlAttributeDecl.java +95 -106
  16. data/ext/java/nokogiri/XmlCdata.java +35 -58
  17. data/ext/java/nokogiri/XmlComment.java +46 -67
  18. data/ext/java/nokogiri/XmlDocument.java +645 -572
  19. data/ext/java/nokogiri/XmlDocumentFragment.java +125 -137
  20. data/ext/java/nokogiri/XmlDtd.java +448 -414
  21. data/ext/java/nokogiri/XmlElement.java +23 -48
  22. data/ext/java/nokogiri/XmlElementContent.java +343 -316
  23. data/ext/java/nokogiri/XmlElementDecl.java +124 -125
  24. data/ext/java/nokogiri/XmlEntityDecl.java +119 -127
  25. data/ext/java/nokogiri/XmlEntityReference.java +49 -72
  26. data/ext/java/nokogiri/XmlNamespace.java +175 -175
  27. data/ext/java/nokogiri/XmlNode.java +1843 -1620
  28. data/ext/java/nokogiri/XmlNodeSet.java +361 -331
  29. data/ext/java/nokogiri/XmlProcessingInstruction.java +47 -69
  30. data/ext/java/nokogiri/XmlReader.java +513 -450
  31. data/ext/java/nokogiri/XmlRelaxng.java +85 -104
  32. data/ext/java/nokogiri/XmlSaxParserContext.java +328 -315
  33. data/ext/java/nokogiri/XmlSaxPushParser.java +227 -220
  34. data/ext/java/nokogiri/XmlSchema.java +328 -295
  35. data/ext/java/nokogiri/XmlSyntaxError.java +113 -115
  36. data/ext/java/nokogiri/XmlText.java +55 -76
  37. data/ext/java/nokogiri/XmlXpathContext.java +240 -238
  38. data/ext/java/nokogiri/XsltStylesheet.java +280 -269
  39. data/ext/java/nokogiri/internals/ClosedStreamException.java +5 -2
  40. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +201 -202
  41. data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +17 -10
  42. data/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +43 -16
  43. data/ext/java/nokogiri/internals/NokogiriDomParser.java +63 -80
  44. data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +107 -88
  45. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +27 -52
  46. data/ext/java/nokogiri/internals/NokogiriHandler.java +316 -286
  47. data/ext/java/nokogiri/internals/NokogiriHelpers.java +736 -652
  48. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +184 -173
  49. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +81 -98
  50. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +64 -79
  51. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +84 -99
  52. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +48 -65
  53. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +116 -131
  54. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +34 -56
  55. data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +23 -46
  56. data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +55 -72
  57. data/ext/java/nokogiri/internals/ParserContext.java +206 -211
  58. data/ext/java/nokogiri/internals/ReaderNode.java +478 -403
  59. data/ext/java/nokogiri/internals/SaveContextVisitor.java +822 -739
  60. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +31 -54
  61. data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +129 -123
  62. data/ext/java/nokogiri/internals/XmlDeclHandler.java +3 -34
  63. data/ext/java/nokogiri/internals/XmlDomParserContext.java +206 -207
  64. data/ext/java/nokogiri/internals/XmlSaxParser.java +22 -47
  65. data/ext/java/nokogiri/internals/c14n/AttrCompare.java +71 -68
  66. data/ext/java/nokogiri/internals/c14n/C14nHelper.java +137 -118
  67. data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +27 -21
  68. data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +74 -61
  69. data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +230 -205
  70. data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +572 -547
  71. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +17 -10
  72. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +17 -10
  73. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +323 -302
  74. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +232 -219
  75. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +22 -15
  76. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +23 -16
  77. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +23 -16
  78. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +22 -15
  79. data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +575 -545
  80. data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +141 -120
  81. data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +39 -38
  82. data/ext/java/nokogiri/internals/c14n/Constants.java +13 -10
  83. data/ext/java/nokogiri/internals/c14n/ElementProxy.java +279 -247
  84. data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +66 -53
  85. data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +44 -37
  86. data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +135 -120
  87. data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +59 -48
  88. data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +384 -334
  89. data/ext/java/nokogiri/internals/c14n/NodeFilter.java +25 -24
  90. data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +151 -140
  91. data/ext/java/nokogiri/internals/c14n/XMLUtils.java +456 -423
  92. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTM.java +1466 -1500
  93. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java +626 -574
  94. data/ext/nokogiri/depend +34 -474
  95. data/ext/nokogiri/extconf.rb +270 -183
  96. data/ext/nokogiri/html_document.c +10 -15
  97. data/ext/nokogiri/html_element_description.c +84 -71
  98. data/ext/nokogiri/html_entity_lookup.c +21 -16
  99. data/ext/nokogiri/html_sax_parser_context.c +67 -64
  100. data/ext/nokogiri/html_sax_push_parser.c +42 -34
  101. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  102. data/ext/nokogiri/nokogiri.c +190 -60
  103. data/ext/nokogiri/test_global_handlers.c +40 -0
  104. data/ext/nokogiri/xml_attr.c +15 -15
  105. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  106. data/ext/nokogiri/xml_cdata.c +13 -18
  107. data/ext/nokogiri/xml_comment.c +19 -26
  108. data/ext/nokogiri/xml_document.c +246 -188
  109. data/ext/nokogiri/xml_document_fragment.c +13 -15
  110. data/ext/nokogiri/xml_dtd.c +54 -48
  111. data/ext/nokogiri/xml_element_content.c +30 -27
  112. data/ext/nokogiri/xml_element_decl.c +22 -22
  113. data/ext/nokogiri/xml_encoding_handler.c +17 -11
  114. data/ext/nokogiri/xml_entity_decl.c +32 -30
  115. data/ext/nokogiri/xml_entity_reference.c +16 -18
  116. data/ext/nokogiri/xml_namespace.c +56 -49
  117. data/ext/nokogiri/xml_node.c +371 -320
  118. data/ext/nokogiri/xml_node_set.c +168 -156
  119. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  120. data/ext/nokogiri/xml_reader.c +191 -157
  121. data/ext/nokogiri/xml_relax_ng.c +29 -23
  122. data/ext/nokogiri/xml_sax_parser.c +117 -112
  123. data/ext/nokogiri/xml_sax_parser_context.c +101 -84
  124. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  125. data/ext/nokogiri/xml_schema.c +48 -42
  126. data/ext/nokogiri/xml_syntax_error.c +42 -21
  127. data/ext/nokogiri/xml_text.c +13 -17
  128. data/ext/nokogiri/xml_xpath_context.c +134 -127
  129. data/ext/nokogiri/xslt_stylesheet.c +157 -157
  130. data/lib/nokogiri.rb +2 -6
  131. data/lib/nokogiri/css/parser.rb +1 -1
  132. data/lib/nokogiri/extension.rb +26 -0
  133. data/lib/nokogiri/html/document_fragment.rb +15 -15
  134. data/lib/nokogiri/nokogiri.jar +0 -0
  135. data/lib/nokogiri/version/constant.rb +1 -1
  136. data/lib/nokogiri/version/info.rb +32 -8
  137. data/lib/nokogiri/xml/document.rb +74 -28
  138. data/lib/nokogiri/xml/node.rb +39 -42
  139. data/lib/nokogiri/xml/reader.rb +2 -9
  140. data/lib/nokogiri/xml/xpath.rb +1 -3
  141. data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
  142. metadata +62 -127
  143. data/ext/nokogiri/xml_io.c +0 -63
  144. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
@@ -1,35 +1,3 @@
1
- /**
2
- * (The MIT License)
3
- *
4
- * Copyright (c) 2008 - 2012:
5
- *
6
- * * {Aaron Patterson}[http://tenderlovemaking.com]
7
- * * {Mike Dalessio}[http://mike.daless.io]
8
- * * {Charles Nutter}[http://blog.headius.com]
9
- * * {Sergio Arbeo}[http://www.serabe.com]
10
- * * {Patrick Mahoney}[http://polycrystal.org]
11
- * * {Yoko Harada}[http://yokolet.blogspot.com]
12
- *
13
- * Permission is hereby granted, free of charge, to any person obtaining
14
- * a copy of this software and associated documentation files (the
15
- * 'Software'), to deal in the Software without restriction, including
16
- * without limitation the rights to use, copy, modify, merge, publish,
17
- * distribute, sublicense, and/or sell copies of the Software, and to
18
- * permit persons to whom the Software is furnished to do so, subject to
19
- * the following conditions:
20
- *
21
- * The above copyright notice and this permission notice shall be
22
- * included in all copies or substantial portions of the Software.
23
- *
24
- * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
25
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
27
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
28
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
29
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
30
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31
- */
32
-
33
1
  package nokogiri;
34
2
 
35
3
  import static nokogiri.internals.NokogiriHelpers.getCachedNodeOrCreate;
@@ -47,55 +15,64 @@ import org.w3c.dom.Node;
47
15
 
48
16
  /**
49
17
  * Class for Nokogiri::XML::EntityReference
50
- *
18
+ *
51
19
  * @author sergio
52
20
  * @author Patrick Mahoney <pat@polycrystal.org>
53
21
  * @author Yoko Harada <yokolet@gmail.com>
54
22
  */
55
- @JRubyClass(name="Nokogiri::XML::EntityReference", parent="Nokogiri::XML::Node")
56
- public class XmlEntityReference extends XmlNode {
23
+ @JRubyClass(name = "Nokogiri::XML::EntityReference", parent = "Nokogiri::XML::Node")
24
+ public class XmlEntityReference extends XmlNode
25
+ {
57
26
 
58
- public XmlEntityReference(Ruby ruby, RubyClass klazz) {
59
- super(ruby, klazz);
60
- }
27
+ public
28
+ XmlEntityReference(Ruby ruby, RubyClass klazz)
29
+ {
30
+ super(ruby, klazz);
31
+ }
61
32
 
62
- public XmlEntityReference(Ruby ruby, RubyClass klass, Node node) {
63
- super(ruby, klass, node);
33
+ public
34
+ XmlEntityReference(Ruby ruby, RubyClass klass, Node node)
35
+ {
36
+ super(ruby, klass, node);
37
+ }
38
+
39
+ protected void
40
+ init(ThreadContext context, IRubyObject[] args)
41
+ {
42
+ if (args.length < 2) {
43
+ throw context.runtime.newArgumentError(args.length, 2);
64
44
  }
65
45
 
66
- protected void init(ThreadContext context, IRubyObject[] args) {
67
- if (args.length < 2) {
68
- throw context.runtime.newArgumentError(args.length, 2);
69
- }
46
+ IRubyObject doc = args[0];
47
+ IRubyObject name = args[1];
70
48
 
71
- IRubyObject doc = args[0];
72
- IRubyObject name = args[1];
49
+ Document document = ((XmlNode) doc).getOwnerDocument();
50
+ // FIXME: disable error checking as a workaround for #719. this depends on the internals of Xerces.
51
+ CoreDocumentImpl internalDocument = (CoreDocumentImpl) document;
52
+ boolean oldErrorChecking = internalDocument.getErrorChecking();
53
+ internalDocument.setErrorChecking(false);
54
+ Node node = document.createEntityReference(rubyStringToString(name));
55
+ internalDocument.setErrorChecking(oldErrorChecking);
56
+ setNode(context.runtime, node);
57
+ }
73
58
 
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);
59
+ @Override
60
+ public void
61
+ accept(ThreadContext context, SaveContextVisitor visitor)
62
+ {
63
+ visitor.enter(node);
64
+ Node child = node.getFirstChild();
65
+ while (child != null) {
66
+ IRubyObject nokoNode = getCachedNodeOrCreate(context.getRuntime(), child);
67
+ if (nokoNode instanceof XmlNode) {
68
+ XmlNode cur = (XmlNode) nokoNode;
69
+ cur.accept(context, visitor);
70
+ } else if (nokoNode instanceof XmlNamespace) {
71
+ XmlNamespace cur = (XmlNamespace) nokoNode;
72
+ cur.accept(context, visitor);
73
+ }
74
+ child = child.getNextSibling();
100
75
  }
76
+ visitor.leave(node);
77
+ }
101
78
  }
@@ -1,35 +1,3 @@
1
- /**
2
- * (The MIT License)
3
- *
4
- * Copyright (c) 2008 - 2012:
5
- *
6
- * * {Aaron Patterson}[http://tenderlovemaking.com]
7
- * * {Mike Dalessio}[http://mike.daless.io]
8
- * * {Charles Nutter}[http://blog.headius.com]
9
- * * {Sergio Arbeo}[http://www.serabe.com]
10
- * * {Patrick Mahoney}[http://polycrystal.org]
11
- * * {Yoko Harada}[http://yokolet.blogspot.com]
12
- *
13
- * Permission is hereby granted, free of charge, to any person obtaining
14
- * a copy of this software and associated documentation files (the
15
- * 'Software'), to deal in the Software without restriction, including
16
- * without limitation the rights to use, copy, modify, merge, publish,
17
- * distribute, sublicense, and/or sell copies of the Software, and to
18
- * permit persons to whom the Software is furnished to do so, subject to
19
- * the following conditions:
20
- *
21
- * The above copyright notice and this permission notice shall be
22
- * included in all copies or substantial portions of the Software.
23
- *
24
- * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
25
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
27
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
28
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
29
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
30
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31
- */
32
-
33
1
  package nokogiri;
34
2
 
35
3
  import static nokogiri.internals.NokogiriHelpers.getCachedNodeOrCreate;
@@ -50,150 +18,182 @@ import org.w3c.dom.Node;
50
18
 
51
19
  /**
52
20
  * Class for Nokogiri::XML::Namespace
53
- *
21
+ *
54
22
  * @author serabe
55
23
  * @author Yoko Harada <yokolet@gmail.com>
56
24
  */
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
- }
25
+ @JRubyClass(name = "Nokogiri::XML::Namespace")
26
+ public class XmlNamespace extends RubyObject
27
+ {
28
+ private Attr attr;
29
+ private transient IRubyObject prefixRuby;
30
+ private transient IRubyObject hrefRuby;
31
+ private String prefix;
32
+ private String href;
33
+
34
+ public
35
+ XmlNamespace(Ruby runtime, RubyClass klazz)
36
+ {
37
+ super(runtime, klazz);
38
+ }
39
+
40
+ XmlNamespace(Ruby runtime, Attr attr, String prefix, String href, IRubyObject document)
41
+ {
42
+ this(runtime, attr, prefix, null, href, null, document);
43
+ }
44
+
45
+ private
46
+ XmlNamespace(Ruby runtime, Attr attr, String prefix, IRubyObject prefixRuby,
47
+ String href, IRubyObject hrefRuby, IRubyObject document)
48
+ {
49
+ super(runtime, getNokogiriClass(runtime, "Nokogiri::XML::Namespace"));
50
+
51
+ this.attr = attr;
52
+ this.prefix = prefix;
53
+ this.href = href;
54
+ this.prefixRuby = prefixRuby;
55
+ this.hrefRuby = hrefRuby;
56
+ setInstanceVariable("@document", document);
57
+ }
58
+
59
+ public Node
60
+ getNode()
61
+ {
62
+ return attr;
63
+ }
64
+
65
+ public String
66
+ getPrefix()
67
+ {
68
+ return prefix;
69
+ }
70
+
71
+ boolean
72
+ hasPrefix(String prefix)
73
+ {
74
+ return prefix == null ? this.prefix == null : prefix.equals(this.prefix);
75
+ }
76
+
77
+ public String
78
+ getHref()
79
+ {
80
+ return href;
81
+ }
82
+
83
+ void
84
+ deleteHref()
85
+ {
86
+ href = "http://www.w3.org/XML/1998/namespace";
87
+ hrefRuby = null;
88
+ attr.getOwnerElement().removeAttributeNode(attr);
89
+ }
90
+
91
+ public static XmlNamespace
92
+ createFromAttr(Ruby runtime, Attr attr)
93
+ {
94
+ String prefixStr = getLocalNameForNamespace(attr.getName(), null);
95
+ IRubyObject prefix = prefixStr == null ? runtime.getNil() : null;
96
+ String hrefStr = attr.getValue();
97
+ // check namespace cache
98
+ XmlDocument xmlDocument = (XmlDocument) getCachedNodeOrCreate(runtime, attr.getOwnerDocument());
99
+ XmlNamespace namespace = xmlDocument.getNamespaceCache().get(prefixStr, hrefStr);
100
+ if (namespace != null) { return namespace; }
101
+
102
+ namespace = new XmlNamespace(runtime, attr, prefixStr, prefix, hrefStr, null, xmlDocument);
103
+ xmlDocument.getNamespaceCache().put(namespace, attr.getOwnerElement());
104
+ return namespace;
105
+ }
106
+
107
+ static XmlNamespace
108
+ createImpl(Node owner, IRubyObject prefix, String prefixStr, IRubyObject href, String hrefStr)
109
+ {
110
+ final Ruby runtime = prefix.getRuntime();
111
+
112
+ Document document = owner.getOwnerDocument();
113
+ XmlDocument xmlDocument = (XmlDocument) getCachedNodeOrCreate(runtime, document);
114
+
115
+ assert xmlDocument.getNamespaceCache().get(prefixStr, hrefStr) == null;
116
+
117
+ // creating XmlNamespace instance
118
+ String attrName = "xmlns";
119
+ if (prefixStr != null && !prefixStr.isEmpty()) { attrName = attrName + ':' + prefixStr; }
120
+
121
+ Attr attrNode = document.createAttribute(attrName);
122
+ attrNode.setNodeValue(hrefStr);
123
+
124
+ XmlNamespace namespace = new XmlNamespace(runtime, attrNode, prefixStr, prefix, hrefStr, href, xmlDocument);
125
+ xmlDocument.getNamespaceCache().put(namespace, owner);
126
+ return namespace;
127
+ }
128
+
129
+ // owner should be an Attr node
130
+ public static XmlNamespace
131
+ createDefaultNamespace(Ruby runtime, Node owner)
132
+ {
133
+ String prefixStr = owner.getPrefix();
134
+ String hrefStr = owner.getNamespaceURI();
135
+ // check namespace cache
136
+ XmlDocument xmlDocument = (XmlDocument) getCachedNodeOrCreate(runtime, owner.getOwnerDocument());
137
+ XmlNamespace namespace = xmlDocument.getNamespaceCache().get(prefixStr, hrefStr);
138
+ if (namespace != null) { return namespace; }
139
+
140
+ namespace = new XmlNamespace(runtime, (Attr) owner, prefixStr, hrefStr, xmlDocument);
141
+ xmlDocument.getNamespaceCache().put(namespace, owner);
142
+ return namespace;
143
+ }
144
+
145
+ /**
146
+ * Create and return a copy of this object.
147
+ *
148
+ * @return a clone of this object
149
+ */
150
+ @Override
151
+ public Object
152
+ clone() throws CloneNotSupportedException
153
+ {
154
+ return super.clone();
155
+ }
156
+
157
+ public boolean
158
+ isEmpty()
159
+ {
160
+ return prefix == null && href == null;
161
+ }
162
+
163
+ @JRubyMethod
164
+ public IRubyObject
165
+ href(ThreadContext context)
166
+ {
167
+ if (hrefRuby == null) {
168
+ if (href == null) { return hrefRuby = context.nil; }
169
+ return hrefRuby = context.runtime.newString(href);
170
+ }
171
+ return hrefRuby;
172
+ }
173
+
174
+ @JRubyMethod
175
+ public IRubyObject
176
+ prefix(ThreadContext context)
177
+ {
178
+ if (prefixRuby == null) {
179
+ if (prefix == null) { return prefixRuby = context.nil; }
180
+ return prefixRuby = context.runtime.newString(prefix);
181
+ }
182
+ return prefixRuby;
183
+ }
184
+
185
+ public void
186
+ accept(ThreadContext context, SaveContextVisitor visitor)
187
+ {
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
+ }
199
199
  }