1   
2   package org.freehep.graphics2d;
3   
4   
5   
6   
7   
8   
9   
10  public class TagHandler {
11  
12      public TagHandler() {
13      }
14  
15      
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34      public String parse(TagString string) {
35          String src = string.toString();
36          StringBuffer parsedString = new StringBuffer();
37          StringBuffer textString = new StringBuffer();
38          int i = 0;
39          int p = 0;
40          try {
41              while (i < src.length()) {
42                  switch (src.charAt(i)) {
43                  case '&':
44                      
45                      
46                      i++;
47                      p = i;
48                      while (src.charAt(i) != ';') {
49                          i++;
50                      }
51                      String ent = src.substring(p, i);
52                      if (ent.equals("amp") || ent.equals("gt")
53                              || ent.equals("lt") || ent.equals("quot")
54                              || ent.equals("apos")) {
55                          textString.append(defaultEntity(ent));
56                      } else {
57                          textString.append(entity(ent));
58                      }
59                      break;
60  
61                  case '<':
62                      
63  
64                      
65                      if (textString.length() > 0) {
66                          parsedString.append(text(textString.toString()));
67                          textString = new StringBuffer();
68                      }
69  
70                      
71                      i++;
72                      p = i;
73                      while (src.charAt(i) != '>') {
74                          i++;
75                      }
76  
77                      if (src.charAt(p) == '/') {
78                          parsedString.append(closeTag(src.substring(p + 1, i)));
79                      } else {
80                          parsedString.append(openTag(src.substring(p, i)));
81                      }
82                      break;
83                  default:
84                      
85                      textString.append(src.charAt(i));
86                      break;
87                  } 
88                  i++;
89              } 
90  
91          } catch (ArrayIndexOutOfBoundsException aoobe) {
92              
93              parsedString.append("!PARSEERROR!");
94          }
95  
96          
97          if (textString.length() > 0) {
98              parsedString.append(text(textString.toString()));
99          }
100         return parsedString.toString();
101     }
102 
103     protected String defaultEntity(String entity) {
104         StringBuffer dst = new StringBuffer();
105         if (entity.equals("amp")) {
106             dst.append('&');
107         } else if (entity.equals("gt")) {
108             dst.append('>');
109         } else if (entity.equals("lt")) {
110             dst.append('<');
111         } else if (entity.equals("quot")) {
112             dst.append('"');
113         } else if (entity.equals("apos")) {
114             dst.append('\'');
115         }
116         return dst.toString();
117     }
118 
119     protected String entity(String entity) {
120         StringBuffer dst = new StringBuffer();
121         dst.append('&');
122         dst.append(entity);
123         dst.append(';');
124         return dst.toString();
125     }
126 
127     protected String openTag(String tag) {
128         StringBuffer dst = new StringBuffer();
129         dst.append('<');
130         dst.append(tag);
131         dst.append('>');
132         return dst.toString();
133     }
134 
135     protected String closeTag(String tag) {
136         StringBuffer dst = new StringBuffer();
137         dst.append("</");
138         dst.append(tag);
139         dst.append('>');
140         return dst.toString();
141     }
142 
143     protected String text(String text) {
144         return text;
145     }
146 
147     public static void main(String[] args) {
148         String text = "<Vector<sup><b>Graphics</b></sup> & Card<i><sub>Adapter</sub></i>>";
149 
150         TagString s = new TagString(text);
151         TagHandler handler = new TagHandler();
152         System.out.println("\"" + s + "\"");
153         System.out.println(handler.parse(s));
154     }
155 }