package org.jabref.logic.formatter.bibtexfields; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; import org.jabref.logic.l10n.Localization; import org.jabref.logic.util.strings.StringLengthComparator; import org.jabref.model.cleanup.Formatter; public class UnitsToLatexFormatter implements Formatter { private static final List<String> UNIT_LIST = Arrays.asList( "A", // Ampere "Ah", // Ampere hours "B", // Byte "Bq", // Bequerel "C", // Coulomb "F", // Farad "Gy", // Gray "H", // Henry "Hz", // Hertz "J", // Joule "K", // Kelvin "N", // Newton "\\$\\\\Omega\\$", // Ohm "Pa", // Pascal "S", // Siemens, Samples "Sa", // Samples "Sv", // Sv "T", // Tesla "V", // Volt "VA", // Volt ampere "W", // Watt "Wb", // Weber "Wh", // Watt hours "bar", // bar "b", // bit "cd", // candela "dB", // decibel "dBm", // decibel "dBc", //decibel "eV", // electron volts "inch", // inch "kat", // katal "lm", // lumen "lx", // lux "m", // meters "mol", // mol "rad", // radians "s", // seconds "sr" // steradians ); private static final List<String> UNIT_PREFIX_LIST = Arrays.asList( "y", // yocto "z", // zepto "a", // atto "f", // femto "p", // pico "n", // nano "\\$\\\\mu\\$", // micro "u", // micro "m", // milli "c", // centi "d", // deci "", // no prefix "da", // deca "h", // hekto "k", // kilo "M", // mega "G", // giga "T", // tera "P", // peta "E", // exa "Z", // zetta "Y" // yotta ); private final List<String> prefixUnitCombinations; public UnitsToLatexFormatter() { prefixUnitCombinations = new ArrayList<>( UnitsToLatexFormatter.UNIT_LIST.size() * UnitsToLatexFormatter.UNIT_PREFIX_LIST.size()); for (String unit : UnitsToLatexFormatter.UNIT_LIST) { for (String prefix : UnitsToLatexFormatter.UNIT_PREFIX_LIST) { prefixUnitCombinations.add(prefix + unit); } } Collections.sort(prefixUnitCombinations, new StringLengthComparator()); // Sort based on string length } @Override public String format(String text) { Objects.requireNonNull(text); if (text.isEmpty()) { return text; } // Replace the hyphen in 12-bit etc with a non-breaking hyphen, will also avoid bad casing of 12-Bit String result = text.replaceAll("([0-9,\\.]+)-([Bb][Ii][Tt])", "$1\\\\mbox\\{-\\}$2"); // Replace the space in 12 bit etc with a non-breaking space, will also avoid bad casing of 12 Bit result = result.replaceAll("([0-9,\\.]+) ([Bb][Ii][Tt])", "$1~$2"); // For each word in the list for (String listOfWord : prefixUnitCombinations) { // Add {} if the character before is a space, -, /, (, [, or } or if it is at the start of the string but not if it is followed by a } result = result.replaceAll("([0-9])(" + listOfWord + ")", "$1\\{$2\\}"); // Only add brackets to keep case result = result.replaceAll("([0-9])-(" + listOfWord + ")", "$1\\\\mbox\\{-\\}\\{$2\\}"); // Replace hyphen with non-break hyphen result = result.replaceAll("([0-9]) (" + listOfWord + ")", "$1~\\{$2\\}"); // Replace space with a hard space } return result; } @Override public String getDescription() { return Localization.lang("Converts units to LaTeX formatting."); } @Override public String getExampleInput() { return "1 Hz"; } @Override public String getName() { return Localization.lang("Units to LaTeX"); } @Override public String getKey() { return "units_to_latex"; } }