1 10 package org.mmbase.util.transformers; 11 12 import java.util.HashMap ; 13 import java.util.Map ; 14 15 21 22 public class Xml extends ConfigurableStringTransformer implements CharTransformer { 23 24 public final static int ESCAPE = 1; 25 public final static int ESCAPE_ATTRIBUTE = 2; 26 public final static int ESCAPE_ATTRIBUTE_DOUBLE = 3; 27 public final static int ESCAPE_ATTRIBUTE_SINGLE = 4; 28 public final static int ESCAPE_ATTRIBUTE_HTML = 5; 29 30 31 32 public Xml() { 33 super(); 34 } 35 public Xml(int c) { 36 super(c); 37 } 38 39 41 44 45 public Map transformers() { 46 HashMap h = new HashMap (); 47 h.put("escape_xml".toUpperCase(), new Config(Xml.class, ESCAPE, "Escapes >, < & and \"")); 48 h.put("escape_html".toUpperCase(), new Config(Xml.class, ESCAPE, "Like ESCAPE_XML now.")); 49 h.put("escape_wml".toUpperCase(), new Config(Xml.class, ESCAPE, "Like ESCAPE_XML now.")); 50 h.put("escape_xml_attribute".toUpperCase(), new Config(Xml.class, ESCAPE_ATTRIBUTE, "Escaping in attributes only involves quotes. This simply escapes both types (which is little too much).")); 51 h.put("escape_xml_attribute_double".toUpperCase(), new Config(Xml.class, ESCAPE_ATTRIBUTE_DOUBLE, "Escaping in attributes only involves quotes. This is for double quotes.")); 52 h.put("escape_xml_attribute_single".toUpperCase(), new Config(Xml.class, ESCAPE_ATTRIBUTE_SINGLE, "Escaping in attributes only involves quotes. This is for single quotes.")); 53 h.put("escape_html_attribute".toUpperCase(), new Config(Xml.class, ESCAPE_ATTRIBUTE_HTML, "This escapes all quotes, and also newlines. Handly in some html tags.")); 54 return h; 55 } 56 57 58 59 64 public static String XMLAttributeEscape(String att, char quot) { 65 if (att == null) return ""; 66 StringBuffer sb = new StringBuffer (); 67 char[] data = att.toCharArray(); 68 char c; 69 for (int i =0 ; i < data.length; i++){ 70 c = data[i]; 71 if (c == quot){ 72 if (quot == '"') { 73 sb.append("""); 74 } else { 75 sb.append("'"); 76 } 77 78 } else if (c == '&') { 79 sb.append("&"); 80 } else { 81 sb.append(c); 82 } 83 } 84 return sb.toString(); 85 } 86 90 public static String XMLAttributeEscape(String att) { 91 if (att == null) return ""; 92 StringBuffer sb = new StringBuffer (); 93 char[] data = att.toCharArray(); 94 char c; 95 for (int i =0 ; i < data.length; i++){ 96 c = data[i]; 97 if (c == '"') { 98 sb.append("""); 99 } else if (c == '\'') { 100 sb.append("'"); 101 } else if (c == '&') { 102 sb.append("&"); 103 } else { 104 sb.append(c); 105 } 106 } 107 return sb.toString(); 108 } 109 110 122 public static String XMLEscape(String xml){ 123 if (xml == null) return ""; 124 StringBuffer sb = new StringBuffer (); 125 XMLEscape(xml, sb); 126 return sb.toString(); 127 } 128 129 132 public static void XMLEscape(String xml, StringBuffer sb) { 133 char[] data = xml.toCharArray(); 134 char c; 135 for (int i =0 ; i < data.length; i++){ 136 c = data[i]; 137 if (c =='&'){ 138 sb.append("&"); 139 } 140 else if (c =='<'){ 141 sb.append("<"); 142 } 143 else if (c =='>'){ 144 sb.append(">"); 145 } 146 else if (c =='"'){ 147 sb.append("""); 148 } 149 else { 150 sb.append(c); 151 } 152 } 153 } 154 155 private static String removeNewlines(String incoming) { 156 String ret = incoming.replace('\n', ' '); 157 return ret.replace('\r', ' '); 158 } 159 160 172 public static String XMLUnescape(String data){ 173 if (data == null) return ""; 174 StringBuffer sb = new StringBuffer (); 175 int i; 176 for (i =0; i < data.length();i++){ 177 char c = data.charAt(i); 178 if (c == '&'){ 179 int end = data.indexOf(';',i+1); 180 if (end == -1){ 182 sb.append(c); 183 continue; 184 } 185 String entity = data.substring(i+1,end); 186 i+= entity.length() + 1; 187 if (entity.equals("amp")){ 188 sb.append('&'); 189 } 190 else if (entity.equals("lt")){ 191 sb.append('<'); 192 } 193 else if (entity.equals("gt")){ 194 sb.append('>'); 195 } 196 else if (entity.equals("quot")){ 197 sb.append('"'); 198 } 199 else if (entity.equals("apos")){ 200 sb.append('\''); 201 } 202 else { 203 sb.append("&" + entity + ";"); 204 } 205 } 206 else { 207 sb.append(c); 208 } 209 } 210 return sb.toString(); 211 } 212 213 214 public String transform(String r) { 215 switch(to){ 216 case ESCAPE: return XMLEscape(r); 217 case ESCAPE_ATTRIBUTE: return XMLAttributeEscape(r); 218 case ESCAPE_ATTRIBUTE_DOUBLE: return XMLAttributeEscape(r, '"'); 219 case ESCAPE_ATTRIBUTE_SINGLE: return XMLAttributeEscape(r, '\''); 220 case ESCAPE_ATTRIBUTE_HTML: return removeNewlines(XMLAttributeEscape(r)); 221 default: throw new UnknownCodingException(getClass(), "transform", to); 222 } 223 } 224 public String transformBack(String r) { 225 switch(to){ 227 case ESCAPE: 228 case ESCAPE_ATTRIBUTE: 229 case ESCAPE_ATTRIBUTE_DOUBLE: 230 case ESCAPE_ATTRIBUTE_SINGLE: return XMLUnescape(r); 231 case ESCAPE_ATTRIBUTE_HTML: 232 return XMLUnescape(r); 234 default: throw new UnknownCodingException(getClass(), "transformBack", to); 235 } 236 } 237 public String getEncoding() { 238 switch(to){ 239 case ESCAPE: return "ESCAPE_XML"; 240 case ESCAPE_ATTRIBUTE: return "ESCAPE_XML_ATTRIBUTE"; 241 case ESCAPE_ATTRIBUTE_DOUBLE: return "ESCAPE_XML_ATTRIBUTE_DOUBLE"; 242 case ESCAPE_ATTRIBUTE_SINGLE: return "ESCAPE_XML_ATTRIBUTE_SINGLE"; 243 case ESCAPE_ATTRIBUTE_HTML: return "ESCAPE_HTML_ATTRIBUTE"; 244 default: throw new UnknownCodingException(getClass(), "getEncoding", to); 245 } 246 } 247 } 248 | Popular Tags |