package org.jabref.logic.formatter.bibtexfields; import java.util.Objects; import org.jabref.logic.l10n.Localization; import org.jabref.model.cleanup.Formatter; /** * Removes all matching braces around the string. */ public class RemoveBracesFormatter implements Formatter { @Override public String getName() { return Localization.lang("Remove enclosing braces"); } @Override public String getKey() { return "remove_braces"; } @Override public String format(String value) { Objects.requireNonNull(value); String formatted = value; while ((formatted.length() >= 2) && (formatted.charAt(0) == '{') && (formatted.charAt(formatted.length() - 1) == '}')) { String trimmed = formatted.substring(1, formatted.length() - 1); // It could be that the removed braces were not matching // For example, "{A} test {B}" results in "A} test {B" // In this case, trimmed has a closing } without an opening { before that if (hasNegativeBraceCount(trimmed)) { return formatted; } else { formatted = trimmed; } } return formatted; } @Override public String getDescription() { return Localization.lang("Removes braces encapsulating the complete field content."); } @Override public String getExampleInput() { return "{In CDMA}"; } /** * Check if a string at any point has had more ending } braces than opening { ones. * Will e.g. return true for the string "DNA} blahblal {EPA" * * @param value The string to check. * @return true if at any index the brace count is negative. */ private boolean hasNegativeBraceCount(String value) { int braceCount = 0; for (int index = 0; index < value.length(); index++) { char charAtIndex = value.charAt(index); if (charAtIndex == '{') { braceCount++; } else if (charAtIndex == '}') { braceCount--; } if (braceCount < 0) { return true; } } return false; } }