nokogiri 1.11.0.rc1-java → 1.11.2-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.
@@ -44,25 +44,32 @@ import nokogiri.internals.SaveContextVisitor;
44
44
 
45
45
  /**
46
46
  * Class for Nokogiri::XML::Element
47
- *
47
+ *
48
48
  * @author sergio
49
49
  * @author Yoko Harada <yokolet@gamil.com>
50
50
  */
51
- @JRubyClass(name="Nokogiri::XML::Element", parent="Nokogiri::XML::Node")
52
- public class XmlElement extends XmlNode {
51
+ @JRubyClass(name = "Nokogiri::XML::Element", parent = "Nokogiri::XML::Node")
52
+ public class XmlElement extends XmlNode
53
+ {
54
+
55
+ public
56
+ XmlElement(Ruby runtime, RubyClass klazz)
57
+ {
58
+ super(runtime, klazz);
59
+ }
53
60
 
54
- public XmlElement(Ruby runtime, RubyClass klazz) {
55
- super(runtime, klazz);
56
- }
61
+ public
62
+ XmlElement(Ruby runtime, RubyClass klazz, Node element)
63
+ {
64
+ super(runtime, klazz, element);
65
+ }
57
66
 
58
- public XmlElement(Ruby runtime, RubyClass klazz, Node element) {
59
- super(runtime, klazz, element);
60
- }
61
-
62
- @Override
63
- public void accept(ThreadContext context, SaveContextVisitor visitor) {
64
- visitor.enter((Element) node);
65
- acceptChildren(context, getChildren(), visitor);
66
- visitor.leave((Element) node);
67
- }
67
+ @Override
68
+ public void
69
+ accept(ThreadContext context, SaveContextVisitor visitor)
70
+ {
71
+ visitor.enter((Element) node);
72
+ acceptChildren(context, getChildren(), visitor);
73
+ visitor.leave((Element) node);
74
+ }
68
75
  }
@@ -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.
@@ -55,328 +55,387 @@ import org.w3c.dom.Node;
55
55
  *
56
56
  * @author Patrick Mahoney <pat@polycrystal.org>
57
57
  */
58
- @JRubyClass(name="Nokogiri::XML::ElementContent")
59
- public class XmlElementContent extends RubyObject {
60
- protected String element_name = null;
61
-
62
- protected String name;
63
- protected Type type;
64
- protected Occur occur;
65
- protected IRubyObject left;
66
- protected IRubyObject right;
67
-
68
- /** values hardcoded from nokogiri/xml/element_content.rb; this
69
- * makes me uneasy, but it works */
70
- public enum Type {
71
- PCDATA (1),
72
- ELEMENT (2),
73
- SEQ (3),
74
- OR (4);
75
-
76
- private final int value;
77
- Type(int value) {
78
- this.value = value;
79
- }
80
- public IRubyObject value(Ruby runtime) {
81
- return runtime.newFixnum(value);
82
- }
58
+ @JRubyClass(name = "Nokogiri::XML::ElementContent")
59
+ public class XmlElementContent extends RubyObject
60
+ {
61
+ protected String element_name = null;
62
+
63
+ protected String name;
64
+ protected Type type;
65
+ protected Occur occur;
66
+ protected IRubyObject left;
67
+ protected IRubyObject right;
68
+
69
+ /** values hardcoded from nokogiri/xml/element_content.rb; this
70
+ * makes me uneasy, but it works */
71
+ public enum Type {
72
+ PCDATA(1),
73
+ ELEMENT(2),
74
+ SEQ(3),
75
+ OR(4);
76
+
77
+ private final int value;
78
+ Type(int value)
79
+ {
80
+ this.value = value;
83
81
  }
84
-
85
- public enum Occur {
86
- ONCE (1),
87
- OPT (2),
88
- MULT (3),
89
- PLUS (4);
90
-
91
- private final int value;
92
- Occur(int value) {
93
- this.value = value;
94
- }
95
- public IRubyObject value(Ruby runtime) {
96
- return runtime.newFixnum(value);
97
- }
82
+ public IRubyObject value(Ruby runtime)
83
+ {
84
+ return runtime.newFixnum(value);
98
85
  }
99
-
100
- public XmlElementContent(Ruby runtime, RubyClass klass,
101
- XmlDocument document, Node node) {
102
- this(runtime, klass, document, new NodeIter(node));
103
- element_name = ((Element)node).getAttribute("ename");
104
-
105
- /*
106
- * This is a bit of a hack to match libxml behavior.
107
- *
108
- * If the tree contains but a single group with a single
109
- * element, we can simply return the bare element without the
110
- * surrounding group.
111
- *
112
- * TODO: is SEQ/ONCE with a single child the only case for
113
- * reduction?
114
- *
115
- * - pmahoney
116
- */
117
- if (!this.left.isNil()) {
118
- XmlElementContent left = (XmlElementContent) this.left;
119
- if (type == Type.SEQ &&
120
- occur == Occur.ONCE &&
121
- left.type == Type.ELEMENT &&
122
- right.isNil()) {
123
- this.name = left.name;
124
- this.type = left.type;
125
- this.occur = left.occur;
126
- this.left = this.right; // both nil
127
- }
128
- }
86
+ }
87
+
88
+ public enum Occur {
89
+ ONCE(1),
90
+ OPT(2),
91
+ MULT(3),
92
+ PLUS(4);
93
+
94
+ private final int value;
95
+ Occur(int value)
96
+ {
97
+ this.value = value;
129
98
  }
130
-
131
- public XmlElementContent(Ruby runtime, XmlDocument document, Node node) {
132
- this(runtime, getNokogiriClass(runtime, "Nokogiri::XML::ElementContent"), document, node);
99
+ public IRubyObject value(Ruby runtime)
100
+ {
101
+ return runtime.newFixnum(value);
133
102
  }
134
-
135
- public XmlElementContent(Ruby runtime, RubyClass klass,
136
- XmlDocument doc, NodeIter iter) {
137
- super(runtime, klass);
138
-
139
- setInstanceVariable("@document", doc);
140
-
141
- name = null;
142
- type = Type.SEQ;
143
- occur = Occur.ONCE;
144
- left = runtime.getNil();
145
- right = runtime.getNil();
146
-
147
- apply(runtime, klass, doc, iter);
103
+ }
104
+
105
+ public
106
+ XmlElementContent(Ruby runtime, RubyClass klass,
107
+ XmlDocument document, Node node)
108
+ {
109
+ this(runtime, klass, document, new NodeIter(node));
110
+ element_name = ((Element)node).getAttribute("ename");
111
+
112
+ /*
113
+ * This is a bit of a hack to match libxml behavior.
114
+ *
115
+ * If the tree contains but a single group with a single
116
+ * element, we can simply return the bare element without the
117
+ * surrounding group.
118
+ *
119
+ * TODO: is SEQ/ONCE with a single child the only case for
120
+ * reduction?
121
+ *
122
+ * - pmahoney
123
+ */
124
+ if (!this.left.isNil()) {
125
+ XmlElementContent left = (XmlElementContent) this.left;
126
+ if (type == Type.SEQ &&
127
+ occur == Occur.ONCE &&
128
+ left.type == Type.ELEMENT &&
129
+ right.isNil()) {
130
+ this.name = left.name;
131
+ this.type = left.type;
132
+ this.occur = left.occur;
133
+ this.left = this.right; // both nil
134
+ }
148
135
  }
149
-
150
- protected XmlElementContent(Ruby runtime, RubyClass klass,
151
- Type type, XmlDocument doc, NodeIter iter,
152
- XmlElementContent left) {
153
- super(runtime, klass);
154
-
155
- setInstanceVariable("@document", doc);
156
-
157
- name = null;
158
- this.type = type;
159
- occur = Occur.ONCE;
160
- this.left = left;
161
- right = runtime.getNil();
162
-
163
- switch (type) {
164
- case SEQ:
165
- case OR:
166
- applyGroup(runtime, klass, doc, iter);
167
- default:
168
- // noop
169
- }
136
+ }
137
+
138
+ public
139
+ XmlElementContent(Ruby runtime, XmlDocument document, Node node)
140
+ {
141
+ this(runtime, getNokogiriClass(runtime, "Nokogiri::XML::ElementContent"), document, node);
142
+ }
143
+
144
+ public
145
+ XmlElementContent(Ruby runtime, RubyClass klass,
146
+ XmlDocument doc, NodeIter iter)
147
+ {
148
+ super(runtime, klass);
149
+
150
+ setInstanceVariable("@document", doc);
151
+
152
+ name = null;
153
+ type = Type.SEQ;
154
+ occur = Occur.ONCE;
155
+ left = runtime.getNil();
156
+ right = runtime.getNil();
157
+
158
+ apply(runtime, klass, doc, iter);
159
+ }
160
+
161
+ protected
162
+ XmlElementContent(Ruby runtime, RubyClass klass,
163
+ Type type, XmlDocument doc, NodeIter iter,
164
+ XmlElementContent left)
165
+ {
166
+ super(runtime, klass);
167
+
168
+ setInstanceVariable("@document", doc);
169
+
170
+ name = null;
171
+ this.type = type;
172
+ occur = Occur.ONCE;
173
+ this.left = left;
174
+ right = runtime.getNil();
175
+
176
+ switch (type) {
177
+ case SEQ:
178
+ case OR:
179
+ applyGroup(runtime, klass, doc, iter);
180
+ default:
181
+ // noop
170
182
  }
171
-
172
- /**
173
- * Applies the current node in <code>iter</code> to this content
174
- * model. When finished, <code>iter</code> will point to the last
175
- * processed node.
176
- */
177
- protected void apply(Ruby runtime, RubyClass klass,
178
- XmlDocument doc,
179
- NodeIter iter) {
180
- if (iter.isNull()) return;
181
-
182
- Element elem = (Element) iter.current();
183
-
184
- if (isGroup(elem) && iter.hasChildren()) {
185
- iter.firstChild();
186
- applyGroup(runtime, klass, doc, iter);
187
- iter.parent();
188
- } else if (isElement(elem)) {
189
- name = elem.getAttribute("name");
190
- type = Type.ELEMENT;
191
- }
192
-
193
- iter.nextSibling();
194
- if (iter.isNull()) return;
195
- if (isOccurrence(iter.current())) {
196
- setOccur(((Element)iter.current()).getAttribute("type"));
197
- iter.nextSibling();
198
- }
183
+ }
184
+
185
+ /**
186
+ * Applies the current node in <code>iter</code> to this content
187
+ * model. When finished, <code>iter</code> will point to the last
188
+ * processed node.
189
+ */
190
+ protected void
191
+ apply(Ruby runtime, RubyClass klass,
192
+ XmlDocument doc,
193
+ NodeIter iter)
194
+ {
195
+ if (iter.isNull()) { return; }
196
+
197
+ Element elem = (Element) iter.current();
198
+
199
+ if (isGroup(elem) && iter.hasChildren()) {
200
+ iter.firstChild();
201
+ applyGroup(runtime, klass, doc, iter);
202
+ iter.parent();
203
+ } else if (isElement(elem)) {
204
+ name = elem.getAttribute("name");
205
+ type = Type.ELEMENT;
199
206
  }
200
207
 
201
- protected void applyGroup(Ruby runtime, RubyClass klass,
202
- XmlDocument doc, NodeIter iter) {
203
- // LEFT branch
208
+ iter.nextSibling();
209
+ if (iter.isNull()) { return; }
210
+ if (isOccurrence(iter.current())) {
211
+ setOccur(((Element)iter.current()).getAttribute("type"));
212
+ iter.nextSibling();
213
+ }
214
+ }
204
215
 
205
- if (iter.isNull()) return;
216
+ protected void
217
+ applyGroup(Ruby runtime, RubyClass klass,
218
+ XmlDocument doc, NodeIter iter)
219
+ {
220
+ // LEFT branch
206
221
 
207
- if (left.isNil()) {
208
- left = new XmlElementContent(runtime, klass, doc, iter);
222
+ if (iter.isNull()) { return; }
209
223
 
210
- if (iter.isNull()) return;
224
+ if (left.isNil()) {
225
+ left = new XmlElementContent(runtime, klass, doc, iter);
211
226
 
212
- if (isSeparator(iter.current())) {
213
- setType(((Element)iter.current()).getAttribute("type"));
214
- iter.nextSibling(); // skip separator
215
- }
216
- }
227
+ if (iter.isNull()) { return; }
217
228
 
218
- // RIGHT branch
229
+ if (isSeparator(iter.current())) {
230
+ setType(((Element)iter.current()).getAttribute("type"));
231
+ iter.nextSibling(); // skip separator
232
+ }
233
+ }
219
234
 
220
- if (iter.isNull()) return;
235
+ // RIGHT branch
221
236
 
222
- right = new XmlElementContent(runtime, klass, doc, iter);
237
+ if (iter.isNull()) { return; }
223
238
 
224
- if (iter.isNull()) return;
225
- if (isSeparator(iter.current()))
226
- iter.nextSibling(); // skip separator
227
- if (iter.isNull()) return;
239
+ right = new XmlElementContent(runtime, klass, doc, iter);
228
240
 
229
- // binary tree can only hold two children. If we have more,
230
- // the right child is another tree with the same sequence
231
- // "type". The "left" of the new tree is what we've
232
- // currently consumed as our "right" branch of this tree.
233
- right = new XmlElementContent(runtime, klass, type, doc, iter,
234
- (XmlElementContent) right);
241
+ if (iter.isNull()) { return; }
242
+ if (isSeparator(iter.current())) {
243
+ iter.nextSibling(); // skip separator
235
244
  }
245
+ if (iter.isNull()) { return; }
246
+
247
+ // binary tree can only hold two children. If we have more,
248
+ // the right child is another tree with the same sequence
249
+ // "type". The "left" of the new tree is what we've
250
+ // currently consumed as our "right" branch of this tree.
251
+ right = new XmlElementContent(runtime, klass, type, doc, iter,
252
+ (XmlElementContent) right);
253
+ }
254
+
255
+ /**
256
+ * Set the type based on the separator node type string.
257
+ */
258
+ protected void
259
+ setType(String type)
260
+ {
261
+ if ("|".equals(type)) { this.type = Type.OR; }
262
+ else if (",".equals(type)) { this.type = Type.SEQ; }
263
+ }
264
+
265
+ protected void
266
+ setOccur(String type)
267
+ {
268
+ if ("*".equals(type)) { this.occur = Occur.MULT; }
269
+ else if ("+".equals(type)) { this.occur = Occur.PLUS; }
270
+ }
271
+
272
+ public static boolean
273
+ isGroup(Node node)
274
+ {
275
+ return XmlDtd.nameEquals(node, DTDConfiguration.E_GROUP);
276
+ }
277
+
278
+ // content model element, not Element node type
279
+ public static boolean
280
+ isElement(Node node)
281
+ {
282
+ return XmlDtd.nameEquals(node, DTDConfiguration.E_ELEMENT);
283
+ }
284
+
285
+ public static boolean
286
+ isSeparator(Node node)
287
+ {
288
+ return XmlDtd.nameEquals(node, DTDConfiguration.E_SEPARATOR);
289
+ }
290
+
291
+ public static boolean
292
+ isOccurrence(Node node)
293
+ {
294
+ return XmlDtd.nameEquals(node, DTDConfiguration.E_OCCURRENCE);
295
+ }
296
+
297
+ /**
298
+ * Return the name of the element to which this content model
299
+ * applies. Only works for the root of the tree.
300
+ */
301
+ public IRubyObject
302
+ element_name(ThreadContext context)
303
+ {
304
+ return nonEmptyStringOrNil(context.getRuntime(), element_name);
305
+ }
306
+
307
+ @JRubyMethod
308
+ public IRubyObject
309
+ prefix(ThreadContext context)
310
+ {
311
+ return nonEmptyStringOrNil(context.getRuntime(), getPrefix(name));
312
+ }
313
+
314
+ @JRubyMethod
315
+ public IRubyObject
316
+ name(ThreadContext context)
317
+ {
318
+ return nonEmptyStringOrNil(context.getRuntime(), getLocalPart(name));
319
+ }
320
+
321
+ @JRubyMethod
322
+ public IRubyObject
323
+ type(ThreadContext context)
324
+ {
325
+ return type.value(context.getRuntime());
326
+ }
327
+
328
+ @JRubyMethod
329
+ public IRubyObject
330
+ occur(ThreadContext context)
331
+ {
332
+ return occur.value(context.getRuntime());
333
+ }
334
+
335
+ @JRubyMethod
336
+ public IRubyObject
337
+ c1(ThreadContext context)
338
+ {
339
+ return left;
340
+ }
341
+
342
+ @JRubyMethod
343
+ public IRubyObject
344
+ c2(ThreadContext context)
345
+ {
346
+ return right;
347
+ }
348
+
349
+ /**
350
+ * Iterator for a tree of Nodes. Has a current position that
351
+ * points to a given node. Calling nextSibling() on the last
352
+ * sibling results in a current position of null. This position
353
+ * is not fatal and can be escaped by calling parent() (which
354
+ * moves to the parent of previous sibling). The null position is
355
+ * used to indicate the end of a list.
356
+ */
357
+ protected static class NodeIter
358
+ {
359
+ protected Node pre;
360
+ protected Node cur;
236
361
 
237
362
  /**
238
- * Set the type based on the separator node type string.
363
+ * The first time, we fake a previous sibling element. Thus,
364
+ * initially, current() is null, and the first call should be
365
+ * nextSibling().
239
366
  */
240
- protected void setType(String type) {
241
- if ("|".equals(type)) this.type = Type.OR;
242
- else if (",".equals(type)) this.type = Type.SEQ;
243
- }
244
-
245
- protected void setOccur(String type) {
246
- if ("*".equals(type)) this.occur = Occur.MULT;
247
- else if ("+".equals(type)) this.occur = Occur.PLUS;
367
+ public
368
+ NodeIter(Node node)
369
+ {
370
+ pre = null;
371
+ cur = node.getFirstChild(); // skip root contentModel node
248
372
  }
249
373
 
250
- public static boolean isGroup(Node node) {
251
- return XmlDtd.nameEquals(node, DTDConfiguration.E_GROUP);
374
+ public Node
375
+ current()
376
+ {
377
+ return cur;
252
378
  }
253
379
 
254
- // content model element, not Element node type
255
- public static boolean isElement(Node node) {
256
- return XmlDtd.nameEquals(node, DTDConfiguration.E_ELEMENT);
380
+ public boolean
381
+ isNull()
382
+ {
383
+ return (cur == null);
257
384
  }
258
385
 
259
- public static boolean isSeparator(Node node) {
260
- return XmlDtd.nameEquals(node, DTDConfiguration.E_SEPARATOR);
261
- }
262
-
263
- public static boolean isOccurrence(Node node) {
264
- return XmlDtd.nameEquals(node, DTDConfiguration.E_OCCURRENCE);
386
+ public boolean
387
+ hasChildren()
388
+ {
389
+ return (cur != null && cur.hasChildNodes());
265
390
  }
266
391
 
267
392
  /**
268
- * Return the name of the element to which this content model
269
- * applies. Only works for the root of the tree.
393
+ * Descend to the first child.
270
394
  */
271
- public IRubyObject element_name(ThreadContext context) {
272
- return nonEmptyStringOrNil(context.getRuntime(), element_name);
273
- }
274
-
275
- @JRubyMethod
276
- public IRubyObject prefix(ThreadContext context) {
277
- return nonEmptyStringOrNil(context.getRuntime(), getPrefix(name));
278
- }
279
-
280
- @JRubyMethod
281
- public IRubyObject name(ThreadContext context) {
282
- return nonEmptyStringOrNil(context.getRuntime(), getLocalPart(name));
283
- }
284
-
285
- @JRubyMethod
286
- public IRubyObject type(ThreadContext context) {
287
- return type.value(context.getRuntime());
288
- }
289
-
290
- @JRubyMethod
291
- public IRubyObject occur(ThreadContext context) {
292
- return occur.value(context.getRuntime());
293
- }
294
-
295
- @JRubyMethod
296
- public IRubyObject c1(ThreadContext context) {
297
- return left;
298
- }
299
-
300
- @JRubyMethod
301
- public IRubyObject c2(ThreadContext context) {
302
- return right;
395
+ public Node
396
+ firstChild()
397
+ {
398
+ if (cur == null) { throw new RuntimeException("no children"); }
399
+ Node ch = cur.getFirstChild();
400
+ if (ch == null) { throw new RuntimeException("no children"); }
401
+
402
+ cur = ch;
403
+ return cur;
303
404
  }
304
405
 
305
406
  /**
306
- * Iterator for a tree of Nodes. Has a current position that
307
- * points to a given node. Calling nextSibling() on the last
308
- * sibling results in a current position of null. This position
309
- * is not fatal and can be escaped by calling parent() (which
310
- * moves to the parent of previous sibling). The null position is
311
- * used to indicate the end of a list.
407
+ * Move to the next sibling
312
408
  */
313
- protected static class NodeIter {
314
- protected Node pre;
315
- protected Node cur;
316
-
317
- /**
318
- * The first time, we fake a previous sibling element. Thus,
319
- * initially, current() is null, and the first call should be
320
- * nextSibling().
321
- */
322
- public NodeIter(Node node) {
323
- pre = null;
324
- cur = node.getFirstChild(); // skip root contentModel node
325
- }
326
-
327
- public Node current() {
328
- return cur;
329
- }
330
-
331
- public boolean isNull() {
332
- return (cur == null);
333
- }
334
-
335
- public boolean hasChildren() {
336
- return (cur != null && cur.hasChildNodes());
337
- }
338
-
339
- /**
340
- * Descend to the first child.
341
- */
342
- public Node firstChild() {
343
- if (cur == null) throw new RuntimeException("no children");
344
- Node ch = cur.getFirstChild();
345
- if (ch == null) throw new RuntimeException("no children");
346
-
347
- cur = ch;
348
- return cur;
349
- }
350
-
351
- /**
352
- * Move to the next sibling
353
- */
354
- public Node nextSibling() {
355
- if (cur == null) {
356
- throw new RuntimeException("no next sibling");
357
- } else {
358
- Node ns = cur.getNextSibling();
359
- if (ns == null) {
360
- pre = cur;
361
- cur = null;
362
- } else {
363
- cur = ns;
364
- }
365
- return cur;
366
- }
409
+ public Node
410
+ nextSibling()
411
+ {
412
+ if (cur == null) {
413
+ throw new RuntimeException("no next sibling");
414
+ } else {
415
+ Node ns = cur.getNextSibling();
416
+ if (ns == null) {
417
+ pre = cur;
418
+ cur = null;
419
+ } else {
420
+ cur = ns;
367
421
  }
422
+ return cur;
423
+ }
424
+ }
368
425
 
369
- /**
370
- * Move to the parent.
371
- */
372
- public Node parent() {
373
- if (cur == null) cur = pre;
426
+ /**
427
+ * Move to the parent.
428
+ */
429
+ public Node
430
+ parent()
431
+ {
432
+ if (cur == null) { cur = pre; }
374
433
 
375
- Node p = cur.getParentNode();
376
- if (p == null) throw new RuntimeException("no parent");
434
+ Node p = cur.getParentNode();
435
+ if (p == null) { throw new RuntimeException("no parent"); }
377
436
 
378
- cur = p;
379
- return cur;
380
- }
437
+ cur = p;
438
+ return cur;
381
439
  }
440
+ }
382
441
  }