Merge branch '55-translate-greek' into 'master'

Extract translateGreek and add tests

Adds tests to translateGreek. Refactored method to handle more cases (like phi1 instead of just phi)

See merge request !9
This commit is contained in:
Fabian Becker 2015-12-15 11:10:22 +01:00
commit b396af12a0
3 changed files with 134 additions and 130 deletions

View File

@ -300,10 +300,7 @@ public final class PropertySheetPanel extends JPanel implements PropertyChangeLi
continue;
} // end try
// Add some specific display for some greeks here
name = translateGreek(name);
name = eva2.tools.StringTools.humaniseCamelCase(name);
propertyTableModel.addRow(new Object[]{name, newView});
propertyTableModel.addRow(new Object[]{prepareLabel(name), newView});
}
propertyTable.setToolTips(toolTips);
@ -327,6 +324,15 @@ public final class PropertySheetPanel extends JPanel implements PropertyChangeLi
setVisible(true);
}
private String prepareLabel(String label) {
// Add some specific display for some greeks here
label = StringTools.translateGreek(label);
label = StringTools.humaniseCamelCase(label);
label = StringTools.subscriptIndices(label);
label = "<html>" + label + "</html>";
return label;
}
private static JPanel buildTitledSeperator(String title) {
JPanel titledSeperator = new JPanel(new GridBagLayout());
@ -558,116 +564,6 @@ public final class PropertySheetPanel extends JPanel implements PropertyChangeLi
return infoPanel;
}
private String translateGreek(String name) {
// Add some specific display for some greeks here
if (name.equalsIgnoreCase("alpha")) {
return "\u03B1";
}
if (name.equalsIgnoreCase("beta")) {
return "\u03B2";
}
if (name.equalsIgnoreCase("gamma")) {
return "\u03B3";
}
if (name.equalsIgnoreCase("gammab")) {
return "\u0393";
}
if (name.equalsIgnoreCase("delta")) {
return "\u03B4";
}
if (name.equalsIgnoreCase("deltab")) {
return "\u0394";
}
if ((name.equalsIgnoreCase("epsi")) || (name.equalsIgnoreCase("epsilon"))) {
return "\u03B5";
}
if (name.equalsIgnoreCase("zeta")) {
return "\u03B6";
}
if (name.equalsIgnoreCase("theta")) {
return "\u03D1";
}
if (name.equalsIgnoreCase("thetab")) {
return "\u0398";
}
if (name.equalsIgnoreCase("iota")) {
return "\u03B9";
}
if (name.equalsIgnoreCase("kappa")) {
return "\u03BA";
}
if (name.equalsIgnoreCase("lambda")) {
return "\u03BB";
}
if (name.equalsIgnoreCase("lambdab")) {
return "\u039B";
}
if (name.equalsIgnoreCase("rho")) {
return "\u03C1";
}
if (name.equalsIgnoreCase("sigma")) {
return "\u03C3";
}
if (name.equalsIgnoreCase("sigmab")) {
return "\u03A3";
}
if (name.equalsIgnoreCase("tau")) {
return "\u03C4";
}
if (name.equalsIgnoreCase("upsilon")) {
return "\u03C5";
}
if (name.equalsIgnoreCase("upsilonb")) {
return "\u03D2";
}
if (name.equalsIgnoreCase("omega")) {
return "\u03C9";
}
if (name.equalsIgnoreCase("omegab")) {
return "\u03A9";
}
// these are too small
if (name.equalsIgnoreCase("eta")) {
return "\u03B7";
}
if (name.equalsIgnoreCase("psi")) {
return "\u03C8";
}
if (name.equalsIgnoreCase("psib")) {
return "\u03A8";
}
if (name.equalsIgnoreCase("phi")) {
return "\u03D5";
}
if (name.equalsIgnoreCase("phib")) {
return "\u03A6";
}
if (name.equalsIgnoreCase("chi")) {
return "\u03C7";
}
if ((name.equalsIgnoreCase("mu")) || (name.equalsIgnoreCase("my")) || (name.equalsIgnoreCase("myu"))) {
return "\u03BC";
}
if (name.equalsIgnoreCase("nu")) {
return "\u03BD";
}
if (name.equalsIgnoreCase("xi")) {
return "\u03BE";
}
if (name.equalsIgnoreCase("xib")) {
return "\u039E";
}
if (name.equalsIgnoreCase("pi")) {
return "\u03C0";
}
if (name.equalsIgnoreCase("pib")) {
return "\u03A0";
}
return name;
}
/**
* Get the html help file name.
*

View File

@ -15,8 +15,7 @@ public final class StringTools {
/**
* Private constructor to prevent instantiation.
*/
private StringTools() {
}
private StringTools() {}
/**
* Returns a HTML formatted String, in which each line is at most lineBreak
@ -480,6 +479,9 @@ public final class StringTools {
}
/**
* Takes a full package name and returns the string
* after the last period (usually the class name).
*
* @param value The string to cut
* @return Returns the class Name without package.
*/
@ -491,5 +493,87 @@ public final class StringTools {
}
return className; // now is shortName
}
/**
* Takes a string and looks for greek letter names. If found,
* replaces them by their greek unicode counterparts.
*
* @param name A string
* @return String with greek letter names replaced
*/
public static String translateGreek(String name) {
// Add some specific display for some greeks here
final String[][] mapping = {
{ "alpha", "α" },
{ "beta", "β" },
{ "gamma", "γ"},
{ "gammab", "Γ"},
{ "delta", "δ"},
{ "deltab", "Δ"},
{ "epsi", "epsilon", "ε"},
{ "zeta", "ζ"},
{ "theta", "ϑ"},
{ "thetab", "Θ"},
{ "iota", "ι"},
{ "kappa", "κ"},
{ "lambda", "λ"},
{ "lambdab", "Λ"},
{ "rho", "ρ"},
{ "sigma", "σ"},
{ "sigmab", "Σ"},
{ "tau", "τ"},
{ "upsilon", "υ"},
{ "upsilonb", "ϒ"},
{ "omega", "ω"},
{ "omegab", "Ω"},
// these are too small
{ "eta", "η"},
{ "psi", "ψ"},
{ "psib", "Ψ"},
{ "phi", "ϕ"},
{ "phib", "Φ"},
{ "chi", "χ"},
{ "mu", "my", "myu", "μ"},
{ "nu", "ν"},
{ "xi", "ξ"},
{ "xib", "Ξ"},
{ "pi", "π"},
{ "pib", "Π"},
};
for(String[] map : mapping) {
for (int i = 0; i < map.length - 1; i++) {
Pattern p = Pattern.compile("^" + map[i] + "\\d*", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(name);
// Regex: ^symbol[0-9]*
if(m.matches()) {
Pattern replace = Pattern.compile("^" + map[i], Pattern.CASE_INSENSITIVE);
Matcher rm = replace.matcher(name);
// Last element contains mapping
return rm.replaceFirst(map[map.length -1 ]);
}
}
}
return name;
}
/**
* Takes a string and looks for trailing numbers. If present those numbers will
* be replaced by a HTML subscript. Make sure to wrap inside a html block when
* displaying as part of a JLabel.
*
* @param label
* @return
*/
public static String subscriptIndices(String label) {
// Trailing numbers
Pattern p = Pattern.compile("(\\d+)$");
Matcher m = p.matcher(label);
return m.replaceFirst("<sub>$1</sub>");
}
}

View File

@ -1,7 +1,5 @@
package eva2.tools;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.HashMap;
@ -11,21 +9,9 @@ import static org.junit.Assert.assertEquals;
/**
*
* @author becker
*/
public class StringToolsTest {
public StringToolsTest() {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
/**
* Test of humaniseCamelCase method, of class StringTools.
*/
@ -61,6 +47,7 @@ public class StringToolsTest {
map.put("thisIsAwesome", "this-is-awesome");
map.put("THQIsNice", "thq-is-nice");
map.put("iLikeABC", "i-like-abc");
map.put("THIS", "this");
String key, value;
for (Object o : map.entrySet()) {
@ -86,4 +73,41 @@ public class StringToolsTest {
assertEquals("StringTools", StringTools.cutClassName("eva2.tools.StringTools"));
assertEquals("RandomClass", StringTools.cutClassName("eva2.optimization.operator.RandomClass"));
}
@Test
public void testTranslateGreek() {
// Doesn't touch string without greek characters
assertEquals("Not a greek string", StringTools.translateGreek("Not a greek string"));
// Replaces greek characters irregardless of case
assertEquals("τ", StringTools.translateGreek("tau"));
assertEquals("τ", StringTools.translateGreek("Tau"));
assertEquals("τ", StringTools.translateGreek("tAU"));
// Handles multiple values for one letter
assertEquals("μ", StringTools.translateGreek("mu"));
assertEquals("μ", StringTools.translateGreek("my"));
assertEquals("μ", StringTools.translateGreek("myu"));
// Handles indices like sigma1, sigma2
assertEquals("ϕ1", StringTools.translateGreek("phi1"));
assertEquals("ϕ10", StringTools.translateGreek("phi10"));
// Doesn't mess up other strings
assertEquals("Stau", StringTools.translateGreek("Stau"));
assertEquals("taur", StringTools.translateGreek("taur"));
assertEquals("taur12", StringTools.translateGreek("taur12"));
}
@Test
public void testSubscriptIndices() throws Exception {
// Doesn't alter numbers at the start or mid string
assertEquals("12derp", StringTools.subscriptIndices("12derp"));
assertEquals("der12p", StringTools.subscriptIndices("der12p"));
// Replaces trailing numbers with a sub html tag
assertEquals("derp<sub>12</sub>", StringTools.subscriptIndices("derp12"));
assertEquals("This is a string <sub>12</sub>", StringTools.subscriptIndices("This is a string 12"));
assertEquals("ϕ<sub>10</sub>", StringTools.subscriptIndices("ϕ10"));
}
}