package org.jabref.logic.layout.format;
import org.jabref.logic.layout.LayoutFormatter;
import org.jabref.model.strings.StringUtil;
public class RemoveLatexCommandsFormatter implements LayoutFormatter {
@Override
public String format(String field) {
StringBuilder sb = new StringBuilder("");
StringBuilder currentCommand = null;
char c;
boolean escaped = false;
boolean incommand = false;
int i;
for (i = 0; i < field.length(); i++) {
c = field.charAt(i);
if (escaped && (c == '\\')) {
sb.append('\\');
escaped = false;
} else if (c == '\\') {
escaped = true;
incommand = true;
currentCommand = new StringBuilder();
} else if (!incommand && ((c == '{') || (c == '}'))) {
// Swallow the brace.
} else if (Character.isLetter(c) || StringUtil.SPECIAL_COMMAND_CHARS.contains(String.valueOf(c))) {
escaped = false;
if (incommand) {
currentCommand.append(c);
if ((currentCommand.length() == 1)
&& StringUtil.SPECIAL_COMMAND_CHARS.contains(currentCommand.toString())) {
// This indicates that we are in a command of the type \^o or \~{n}
incommand = false;
escaped = false;
}
} else {
sb.append(c);
}
} else if (Character.isLetter(c)) {
escaped = false;
if (incommand) {
// We are in a command, and should not keep the letter.
currentCommand.append(c);
} else {
sb.append(c);
}
} else {
if (!incommand || (!Character.isWhitespace(c) && (c != '{'))) {
sb.append(c);
} else {
if (c != '{') {
sb.append(c);
}
}
incommand = false;
escaped = false;
}
}
return sb.toString();
}
}