mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-19 01:44:44 -04:00
new text handling in SVG export seems to work
This commit is contained in:
parent
bf46f84a36
commit
c0b17f8f00
@ -1,11 +1,16 @@
|
|||||||
package de.neemann.digital.draw.graphics;
|
package de.neemann.digital.draw.graphics;
|
||||||
|
|
||||||
|
import de.neemann.digital.draw.graphics.text.ParseException;
|
||||||
|
import de.neemann.digital.draw.graphics.text.Parser;
|
||||||
|
import de.neemann.digital.draw.graphics.text.formatter.SVGFormatter;
|
||||||
|
import de.neemann.digital.draw.graphics.text.text.Decorate;
|
||||||
|
import de.neemann.digital.draw.graphics.text.text.Text;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import static de.neemann.digital.core.element.ElementAttributes.cleanLabel;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subclass of {@link GraphicSVG} which creates the correct SVG representation
|
* Subclass of {@link GraphicSVG} which creates the correct SVG representation
|
||||||
* of an index if used like "x_0".
|
* of an index if used like "x_0".
|
||||||
@ -38,39 +43,15 @@ public class GraphicSVGIndex extends GraphicSVG {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String formatText(String text, Style style) {
|
public String formatText(String text, Style style) {
|
||||||
text = text.replace('~', '\u00ac');
|
try {
|
||||||
return formatSVGIndex(escapeXML(formatIndex(cleanLabel(text))));
|
Text t = new Parser(text).parse();
|
||||||
}
|
if (style.getFontStyle() == Font.ITALIC)
|
||||||
|
t = new Decorate(t, Decorate.Style.MATH);
|
||||||
private String formatIndex(String text) {
|
return SVGFormatter.format(t);
|
||||||
int p = text.lastIndexOf("_");
|
} catch (ParseException e) {
|
||||||
if (p > 0) {
|
e.printStackTrace();
|
||||||
text = text.substring(0, p) + "_{" + text.substring(p + 1) + "}";
|
|
||||||
}
|
}
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private String formatSVGIndex(String text) {
|
|
||||||
int p1;
|
|
||||||
while ((p1 = text.indexOf("_{")) >= 0) {
|
|
||||||
int p2 = text.indexOf('}', p1);
|
|
||||||
if (p2 >= 0) {
|
|
||||||
String ind = text.substring(p1 + 2, p2);
|
|
||||||
if (ind.length() > 0)
|
|
||||||
ind = "<tspan style=\"font-size:80%;baseline-shift:sub\">" + ind + "</tspan>";
|
|
||||||
text = text.substring(0, p1) + ind + text.substring(p2 + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while ((p1 = text.indexOf("^{")) >= 0) {
|
|
||||||
int p2 = text.indexOf('}', p1);
|
|
||||||
if (p2 >= 0) {
|
|
||||||
String ind = text.substring(p1 + 2, p2);
|
|
||||||
if (ind.length() > 0)
|
|
||||||
ind = "<tspan style=\"font-size:80%;baseline-shift:super\">" + ind + "</tspan>";
|
|
||||||
text = text.substring(0, p1) + ind + text.substring(p2 + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,73 @@
|
|||||||
|
package de.neemann.digital.draw.graphics.text.formatter;
|
||||||
|
|
||||||
|
import de.neemann.digital.draw.graphics.text.text.*;
|
||||||
|
import de.neemann.digital.draw.graphics.text.text.Character;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SVG text formatter
|
||||||
|
*/
|
||||||
|
public final class SVGFormatter {
|
||||||
|
|
||||||
|
private SVGFormatter() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats the given text
|
||||||
|
*
|
||||||
|
* @param text the text to format
|
||||||
|
* @return the formatted string
|
||||||
|
*/
|
||||||
|
public static String format(Text text) {
|
||||||
|
return format(text, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String format(Text text, boolean mathMode) {
|
||||||
|
if (text instanceof Simple) {
|
||||||
|
return ((Simple) text).getText();
|
||||||
|
} else if (text instanceof Blank) {
|
||||||
|
return " ";
|
||||||
|
} else if (text instanceof Character) {
|
||||||
|
return character(((Character) text).getChar());
|
||||||
|
} else if (text instanceof Decorate) {
|
||||||
|
Decorate d = (Decorate) text;
|
||||||
|
switch (d.getStyle()) {
|
||||||
|
case MATH:
|
||||||
|
return "<tspan style=\"font-style:italic\">" + format(d.getContent(), true) + "</tspan>";
|
||||||
|
case OVERLINE:
|
||||||
|
return "<tspan style=\"text-decoration: overline\">" + format(d.getContent(), mathMode) + "</tspan>";
|
||||||
|
default:
|
||||||
|
return format(d.getContent(), mathMode);
|
||||||
|
}
|
||||||
|
} else if (text instanceof Index) {
|
||||||
|
Index i = (Index) text;
|
||||||
|
String str = format(i.getVar(), true);
|
||||||
|
if (i.getSubScript() != null)
|
||||||
|
str += "<tspan style=\"font-size:80%;baseline-shift:sub\">" + format(i.getSubScript(), mathMode) + "</tspan>";
|
||||||
|
if (i.getSuperScript() != null)
|
||||||
|
str += "<tspan style=\"font-size:80%;baseline-shift:super\">" + format(i.getSuperScript(), mathMode) + "</tspan>";
|
||||||
|
return str;
|
||||||
|
} else if (text instanceof Sentence) {
|
||||||
|
Sentence s = (Sentence) text;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (Text t : s)
|
||||||
|
sb.append(format(t, mathMode));
|
||||||
|
return sb.toString();
|
||||||
|
} else return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String character(char aChar) {
|
||||||
|
switch (aChar) {
|
||||||
|
case '&':
|
||||||
|
return "&";
|
||||||
|
case '<':
|
||||||
|
return "<";
|
||||||
|
case '>':
|
||||||
|
return ">";
|
||||||
|
case '"':
|
||||||
|
return """;
|
||||||
|
default:
|
||||||
|
return "" + aChar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -12,7 +12,7 @@ public class GraphicSVGIndexTest extends TestCase {
|
|||||||
|
|
||||||
assertEquals("Z<tspan style=\"font-size:80%;baseline-shift:sub\">0</tspan>", gs.formatText("Z_0", Style.NORMAL));
|
assertEquals("Z<tspan style=\"font-size:80%;baseline-shift:sub\">0</tspan>", gs.formatText("Z_0", Style.NORMAL));
|
||||||
assertEquals("<a>", gs.formatText("<a>", Style.NORMAL));
|
assertEquals("<a>", gs.formatText("<a>", Style.NORMAL));
|
||||||
assertEquals("¬Z", gs.formatText("~Z", Style.NORMAL));
|
assertEquals("<tspan style=\"text-decoration: overline\">Z</tspan>", gs.formatText("~Z", Style.NORMAL));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user