View Javadoc

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 }