Source code: com/telefonicasoluciones/search/server/parser/xml/TagToken.java
1 package com.telefonicasoluciones.search.server.parser.xml;
2
3 /**
4 * Representa un HTML tag. Cada tag contiene
5 * un nombre y una lista de atributos.
6 * @author
7 */
8 import java.util.Hashtable;
9 import java.util.ArrayList;
10 import java.util.Enumeration;
11
12 public class TagToken {
13 public static final char ESCAPE = '\\';
14 public static final char QUOTE = '"';
15 public static final char SEP_I = '<';
16 public static final char SEP_F = '>';
17 private String name;
18 private boolean end = false;
19 private AttributeList attr;
20
21 public TagToken(String line) {
22 name = null;
23 attr = new AttributeList();
24 tokenizeAttributes(line);
25 }
26 public String getAttribute(String name) {
27 String newText = attr.get(name);
28 return newText;
29 }
30 public AttributeList getAttributes() {
31 return attr;
32 }
33 public String getName () {
34 if(name.endsWith("/")) {
35 return name.substring(0,name.lastIndexOf("/"));
36 }
37 return name;
38 }
39 public String getQuotedAttribute (String name) {
40 if (attr == null) return null;
41 return attr.getQuoted(name);
42 }
43 public boolean isAttribute (String name) {
44 return attr.exists(name);
45 }
46 public boolean isEndTag () {
47 return end;
48 }
49 private boolean isWhitespace(char c) {
50 return (c==' '||c=='\t'||c=='\n');
51 }
52 private void setAttribute(String s) {
53 int index;
54 String name;
55 String value;
56
57 if (s==null) return;
58 index = s.indexOf('=');
59
60 if (index<0) {
61 setAttribute(s, "");
62 } else {
63 name = s.substring(0, index);
64 value = s.substring(index+1);
65 setAttribute(name, value);
66 }
67 }
68 private void setAttribute(String name, String value) {
69 attr.set(name, value);
70 }
71 private void setName(String name) {
72 if (name==null) {
73 this.name = null;
74 return;
75 }
76 String lcname = name.toLowerCase();
77 if (lcname.charAt(0)=='/') {
78 this.name = lcname.substring(1);
79 end = true;
80 } else {
81 this.name = lcname;
82 }
83 }
84 private void tokenizeAttributes (String args) {
85 Object[] tokens = null;
86 int length;
87
88 tokens = tokenizeString(args);
89 length = tokens.length;
90 setName((String) tokens[0]);
91 if (length<=0) return;
92
93 for (int i=1; i<(length-1); i++) {
94 if (tokens[i] == null) continue;
95 if (tokens[i].equals("=")) {
96 setAttribute((String) tokens[i-1], (String) tokens[i+1]);
97 tokens[i] = null;
98 tokens[i-1] = null;
99 tokens[i+1] = null;
100 }
101 }
102 for (int i=0; i<length; i++)
103 if (tokens[i] != null) setAttribute((String) tokens[i]);
104 }
105 private Object[] tokenizeString(String s) {
106 if (s==null||s.length()==0) return null;
107
108 boolean whitespace = false; //Verdadero si se lee con espacio.
109 boolean escaped = false; //Verdader si el siguiente caracter está escapado.
110 boolean quoted = false; //Verdadero si está entre comillas.
111 int length;
112
113 ArrayList tokens = new ArrayList();
114 StringBuffer buffer = new StringBuffer(255);
115 char[] array = s.toCharArray();
116 length = array.length;
117
118 for(int i=0; i<length; ) {
119 if (array[i] == SEP_I) {
120 i++;
121 continue;
122 }
123 if (array[i] == SEP_F) {
124 break;
125 }
126 if (whitespace) {
127 if (isWhitespace(array[i])) {
128 i++;
129 continue;
130 } else {
131 whitespace = false;
132 }
133 }
134 if (escaped) {
135 buffer.append(array[i++]);
136 escaped = false;
137 continue;
138 } else {
139 if (array[i] == ESCAPE) {
140 escaped = true;
141 i++;
142 continue;
143 }
144 if (array[i] == QUOTE) {
145 quoted = !quoted;
146 i++;
147 continue;
148 }
149 if (!quoted && isWhitespace(array[i])) {
150 tokens.add(buffer.toString());
151 buffer = new StringBuffer(80);
152 whitespace = true;
153 continue;
154 }
155 buffer.append(array[i++]);
156 }
157 }
158 if (!whitespace) tokens.add(buffer.toString());
159 return tokens.toArray();
160 }
161 public String toString () {
162 StringBuffer sb = new StringBuffer();
163 Enumeration list;
164
165 if (end)
166 sb.append("</"+name);
167 else
168 sb.append('<'+name);
169 if (attr != null && attr.size()>0) {
170 sb.append(' ').append(attr.toString());
171 }
172 sb.append('>');
173 return sb.toString();
174 }
175 }