/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2013, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.core.helpers;
/**
* Utility class for transforming strings.
*
* @author Ceki Gülcü
* @author Michael A. McAngus
*/
public class Transform {
private static final String CDATA_START = "<![CDATA[";
private static final String CDATA_END = "]]>";
private static final String CDATA_PSEUDO_END = "]]>";
private static final String CDATA_EMBEDED_END = CDATA_END + CDATA_PSEUDO_END
+ CDATA_START;
private static final int CDATA_END_LEN = CDATA_END.length();
/**
* This method takes a string which may contain HTML tags (ie, <b>,
* <table>, etc) and replaces any '<' and '>' characters with
* respective predefined entity references.
*
* @param input
* The text to be converted.
* @return the string with the tags escaped
*/
public static String escapeTags(final String input) {
// if input is null or zero length or contains no < and > characters, return it as is
if ((input == null) || (input.length() == 0)
|| (input.indexOf("<") == -1 && input.indexOf(">") == -1)) {
return input;
}
StringBuffer buf = new StringBuffer(input);
return escapeTags(buf);
}
/**
* This method takes a StringBuilder which may contain HTML tags (ie, <b>,
* <table>, etc) and replaces any '<' and '>' characters with
* respective predefined entity references.
* @param buf StringBuffer to transform
* @return the string with the tags escaped
*/
public static String escapeTags(final StringBuffer buf) {
for (int i = 0; i < buf.length(); i++) {
char ch = buf.charAt(i);
if (ch == '<') {
buf.replace(i, i + 1, "<");
} else if (ch == '>') {
buf.replace(i, i + 1, ">");
}
}
return buf.toString();
}
/**
* Ensures that embedded CDEnd strings (]]>) are handled properly within
* message, NDC and throwable tag text.
*
* @param output
* Writer. The initial CDSutart (<![CDATA[) and final CDEnd (]]>) of
* the CDATA section are the responsibility of the calling method.
*
* @param str
* The String that is inserted into an existing CDATA Section.
*/
public static void appendEscapingCDATA(StringBuilder output, String str) {
if (str == null) {
return;
}
int end = str.indexOf(CDATA_END);
if (end < 0) {
output.append(str);
return;
}
int start = 0;
while (end > -1) {
output.append(str.substring(start, end));
output.append(CDATA_EMBEDED_END);
start = end + CDATA_END_LEN;
if (start < str.length()) {
end = str.indexOf(CDATA_END, start);
} else {
return;
}
}
output.append(str.substring(start));
}
}