diff --git a/distribution/ReleaseNotes.txt b/distribution/ReleaseNotes.txt index 72aaf1409..7f704e149 100644 --- a/distribution/ReleaseNotes.txt +++ b/distribution/ReleaseNotes.txt @@ -14,9 +14,11 @@ Head, planned as v0.25 - The layout shape uses a slightly different algorithm to determine the pin positions. You may need to adjust usages of embedded circuits that use the layout shape. - - The CommandLineTester has moved! Tests are now executed like + - The CommandLineTester has moved! Tests are now executed like this: java -cp Digital.jar CLI test [file to test] [-tests [optional file with test cases]] + - Text formatting was reworked. Disable formatting with a '\' in the + beginning does not longer work. Use "\_" to escape a underscore. v0.24, released on 1. Feb. 2020 - Improved SVG export diff --git a/src/main/dig/misc/TextFormatExample.dig b/src/main/dig/misc/TextFormatExample.dig index 6543f3e2b..67589d65a 100644 --- a/src/main/dig/misc/TextFormatExample.dig +++ b/src/main/dig/misc/TextFormatExample.dig @@ -11,7 +11,7 @@ ~A - + In @@ -21,7 +21,7 @@ ~{A<B} - + In @@ -31,7 +31,7 @@ s_1^n - + In @@ -41,7 +41,7 @@ s_1^{n+1} - + In @@ -51,7 +51,7 @@ ~s_1^{n+1} - + In @@ -61,7 +61,7 @@ ~{s_1^{n+1}} - + Text @@ -74,7 +74,7 @@ of ~{s_1^{n+1}} in detail. von ~{s_1^{n+1}} im Detail erklärt.}} - + In @@ -84,7 +84,7 @@ von ~{s_1^{n+1}} im Detail erklärt.}} ~ABC - + In @@ -94,7 +94,7 @@ von ~{s_1^{n+1}} im Detail erklärt.}} ~{A}BC - + In @@ -111,11 +111,31 @@ von ~{s_1^{n+1}} im Detail erklärt.}} Label - \A_B + A\_B + + In + + + Label + A\\B + + + + + + In + + + Label + \foo + + + + diff --git a/src/main/java/de/neemann/digital/draw/graphics/text/Parser.java b/src/main/java/de/neemann/digital/draw/graphics/text/Parser.java index 55f352e82..0517a7394 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/text/Parser.java +++ b/src/main/java/de/neemann/digital/draw/graphics/text/Parser.java @@ -8,14 +8,23 @@ package de.neemann.digital.draw.graphics.text; import de.neemann.digital.draw.graphics.text.text.*; import de.neemann.digital.draw.graphics.text.text.Character; +import java.util.HashMap; + /** * The text parser */ public class Parser { + private static final HashMap COMMANDS = new HashMap<>(); + + static { + COMMANDS.put("sum", "∑"); + COMMANDS.put("prod", "∏"); + } private final String text; private int pos; + /** * Creates a new instance * @@ -67,8 +76,6 @@ public class Parser { * @throws ParseException ParseException */ public Text parse() throws ParseException { - if (text.length() > 0 && text.charAt(0) == '\\') - return new Simple(text.substring(1).trim()); return parse('\0'); } @@ -99,6 +106,24 @@ public class Parser { case '^': getChar(); sentence.getIndex().addSuper(parseBrace()); + break; + case '\\': + getChar(); + char p = peekChar(); + switch (p) { + case '\\': + case '^': + case '_': + sentence.add(new Character(getChar())); + break; + default: + String command = readWord(); + String t = COMMANDS.get(command); + if (t == null) + t = '\\' + command; + sentence.add(new Simple(t).simplify()); + } + break; default: if (isNormal(peekChar())) diff --git a/src/main/java/de/neemann/digital/draw/graphics/text/formatter/LaTeXFormatter.java b/src/main/java/de/neemann/digital/draw/graphics/text/formatter/LaTeXFormatter.java index 75114d904..4a3960e5b 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/text/formatter/LaTeXFormatter.java +++ b/src/main/java/de/neemann/digital/draw/graphics/text/formatter/LaTeXFormatter.java @@ -109,6 +109,10 @@ public final class LaTeXFormatter { return "\\textgreater{}"; case '&': return "\\&"; + case '_': + return "\\_"; + case '\\': + return "\\\\"; case '∑': if (inMath) return "\\sum "; diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java index ca6727445..72a208bd1 100644 --- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java @@ -597,7 +597,7 @@ public class ElementLibrary implements Iterable private String createShortName(String name, String userDefined) { if (userDefined.isEmpty()) { - if (name.endsWith(".dig")) return "\\" + name.substring(0, name.length() - 4); + if (name.endsWith(".dig")) return name.substring(0, name.length() - 4).replace("_", "\\_"); String transName = Lang.getNull("elem_" + name); if (transName == null) diff --git a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java index c74698211..9d7559b47 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java +++ b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java @@ -174,7 +174,7 @@ public final class ShapeFactory { attributes.getLabel(), true, attributes.get(Keys.WIDTH)) { @Override public String format(String s) { - return "\\" + s; + return s.replace("_", "\\_"); } }); diff --git a/src/test/java/de/neemann/digital/draw/graphics/text/ParserTest.java b/src/test/java/de/neemann/digital/draw/graphics/text/ParserTest.java index dd5f69551..e79a2df76 100644 --- a/src/test/java/de/neemann/digital/draw/graphics/text/ParserTest.java +++ b/src/test/java/de/neemann/digital/draw/graphics/text/ParserTest.java @@ -23,6 +23,9 @@ public class ParserTest extends TestCase { t = new Parser("\\I^n_0").parse(); assertTrue(t instanceof Simple); assertEquals("I^n_0", ((Simple) t).getText()); + + t = new Parser("A\\_B").parse(); + assertEquals("A_B", t.toString()); } public void testSimple() throws ParseException { @@ -43,6 +46,9 @@ public class ParserTest extends TestCase { assertEquals("Decorate{≥1, MATH}", new Parser("$≥1$").parse().toString()); assertEquals("Decorate{MR, OVERLINE}", new Parser("~MR").parse().toString()); + + assertEquals("A=∑ b", new Parser("A=\\sum b").parse().toString()); + assertEquals("A=∑^{m}_{n=0}", new Parser("A=\\sum_{n=0}^m").parse().toString()); } }