package org.jabref.logic.formatter.bibtexfields; import java.util.Map; import java.util.Objects; import org.jabref.logic.l10n.Localization; import org.jabref.logic.layout.LayoutFormatter; import org.jabref.logic.util.strings.HTMLUnicodeConversionMaps; import org.jabref.model.cleanup.Formatter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class UnicodeToLatexFormatter implements LayoutFormatter, Formatter { private static final Log LOGGER = LogFactory.getLog(UnicodeToLatexFormatter.class); @Override public String format(String text) { String result = Objects.requireNonNull(text); if (result.isEmpty()) { return result; } // Standard symbols for (Map.Entry<String, String> unicodeLatexPair : HTMLUnicodeConversionMaps.UNICODE_LATEX_CONVERSION_MAP .entrySet()) { result = result.replace(unicodeLatexPair.getKey(), unicodeLatexPair.getValue()); } // Combining accents StringBuilder sb = new StringBuilder(); boolean consumed = false; for (int i = 0; i <= (result.length() - 2); i++) { if (!consumed && (i < (result.length() - 1))) { int cpCurrent = result.codePointAt(i); Integer cpNext = result.codePointAt(i + 1); String code = HTMLUnicodeConversionMaps.ESCAPED_ACCENTS.get(cpNext); if (code == null) { sb.append((char) cpCurrent); } else { sb.append("{\\").append(code).append('{').append((char) cpCurrent).append("}}"); consumed = true; } } else { consumed = false; } } if (!consumed) { sb.append((char) result.codePointAt(result.length() - 1)); } result = sb.toString(); // Check if any symbols is not converted for (int i = 0; i <= (result.length() - 1); i++) { int cp = result.codePointAt(i); if (cp >= 129) { LOGGER.warn("Unicode character not converted: " + cp); } } return result; } @Override public String getDescription() { return Localization.lang("Converts Unicode characters to LaTeX encoding."); } @Override public String getExampleInput() { return "Mönch"; } @Override public String getName() { return Localization.lang("Unicode to LaTeX"); } @Override public String getKey() { return "unicode_to_latex"; } }