blob: 66e18a753d3e72ba3ea9c8c7a0333b83215e6a5f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.ui.internal.util;
/**
* Utility class for preparing strings for display in a FormText widget by
* escaping the necessary characters
*/
public class EscapeUtils {
/**
* Replace every occurrence of &, <, >, ', " by an escape character
* Replace tabs with spaces
* @param value the original string, may not be null
* @return the escaped string
*/
public static String escapeSpecialChars(String value) {
return escapeSpecialChars(value, false);
}
/**
* Replace every occurrence of &, <, >, ', " by an escape character
* but allow <b> and </b> through
* Replace tabs with spaces
* @param value the original string, may not be null
* @return the escaped string
*/
public static String escapeSpecialCharsLeavinggBold(String value) {
return escapeSpecialChars(value, true);
}
public static String escapeAmpersand(String value) {
return value.replaceAll("&", "&amp;"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Escape any ampersands used in a label
**/
public static String escapeForLabel(String message) {
// Make the most common case - i.e. no ampersand the
// most efficient
if (message.indexOf('&') < 0) {
return message;
}
int next = 0;
StringBuffer result = new StringBuffer();
int index = message.indexOf('&');
while (index >= 0) {
result.append(message.substring(next, index + 1));
result.append('&');
next = index + 1;
index = message.indexOf('&', next);
}
result.append(message.substring(next));
return result.toString();
}
private static String escapeSpecialChars(String value, boolean leaveBold) {
if (value == null) {
return null;
}
StringBuffer buf = new StringBuffer();
for (int i = 0; i < value.length(); i++) {
char c = value.charAt(i);
switch (c) {
case '&':
buf.append("&amp;"); //$NON-NLS-1$
break;
case '<':
if (leaveBold) {
int length = value.length();
if (i + 6 < length) {
String tag = value.substring(i, i+7);
if (tag.equalsIgnoreCase("</code>")) { //$NON-NLS-1$
buf.append("</span>"); //$NON-NLS-1$
i+= 6;
continue;
}
}
if (i + 5 < length) {
String tag = value.substring(i, i+6);
if (tag.equalsIgnoreCase("<code>")) { //$NON-NLS-1$
buf.append("<span font=\"code\">"); //$NON-NLS-1$
i+= 5;
continue;
}
}
if (i + 3 < length) {
String tag = value.substring(i, i + 4);
if (tag.equalsIgnoreCase("</b>")) { //$NON-NLS-1$
buf.append(tag);
i += 3;
continue;
}
if (tag.equalsIgnoreCase("<br>")) { //$NON-NLS-1$
buf.append("<br/>"); //$NON-NLS-1$
i+= 3;
continue;
}
}
if (i + 2 < length) {
String tag = value.substring(i, i + 3);
if (tag.equalsIgnoreCase("<b>")) { //$NON-NLS-1$
buf.append(tag);
i += 2;
continue;
}
}
}
buf.append("&lt;"); //$NON-NLS-1$
break;
case '>':
buf.append("&gt;"); //$NON-NLS-1$
break;
case '\'':
buf.append("&apos;"); //$NON-NLS-1$
break;
case '\"':
buf.append("&quot;"); //$NON-NLS-1$
break;
case 160:
buf.append(" "); //$NON-NLS-1$
break;
case '\t':
buf.append(' ');
break;
default:
buf.append(c);
break;
}
}
return buf.toString();
}
}