1 /*
2 * Java HTML Tidy - JTidy
3 * HTML parser and pretty printer
4 *
5 * Copyright (c) 1998-2000 World Wide Web Consortium (Massachusetts
6 * Institute of Technology, Institut National de Recherche en
7 * Informatique et en Automatique, Keio University). All Rights
8 * Reserved.
9 *
10 * Contributing Author(s):
11 *
12 * Dave Raggett <dsr@w3.org>
13 * Andy Quick <ac.quick@sympatico.ca> (translation to Java)
14 * Gary L Peskin <garyp@firstech.com> (Java development)
15 * Sami Lempinen <sami@lempinen.net> (release management)
16 * Fabrizio Giustina <fgiust at users.sourceforge.net>
17 *
18 * The contributing author(s) would like to thank all those who
19 * helped with testing, bug fixes, and patience. This wouldn't
20 * have been possible without all of you.
21 *
22 * COPYRIGHT NOTICE:
23 *
24 * This software and documentation is provided "as is," and
25 * the copyright holders and contributing author(s) make no
26 * representations or warranties, express or implied, including
27 * but not limited to, warranties of merchantability or fitness
28 * for any particular purpose or that the use of the software or
29 * documentation will not infringe any third party patents,
30 * copyrights, trademarks or other rights.
31 *
32 * The copyright holders and contributing author(s) will not be
33 * liable for any direct, indirect, special or consequential damages
34 * arising out of any use of the software or documentation, even if
35 * advised of the possibility of such damage.
36 *
37 * Permission is hereby granted to use, copy, modify, and distribute
38 * this source code, or portions hereof, documentation and executables,
39 * for any purpose, without fee, subject to the following restrictions:
40 *
41 * 1. The origin of this source code must not be misrepresented.
42 * 2. Altered versions must be plainly marked as such and must
43 * not be misrepresented as being the original source.
44 * 3. This Copyright notice may not be removed or altered from any
45 * source or altered source distribution.
46 *
47 * The copyright holders and contributing author(s) specifically
48 * permit, without fee, and encourage the use of this source code
49 * as a component for supporting the Hypertext Markup Language in
50 * commercial products. If you use this source code in a product,
51 * acknowledgment is not required but would be appreciated.
52 *
53 */
54
55 package org.w3c.tidy;
56
57 /**
58 * DOMNodeListByTagNameImpl. The items in the <code>NodeList</code> are accessible via an integral index, starting
59 * from 0.
60 * @author Dave Raggett <a href="mailto:dsr@w3.org">dsr@w3.org </a>
61 * @author Andy Quick <a href="mailto:ac.quick@sympatico.ca">ac.quick@sympatico.ca </a> (translation to Java)
62 * @author Fabrizio Giustina
63 * @version $Revision: 779 $ ($Author: fgiust $)
64 */
65 public class DOMNodeListByTagNameImpl implements org.w3c.dom.NodeList
66 {
67
68 /**
69 * First node.
70 */
71 private Node first;
72
73 /**
74 * Tag name.
75 */
76 private String tagName;
77
78 /**
79 * Current index.
80 */
81 private int currIndex;
82
83 /**
84 * Max index (number of nodes).
85 */
86 private int maxIndex;
87
88 /**
89 * Current node.
90 */
91 private Node currNode;
92
93 /**
94 * Instantiates a new DOMNodeListByTagName.
95 * @param first first node.
96 * @param tagName tag name
97 */
98 protected DOMNodeListByTagNameImpl(Node first, String tagName)
99 {
100 this.first = first;
101 this.tagName = tagName;
102 }
103
104 /**
105 * @see org.w3c.dom.NodeList#item
106 */
107 public org.w3c.dom.Node item(int index)
108 {
109 currIndex = 0;
110 maxIndex = index;
111 preTraverse(first);
112
113 if (currIndex > maxIndex && currNode != null)
114 {
115 return currNode.getAdapter();
116 }
117
118 return null;
119 }
120
121 /**
122 * @see org.w3c.dom.NodeList#getLength
123 */
124 public int getLength()
125 {
126 currIndex = 0;
127 maxIndex = Integer.MAX_VALUE;
128 preTraverse(first);
129 return currIndex;
130 }
131
132 /**
133 * Traverse the node list.
134 * @param node Node
135 */
136 protected void preTraverse(Node node)
137 {
138 if (node == null)
139 {
140 return;
141 }
142
143 if (node.type == Node.START_TAG || node.type == Node.START_END_TAG)
144 {
145 if (currIndex <= maxIndex && (tagName.equals("*") || tagName.equals(node.element)))
146 {
147 currIndex += 1;
148 currNode = node;
149 }
150 }
151 if (currIndex > maxIndex)
152 {
153 return;
154 }
155
156 node = node.content;
157 while (node != null)
158 {
159 preTraverse(node);
160 node = node.next;
161 }
162 }
163
164 }