mirror of
https://github.com/octoleo/plantuml.git
synced 2024-12-22 02:49:06 +00:00
version 8050
This commit is contained in:
parent
9f28832b09
commit
c2f885ffb5
@ -2,7 +2,7 @@
|
||||
========================================================================
|
||||
PlantUML : a free UML diagram generator
|
||||
========================================================================
|
||||
(C) Copyright 2009-2013, Arnaud Roques
|
||||
(C) Copyright 2009-2017, Arnaud Roques
|
||||
|
||||
Project Info: http://plantuml.sourceforge.net
|
||||
|
||||
@ -51,6 +51,11 @@
|
||||
<include name="*.png" />
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="build/net/sourceforge/plantuml/math">
|
||||
<fileset dir="src/net/sourceforge/plantuml/math">
|
||||
<include name="*.js" />
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="dist" depends="compile">
|
||||
@ -60,7 +65,7 @@
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="net.sourceforge.plantuml.Run" />
|
||||
<attribute name="SplashScreen-Image" value="net/sourceforge/plantuml/version/logo.png" />
|
||||
<attribute name="Class-Path" value="batik-all-1.7.jar fop.jar vizjs.jar j2v8_win32_x86_64-3.1.6.jar j2v8_linux_x86_64-3.1.6.jar j2v8_macosx_x86_64-3.1.6.jar" />
|
||||
<attribute name="Class-Path" value="batik-all-1.7.jar commons-io-1.3.1.jar commons-logging-1.1.1.jar jeuclid-core-3.1.9.jar xmlgraphics-commons-1.3.1.jar fop.jar vizjs.jar j2v8_win32_x86_64-3.1.6.jar j2v8_linux_x86_64-3.1.6.jar j2v8_macosx_x86_64-3.1.6.jar" />
|
||||
</manifest>
|
||||
</jar>
|
||||
<delete dir="build" />
|
||||
|
2
pom.xml
2
pom.xml
@ -35,7 +35,7 @@
|
||||
|
||||
<groupId>net.sourceforge.plantuml</groupId>
|
||||
<artifactId>plantuml</artifactId>
|
||||
<version>8050-SNAPSHOT</version>
|
||||
<version>8051-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>PlantUML</name>
|
||||
|
@ -30,8 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import net.sourceforge.plantuml.command.BlocLines;
|
||||
import net.sourceforge.plantuml.command.Command;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
@ -55,9 +53,8 @@ public abstract class AbstractPSystem implements Diagram {
|
||||
toAppend.append(Version.versionString());
|
||||
toAppend.append("(" + Version.compileTimeString() + ")\n");
|
||||
toAppend.append("(" + License.getCurrent() + " source distribution)\n");
|
||||
final Properties p = System.getProperties();
|
||||
for (String name : OptionPrint.interestingProperties()) {
|
||||
toAppend.append(p.getProperty(name));
|
||||
toAppend.append(name);
|
||||
toAppend.append('\n');
|
||||
}
|
||||
return toAppend.toString();
|
||||
|
@ -122,7 +122,8 @@ public enum FileFormat {
|
||||
if (cpt == 0) {
|
||||
return changeName(fileName, getFileSuffix());
|
||||
}
|
||||
return changeName(fileName, "_" + String.format("%03d", cpt) + getFileSuffix());
|
||||
return changeName(fileName, OptionFlags.getInstance().getFileSeparator() + String.format("%03d", cpt)
|
||||
+ getFileSuffix());
|
||||
}
|
||||
|
||||
private String changeName(String fileName, String replacement) {
|
||||
@ -145,6 +146,7 @@ public enum FileFormat {
|
||||
if (i == 0) {
|
||||
return name;
|
||||
}
|
||||
return name.replaceAll("\\" + getFileSuffix() + "$", "_" + String.format("%03d", i) + getFileSuffix());
|
||||
return name.replaceAll("\\" + getFileSuffix() + "$",
|
||||
OptionFlags.getInstance().getFileSeparator() + String.format("%03d", i) + getFileSuffix());
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ public class OptionFlags {
|
||||
// static public final boolean TRACE_DOT = false;
|
||||
|
||||
static public boolean ALLOW_INCLUDE = true;
|
||||
|
||||
|
||||
static public void setMaxPixel(int max) {
|
||||
ImageBuilder.setMaxPixel(max);
|
||||
}
|
||||
@ -63,6 +63,7 @@ public class OptionFlags {
|
||||
static public final boolean SWI2 = false;
|
||||
// static public final boolean USE_COMPOUND = false;
|
||||
static public final boolean OMEGA_CROSSING = false;
|
||||
|
||||
// static public final boolean LINK_BETWEEN_FIELDS = true;
|
||||
|
||||
// static public final boolean USE_JDOT = false;
|
||||
@ -111,6 +112,7 @@ public class OptionFlags {
|
||||
// private boolean failOnError;
|
||||
private boolean encodesprite;
|
||||
private boolean overwrite;
|
||||
private String fileSeparator = "_";
|
||||
private File logData;
|
||||
|
||||
private OptionFlags() {
|
||||
@ -291,4 +293,12 @@ public class OptionFlags {
|
||||
this.overwrite = overwrite;
|
||||
}
|
||||
|
||||
public String getFileSeparator() {
|
||||
return fileSeparator;
|
||||
}
|
||||
|
||||
public void setFileSeparator(String fileSeparator) {
|
||||
this.fileSeparator = fileSeparator;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -31,6 +31,7 @@
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.InetAddress;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@ -38,6 +39,7 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.GraphvizUtils;
|
||||
@ -139,9 +141,8 @@ public class OptionPrint {
|
||||
public static void printVersion() throws InterruptedException {
|
||||
System.out.println("PlantUML version " + Version.versionString() + " (" + Version.compileTimeString() + ")");
|
||||
System.out.println("(" + License.getCurrent() + " source distribution)");
|
||||
final Properties p = System.getProperties();
|
||||
for (String name : interestingProperties()) {
|
||||
System.out.println(p.getProperty(name));
|
||||
for (String v : interestingProperties()) {
|
||||
System.out.println(v);
|
||||
}
|
||||
for (String v : interestingValues()) {
|
||||
System.out.println(v);
|
||||
@ -154,11 +155,20 @@ public class OptionPrint {
|
||||
}
|
||||
|
||||
public static Collection<String> interestingProperties() {
|
||||
return Arrays.asList("java.runtime.name", "java.vm.name", "java.runtime.version", "os.name", "file.encoding");
|
||||
final Properties p = System.getProperties();
|
||||
final List<String> all = Arrays.asList("java.runtime.name", "Java Runtime", "java.vm.name", "JVM",
|
||||
"java.runtime.version", "Java Version", "os.name", "Operating System", "os.version", "OS Version",
|
||||
"file.encoding", "Default Encoding", "user.language", "Language", "user.country", "Country");
|
||||
final List<String> result = new ArrayList<String>();
|
||||
for (int i = 0; i < all.size(); i += 2) {
|
||||
result.add(all.get(i + 1) + ": " + p.getProperty(all.get(i)));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Collection<String> interestingValues() {
|
||||
final List<String> strings = new ArrayList<String>();
|
||||
strings.add("Machine: " + getHostName());
|
||||
strings.add("PLANTUML_LIMIT_SIZE: " + GraphvizUtils.getenvImageLimit());
|
||||
strings.add("Processors: " + Runtime.getRuntime().availableProcessors());
|
||||
final long freeMemory = Runtime.getRuntime().freeMemory();
|
||||
@ -174,6 +184,30 @@ public class OptionPrint {
|
||||
return Collections.unmodifiableCollection(strings);
|
||||
}
|
||||
|
||||
private static String hostname;
|
||||
|
||||
public static synchronized String getHostName() {
|
||||
if (hostname == null) {
|
||||
hostname = getHostNameSlow();
|
||||
}
|
||||
return hostname;
|
||||
}
|
||||
|
||||
private static String getHostNameSlow() {
|
||||
try {
|
||||
final InetAddress addr = InetAddress.getLocalHost();
|
||||
return addr.getHostName();
|
||||
} catch (Throwable e) {
|
||||
final Map<String, String> env = System.getenv();
|
||||
if (env.containsKey("COMPUTERNAME")) {
|
||||
return env.get("COMPUTERNAME");
|
||||
} else if (env.containsKey("HOSTNAME")) {
|
||||
return env.get("HOSTNAME");
|
||||
}
|
||||
}
|
||||
return "Unknown Computer";
|
||||
}
|
||||
|
||||
private static String format(final long value) {
|
||||
return String.format(Locale.US, "%,d", value);
|
||||
}
|
||||
|
@ -52,8 +52,8 @@ import net.sourceforge.plantuml.donors.PSystemDonorsFactory;
|
||||
import net.sourceforge.plantuml.eggs.PSystemAppleTwoFactory;
|
||||
import net.sourceforge.plantuml.eggs.PSystemCharlieFactory;
|
||||
import net.sourceforge.plantuml.eggs.PSystemEggFactory;
|
||||
import net.sourceforge.plantuml.eggs.PSystemEmptyFactory;
|
||||
import net.sourceforge.plantuml.eggs.PSystemLostFactory;
|
||||
import net.sourceforge.plantuml.eggs.PSystemMemorialFactory;
|
||||
import net.sourceforge.plantuml.eggs.PSystemPathFactory;
|
||||
import net.sourceforge.plantuml.eggs.PSystemRIPFactory;
|
||||
import net.sourceforge.plantuml.flowdiagram.FlowDiagramFactory;
|
||||
@ -61,6 +61,7 @@ import net.sourceforge.plantuml.font.PSystemListFontsFactory;
|
||||
import net.sourceforge.plantuml.jcckit.PSystemJcckitFactory;
|
||||
import net.sourceforge.plantuml.jungle.PSystemTreeFactory;
|
||||
import net.sourceforge.plantuml.logo.PSystemLogoFactory;
|
||||
import net.sourceforge.plantuml.math.PSystemMathFactory;
|
||||
import net.sourceforge.plantuml.openiconic.PSystemListOpenIconicFactory;
|
||||
import net.sourceforge.plantuml.openiconic.PSystemOpenIconicFactory;
|
||||
import net.sourceforge.plantuml.oregon.PSystemOregonFactory;
|
||||
@ -70,8 +71,9 @@ import net.sourceforge.plantuml.project2.PSystemProjectFactory2;
|
||||
import net.sourceforge.plantuml.salt.PSystemSaltFactory;
|
||||
import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory;
|
||||
import net.sourceforge.plantuml.statediagram.StateDiagramFactory;
|
||||
import net.sourceforge.plantuml.stats.PSystemStatsFactory;
|
||||
import net.sourceforge.plantuml.stats.StatsUtils;
|
||||
import net.sourceforge.plantuml.sudoku.PSystemSudokuFactory;
|
||||
import net.sourceforge.plantuml.turing.PSystemTuringFactory;
|
||||
import net.sourceforge.plantuml.ugraphic.sprite.PSystemListInternalSpritesFactory;
|
||||
import net.sourceforge.plantuml.version.License;
|
||||
import net.sourceforge.plantuml.version.PSystemLicenseFactory;
|
||||
@ -83,34 +85,41 @@ public class PSystemBuilder {
|
||||
|
||||
final public Diagram createPSystem(final List<CharSequence2> strings2) {
|
||||
|
||||
final List<PSystemFactory> factories = getAllFactories();
|
||||
final long now = System.currentTimeMillis();
|
||||
Diagram result = null;
|
||||
try {
|
||||
final List<PSystemFactory> factories = getAllFactories();
|
||||
final DiagramType type = DiagramType.getTypeFromArobaseStart(strings2.get(0).toString2());
|
||||
|
||||
final DiagramType type = DiagramType.getTypeFromArobaseStart(strings2.get(0).toString2());
|
||||
final UmlSource umlSource = new UmlSource(strings2, type == DiagramType.UML);
|
||||
final DiagramType diagramType = umlSource.getDiagramType();
|
||||
final List<PSystemError> errors = new ArrayList<PSystemError>();
|
||||
for (PSystemFactory systemFactory : factories) {
|
||||
if (diagramType != systemFactory.getDiagramType()) {
|
||||
continue;
|
||||
}
|
||||
final Diagram sys = systemFactory.createSystem(umlSource);
|
||||
if (isOk(sys)) {
|
||||
result = sys;
|
||||
return sys;
|
||||
}
|
||||
errors.add((PSystemError) sys);
|
||||
}
|
||||
|
||||
final UmlSource umlSource = new UmlSource(strings2, type == DiagramType.UML);
|
||||
final DiagramType diagramType = umlSource.getDiagramType();
|
||||
final List<PSystemError> errors = new ArrayList<PSystemError>();
|
||||
for (PSystemFactory systemFactory : factories) {
|
||||
if (diagramType != systemFactory.getDiagramType()) {
|
||||
continue;
|
||||
final PSystemError err = PSystemError.merge(errors);
|
||||
result = err;
|
||||
return err;
|
||||
} finally {
|
||||
if (result != null) {
|
||||
StatsUtils.onceMoreParse(System.currentTimeMillis() - now, result.getClass());
|
||||
}
|
||||
final Diagram sys = systemFactory.createSystem(umlSource);
|
||||
if (isOk(sys)) {
|
||||
return sys;
|
||||
}
|
||||
errors.add((PSystemError) sys);
|
||||
}
|
||||
|
||||
final PSystemError err = PSystemError.merge(errors);
|
||||
// if (OptionFlags.getInstance().isQuiet() == false) {
|
||||
// err.print(System.err);
|
||||
// }
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
private List<PSystemFactory> getAllFactories() {
|
||||
final List<PSystemFactory> factories = new ArrayList<PSystemFactory>();
|
||||
factories.add(new PSystemEmptyFactory());
|
||||
factories.add(new SequenceDiagramFactory());
|
||||
factories.add(new ClassDiagramFactory());
|
||||
factories.add(new ActivityDiagramFactory());
|
||||
@ -139,8 +148,9 @@ public class PSystemBuilder {
|
||||
factories.add(new PSystemJcckitFactory(DiagramType.UML));
|
||||
factories.add(new PSystemLogoFactory());
|
||||
factories.add(new PSystemSudokuFactory());
|
||||
factories.add(new PSystemTuringFactory());
|
||||
}
|
||||
factories.add(new PSystemMathFactory(DiagramType.MATH));
|
||||
factories.add(new PSystemStatsFactory());
|
||||
factories.add(new PSystemCreoleFactory());
|
||||
factories.add(new PSystemEggFactory());
|
||||
factories.add(new PSystemAppleTwoFactory());
|
||||
@ -149,7 +159,6 @@ public class PSystemBuilder {
|
||||
factories.add(new PSystemPathFactory());
|
||||
factories.add(new PSystemOregonFactory());
|
||||
factories.add(new PSystemCharlieFactory());
|
||||
factories.add(new PSystemMemorialFactory());
|
||||
if (License.getCurrent() == License.GPL || License.getCurrent() == License.GPLV2) {
|
||||
factories.add(new PSystemXearthFactory());
|
||||
}
|
||||
|
@ -45,6 +45,7 @@ import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.core.UmlSource;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.txt.UGraphicTxt;
|
||||
@ -108,7 +109,7 @@ public class PSystemError extends AbstractPSystem {
|
||||
|
||||
}
|
||||
final boolean useRed = fileFormat.isUseRedForError();
|
||||
final GraphicStrings result = GraphicStrings.createDefault(getHtmlStrings(useRed), useRed);
|
||||
final TextBlockBackcolored result = GraphicStrings.createForError(getHtmlStrings(useRed), useRed);
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
|
@ -47,28 +47,30 @@ import net.sourceforge.plantuml.cucadiagram.CucaDiagram;
|
||||
import net.sourceforge.plantuml.html.CucaDiagramHtmlMaker;
|
||||
import net.sourceforge.plantuml.png.PngSplitter;
|
||||
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
|
||||
import net.sourceforge.plantuml.stats.StatsUtils;
|
||||
|
||||
public class PSystemUtils {
|
||||
|
||||
public static List<File> exportDiagrams(Diagram system, File suggestedFile, FileFormatOption fileFormatOption)
|
||||
throws IOException {
|
||||
// if (system instanceof UmlDiagram) {
|
||||
// final ISkinParam skinParam = ((UmlDiagram) system).getSkinParam();
|
||||
// fileFormatOption = fileFormatOption.withSvgLinkTarget(skinParam.getSvgLinkTarget());
|
||||
// }
|
||||
if (system instanceof NewpagedDiagram) {
|
||||
return exportDiagramsNewpaged((NewpagedDiagram) system, suggestedFile, fileFormatOption);
|
||||
final long now = System.currentTimeMillis();
|
||||
try {
|
||||
if (system instanceof NewpagedDiagram) {
|
||||
return exportDiagramsNewpaged((NewpagedDiagram) system, suggestedFile, fileFormatOption);
|
||||
}
|
||||
if (system instanceof SequenceDiagram) {
|
||||
return exportDiagramsSequence((SequenceDiagram) system, suggestedFile, fileFormatOption);
|
||||
}
|
||||
if (system instanceof CucaDiagram) {
|
||||
return exportDiagramsCuca((CucaDiagram) system, suggestedFile, fileFormatOption);
|
||||
}
|
||||
if (system instanceof ActivityDiagram3) {
|
||||
return exportDiagramsActivityDiagram3((ActivityDiagram3) system, suggestedFile, fileFormatOption);
|
||||
}
|
||||
return exportDiagramsDefault(system, suggestedFile, fileFormatOption);
|
||||
} finally {
|
||||
StatsUtils.onceMoreGenerate(System.currentTimeMillis() - now, system.getClass(), fileFormatOption.getFileFormat());
|
||||
}
|
||||
if (system instanceof SequenceDiagram) {
|
||||
return exportDiagramsSequence((SequenceDiagram) system, suggestedFile, fileFormatOption);
|
||||
}
|
||||
if (system instanceof CucaDiagram) {
|
||||
return exportDiagramsCuca((CucaDiagram) system, suggestedFile, fileFormatOption);
|
||||
}
|
||||
if (system instanceof ActivityDiagram3) {
|
||||
return exportDiagramsActivityDiagram3((ActivityDiagram3) system, suggestedFile, fileFormatOption);
|
||||
}
|
||||
return exportDiagramsDefault(system, suggestedFile, fileFormatOption);
|
||||
}
|
||||
|
||||
private static List<File> exportDiagramsNewpaged(NewpagedDiagram system, File suggestedFile,
|
||||
|
@ -46,6 +46,7 @@ import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.preproc.Defines;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
|
||||
@ -150,7 +151,7 @@ public class SourceStringReader {
|
||||
}
|
||||
|
||||
private void noStartumlFound(OutputStream os, FileFormatOption fileFormatOption) throws IOException {
|
||||
final GraphicStrings error = GraphicStrings.createDefault(Arrays.asList("No @startuml found"),
|
||||
final TextBlockBackcolored error = GraphicStrings.createForError(Arrays.asList("No @startuml found"),
|
||||
fileFormatOption.isUseRedForError());
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, error.getBackcolor(), null,
|
||||
null, 0, 0, null, false);
|
||||
|
@ -34,7 +34,6 @@ import java.awt.Color;
|
||||
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorSimple;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
|
||||
public class SplitParam {
|
||||
|
||||
|
@ -70,9 +70,9 @@ import net.sourceforge.plantuml.mjpeg.MJPEGGenerator;
|
||||
import net.sourceforge.plantuml.pdf.PdfConverter;
|
||||
import net.sourceforge.plantuml.svek.EmptySvgException;
|
||||
import net.sourceforge.plantuml.svek.GraphvizCrash;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.UImage;
|
||||
@ -244,7 +244,12 @@ public abstract class UmlDiagram extends AbstractPSystem implements Diagram, Ann
|
||||
|
||||
public static void exportDiagramError(OutputStream os, Throwable exception, FileFormatOption fileFormat,
|
||||
String metadata, String flash, List<String> strings) throws IOException {
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
|
||||
if (fileFormat.getFileFormat() == FileFormat.ATXT || fileFormat.getFileFormat() == FileFormat.UTXT) {
|
||||
exportDiagramErrorText(os, exception, strings);
|
||||
return;
|
||||
}
|
||||
|
||||
strings.addAll(CommandExecutionResult.getStackTrace(exception));
|
||||
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, HtmlColorUtils.WHITE,
|
||||
@ -256,8 +261,7 @@ public abstract class UmlDiagram extends AbstractPSystem implements Diagram, Ann
|
||||
GraphvizCrash.addDecodeHint(strings);
|
||||
}
|
||||
|
||||
final GraphicStrings graphicStrings = new GraphicStrings(strings, font, HtmlColorUtils.BLACK,
|
||||
HtmlColorUtils.WHITE, UAntiAliasing.ANTI_ALIASING_ON, IconLoader.getRandom(),
|
||||
final TextBlockBackcolored graphicStrings = GraphicStrings.createBlackOnWhite(strings, IconLoader.getRandom(),
|
||||
GraphicPosition.BACKGROUND_CORNER_TOP_RIGHT);
|
||||
|
||||
if (im == null) {
|
||||
@ -275,6 +279,18 @@ public abstract class UmlDiagram extends AbstractPSystem implements Diagram, Ann
|
||||
imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private static void exportDiagramErrorText(OutputStream os, Throwable exception, List<String> strings) {
|
||||
final PrintWriter pw = new PrintWriter(os);
|
||||
exception.printStackTrace(pw);
|
||||
pw.println();
|
||||
pw.println();
|
||||
for (String s : strings) {
|
||||
s = s.replaceAll("\\</?\\w+?\\>", "");
|
||||
pw.println(s);
|
||||
}
|
||||
pw.flush();
|
||||
}
|
||||
|
||||
public String getFlashData() {
|
||||
final UmlSource source = getSource();
|
||||
if (source == null) {
|
||||
|
@ -142,7 +142,7 @@ public class UrlBuilder {
|
||||
final Pattern2 p = MyPattern.cmpile("[%s]*" + URL_PATTERN + "[%s]*");
|
||||
final Matcher2 m = p.matcher(label);
|
||||
if (m.find() == false) {
|
||||
throw new IllegalStateException();
|
||||
return label;
|
||||
}
|
||||
final String url = m.group(0);
|
||||
final int x = label.indexOf(url);
|
||||
|
@ -59,7 +59,8 @@ public class InstructionList extends WithNote implements Instruction, Instructio
|
||||
}
|
||||
|
||||
public boolean isOnlySingleStop() {
|
||||
return all.size() == 1 && getLast() instanceof InstructionStop;
|
||||
return all.size() == 1 && getLast() instanceof InstructionStop
|
||||
&& ((InstructionStop) getLast()).hasNotes() == false;
|
||||
}
|
||||
|
||||
public InstructionList(Swimlane defaultSwimlane) {
|
||||
@ -126,16 +127,26 @@ public class InstructionList extends WithNote implements Instruction, Instructio
|
||||
}
|
||||
|
||||
public Swimlane getSwimlaneIn() {
|
||||
if (getSwimlanes().size() == 0) {
|
||||
return null;
|
||||
}
|
||||
return all.get(0).getSwimlaneIn();
|
||||
return defaultSwimlane;
|
||||
// final Set<Swimlane> swimlanes = getSwimlanes();
|
||||
// if (swimlanes.size() == 0) {
|
||||
// return null;
|
||||
// }
|
||||
// if (swimlanes.size() == 1) {
|
||||
// return swimlanes.iterator().next();
|
||||
// }
|
||||
// System.err.println("foo1="+getClass());
|
||||
// return all.get(0).getSwimlaneIn();
|
||||
}
|
||||
|
||||
public Swimlane getSwimlaneOut() {
|
||||
if (getSwimlanes().size() == 0) {
|
||||
final Set<Swimlane> swimlanes = getSwimlanes();
|
||||
if (swimlanes.size() == 0) {
|
||||
return null;
|
||||
}
|
||||
if (swimlanes.size() == 1) {
|
||||
return swimlanes.iterator().next();
|
||||
}
|
||||
return getLast().getSwimlaneOut();
|
||||
}
|
||||
|
||||
|
@ -62,4 +62,8 @@ public class WithNote {
|
||||
return Collections.unmodifiableCollection(notes);
|
||||
}
|
||||
|
||||
public boolean hasNotes() {
|
||||
return notes.size() > 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -259,7 +259,7 @@ class FtileRepeat extends AbstractFtile {
|
||||
}
|
||||
|
||||
public void drawU(UGraphic ug) {
|
||||
throw new UnsupportedOperationException();
|
||||
// throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) {
|
||||
|
@ -38,7 +38,6 @@ import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import net.sourceforge.plantuml.Direction;
|
||||
import net.sourceforge.plantuml.ISkinSimple;
|
||||
import net.sourceforge.plantuml.activitydiagram3.LinkRendering;
|
||||
import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractConnection;
|
||||
import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile;
|
||||
|
@ -370,4 +370,8 @@ public class PlantUmlTask extends Task {
|
||||
OptionFlags.getInstance().setOverwrite(flag);
|
||||
}
|
||||
|
||||
public void setFileSeparator(String s) {
|
||||
OptionFlags.getInstance().setFileSeparator(s);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -25,14 +25,14 @@ package net.sourceforge.plantuml.api;
|
||||
|
||||
public interface INumberAnalyzed {
|
||||
|
||||
public int getNb();
|
||||
public long getNb();
|
||||
|
||||
public int getSum();
|
||||
public long getSum();
|
||||
|
||||
public int getMin();
|
||||
public long getMin();
|
||||
|
||||
public int getMax();
|
||||
public long getMax();
|
||||
|
||||
public int getMean();
|
||||
public long getMean();
|
||||
|
||||
}
|
||||
|
@ -23,18 +23,61 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.api;
|
||||
|
||||
import java.util.prefs.Preferences;
|
||||
|
||||
public class NumberAnalyzed implements INumberAnalyzed {
|
||||
|
||||
private int nb;
|
||||
private int sum;
|
||||
private int min;
|
||||
private int max;
|
||||
|
||||
public NumberAnalyzed() {
|
||||
private long nb;
|
||||
private long sum;
|
||||
private long min;
|
||||
private long max;
|
||||
private final String name;
|
||||
|
||||
public NumberAnalyzed(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
private NumberAnalyzed(int nb, int sum, int min, int max) {
|
||||
public NumberAnalyzed() {
|
||||
this("");
|
||||
}
|
||||
|
||||
public void save(Preferences prefs) {
|
||||
if (name.length() == 0) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
prefs.putLong(name + ".nb", nb);
|
||||
prefs.putLong(name + ".sum", sum);
|
||||
prefs.putLong(name + ".min", min);
|
||||
prefs.putLong(name + ".max", max);
|
||||
}
|
||||
|
||||
public static NumberAnalyzed load(String name, Preferences prefs) {
|
||||
final long nb = prefs.getLong(name + ".nb", 0);
|
||||
if (nb == 0) {
|
||||
return null;
|
||||
}
|
||||
final long sum = prefs.getLong(name + ".sum", 0);
|
||||
if (sum == 0) {
|
||||
return null;
|
||||
}
|
||||
final long min = prefs.getLong(name + ".min", 0);
|
||||
if (min == 0) {
|
||||
return null;
|
||||
}
|
||||
final long max = prefs.getLong(name + ".max", 0);
|
||||
if (max == 0) {
|
||||
return null;
|
||||
}
|
||||
return new NumberAnalyzed(name, nb, sum, min, max);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized String toString() {
|
||||
return "sum=" + sum + " nb=" + nb + " min=" + min + " max=" + max + " mean=" + getMean();
|
||||
}
|
||||
|
||||
private NumberAnalyzed(String name, long nb, long sum, long min, long max) {
|
||||
this(name);
|
||||
this.nb = nb;
|
||||
this.sum = sum;
|
||||
this.min = min;
|
||||
@ -42,11 +85,11 @@ public class NumberAnalyzed implements INumberAnalyzed {
|
||||
}
|
||||
|
||||
public synchronized INumberAnalyzed getCopyImmutable() {
|
||||
final NumberAnalyzed copy = new NumberAnalyzed(nb, sum, min, max);
|
||||
final NumberAnalyzed copy = new NumberAnalyzed(name, nb, sum, min, max);
|
||||
return copy;
|
||||
}
|
||||
|
||||
public synchronized void addValue(int v) {
|
||||
public synchronized void addValue(long v) {
|
||||
nb++;
|
||||
if (nb == 1) {
|
||||
sum = v;
|
||||
@ -63,27 +106,40 @@ public class NumberAnalyzed implements INumberAnalyzed {
|
||||
}
|
||||
}
|
||||
|
||||
synchronized public final int getNb() {
|
||||
public synchronized void add(NumberAnalyzed other) {
|
||||
synchronized (other) {
|
||||
this.sum += other.sum;
|
||||
this.nb += other.nb;
|
||||
this.min = Math.min(this.min, other.min);
|
||||
this.max = Math.max(this.max, other.max);
|
||||
}
|
||||
}
|
||||
|
||||
synchronized public final long getNb() {
|
||||
return nb;
|
||||
}
|
||||
|
||||
synchronized public final int getSum() {
|
||||
synchronized public final long getSum() {
|
||||
return sum;
|
||||
}
|
||||
|
||||
synchronized public final int getMin() {
|
||||
synchronized public final long getMin() {
|
||||
return min;
|
||||
}
|
||||
|
||||
synchronized public final int getMax() {
|
||||
synchronized public final long getMax() {
|
||||
return max;
|
||||
}
|
||||
|
||||
synchronized public final int getMean() {
|
||||
synchronized public final long getMean() {
|
||||
if (nb == 0) {
|
||||
return 0;
|
||||
}
|
||||
return sum / nb;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,73 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2017, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.asciiart;
|
||||
|
||||
import java.awt.geom.Dimension2D;
|
||||
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||
import net.sourceforge.plantuml.skin.Area;
|
||||
import net.sourceforge.plantuml.skin.ComponentType;
|
||||
import net.sourceforge.plantuml.skin.Context2D;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.txt.UGraphicTxt;
|
||||
|
||||
public class ComponentTextDelay extends AbstractComponentText {
|
||||
|
||||
private final Display stringsToDisplay;
|
||||
|
||||
public ComponentTextDelay(ComponentType type, Display stringsToDisplay, FileFormat fileFormat) {
|
||||
this.stringsToDisplay = stringsToDisplay;
|
||||
}
|
||||
|
||||
public void drawU(UGraphic ug, Area area, Context2D context) {
|
||||
final Dimension2D dimensionToUse = area.getDimensionToUse();
|
||||
final UmlCharArea charArea = ((UGraphicTxt) ug).getCharArea();
|
||||
final int width = (int) dimensionToUse.getWidth();
|
||||
final int textWidth = StringUtils.getWidth(stringsToDisplay);
|
||||
|
||||
final int textPos = (width - textWidth) / 2;
|
||||
final String desc = stringsToDisplay.get(0).toString();
|
||||
|
||||
charArea.drawStringLR(desc, textPos, 0);
|
||||
}
|
||||
|
||||
public double getPreferredHeight(StringBounder stringBounder) {
|
||||
return StringUtils.getHeight(stringsToDisplay) + 1;
|
||||
}
|
||||
|
||||
public double getPreferredWidth(StringBounder stringBounder) {
|
||||
return StringUtils.getWidth(stringsToDisplay) + 2;
|
||||
}
|
||||
|
||||
}
|
@ -35,16 +35,25 @@ import java.awt.geom.Dimension2D;
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||
import net.sourceforge.plantuml.skin.Area;
|
||||
import net.sourceforge.plantuml.skin.ComponentType;
|
||||
import net.sourceforge.plantuml.skin.Context2D;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.txt.UGraphicTxt;
|
||||
|
||||
public class ComponentTextLine extends AbstractComponentText {
|
||||
|
||||
private final FileFormat fileFormat;
|
||||
private static final int MAGIC_NUMBER = -3;
|
||||
private char using;
|
||||
|
||||
public ComponentTextLine(FileFormat fileFormat) {
|
||||
this.fileFormat = fileFormat;
|
||||
public ComponentTextLine(ComponentType type, FileFormat fileFormat) {
|
||||
if (fileFormat == FileFormat.UTXT) {
|
||||
using = '\u2502';
|
||||
} else {
|
||||
using = '|';
|
||||
}
|
||||
if (type == ComponentType.DELAY_LINE) {
|
||||
using = '.';
|
||||
}
|
||||
}
|
||||
|
||||
public void drawU(UGraphic ug, Area area, Context2D context) {
|
||||
@ -52,11 +61,12 @@ public class ComponentTextLine extends AbstractComponentText {
|
||||
final UmlCharArea charArea = ((UGraphicTxt) ug).getCharArea();
|
||||
final int width = (int) dimensionToUse.getWidth();
|
||||
final int height = (int) dimensionToUse.getHeight();
|
||||
if (fileFormat == FileFormat.UTXT) {
|
||||
charArea.drawVLine('\u2502', (width - 1) / 2, 0, height - 1);
|
||||
} else {
|
||||
charArea.drawVLine('|', (width - 1) / 2, 0, height - 1);
|
||||
}
|
||||
charArea.drawVLine(using, (width - 1) / 2, MAGIC_NUMBER, height);
|
||||
// if (using == '.') {
|
||||
// charArea.drawVLine(using, (width - 1) / 2, -3, height);
|
||||
// } else {
|
||||
// charArea.drawVLine(using, (width - 1) / 2, 0, height);
|
||||
// }
|
||||
}
|
||||
|
||||
public double getPreferredHeight(StringBounder stringBounder) {
|
||||
|
@ -66,13 +66,13 @@ public class TextSkin implements Skin {
|
||||
return new ComponentTextSelfArrow(type, config, stringsToDisplay, fileFormat);
|
||||
}
|
||||
if (type == ComponentType.PARTICIPANT_LINE) {
|
||||
return new ComponentTextLine(fileFormat);
|
||||
return new ComponentTextLine(type, fileFormat);
|
||||
}
|
||||
if (type == ComponentType.CONTINUE_LINE) {
|
||||
return new ComponentTextLine(fileFormat);
|
||||
return new ComponentTextLine(type, fileFormat);
|
||||
}
|
||||
if (type == ComponentType.DELAY_LINE) {
|
||||
return new ComponentTextLine(fileFormat);
|
||||
return new ComponentTextLine(type, fileFormat);
|
||||
}
|
||||
if (type == ComponentType.ALIVE_BOX_CLOSE_CLOSE) {
|
||||
return new ComponentTextActiveLine(fileFormat);
|
||||
@ -104,6 +104,9 @@ public class TextSkin implements Skin {
|
||||
if (type == ComponentType.NEWPAGE) {
|
||||
return new ComponentTextNewpage(fileFormat);
|
||||
}
|
||||
if (type == ComponentType.DELAY_TEXT) {
|
||||
return new ComponentTextDelay(type, stringsToDisplay, fileFormat);
|
||||
}
|
||||
throw new UnsupportedOperationException(type.toString());
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,6 @@ import net.sourceforge.plantuml.cucadiagram.IGroup;
|
||||
import net.sourceforge.plantuml.cucadiagram.ILeaf;
|
||||
import net.sourceforge.plantuml.cucadiagram.LeafType;
|
||||
import net.sourceforge.plantuml.cucadiagram.Link;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.graphic.USymbol;
|
||||
import net.sourceforge.plantuml.objectdiagram.AbstractClassOrObjectDiagram;
|
||||
|
@ -30,7 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.command;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
|
@ -33,7 +33,7 @@ package net.sourceforge.plantuml.core;
|
||||
import net.sourceforge.plantuml.utils.StartUtils;
|
||||
|
||||
public enum DiagramType {
|
||||
UML, DITAA, DOT, PROJECT, JCCKIT, SALT, TURING, FLOW, CREOLE, JUNGLE, CUTE, UNKNOWN;
|
||||
UML, DITAA, DOT, PROJECT, JCCKIT, SALT, FLOW, CREOLE, JUNGLE, CUTE, MATH, UNKNOWN;
|
||||
|
||||
static public DiagramType getTypeFromArobaseStart(String s) {
|
||||
s = s.toLowerCase();
|
||||
@ -58,9 +58,6 @@ public enum DiagramType {
|
||||
if (StartUtils.startsWithSymbolAnd("startsalt", s)) {
|
||||
return SALT;
|
||||
}
|
||||
if (StartUtils.startsWithSymbolAnd("startturing", s)) {
|
||||
return TURING;
|
||||
}
|
||||
if (StartUtils.startsWithSymbolAnd("startflow", s)) {
|
||||
return FLOW;
|
||||
}
|
||||
@ -73,6 +70,9 @@ public enum DiagramType {
|
||||
if (StartUtils.startsWithSymbolAnd("startcute", s)) {
|
||||
return CUTE;
|
||||
}
|
||||
if (StartUtils.startsWithSymbolAnd("startmath", s)) {
|
||||
return MATH;
|
||||
}
|
||||
return UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
@ -30,12 +30,7 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram;
|
||||
|
||||
import net.sourceforge.plantuml.FontParam;
|
||||
import net.sourceforge.plantuml.ISkinParam;
|
||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
||||
import net.sourceforge.plantuml.graphic.VerticalAlignment;
|
||||
|
||||
public class DisplayPositionned {
|
||||
|
@ -193,6 +193,7 @@ public class MemberImpl implements Member {
|
||||
}
|
||||
|
||||
public static boolean isMethod(String s) {
|
||||
s = UrlBuilder.purgeUrl(s);
|
||||
if (s.contains("{method}")) {
|
||||
return true;
|
||||
}
|
||||
|
@ -49,6 +49,7 @@ import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.graphic.TextBlockLineBefore;
|
||||
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
||||
import net.sourceforge.plantuml.graphic.TextBlockWidth;
|
||||
import net.sourceforge.plantuml.graphic.TextBlockWithUrl;
|
||||
import net.sourceforge.plantuml.skin.VisibilityModifier;
|
||||
import net.sourceforge.plantuml.skin.rose.Rose;
|
||||
import net.sourceforge.plantuml.svek.Ports;
|
||||
@ -184,7 +185,7 @@ public class MethodsOrFieldsArea extends AbstractTextBlock implements TextBlockW
|
||||
|
||||
}
|
||||
|
||||
private TextBlock getUBlock(final VisibilityModifier modifier) {
|
||||
private TextBlock getUBlock(final VisibilityModifier modifier, Url url) {
|
||||
if (modifier == null) {
|
||||
return new AbstractTextBlock() {
|
||||
|
||||
@ -200,8 +201,8 @@ public class MethodsOrFieldsArea extends AbstractTextBlock implements TextBlockW
|
||||
modifier.getBackground());
|
||||
final HtmlColor fore = rose.getHtmlColor(skinParam, modifier.getForeground());
|
||||
|
||||
final TextBlock uBlock = modifier.getUBlock(skinParam.classAttributeIconSize(), fore, back);
|
||||
return uBlock;
|
||||
final TextBlock uBlock = modifier.getUBlock(skinParam.classAttributeIconSize(), fore, back, url != null);
|
||||
return TextBlockWithUrl.withUrl(uBlock, url);
|
||||
}
|
||||
|
||||
public TextBlock asTextBlock(final double widthToUse) {
|
||||
@ -232,7 +233,7 @@ public class MethodsOrFieldsArea extends AbstractTextBlock implements TextBlockW
|
||||
for (Member att : members) {
|
||||
final TextBlock bloc = createTextBlock(att);
|
||||
final VisibilityModifier modifier = att.getVisibilityModifier();
|
||||
group.add(getUBlock(modifier));
|
||||
group.add(getUBlock(modifier, att.getUrl()));
|
||||
group.add(bloc);
|
||||
}
|
||||
} else {
|
||||
|
@ -51,8 +51,8 @@ public class Dedication {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
private final BigInteger E = new BigInteger("47");
|
||||
private final BigInteger N = new BigInteger(
|
||||
static public final BigInteger E = new BigInteger("47");
|
||||
static public final BigInteger N = new BigInteger(
|
||||
"64194259632025692228025828504368542164501926620236990850309916606915924860847417702229807236946186163298479808527077315212362810246237044147835839820235668271044023359607622658694578433933680627840319408427732468918341837133798296090069295727323673222224923200718714534955390633175683720810506099934813509605263799234445827953809462431871169282281822048299576307847441008670575692934434087522877910989584374673170522742162366773143807761599862833698229067475807108264396251702152180676841544743258182370105404479387062985271422237607462447989728490398294623785717593446941673706569352249533885603771123718557406286501161336667835919957553680522213067630956498293529840163155604109185561515875171125161872265975088797712442352939352686113608345330266855433849127812528823634773975825170679786399199082599910532761710473383280738663105826045325480095451410448217715495894688594898541182351588505292424154550388343455540760277051977859647543838445735549451966254020972172982014944475678385523833120793348365125754234511467512831686599126674298367512469557219326026525667529348508876650236597163509336304607610284488623800062157659286940214435134423619711736992281071131245654755167288438258292694799131521268600284444731890784171372171309");
|
||||
|
||||
public InputStream getInputStream(String keepLetter) throws IOException {
|
||||
|
@ -63,6 +63,10 @@ public class QBlock {
|
||||
return new QBlock(changed);
|
||||
}
|
||||
|
||||
public byte[] getData() {
|
||||
return big.toByteArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return big.toByteArray().length + " " + big.toString();
|
||||
|
@ -37,6 +37,8 @@ import java.math.BigInteger;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.code.AsciiEncoder;
|
||||
|
||||
public class QBlocks {
|
||||
|
||||
private final List<QBlock> all = new ArrayList<QBlock>();
|
||||
@ -70,4 +72,24 @@ public class QBlocks {
|
||||
}
|
||||
}
|
||||
|
||||
public String encodeAscii() {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final AsciiEncoder encoder = new AsciiEncoder();
|
||||
for (QBlock rsa : all) {
|
||||
sb.append(encoder.encode(rsa.getData()));
|
||||
sb.append("!");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static QBlocks descodeAscii(String s) {
|
||||
final QBlocks result = new QBlocks();
|
||||
final AsciiEncoder encoder = new AsciiEncoder();
|
||||
for (String bl : s.split("!")) {
|
||||
final BigInteger bigInteger = new BigInteger(encoder.decode(bl));
|
||||
result.all.add(new QBlock(bigInteger));
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ public class PSystemDot extends AbstractPSystem {
|
||||
final Graphviz graphviz = GraphvizUtils.create(null, data,
|
||||
StringUtils.goLowerCase(fileFormat.getFileFormat().name()));
|
||||
if (graphviz.getExeState() != ExeState.OK) {
|
||||
final TextBlock result = GraphicStrings.createDefault(
|
||||
final TextBlock result = GraphicStrings.createForError(
|
||||
Arrays.asList("There is an issue with your Dot/Graphviz installation"), false);
|
||||
UGraphicUtils.writeImage(os, null, fileFormat, new ColorMapperIdentity(), HtmlColorUtils.WHITE, result);
|
||||
return new ImageDataSimple();
|
||||
@ -78,7 +78,7 @@ public class PSystemDot extends AbstractPSystem {
|
||||
throw new IllegalStateException("Timeout1 " + state);
|
||||
}
|
||||
if (counter.getLength() == 0) {
|
||||
final TextBlock result = GraphicStrings.createDefault(Arrays.asList("Graphivz has crashed"), false);
|
||||
final TextBlock result = GraphicStrings.createForError(Arrays.asList("Graphivz has crashed"), false);
|
||||
UGraphicUtils.writeImage(os, null, fileFormat, new ColorMapperIdentity(), HtmlColorUtils.WHITE, result);
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.donors;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
@ -46,11 +45,9 @@ import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicPosition;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.version.PSystemVersion;
|
||||
|
||||
public class PSystemDonors extends AbstractPSystem {
|
||||
@ -58,14 +55,14 @@ public class PSystemDonors extends AbstractPSystem {
|
||||
public static final String DONORS = "UDfTKqjosp0CtUCKN6lIGoXsxDQ_PAmqdSaEbX29DaMe9ELKFbjtlLYXj3BfS2MC0F3zc9li_o47JnJ8gTm6jXfBUAOi7cvXmx5q7l9f50-mTF4N3L3G0NtGQDME6mkvhTYf9LEuqFZvzYOTKpjQs61oaGqmrrEX3UHnDP-Xw2E40POwkpsMOJMXx3qKWRg6h9enTy9lFjr37jRjfr5sC6EZhTfpxmbM_QV_sP65o5Hq6hO9QcpJKgxA3Vr2MucSiqRBrXhT84ptLzgsXbsAFbpWqUYp3CnrUHBarp_QmeE_hhO9Y8pECB-qEhX1RR3X2c4rYlxQeAnF-Z8oqIuvfq5aiXYaJ_09hjK_y7IwOMKhALqfcYpmu8OJl_kJbaL6nXvTq1Vu6hihXgqk6pBg7hKPKWRcaeBn7bQ4ziiAovyzUJNl3mx5InFvll0nKDcejKEF4L9D4j74iVSnMTAYrdpMQL0-el8z4jO8-oIyunKfp-meqrqIApwDojopGukckrEl590x3tiXYAvIQprQ2ml3RjHx--UtCH-cnq2O99mIfyqrJWudjKVNcrj6Fad8QDeJJc7PwnlukT6gGApa8RcQr0-oDRaxjSsVlnLv37h65fPqyu1I7MmfWMdLYt2OIuJNiTFHwBCydGqHF9pJTt16sCKbr4uWiuJKijUIahubjU2UGbIxzB18VVhW4hDXBwc80dUdQqbKeLlu2u2IDTa0";
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
final List<String> lines = new ArrayList<String>();
|
||||
lines.add("<b>Special thanks to our sponsors and donors !");
|
||||
lines.add(" ");
|
||||
@ -82,12 +79,8 @@ public class PSystemDonors extends AbstractPSystem {
|
||||
}
|
||||
}
|
||||
lines.add(" ");
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
final GraphicStrings graphicStrings = new GraphicStrings(lines, font, HtmlColorUtils.BLACK,
|
||||
HtmlColorUtils.WHITE, UAntiAliasing.ANTI_ALIASING_ON, PSystemVersion.getPlantumlImage(),
|
||||
GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT);
|
||||
graphicStrings.setMaxLine(maxLine + 2);
|
||||
return graphicStrings;
|
||||
return GraphicStrings.createBlackOnWhite(lines, PSystemVersion.getPlantumlImage(),
|
||||
GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT, maxLine + 2);
|
||||
}
|
||||
|
||||
private List<String> getDonors() throws IOException {
|
||||
|
@ -30,7 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.eggs;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
@ -48,11 +47,9 @@ import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicPosition;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemAppleTwo extends AbstractPSystem {
|
||||
|
||||
@ -60,7 +57,7 @@ public class PSystemAppleTwo extends AbstractPSystem {
|
||||
private final BufferedImage image;
|
||||
|
||||
public PSystemAppleTwo() throws IOException {
|
||||
strings.add(" <b><size:16>Apple //e for ever!");
|
||||
strings.add(" <b><size:18>Apple //e for ever ! ");
|
||||
strings.add(" ");
|
||||
|
||||
final InputStream is = new ByteArrayInputStream(imm);
|
||||
@ -69,18 +66,19 @@ public class PSystemAppleTwo extends AbstractPSystem {
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
final GraphicStrings result = new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE,
|
||||
UAntiAliasing.ANTI_ALIASING_ON, image, GraphicPosition.BOTTOM);
|
||||
result.setMinWidth(200);
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
// final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
final TextBlockBackcolored result = GraphicStrings.createBlackOnWhite(strings, image, GraphicPosition.BOTTOM);
|
||||
// final GraphicStrings result = new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE,
|
||||
// image, GraphicPosition.BOTTOM);
|
||||
// result.setMinWidth(200);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.eggs;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
@ -43,11 +42,9 @@ import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemEgg extends AbstractPSystem {
|
||||
|
||||
@ -61,16 +58,15 @@ public class PSystemEgg extends AbstractPSystem {
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
return new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, UAntiAliasing.ANTI_ALIASING_ON);
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
return GraphicStrings.createBlackOnWhite(strings);
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
|
94
src/net/sourceforge/plantuml/eggs/PSystemEmpty.java
Normal file
94
src/net/sourceforge/plantuml/eggs/PSystemEmpty.java
Normal file
@ -0,0 +1,94 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2017, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.eggs;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.AbstractPSystem;
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicPosition;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.version.PSystemVersion;
|
||||
|
||||
public class PSystemEmpty extends AbstractPSystem {
|
||||
|
||||
private final List<String> strings = new ArrayList<String>();
|
||||
|
||||
public PSystemEmpty() {
|
||||
strings.add("<b>Welcome to PlantUML!");
|
||||
strings.add(" ");
|
||||
strings.add("If you use this software, you accept its license.");
|
||||
strings.add("(details by typing \"\"license\"\" keyword)");
|
||||
strings.add(" ");
|
||||
strings.add("You can start with a simple UML Diagram like:");
|
||||
strings.add(" ");
|
||||
strings.add("\"\"Bob->Alice: Hello\"\"");
|
||||
strings.add(" ");
|
||||
strings.add("Or");
|
||||
strings.add(" ");
|
||||
strings.add("\"\"class Example\"\"");
|
||||
strings.add(" ");
|
||||
strings.add("You will find more information about PlantUML syntax on <u>http://plantuml.com</u>");
|
||||
strings.add(" ");
|
||||
strings.add(" ");
|
||||
strings.add(" ");
|
||||
strings.add(" ");
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
// imageBuilder.setUDrawable(TextBlockUtils.withMargin(result, 4, 4));
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
final TextBlockBackcolored result = GraphicStrings.createBlackOnWhite(strings, PSystemVersion.getPlantumlImage(),
|
||||
GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT);
|
||||
return result;
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
return new DiagramDescriptionImpl("(Empty)", getClass());
|
||||
}
|
||||
|
||||
}
|
51
src/net/sourceforge/plantuml/eggs/PSystemEmptyFactory.java
Normal file
51
src/net/sourceforge/plantuml/eggs/PSystemEmptyFactory.java
Normal file
@ -0,0 +1,51 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2017, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.eggs;
|
||||
|
||||
import net.sourceforge.plantuml.api.PSystemFactory;
|
||||
import net.sourceforge.plantuml.core.Diagram;
|
||||
import net.sourceforge.plantuml.core.DiagramType;
|
||||
import net.sourceforge.plantuml.core.UmlSource;
|
||||
|
||||
public class PSystemEmptyFactory implements PSystemFactory {
|
||||
|
||||
public Diagram createSystem(UmlSource source) {
|
||||
if (source.getTotalLineCount() == 2) {
|
||||
return new PSystemEmpty();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public DiagramType getDiagramType() {
|
||||
return DiagramType.UML;
|
||||
}
|
||||
|
||||
}
|
@ -30,7 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.eggs;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
@ -42,11 +41,9 @@ import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemLost extends AbstractPSystem {
|
||||
|
||||
@ -57,17 +54,15 @@ public class PSystemLost extends AbstractPSystem {
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
return new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, UAntiAliasing.ANTI_ALIASING_ON, null,
|
||||
null);
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
return GraphicStrings.createBlackOnWhite(strings);
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
|
@ -1,102 +0,0 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2017, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.eggs;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Arrays;
|
||||
|
||||
import net.sourceforge.plantuml.AbstractPSystem;
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.SpriteContainerEmpty;
|
||||
import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.graphic.DateEventUtils;
|
||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.graphic.UDrawable;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.UImage;
|
||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||
import net.sourceforge.plantuml.webp.Portrait;
|
||||
|
||||
public class PSystemMemorial extends AbstractPSystem {
|
||||
|
||||
public static final String PARIS = "A thought for those who died in Paris the 13th November 2015.";
|
||||
private Portrait portrait;
|
||||
|
||||
PSystemMemorial(Portrait portrait) {
|
||||
this.portrait = portrait;
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, HtmlColorUtils.WHITE,
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(new UDrawable() {
|
||||
|
||||
public void drawU(UGraphic ug) {
|
||||
final String name = portrait.getName();
|
||||
final String quote = portrait.getQuote();
|
||||
final String age = "" + portrait.getAge() + " years old";
|
||||
final UFont font = new UFont("SansSerif", Font.BOLD, 14);
|
||||
final BufferedImage im = portrait.getBufferedImage();
|
||||
final FontConfiguration fc = new FontConfiguration(font, HtmlColorUtils.BLACK, HtmlColorUtils.BLACK,
|
||||
true);
|
||||
|
||||
final TextBlock top = DateEventUtils.getComment(Arrays.asList(PARIS), HtmlColorUtils.BLACK);
|
||||
|
||||
final TextBlock tb = Display.create(name, age, quote).create(fc, HorizontalAlignment.LEFT,
|
||||
new SpriteContainerEmpty());
|
||||
|
||||
top.drawU(ug);
|
||||
ug = ug.apply(new UTranslate(0, top.calculateDimension(ug.getStringBounder()).getHeight() + 10));
|
||||
|
||||
ug.draw(new UImage(im));
|
||||
ug = ug.apply(new UTranslate(im.getWidth() + 10, 0));
|
||||
tb.drawU(ug);
|
||||
}
|
||||
});
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
return new DiagramDescriptionImpl("(Memorial)", getClass());
|
||||
}
|
||||
|
||||
}
|
@ -30,7 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.eggs;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
@ -48,11 +47,9 @@ import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicPosition;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemRIP extends AbstractPSystem {
|
||||
|
||||
@ -76,20 +73,16 @@ public class PSystemRIP extends AbstractPSystem {
|
||||
is.close();
|
||||
}
|
||||
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
return new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, UAntiAliasing.ANTI_ALIASING_ON,
|
||||
image, GraphicPosition.BOTTOM);
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
return GraphicStrings.createBlackOnWhite(strings, image, GraphicPosition.BOTTOM);
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
@ -462,5 +455,4 @@ public class PSystemRIP extends AbstractPSystem {
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
@ -30,7 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.font;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
@ -43,11 +42,9 @@ import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemListFonts extends AbstractPSystem {
|
||||
|
||||
@ -69,18 +66,15 @@ public class PSystemListFonts extends AbstractPSystem {
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
final GraphicStrings result = new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE,
|
||||
UAntiAliasing.ANTI_ALIASING_ON);
|
||||
return result;
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
return GraphicStrings.createBlackOnWhite(strings);
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
|
@ -39,7 +39,7 @@ import javax.imageio.ImageIO;
|
||||
|
||||
public class IconLoader {
|
||||
|
||||
private static final int NUMBER_OF_ICONS = 20;
|
||||
private static final int NUMBER_OF_ICONS = 21;
|
||||
|
||||
private final static Map<String, BufferedImage> all = new ConcurrentHashMap<String, BufferedImage>();
|
||||
|
||||
|
BIN
src/net/sourceforge/plantuml/fun/sprite020.png
Normal file
BIN
src/net/sourceforge/plantuml/fun/sprite020.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 261 B |
@ -30,152 +30,131 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.graphic;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||
import net.sourceforge.plantuml.Log;
|
||||
import net.sourceforge.plantuml.SpriteContainerEmpty;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.eggs.PSystemMemorial;
|
||||
import net.sourceforge.plantuml.ugraphic.LimitFinder;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.UImage;
|
||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||
import net.sourceforge.plantuml.version.PSystemVersion;
|
||||
import net.sourceforge.plantuml.webp.Portrait;
|
||||
import net.sourceforge.plantuml.webp.Portraits;
|
||||
|
||||
public class DateEventUtils {
|
||||
|
||||
public static TextBlock addEvent(final TextBlock textBlock, final HtmlColor color) {
|
||||
try {
|
||||
final String today = new SimpleDateFormat("MM-dd", Locale.US).format(new Date());
|
||||
if ("11-05".equals(today)) {
|
||||
final List<String> asList = Arrays.asList("<u>November 5th, 1955",
|
||||
"Doc Brown's discovery of the Flux Capacitor, that makes time-travel possible.");
|
||||
return TextBlockUtils.mergeTB(textBlock, getComment(asList, color), HorizontalAlignment.LEFT);
|
||||
} else if ("08-29".equals(today)) {
|
||||
final List<String> asList = Arrays.asList("<u>August 29th, 1997",
|
||||
"Skynet becomes self-aware at 02:14 AM Eastern Time.");
|
||||
return TextBlockUtils.mergeTB(textBlock, getComment(asList, color), HorizontalAlignment.LEFT);
|
||||
} else if ("06-29".equals(today)) {
|
||||
final List<String> asList = Arrays.asList("<u>June 29th, 1975",
|
||||
"\"It was the first time in history that anyone had typed",
|
||||
"a character on a keyboard and seen it show up on their",
|
||||
"own computer's screen right in front of them.\"", "\t\t\t\t\t\t\t\t\t\t<i>Steve Wozniak");
|
||||
return TextBlockUtils.mergeTB(textBlock, getComment(asList, color), HorizontalAlignment.LEFT);
|
||||
} else if ("01-07".equals(today) || ("01-08".equals(today) && getDayOfWeek() == Calendar.MONDAY)) {
|
||||
return addCharlie(textBlock);
|
||||
} else if ("11-13".equals(today) || ("11-14".equals(today) && getDayOfWeek() == Calendar.MONDAY)) {
|
||||
return addMemorial(textBlock, color);
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
Log.debug("Error " + t);
|
||||
}
|
||||
return textBlock;
|
||||
}
|
||||
|
||||
private synchronized static int getDayOfWeek() {
|
||||
return Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
|
||||
}
|
||||
|
||||
private static TextBlock addMemorial(TextBlock textBlock, HtmlColor color) {
|
||||
final Portrait portrait = Portraits.getOne();
|
||||
if (portrait == null) {
|
||||
return textBlock;
|
||||
}
|
||||
final BufferedImage im = portrait.getBufferedImage();
|
||||
if (im == null) {
|
||||
return textBlock;
|
||||
}
|
||||
|
||||
final String name = portrait.getName();
|
||||
final String quote = portrait.getQuote();
|
||||
final String age = "" + portrait.getAge() + " years old";
|
||||
final UFont font12 = new UFont("SansSerif", Font.BOLD, 12);
|
||||
TextBlock comment = Display.create(name, age, quote).create(
|
||||
new FontConfiguration(font12, color, HtmlColorUtils.BLUE, true), HorizontalAlignment.LEFT,
|
||||
new SpriteContainerEmpty());
|
||||
comment = TextBlockUtils.withMinWidth(TextBlockUtils.withMargin(comment, 4, 4), 800, HorizontalAlignment.LEFT);
|
||||
|
||||
final TextBlock bottom0 = getComment(Arrays.asList(PSystemMemorial.PARIS), color);
|
||||
final TextBlock bottom1 = new AbstractTextBlock() {
|
||||
private double margin = 10;
|
||||
|
||||
public void drawU(UGraphic ug) {
|
||||
ug = ug.apply(new UTranslate(0, margin));
|
||||
ug.draw(new UImage(im));
|
||||
if (ug instanceof LimitFinder) {
|
||||
return;
|
||||
}
|
||||
Portraits.nextOne();
|
||||
}
|
||||
|
||||
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||
return new Dimension2DDouble(im.getWidth(), margin + im.getHeight());
|
||||
}
|
||||
};
|
||||
final TextBlock bottom = TextBlockUtils.mergeTB(bottom0,
|
||||
TextBlockUtils.mergeLR(bottom1, comment, VerticalAlignment.CENTER), HorizontalAlignment.LEFT);
|
||||
final TextBlock mergeTB = TextBlockUtils.mergeTB(textBlock, bottom, HorizontalAlignment.LEFT);
|
||||
return addMajesty(mergeTB, color);
|
||||
}
|
||||
|
||||
public static TextBlock addMajesty(TextBlock block, HtmlColor color) {
|
||||
final UFont font12 = new UFont("SansSerif", Font.BOLD, 12);
|
||||
final String arabic1 = "<size:16>\u0625\u0646 \u0627\u0644\u0625\u0631\u0647\u0627\u0628\u064A\u064A\u0646 \u0628\u0627\u0633\u0645 \u0627\u0644\u0625\u0633\u0644\u0627\u0645 \u0644\u064A\u0633\u0648\u0627 \u0645\u0633\u0644\u0645\u064A\u0646\u060C \u0648\u0644\u0627 \u064A\u0631\u0628\u0637\u0647\u0645 \u0628\u0627\u0644\u0625\u0633\u0644\u0627\u0645 \u0625\u0644\u0627 \u0627\u0644\u062F\u0648\u0627\u0641\u0639 \u0627\u0644\u062A\u064A \u064A\u0631\u0643\u0628\u0648\u0646 \u0639\u0644\u064A\u0647\u0627 \u0644\u062A\u0628\u0631\u064A\u0631 \u062C\u0631\u0627\u0626\u0645\u0647\u0645 \u0648\u062D\u0645\u0627\u0642\u0627\u062A\u0647\u0645.";
|
||||
final String arabic2 = "<size:16>\u0641\u0647\u0645 \u0642\u0648\u0645 \u0636\u0627\u0644\u0648\u0646\u060C \u0645\u0635\u064A\u0631\u0647\u0645 \u062C\u0647\u0646\u0645 \u062E\u0627\u0644\u062F\u064A\u0646 \u0641\u064A\u0647\u0627 \u0623\u0628\u062F\u0627.";
|
||||
final String english1 = "<size:10>Those who engage in terrorism, in the name of Islam, are not Muslims.";
|
||||
final String english2 = "<size:10>Their only link to Islam is the pretexts they use to justify their crimes and their folly.";
|
||||
final String english3 = "<size:10>They have strayed from the right path, and their fate is to dwell forever in hell.";
|
||||
final TextBlock arabic = Display
|
||||
.create(" ",
|
||||
arabic1,
|
||||
arabic2,
|
||||
"<size:16>\u0635\u0627\u062D\u0628 \u0627\u0644\u062C\u0644\u0627\u0644\u0629 \u0627\u0644\u0645\u0644\u0643 \u0645\u062D\u0645\u062F \u0627\u0644\u0633\u0627\u062F\u0633 \u0623\u0645\u064A\u0631 \u0627\u0644\u0645\u0624\u0645\u0646\u064A\u0646 \u0646\u0635\u0631\u0647 \u0627\u0644\u0644\u0647")
|
||||
.create(new FontConfiguration(font12, color, HtmlColorUtils.BLUE, true), HorizontalAlignment.RIGHT,
|
||||
new SpriteContainerEmpty());
|
||||
final TextBlock english = Display.create(english1, english2, english3,
|
||||
"<size:10>-- His Majesty the King Mohammed the Sixth, Commander of the Faithful").create(
|
||||
new FontConfiguration(font12, color, HtmlColorUtils.BLUE, true), HorizontalAlignment.LEFT,
|
||||
new SpriteContainerEmpty());
|
||||
return TextBlockUtils.mergeTB(block, TextBlockUtils.mergeTB(arabic, english, HorizontalAlignment.LEFT),
|
||||
HorizontalAlignment.LEFT);
|
||||
}
|
||||
|
||||
private static TextBlock addCharlie(TextBlock textBlock) {
|
||||
final TextBlock charlie = new AbstractTextBlock() {
|
||||
private final BufferedImage charlie = PSystemVersion.getCharlieImage();
|
||||
|
||||
public void drawU(UGraphic ug) {
|
||||
ug.draw(new UImage(charlie));
|
||||
}
|
||||
|
||||
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||
return new Dimension2DDouble(charlie.getWidth(), charlie.getHeight());
|
||||
}
|
||||
};
|
||||
return TextBlockUtils.mergeTB(charlie, textBlock, HorizontalAlignment.LEFT);
|
||||
|
||||
}
|
||||
|
||||
public static TextBlock getComment(final List<String> asList, HtmlColor color) {
|
||||
final UFont font = new UFont("SansSerif", Font.BOLD, 14);
|
||||
TextBlock comment = Display.create(asList).create(
|
||||
new FontConfiguration(font, color, HtmlColorUtils.BLUE, true), HorizontalAlignment.LEFT,
|
||||
new SpriteContainerEmpty());
|
||||
comment = TextBlockUtils.withMargin(comment, 4, 4);
|
||||
comment = new SimpleTextBlockBordered(comment, color);
|
||||
comment = TextBlockUtils.withMargin(comment, 10, 10);
|
||||
return comment;
|
||||
}
|
||||
// private static final String PARIS = "A thought for those who died in Paris the 13th November 2015.";
|
||||
//
|
||||
// private static TextBlock addEvent(final TextBlock textBlock, final HtmlColor color) {
|
||||
// try {
|
||||
// final String today = new SimpleDateFormat("MM-dd", Locale.US).format(new Date());
|
||||
// if ("11-05".equals(today)) {
|
||||
// final List<String> asList = Arrays.asList("<u>November 5th, 1955",
|
||||
// "Doc Brown's discovery of the Flux Capacitor, that makes time-travel possible.");
|
||||
// return TextBlockUtils.mergeTB(textBlock, getComment(asList, color), HorizontalAlignment.LEFT);
|
||||
// } else if ("08-29".equals(today)) {
|
||||
// final List<String> asList = Arrays.asList("<u>August 29th, 1997",
|
||||
// "Skynet becomes self-aware at 02:14 AM Eastern Time.");
|
||||
// return TextBlockUtils.mergeTB(textBlock, getComment(asList, color), HorizontalAlignment.LEFT);
|
||||
// } else if ("06-29".equals(today)) {
|
||||
// final List<String> asList = Arrays.asList("<u>June 29th, 1975",
|
||||
// "\"It was the first time in history that anyone had typed",
|
||||
// "a character on a keyboard and seen it show up on their",
|
||||
// "own computer's screen right in front of them.\"", "\t\t\t\t\t\t\t\t\t\t<i>Steve Wozniak");
|
||||
// return TextBlockUtils.mergeTB(textBlock, getComment(asList, color), HorizontalAlignment.LEFT);
|
||||
// } else if ("01-07".equals(today) || ("01-08".equals(today) && getDayOfWeek() == Calendar.MONDAY)) {
|
||||
// return addCharlie(textBlock);
|
||||
// } else if ("11-13".equals(today) || ("11-14".equals(today) && getDayOfWeek() == Calendar.MONDAY)) {
|
||||
// return addMemorial(textBlock, color);
|
||||
// }
|
||||
// } catch (Throwable t) {
|
||||
// Log.debug("Error " + t);
|
||||
// }
|
||||
// return textBlock;
|
||||
// }
|
||||
//
|
||||
// private synchronized static int getDayOfWeek() {
|
||||
// return Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
|
||||
// }
|
||||
//
|
||||
// private static TextBlock addMemorial(TextBlock textBlock, HtmlColor color) {
|
||||
// final Portrait portrait = Portraits.getOne();
|
||||
// if (portrait == null) {
|
||||
// return textBlock;
|
||||
// }
|
||||
// final BufferedImage im = portrait.getBufferedImage();
|
||||
// if (im == null) {
|
||||
// return textBlock;
|
||||
// }
|
||||
//
|
||||
// final String name = portrait.getName();
|
||||
// final String quote = portrait.getQuote();
|
||||
// final String age = "" + portrait.getAge() + " years old";
|
||||
// final UFont font12 = new UFont("SansSerif", Font.BOLD, 12);
|
||||
// TextBlock comment = Display.create(name, age, quote).create(
|
||||
// new FontConfiguration(font12, color, HtmlColorUtils.BLUE, true), HorizontalAlignment.LEFT,
|
||||
// new SpriteContainerEmpty());
|
||||
// comment = TextBlockUtils.withMinWidth(TextBlockUtils.withMargin(comment, 4, 4), 800, HorizontalAlignment.LEFT);
|
||||
//
|
||||
// final TextBlock bottom0 = getComment(Arrays.asList(PARIS), color);
|
||||
// final TextBlock bottom1 = new AbstractTextBlock() {
|
||||
// private double margin = 10;
|
||||
//
|
||||
// public void drawU(UGraphic ug) {
|
||||
// ug = ug.apply(new UTranslate(0, margin));
|
||||
// ug.draw(new UImage(im));
|
||||
// if (ug instanceof LimitFinder) {
|
||||
// return;
|
||||
// }
|
||||
// Portraits.nextOne();
|
||||
// }
|
||||
//
|
||||
// public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||
// return new Dimension2DDouble(im.getWidth(), margin + im.getHeight());
|
||||
// }
|
||||
// };
|
||||
// final TextBlock bottom = TextBlockUtils.mergeTB(bottom0,
|
||||
// TextBlockUtils.mergeLR(bottom1, comment, VerticalAlignment.CENTER), HorizontalAlignment.LEFT);
|
||||
// final TextBlock mergeTB = TextBlockUtils.mergeTB(textBlock, bottom, HorizontalAlignment.LEFT);
|
||||
// return addMajesty(mergeTB, color);
|
||||
// }
|
||||
//
|
||||
// public static TextBlock addMajesty(TextBlock block, HtmlColor color) {
|
||||
// final UFont font12 = new UFont("SansSerif", Font.BOLD, 12);
|
||||
// final String arabic1 = "<size:16>\u0625\u0646 \u0627\u0644\u0625\u0631\u0647\u0627\u0628\u064A\u064A\u0646 \u0628\u0627\u0633\u0645 \u0627\u0644\u0625\u0633\u0644\u0627\u0645 \u0644\u064A\u0633\u0648\u0627 \u0645\u0633\u0644\u0645\u064A\u0646\u060C \u0648\u0644\u0627 \u064A\u0631\u0628\u0637\u0647\u0645 \u0628\u0627\u0644\u0625\u0633\u0644\u0627\u0645 \u0625\u0644\u0627 \u0627\u0644\u062F\u0648\u0627\u0641\u0639 \u0627\u0644\u062A\u064A \u064A\u0631\u0643\u0628\u0648\u0646 \u0639\u0644\u064A\u0647\u0627 \u0644\u062A\u0628\u0631\u064A\u0631 \u062C\u0631\u0627\u0626\u0645\u0647\u0645 \u0648\u062D\u0645\u0627\u0642\u0627\u062A\u0647\u0645.";
|
||||
// final String arabic2 = "<size:16>\u0641\u0647\u0645 \u0642\u0648\u0645 \u0636\u0627\u0644\u0648\u0646\u060C \u0645\u0635\u064A\u0631\u0647\u0645 \u062C\u0647\u0646\u0645 \u062E\u0627\u0644\u062F\u064A\u0646 \u0641\u064A\u0647\u0627 \u0623\u0628\u062F\u0627.";
|
||||
// final String english1 = "<size:10>Those who engage in terrorism, in the name of Islam, are not Muslims.";
|
||||
// final String english2 = "<size:10>Their only link to Islam is the pretexts they use to justify their crimes and their folly.";
|
||||
// final String english3 = "<size:10>They have strayed from the right path, and their fate is to dwell forever in hell.";
|
||||
// final TextBlock arabic = Display
|
||||
// .create(" ",
|
||||
// arabic1,
|
||||
// arabic2,
|
||||
// "<size:16>\u0635\u0627\u062D\u0628 \u0627\u0644\u062C\u0644\u0627\u0644\u0629 \u0627\u0644\u0645\u0644\u0643 \u0645\u062D\u0645\u062F \u0627\u0644\u0633\u0627\u062F\u0633 \u0623\u0645\u064A\u0631 \u0627\u0644\u0645\u0624\u0645\u0646\u064A\u0646 \u0646\u0635\u0631\u0647 \u0627\u0644\u0644\u0647")
|
||||
// .create(new FontConfiguration(font12, color, HtmlColorUtils.BLUE, true), HorizontalAlignment.RIGHT,
|
||||
// new SpriteContainerEmpty());
|
||||
// final TextBlock english = Display.create(english1, english2, english3,
|
||||
// "<size:10>-- His Majesty the King Mohammed the Sixth, Commander of the Faithful").create(
|
||||
// new FontConfiguration(font12, color, HtmlColorUtils.BLUE, true), HorizontalAlignment.LEFT,
|
||||
// new SpriteContainerEmpty());
|
||||
// return TextBlockUtils.mergeTB(block, TextBlockUtils.mergeTB(arabic, english, HorizontalAlignment.LEFT),
|
||||
// HorizontalAlignment.LEFT);
|
||||
// }
|
||||
//
|
||||
// private static TextBlock addCharlie(TextBlock textBlock) {
|
||||
// final TextBlock charlie = new AbstractTextBlock() {
|
||||
// private final BufferedImage charlie = PSystemVersion.getCharlieImage();
|
||||
//
|
||||
// public void drawU(UGraphic ug) {
|
||||
// ug.draw(new UImage(charlie));
|
||||
// }
|
||||
//
|
||||
// public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||
// return new Dimension2DDouble(charlie.getWidth(), charlie.getHeight());
|
||||
// }
|
||||
// };
|
||||
// return TextBlockUtils.mergeTB(charlie, textBlock, HorizontalAlignment.LEFT);
|
||||
//
|
||||
// }
|
||||
//
|
||||
// public static TextBlock getComment(final List<String> asList, HtmlColor color) {
|
||||
// final UFont font = new UFont("SansSerif", Font.BOLD, 14);
|
||||
// TextBlock comment = Display.create(asList).create(
|
||||
// new FontConfiguration(font, color, HtmlColorUtils.BLUE, true), HorizontalAlignment.LEFT,
|
||||
// new SpriteContainerEmpty());
|
||||
// comment = TextBlockUtils.withMargin(comment, 4, 4);
|
||||
// comment = new SimpleTextBlockBordered(comment, color);
|
||||
// comment = TextBlockUtils.withMargin(comment, 10, 10);
|
||||
// return comment;
|
||||
// }
|
||||
}
|
||||
|
@ -40,9 +40,7 @@ import net.sourceforge.plantuml.SpriteContainerEmpty;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.svek.IEntityImage;
|
||||
import net.sourceforge.plantuml.svek.ShapeType;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapper;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.UChangeColor;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
@ -51,11 +49,13 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||
|
||||
public class GraphicStrings extends AbstractTextBlock implements IEntityImage {
|
||||
|
||||
private final double margin = 5;
|
||||
|
||||
private final HtmlColor background;
|
||||
|
||||
private final UFont font;
|
||||
|
||||
private final HtmlColor green;
|
||||
private final HtmlColor maincolor;
|
||||
|
||||
private final HtmlColor hyperlinkColor = HtmlColorUtils.BLUE;
|
||||
|
||||
@ -67,54 +67,71 @@ public class GraphicStrings extends AbstractTextBlock implements IEntityImage {
|
||||
|
||||
private final GraphicPosition position;
|
||||
|
||||
private final UAntiAliasing antiAliasing;
|
||||
private int maxLine = 0;
|
||||
|
||||
private final ColorMapper colorMapper = new ColorMapperIdentity();
|
||||
|
||||
public static GraphicStrings createDefault(List<String> strings, boolean useRed) {
|
||||
public static IEntityImage createForError(List<String> strings, boolean useRed) {
|
||||
if (useRed) {
|
||||
return new GraphicStrings(strings, new UFont("SansSerif", Font.BOLD, 14), HtmlColorUtils.BLACK,
|
||||
HtmlColorUtils.RED_LIGHT, UAntiAliasing.ANTI_ALIASING_ON);
|
||||
HtmlColorUtils.RED_LIGHT, null, null);
|
||||
}
|
||||
return new GraphicStrings(strings, new UFont("SansSerif", Font.BOLD, 14), HtmlColorSet.getInstance()
|
||||
.getColorIfValid("#33FF02"), HtmlColorUtils.BLACK, UAntiAliasing.ANTI_ALIASING_ON);
|
||||
.getColorIfValid("#33FF02"), HtmlColorUtils.BLACK, null, null);
|
||||
}
|
||||
|
||||
public GraphicStrings(List<String> strings, UFont font, HtmlColor green, HtmlColor background,
|
||||
UAntiAliasing antiAliasing) {
|
||||
this(strings, font, green, background, antiAliasing, null, null);
|
||||
public static TextBlockBackcolored createGreenOnBlackMonospaced(List<String> strings) {
|
||||
return new GraphicStrings(strings, monospaced14(), HtmlColorUtils.GREEN, HtmlColorUtils.BLACK, null, null);
|
||||
}
|
||||
|
||||
public GraphicStrings(List<String> strings, UFont font, HtmlColor green, HtmlColor background,
|
||||
UAntiAliasing antiAliasing, BufferedImage image, GraphicPosition position) {
|
||||
public static TextBlockBackcolored createBlackOnWhite(List<String> strings) {
|
||||
return new GraphicStrings(strings, sansSerif12(), HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, null, null);
|
||||
}
|
||||
|
||||
public static TextBlockBackcolored createBlackOnWhiteMonospaced(List<String> strings) {
|
||||
return new GraphicStrings(strings, monospaced14(), HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, null, null);
|
||||
}
|
||||
|
||||
public static TextBlockBackcolored createBlackOnWhite(List<String> strings, BufferedImage image,
|
||||
GraphicPosition position, int maxLine) {
|
||||
final GraphicStrings result = new GraphicStrings(strings, sansSerif12(), HtmlColorUtils.BLACK,
|
||||
HtmlColorUtils.WHITE, image, position);
|
||||
result.maxLine = maxLine;
|
||||
return result;
|
||||
}
|
||||
|
||||
public static TextBlockBackcolored createBlackOnWhite(List<String> strings, BufferedImage image,
|
||||
GraphicPosition position) {
|
||||
return new GraphicStrings(strings, sansSerif12(), HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, image, position);
|
||||
}
|
||||
|
||||
private static UFont sansSerif12() {
|
||||
return new UFont("SansSerif", Font.PLAIN, 12);
|
||||
}
|
||||
|
||||
private static UFont monospaced14() {
|
||||
return new UFont("Monospaced", Font.PLAIN, 14);
|
||||
}
|
||||
|
||||
private GraphicStrings(List<String> strings, UFont font, HtmlColor maincolor, HtmlColor background,
|
||||
BufferedImage image, GraphicPosition position) {
|
||||
this.strings = strings;
|
||||
this.font = font;
|
||||
this.green = green;
|
||||
this.maincolor = maincolor;
|
||||
this.background = background;
|
||||
this.image = image;
|
||||
this.position = position;
|
||||
this.antiAliasing = antiAliasing;
|
||||
}
|
||||
|
||||
private double minWidth;
|
||||
|
||||
public void setMinWidth(double minWidth) {
|
||||
this.minWidth = minWidth;
|
||||
}
|
||||
|
||||
private int maxLine = 0;
|
||||
|
||||
private TextBlock getTextBlock() {
|
||||
TextBlock result = null;
|
||||
if (maxLine == 0) {
|
||||
result = Display.create(strings).create(
|
||||
new FontConfiguration(font, green, hyperlinkColor, useUnderlineForHyperlink),
|
||||
new FontConfiguration(font, maincolor, hyperlinkColor, useUnderlineForHyperlink),
|
||||
HorizontalAlignment.LEFT, new SpriteContainerEmpty());
|
||||
} else {
|
||||
for (int i = 0; i < strings.size(); i += maxLine) {
|
||||
final int n = Math.min(i + maxLine, strings.size());
|
||||
final TextBlock textBlock1 = Display.create(strings.subList(i, n)).create(
|
||||
new FontConfiguration(font, green, hyperlinkColor, useUnderlineForHyperlink),
|
||||
new FontConfiguration(font, maincolor, hyperlinkColor, useUnderlineForHyperlink),
|
||||
HorizontalAlignment.LEFT, new SpriteContainerEmpty());
|
||||
if (result == null) {
|
||||
result = textBlock1;
|
||||
@ -124,13 +141,14 @@ public class GraphicStrings extends AbstractTextBlock implements IEntityImage {
|
||||
}
|
||||
}
|
||||
}
|
||||
result = DateEventUtils.addEvent(result, green);
|
||||
// result = DateEventUtils.addEvent(result, green);
|
||||
return result;
|
||||
}
|
||||
|
||||
public void drawU(UGraphic ug) {
|
||||
final Dimension2D size = calculateDimension(ug.getStringBounder());
|
||||
getTextBlock().drawU(ug.apply(new UChangeColor(green)));
|
||||
ug = ug.apply(new UTranslate(margin, margin));
|
||||
final Dimension2D size = calculateDimensionInternal(ug.getStringBounder());
|
||||
getTextBlock().drawU(ug.apply(new UChangeColor(maincolor)));
|
||||
|
||||
if (image != null) {
|
||||
if (position == GraphicPosition.BOTTOM) {
|
||||
@ -146,10 +164,11 @@ public class GraphicStrings extends AbstractTextBlock implements IEntityImage {
|
||||
}
|
||||
|
||||
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||
return Dimension2DDouble.delta(calculateDimensionInternal(stringBounder), 2 * margin);
|
||||
}
|
||||
|
||||
private Dimension2D calculateDimensionInternal(StringBounder stringBounder) {
|
||||
Dimension2D dim = getTextBlock().calculateDimension(stringBounder);
|
||||
if (dim.getWidth() < minWidth) {
|
||||
dim = new Dimension2DDouble(minWidth, dim.getHeight());
|
||||
}
|
||||
if (image != null) {
|
||||
if (position == GraphicPosition.BOTTOM) {
|
||||
dim = new Dimension2DDouble(dim.getWidth(), dim.getHeight() + image.getHeight());
|
||||
@ -178,8 +197,4 @@ public class GraphicStrings extends AbstractTextBlock implements IEntityImage {
|
||||
return false;
|
||||
}
|
||||
|
||||
public final void setMaxLine(int maxLine) {
|
||||
this.maxLine = maxLine;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -97,7 +97,7 @@ public class QuoteUtils {
|
||||
"Luke, I am your father.", //
|
||||
"Blood, Sweat and Tears", //
|
||||
"Houston, we have a problem.", //
|
||||
"Boot failure, press any key to continue", //
|
||||
"Keyboard failure, press any key to continue", //
|
||||
"Big mistake!", //
|
||||
"How many UML designers does it take to change a lightbulb ?", //
|
||||
"Do you like movies about gladiators ?", //
|
||||
|
71
src/net/sourceforge/plantuml/graphic/TextBlockWithUrl.java
Normal file
71
src/net/sourceforge/plantuml/graphic/TextBlockWithUrl.java
Normal file
@ -0,0 +1,71 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2017, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.graphic;
|
||||
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
|
||||
public class TextBlockWithUrl implements TextBlock {
|
||||
|
||||
private final TextBlock block;
|
||||
private final Url url;
|
||||
|
||||
public static TextBlock withUrl(TextBlock block, Url url) {
|
||||
if (url == null) {
|
||||
return block;
|
||||
}
|
||||
return new TextBlockWithUrl(block, url);
|
||||
|
||||
}
|
||||
|
||||
private TextBlockWithUrl(TextBlock block, Url url) {
|
||||
this.block = block;
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
public void drawU(UGraphic ug) {
|
||||
ug.startUrl(url);
|
||||
block.drawU(ug);
|
||||
ug.closeAction();
|
||||
}
|
||||
|
||||
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||
return block.calculateDimension(stringBounder);
|
||||
}
|
||||
|
||||
public Rectangle2D getInnerPosition(String member, StringBounder stringBounder) {
|
||||
return block.getInnerPosition(member, stringBounder);
|
||||
}
|
||||
|
||||
}
|
128
src/net/sourceforge/plantuml/math/AsciiMath.java
Normal file
128
src/net/sourceforge/plantuml/math/AsciiMath.java
Normal file
@ -0,0 +1,128 @@
|
||||
package net.sourceforge.plantuml.math;
|
||||
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.script.Invocable;
|
||||
import javax.script.ScriptEngine;
|
||||
import javax.script.ScriptEngineManager;
|
||||
import javax.script.ScriptException;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
public class AsciiMath {
|
||||
|
||||
private static final String ASCIIMATH_PARSER_JS_LOCATION = "/net/sourceforge/plantuml/math/";
|
||||
|
||||
private static String JAVASCRIPT_CODE;
|
||||
|
||||
static {
|
||||
try {
|
||||
final BufferedReader br = new BufferedReader(new InputStreamReader(
|
||||
AsciiMath.class.getResourceAsStream(ASCIIMATH_PARSER_JS_LOCATION + "AsciiMathParser.js"), "UTF-8"));
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
String s = null;
|
||||
while ((s = br.readLine()) != null) {
|
||||
sb.append(s);
|
||||
sb.append("\n");
|
||||
}
|
||||
br.close();
|
||||
JAVASCRIPT_CODE = sb.toString();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final Node mathML;
|
||||
|
||||
public AsciiMath(String form) throws IOException, ScriptException, ParserConfigurationException,
|
||||
NoSuchMethodException {
|
||||
final ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
|
||||
engine.eval(JAVASCRIPT_CODE);
|
||||
final Invocable inv = (Invocable) engine;
|
||||
final Document dom = createDocument();
|
||||
mathML = (Node) inv.invokeFunction("plantuml", dom, form);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException, NoSuchMethodException, ScriptException,
|
||||
ParserConfigurationException, ClassNotFoundException, SecurityException, IllegalAccessException,
|
||||
IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
|
||||
AsciiMath math = new AsciiMath("sum_(i=1)^n i^3=((n(n+1))/2)^2");
|
||||
PrintWriter pw = new PrintWriter(new File("math2.svg"));
|
||||
pw.println(math.getSvg());
|
||||
pw.close();
|
||||
ImageIO.write(math.getImage(), "png", new File("math2.png"));
|
||||
}
|
||||
|
||||
private Document createDocument() throws ParserConfigurationException {
|
||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||
dbf.setNamespaceAware(true);
|
||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||
Document document = db.newDocument();
|
||||
return document;
|
||||
}
|
||||
|
||||
private Dimension2D dim;
|
||||
|
||||
public String getSvg() throws IOException, ClassNotFoundException, NoSuchMethodException, SecurityException,
|
||||
IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final Class<?> clConverter = Class.forName("net.sourceforge.jeuclid.converter.Converter");
|
||||
final Method getInstance = clConverter.getMethod("getInstance");
|
||||
final Object conv = getInstance.invoke(null);
|
||||
final Method convert = clConverter.getMethod("convert", Node.class, OutputStream.class, String.class,
|
||||
Class.forName("net.sourceforge.jeuclid.LayoutContext"));
|
||||
dim = (Dimension2D) convert.invoke(conv, mathML, baos, "image/svg+xml", getLayout());
|
||||
return new String(baos.toByteArray());
|
||||
}
|
||||
|
||||
public BufferedImage getImage() throws IOException, ClassNotFoundException, NoSuchMethodException,
|
||||
SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
|
||||
NoSuchFieldException {
|
||||
final Class<?> clConverter = Class.forName("net.sourceforge.jeuclid.converter.Converter");
|
||||
final Method getInstance = clConverter.getMethod("getInstance");
|
||||
final Object conv = getInstance.invoke(null);
|
||||
// final LayoutContext layoutContext = LayoutContextImpl.getDefaultLayoutContext();
|
||||
|
||||
final Method render = clConverter.getMethod("render", Node.class,
|
||||
Class.forName("net.sourceforge.jeuclid.LayoutContext"));
|
||||
|
||||
final BufferedImage result = (BufferedImage) render.invoke(conv, mathML, getLayout());
|
||||
dim = new Dimension2DDouble(result.getWidth(), result.getHeight());
|
||||
return result;
|
||||
}
|
||||
|
||||
private Object getLayout() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException,
|
||||
InvocationTargetException, IllegalArgumentException, NoSuchFieldException, SecurityException {
|
||||
final Class<?> clLayoutContextIml = Class.forName("net.sourceforge.jeuclid.context.LayoutContextImpl");
|
||||
final Class<?> clParameter = Class.forName("net.sourceforge.jeuclid.context.Parameter");
|
||||
final Method getDefaultLayoutContext = clLayoutContextIml.getMethod("getDefaultLayoutContext");
|
||||
final Object layoutContext = getDefaultLayoutContext.invoke(null);
|
||||
|
||||
final Method setParameter = clLayoutContextIml.getMethod("setParameter", clParameter, Object.class);
|
||||
setParameter.invoke(layoutContext, clParameter.getDeclaredField("SCRIPTSIZEMULTIPLIER").get(null), (float) 2);
|
||||
return layoutContext;
|
||||
}
|
||||
|
||||
public Dimension2D getDimension() {
|
||||
return dim;
|
||||
}
|
||||
|
||||
}
|
846
src/net/sourceforge/plantuml/math/AsciiMathParser.js
Normal file
846
src/net/sourceforge/plantuml/math/AsciiMathParser.js
Normal file
@ -0,0 +1,846 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2011-2012, The University of Edinburgh
|
||||
All Rights Reserved
|
||||
|
||||
This file is part of AsciiMathParser.js
|
||||
|
||||
AsciiMathParser.js is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published by the
|
||||
Free Software Foundation; either version 3 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
AsciiMathParser.js is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License (at
|
||||
http://www.gnu.org/licences/lgpl.html) for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with AsciiMathParser.js. If not, see <http://www.gnu.org/licenses/lgpl.html>.
|
||||
|
||||
AsciiMathParser.js
|
||||
==================
|
||||
|
||||
This is a modified and cut-down version of ASCIIMathML.js v2.1
|
||||
that allows ASCIIMath to be used solely as a parser for ASCIIMath
|
||||
input, generating an XML Element Node as a result.
|
||||
|
||||
This may allow you to integrate the ASCIIMath input format with
|
||||
other software and does not need to be run in a browser.
|
||||
|
||||
The only requirement is that you can provide a DOM Document Object
|
||||
when creating a parser. (Microsoft's implementation of Document is fine
|
||||
too.)
|
||||
|
||||
*/
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
/* This creates a new Object that you can use to parse ASCIIMath input.
|
||||
*
|
||||
* You must pass a DOM Document Object here that will be used to create
|
||||
* new DOM Nodes. The Doucument itself will not be modified.
|
||||
* A Microsoft DOM is acceptable.
|
||||
*/
|
||||
function AsciiMathParser(document) {
|
||||
|
||||
/* ASCIIMathML.js BEGINS BELOW.
|
||||
*
|
||||
* NOTE: I did a global search and replace to make NodeList traversal
|
||||
* work with the Java DOM, so that childNodes[i] -> childNodes.item(i).
|
||||
* This was done with the regexp s/(childNodes)\[(.+?)\]/$1.item($2)/g
|
||||
*
|
||||
* All other modifications made are shown below on
|
||||
* lines starting with
|
||||
* '//MOD: '
|
||||
*/
|
||||
|
||||
//-------------------------------------------------------------
|
||||
|
||||
/*
|
||||
ASCIIMathML.js
|
||||
==============
|
||||
This file contains JavaScript functions to convert ASCII math notation
|
||||
and LaTeX to Presentation MathML. Simple graphics commands are also
|
||||
translated to SVG images. The conversion is done while the (X)HTML
|
||||
page loads, and should work with Firefox/Mozilla/Netscape 7+ and Internet
|
||||
Explorer 6/7 + MathPlayer (http://www.dessci.com/en/products/mathplayer/) +
|
||||
Adobe SVGview 3.03 (http://www.adobe.com/svg/viewer/install/).
|
||||
|
||||
Just add the next line to your (X)HTML page with this file in the same folder:
|
||||
|
||||
<script type="text/javascript" src="ASCIIMathML.js"></script>
|
||||
|
||||
(using the graphics in IE also requires the file "d.svg" in the same folder).
|
||||
This is a convenient and inexpensive solution for authoring MathML and SVG.
|
||||
|
||||
Version 2.1 Oct 8, 2008, (c) Peter Jipsen http://www.chapman.edu/~jipsen
|
||||
This version extends ASCIIMathML.js with LaTeXMathML.js and ASCIIsvg.js.
|
||||
Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js
|
||||
If you use it on a webpage, please send the URL to jipsen@chapman.edu
|
||||
|
||||
The LaTeXMathML modifications were made by Douglas Woodall, June 2006.
|
||||
(for details see header on the LaTeXMathML part in middle of file)
|
||||
Extensive clean-up and improvements by Paulo Soares, Oct 2007.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or (at
|
||||
your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
(at http://www.gnu.org/licences/lgpl.html) for more details.
|
||||
*/
|
||||
|
||||
//MOD: Most of the global variables defined next are not required,
|
||||
//MOD: with the exception of the following:
|
||||
var decimalsign = "."; // change to "," if you like, beware of `(1,2)`!
|
||||
|
||||
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
||||
|
||||
//MOD: Everything from this point until the character list definitions starting
|
||||
//MOD: with 'var AMcal' has been removed and replaced with the following:
|
||||
|
||||
// This should be false here, since we're generating an XML DOM, rather than
|
||||
// something that will be aimed at a specific browser.
|
||||
var isIE = false;
|
||||
|
||||
// New version of this method to overcome the lack of createElementNS() in MSXML
|
||||
function createMmlNode(t,frag) {
|
||||
var node;
|
||||
if (document.createElementNS) {
|
||||
node = document.createElementNS("http://www.w3.org/1998/Math/MathML", t);
|
||||
}
|
||||
else {
|
||||
try {
|
||||
/* MSXML */
|
||||
node = document.createNode(1, t, "http://www.w3.org/1998/Math/MathML");
|
||||
}
|
||||
catch (e) {
|
||||
throw "This DOM Document does not support either createElementNS() or createNS()";
|
||||
}
|
||||
}
|
||||
if (frag) node.appendChild(frag);
|
||||
return node;
|
||||
}
|
||||
|
||||
// character lists for Mozilla/Netscape fonts
|
||||
var AMcal = [0xEF35,0x212C,0xEF36,0xEF37,0x2130,0x2131,0xEF38,0x210B,0x2110,0xEF39,0xEF3A,0x2112,0x2133,0xEF3B,0xEF3C,0xEF3D,0xEF3E,0x211B,0xEF3F,0xEF40,0xEF41,0xEF42,0xEF43,0xEF44,0xEF45,0xEF46];
|
||||
var AMfrk = [0xEF5D,0xEF5E,0x212D,0xEF5F,0xEF60,0xEF61,0xEF62,0x210C,0x2111,0xEF63,0xEF64,0xEF65,0xEF66,0xEF67,0xEF68,0xEF69,0xEF6A,0x211C,0xEF6B,0xEF6C,0xEF6D,0xEF6E,0xEF6F,0xEF70,0xEF71,0x2128];
|
||||
var AMbbb = [0xEF8C,0xEF8D,0x2102,0xEF8E,0xEF8F,0xEF90,0xEF91,0x210D,0xEF92,0xEF93,0xEF94,0xEF95,0xEF96,0x2115,0xEF97,0x2119,0x211A,0x211D,0xEF98,0xEF99,0xEF9A,0xEF9B,0xEF9C,0xEF9D,0xEF9E,0x2124];
|
||||
|
||||
var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4,
|
||||
RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8,
|
||||
LEFTRIGHT = 9, TEXT = 10, BIG = 11, LONG = 12, STRETCHY = 13,
|
||||
MATRIX = 14;; // token types
|
||||
|
||||
var AMquote = {input:"\"", tag:"mtext", output:"mbox", tex:null, ttype:TEXT};
|
||||
|
||||
var AMsymbols = [
|
||||
//some greek symbols
|
||||
{input:"alpha", tag:"mi", output:"\u03B1", tex:null, ttype:CONST},
|
||||
{input:"beta", tag:"mi", output:"\u03B2", tex:null, ttype:CONST},
|
||||
{input:"chi", tag:"mi", output:"\u03C7", tex:null, ttype:CONST},
|
||||
{input:"delta", tag:"mi", output:"\u03B4", tex:null, ttype:CONST},
|
||||
{input:"Delta", tag:"mo", output:"\u0394", tex:null, ttype:CONST},
|
||||
{input:"epsi", tag:"mi", output:"\u03B5", tex:"epsilon", ttype:CONST},
|
||||
{input:"varepsilon", tag:"mi", output:"\u025B", tex:null, ttype:CONST},
|
||||
{input:"eta", tag:"mi", output:"\u03B7", tex:null, ttype:CONST},
|
||||
{input:"gamma", tag:"mi", output:"\u03B3", tex:null, ttype:CONST},
|
||||
{input:"Gamma", tag:"mo", output:"\u0393", tex:null, ttype:CONST},
|
||||
{input:"iota", tag:"mi", output:"\u03B9", tex:null, ttype:CONST},
|
||||
{input:"kappa", tag:"mi", output:"\u03BA", tex:null, ttype:CONST},
|
||||
{input:"lambda", tag:"mi", output:"\u03BB", tex:null, ttype:CONST},
|
||||
{input:"Lambda", tag:"mo", output:"\u039B", tex:null, ttype:CONST},
|
||||
{input:"mu", tag:"mi", output:"\u03BC", tex:null, ttype:CONST},
|
||||
{input:"nu", tag:"mi", output:"\u03BD", tex:null, ttype:CONST},
|
||||
{input:"omega", tag:"mi", output:"\u03C9", tex:null, ttype:CONST},
|
||||
{input:"Omega", tag:"mo", output:"\u03A9", tex:null, ttype:CONST},
|
||||
{input:"phi", tag:"mi", output:"\u03C6", tex:null, ttype:CONST},
|
||||
{input:"varphi", tag:"mi", output:"\u03D5", tex:null, ttype:CONST},
|
||||
{input:"Phi", tag:"mo", output:"\u03A6", tex:null, ttype:CONST},
|
||||
{input:"pi", tag:"mi", output:"\u03C0", tex:null, ttype:CONST},
|
||||
{input:"Pi", tag:"mo", output:"\u03A0", tex:null, ttype:CONST},
|
||||
{input:"psi", tag:"mi", output:"\u03C8", tex:null, ttype:CONST},
|
||||
{input:"Psi", tag:"mi", output:"\u03A8", tex:null, ttype:CONST},
|
||||
{input:"rho", tag:"mi", output:"\u03C1", tex:null, ttype:CONST},
|
||||
{input:"sigma", tag:"mi", output:"\u03C3", tex:null, ttype:CONST},
|
||||
{input:"Sigma", tag:"mo", output:"\u03A3", tex:null, ttype:CONST},
|
||||
{input:"tau", tag:"mi", output:"\u03C4", tex:null, ttype:CONST},
|
||||
{input:"theta", tag:"mi", output:"\u03B8", tex:null, ttype:CONST},
|
||||
{input:"vartheta", tag:"mi", output:"\u03D1", tex:null, ttype:CONST},
|
||||
{input:"Theta", tag:"mo", output:"\u0398", tex:null, ttype:CONST},
|
||||
{input:"upsilon", tag:"mi", output:"\u03C5", tex:null, ttype:CONST},
|
||||
{input:"xi", tag:"mi", output:"\u03BE", tex:null, ttype:CONST},
|
||||
{input:"Xi", tag:"mo", output:"\u039E", tex:null, ttype:CONST},
|
||||
{input:"zeta", tag:"mi", output:"\u03B6", tex:null, ttype:CONST},
|
||||
|
||||
//binary operation symbols
|
||||
//{input:"-", tag:"mo", output:"\u0096", tex:null, ttype:CONST},
|
||||
{input:"*", tag:"mo", output:"\u22C5", tex:"cdot", ttype:CONST},
|
||||
{input:"**", tag:"mo", output:"\u22C6", tex:"star", ttype:CONST},
|
||||
{input:"//", tag:"mo", output:"/", tex:null, ttype:CONST},
|
||||
{input:"\\\\", tag:"mo", output:"\\", tex:"backslash", ttype:CONST},
|
||||
{input:"setminus", tag:"mo", output:"\\", tex:null, ttype:CONST},
|
||||
{input:"xx", tag:"mo", output:"\u00D7", tex:"times", ttype:CONST},
|
||||
{input:"-:", tag:"mo", output:"\u00F7", tex:"divide", ttype:CONST},
|
||||
{input:"@", tag:"mo", output:"\u26AC", tex:"circ", ttype:CONST},
|
||||
{input:"o+", tag:"mo", output:"\u2295", tex:"oplus", ttype:CONST},
|
||||
{input:"ox", tag:"mo", output:"\u2297", tex:"otimes", ttype:CONST},
|
||||
{input:"o.", tag:"mo", output:"\u2299", tex:"odot", ttype:CONST},
|
||||
{input:"sum", tag:"mo", output:"\u2211", tex:null, ttype:UNDEROVER},
|
||||
{input:"prod", tag:"mo", output:"\u220F", tex:null, ttype:UNDEROVER},
|
||||
{input:"^^", tag:"mo", output:"\u2227", tex:"wedge", ttype:CONST},
|
||||
{input:"^^^", tag:"mo", output:"\u22C0", tex:"bigwedge", ttype:UNDEROVER},
|
||||
{input:"vv", tag:"mo", output:"\u2228", tex:"vee", ttype:CONST},
|
||||
{input:"vvv", tag:"mo", output:"\u22C1", tex:"bigvee", ttype:UNDEROVER},
|
||||
{input:"nn", tag:"mo", output:"\u2229", tex:"cap", ttype:CONST},
|
||||
{input:"nnn", tag:"mo", output:"\u22C2", tex:"bigcap", ttype:UNDEROVER},
|
||||
{input:"uu", tag:"mo", output:"\u222A", tex:"cup", ttype:CONST},
|
||||
{input:"uuu", tag:"mo", output:"\u22C3", tex:"bigcup", ttype:UNDEROVER},
|
||||
|
||||
//binary relation symbols
|
||||
{input:"!=", tag:"mo", output:"\u2260", tex:"ne", ttype:CONST},
|
||||
{input:":=", tag:"mo", output:":=", tex:null, ttype:CONST},
|
||||
{input:"lt", tag:"mo", output:"<", tex:null, ttype:CONST},
|
||||
{input:"<=", tag:"mo", output:"\u2264", tex:"le", ttype:CONST},
|
||||
{input:"lt=", tag:"mo", output:"\u2264", tex:"leq", ttype:CONST},
|
||||
{input:">=", tag:"mo", output:"\u2265", tex:"ge", ttype:CONST},
|
||||
{input:"geq", tag:"mo", output:"\u2265", tex:null, ttype:CONST},
|
||||
{input:"-<", tag:"mo", output:"\u227A", tex:"prec", ttype:CONST},
|
||||
{input:"-lt", tag:"mo", output:"\u227A", tex:null, ttype:CONST},
|
||||
{input:">-", tag:"mo", output:"\u227B", tex:"succ", ttype:CONST},
|
||||
{input:"-<=", tag:"mo", output:"\u2AAF", tex:"preceq", ttype:CONST},
|
||||
{input:">-=", tag:"mo", output:"\u2AB0", tex:"succeq", ttype:CONST},
|
||||
{input:"in", tag:"mo", output:"\u2208", tex:null, ttype:CONST},
|
||||
{input:"!in", tag:"mo", output:"\u2209", tex:"notin", ttype:CONST},
|
||||
{input:"sub", tag:"mo", output:"\u2282", tex:"subset", ttype:CONST},
|
||||
{input:"sup", tag:"mo", output:"\u2283", tex:"supset", ttype:CONST},
|
||||
{input:"sube", tag:"mo", output:"\u2286", tex:"subseteq", ttype:CONST},
|
||||
{input:"supe", tag:"mo", output:"\u2287", tex:"supseteq", ttype:CONST},
|
||||
{input:"-=", tag:"mo", output:"\u2261", tex:"equiv", ttype:CONST},
|
||||
{input:"~=", tag:"mo", output:"\u2245", tex:"cong", ttype:CONST},
|
||||
{input:"~~", tag:"mo", output:"\u2248", tex:"approx", ttype:CONST},
|
||||
{input:"prop", tag:"mo", output:"\u221D", tex:"propto", ttype:CONST},
|
||||
|
||||
//logical symbols
|
||||
{input:"and", tag:"mtext", output:"and", tex:null, ttype:SPACE},
|
||||
{input:"or", tag:"mtext", output:"or", tex:null, ttype:SPACE},
|
||||
{input:"not", tag:"mo", output:"\u00AC", tex:"neg", ttype:CONST},
|
||||
{input:"=>", tag:"mo", output:"\u21D2", tex:"implies", ttype:CONST},
|
||||
{input:"if", tag:"mo", output:"if", tex:null, ttype:SPACE},
|
||||
{input:"<=>", tag:"mo", output:"\u21D4", tex:"iff", ttype:CONST},
|
||||
{input:"AA", tag:"mo", output:"\u2200", tex:"forall", ttype:CONST},
|
||||
{input:"EE", tag:"mo", output:"\u2203", tex:"exists", ttype:CONST},
|
||||
{input:"_|_", tag:"mo", output:"\u22A5", tex:"bot", ttype:CONST},
|
||||
{input:"TT", tag:"mo", output:"\u22A4", tex:"top", ttype:CONST},
|
||||
{input:"|--", tag:"mo", output:"\u22A2", tex:"vdash", ttype:CONST},
|
||||
{input:"|==", tag:"mo", output:"\u22A8", tex:"models", ttype:CONST},
|
||||
|
||||
//grouping brackets
|
||||
{input:"(", tag:"mo", output:"(", tex:null, ttype:LEFTBRACKET},
|
||||
{input:")", tag:"mo", output:")", tex:null, ttype:RIGHTBRACKET},
|
||||
{input:"[", tag:"mo", output:"[", tex:null, ttype:LEFTBRACKET},
|
||||
{input:"]", tag:"mo", output:"]", tex:null, ttype:RIGHTBRACKET},
|
||||
{input:"{", tag:"mo", output:"{", tex:null, ttype:LEFTBRACKET},
|
||||
{input:"}", tag:"mo", output:"}", tex:null, ttype:RIGHTBRACKET},
|
||||
{input:"|", tag:"mo", output:"|", tex:null, ttype:LEFTRIGHT},
|
||||
//{input:"||", tag:"mo", output:"||", tex:null, ttype:LEFTRIGHT},
|
||||
{input:"(:", tag:"mo", output:"\u2329", tex:"langle", ttype:LEFTBRACKET},
|
||||
{input:":)", tag:"mo", output:"\u232A", tex:"rangle", ttype:RIGHTBRACKET},
|
||||
{input:"<<", tag:"mo", output:"\u2329", tex:null, ttype:LEFTBRACKET},
|
||||
{input:">>", tag:"mo", output:"\u232A", tex:null, ttype:RIGHTBRACKET},
|
||||
{input:"{:", tag:"mo", output:"{:", tex:null, ttype:LEFTBRACKET, invisible:true},
|
||||
{input:":}", tag:"mo", output:":}", tex:null, ttype:RIGHTBRACKET, invisible:true},
|
||||
|
||||
//miscellaneous symbols
|
||||
{input:"int", tag:"mo", output:"\u222B", tex:null, ttype:CONST},
|
||||
{input:"dx", tag:"mi", output:"{:d x:}", tex:null, ttype:DEFINITION},
|
||||
{input:"dy", tag:"mi", output:"{:d y:}", tex:null, ttype:DEFINITION},
|
||||
{input:"dz", tag:"mi", output:"{:d z:}", tex:null, ttype:DEFINITION},
|
||||
{input:"dt", tag:"mi", output:"{:d t:}", tex:null, ttype:DEFINITION},
|
||||
{input:"oint", tag:"mo", output:"\u222E", tex:null, ttype:CONST},
|
||||
{input:"del", tag:"mo", output:"\u2202", tex:"partial", ttype:CONST},
|
||||
{input:"grad", tag:"mo", output:"\u2207", tex:"nabla", ttype:CONST},
|
||||
{input:"+-", tag:"mo", output:"\u00B1", tex:"pm", ttype:CONST},
|
||||
{input:"O/", tag:"mo", output:"\u2205", tex:"emptyset", ttype:CONST},
|
||||
{input:"oo", tag:"mo", output:"\u221E", tex:"infty", ttype:CONST},
|
||||
{input:"aleph", tag:"mo", output:"\u2135", tex:null, ttype:CONST},
|
||||
{input:"...", tag:"mo", output:"...", tex:"ldots", ttype:CONST},
|
||||
{input:":.", tag:"mo", output:"\u2234", tex:"therefore", ttype:CONST},
|
||||
{input:"/_", tag:"mo", output:"\u2220", tex:"angle", ttype:CONST},
|
||||
{input:"\\ ", tag:"mo", output:"\u00A0", tex:null, ttype:CONST},
|
||||
{input:"quad", tag:"mo", output:"\u00A0\u00A0", tex:null, ttype:CONST},
|
||||
{input:"qquad", tag:"mo", output:"\u00A0\u00A0\u00A0\u00A0", tex:null, ttype:CONST},
|
||||
{input:"cdots", tag:"mo", output:"\u22EF", tex:null, ttype:CONST},
|
||||
{input:"vdots", tag:"mo", output:"\u22EE", tex:null, ttype:CONST},
|
||||
{input:"ddots", tag:"mo", output:"\u22F1", tex:null, ttype:CONST},
|
||||
{input:"diamond", tag:"mo", output:"\u22C4", tex:null, ttype:CONST},
|
||||
{input:"square", tag:"mo", output:"\u25A1", tex:null, ttype:CONST},
|
||||
{input:"|__", tag:"mo", output:"\u230A", tex:"lfloor", ttype:CONST},
|
||||
{input:"__|", tag:"mo", output:"\u230B", tex:"rfloor", ttype:CONST},
|
||||
{input:"|~", tag:"mo", output:"\u2308", tex:"lceiling", ttype:CONST},
|
||||
{input:"~|", tag:"mo", output:"\u2309", tex:"rceiling", ttype:CONST},
|
||||
{input:"CC", tag:"mo", output:"\u2102", tex:null, ttype:CONST},
|
||||
{input:"NN", tag:"mo", output:"\u2115", tex:null, ttype:CONST},
|
||||
{input:"QQ", tag:"mo", output:"\u211A", tex:null, ttype:CONST},
|
||||
{input:"RR", tag:"mo", output:"\u211D", tex:null, ttype:CONST},
|
||||
{input:"ZZ", tag:"mo", output:"\u2124", tex:null, ttype:CONST},
|
||||
{input:"f", tag:"mi", output:"f", tex:null, ttype:UNARY, func:true},
|
||||
{input:"g", tag:"mi", output:"g", tex:null, ttype:UNARY, func:true},
|
||||
|
||||
//standard functions
|
||||
{input:"lim", tag:"mo", output:"lim", tex:null, ttype:UNDEROVER},
|
||||
{input:"Lim", tag:"mo", output:"Lim", tex:null, ttype:UNDEROVER},
|
||||
{input:"sin", tag:"mo", output:"sin", tex:null, ttype:UNARY, func:true},
|
||||
{input:"cos", tag:"mo", output:"cos", tex:null, ttype:UNARY, func:true},
|
||||
{input:"tan", tag:"mo", output:"tan", tex:null, ttype:UNARY, func:true},
|
||||
{input:"sinh", tag:"mo", output:"sinh", tex:null, ttype:UNARY, func:true},
|
||||
{input:"cosh", tag:"mo", output:"cosh", tex:null, ttype:UNARY, func:true},
|
||||
{input:"tanh", tag:"mo", output:"tanh", tex:null, ttype:UNARY, func:true},
|
||||
{input:"cot", tag:"mo", output:"cot", tex:null, ttype:UNARY, func:true},
|
||||
{input:"sec", tag:"mo", output:"sec", tex:null, ttype:UNARY, func:true},
|
||||
{input:"csc", tag:"mo", output:"csc", tex:null, ttype:UNARY, func:true},
|
||||
{input:"log", tag:"mo", output:"log", tex:null, ttype:UNARY, func:true},
|
||||
{input:"ln", tag:"mo", output:"ln", tex:null, ttype:UNARY, func:true},
|
||||
{input:"det", tag:"mo", output:"det", tex:null, ttype:UNARY, func:true},
|
||||
{input:"dim", tag:"mo", output:"dim", tex:null, ttype:CONST},
|
||||
{input:"mod", tag:"mo", output:"mod", tex:null, ttype:CONST},
|
||||
{input:"gcd", tag:"mo", output:"gcd", tex:null, ttype:UNARY, func:true},
|
||||
{input:"lcm", tag:"mo", output:"lcm", tex:null, ttype:UNARY, func:true},
|
||||
{input:"lub", tag:"mo", output:"lub", tex:null, ttype:CONST},
|
||||
{input:"glb", tag:"mo", output:"glb", tex:null, ttype:CONST},
|
||||
{input:"min", tag:"mo", output:"min", tex:null, ttype:UNDEROVER},
|
||||
{input:"max", tag:"mo", output:"max", tex:null, ttype:UNDEROVER},
|
||||
|
||||
//arrows
|
||||
{input:"uarr", tag:"mo", output:"\u2191", tex:"uparrow", ttype:CONST},
|
||||
{input:"darr", tag:"mo", output:"\u2193", tex:"downarrow", ttype:CONST},
|
||||
{input:"rarr", tag:"mo", output:"\u2192", tex:"rightarrow", ttype:CONST},
|
||||
{input:"->", tag:"mo", output:"\u2192", tex:"to", ttype:CONST},
|
||||
{input:">->", tag:"mo", output:"\u21A3", tex:"rightarrowtail", ttype:CONST},
|
||||
{input:"->>", tag:"mo", output:"\u21A0", tex:"twoheadrightarrow", ttype:CONST},
|
||||
{input:">->>", tag:"mo", output:"\u2916", tex:"twoheadrightarrowtail", ttype:CONST},
|
||||
{input:"|->", tag:"mo", output:"\u21A6", tex:"mapsto", ttype:CONST},
|
||||
{input:"larr", tag:"mo", output:"\u2190", tex:"leftarrow", ttype:CONST},
|
||||
{input:"harr", tag:"mo", output:"\u2194", tex:"leftrightarrow", ttype:CONST},
|
||||
{input:"rArr", tag:"mo", output:"\u21D2", tex:"Rightarrow", ttype:CONST},
|
||||
{input:"lArr", tag:"mo", output:"\u21D0", tex:"Leftarrow", ttype:CONST},
|
||||
{input:"hArr", tag:"mo", output:"\u21D4", tex:"Leftrightarrow", ttype:CONST},
|
||||
//commands with argument
|
||||
{input:"sqrt", tag:"msqrt", output:"sqrt", tex:null, ttype:UNARY},
|
||||
{input:"root", tag:"mroot", output:"root", tex:null, ttype:BINARY},
|
||||
{input:"frac", tag:"mfrac", output:"/", tex:null, ttype:BINARY},
|
||||
{input:"/", tag:"mfrac", output:"/", tex:null, ttype:INFIX},
|
||||
{input:"stackrel", tag:"mover", output:"stackrel", tex:null, ttype:BINARY},
|
||||
{input:"_", tag:"msub", output:"_", tex:null, ttype:INFIX},
|
||||
{input:"^", tag:"msup", output:"^", tex:null, ttype:INFIX},
|
||||
{input:"hat", tag:"mover", output:"\u005E", tex:null, ttype:UNARY, acc:true},
|
||||
{input:"bar", tag:"mover", output:"\u00AF", tex:"overline", ttype:UNARY, acc:true},
|
||||
{input:"vec", tag:"mover", output:"\u2192", tex:null, ttype:UNARY, acc:true},
|
||||
{input:"dot", tag:"mover", output:".", tex:null, ttype:UNARY, acc:true},
|
||||
{input:"ddot", tag:"mover", output:"..", tex:null, ttype:UNARY, acc:true},
|
||||
{input:"ul", tag:"munder", output:"\u0332", tex:"underline", ttype:UNARY, acc:true},
|
||||
{input:"text", tag:"mtext", output:"text", tex:null, ttype:TEXT},
|
||||
{input:"mbox", tag:"mtext", output:"mbox", tex:null, ttype:TEXT},
|
||||
AMquote,
|
||||
{input:"bb", tag:"mstyle", atname:"fontweight", atval:"bold", output:"bb", tex:null, ttype:UNARY},
|
||||
{input:"mathbf", tag:"mstyle", atname:"fontweight", atval:"bold", output:"mathbf", tex:null, ttype:UNARY},
|
||||
{input:"sf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"sf", tex:null, ttype:UNARY},
|
||||
{input:"mathsf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"mathsf", tex:null, ttype:UNARY},
|
||||
{input:"bbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"bbb", tex:null, ttype:UNARY, codes:AMbbb},
|
||||
{input:"mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb},
|
||||
{input:"cc", tag:"mstyle", atname:"mathvariant", atval:"script", output:"cc", tex:null, ttype:UNARY, codes:AMcal},
|
||||
{input:"mathcal", tag:"mstyle", atname:"mathvariant", atval:"script", output:"mathcal", tex:null, ttype:UNARY, codes:AMcal},
|
||||
{input:"tt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"tt", tex:null, ttype:UNARY},
|
||||
{input:"mathtt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"mathtt", tex:null, ttype:UNARY},
|
||||
{input:"fr", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"fr", tex:null, ttype:UNARY, codes:AMfrk},
|
||||
{input:"mathfrak", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"mathfrak", tex:null, ttype:UNARY, codes:AMfrk}
|
||||
];
|
||||
|
||||
function compareNames(s1,s2) {
|
||||
if (s1.input > s2.input) return 1
|
||||
else return -1;
|
||||
}
|
||||
|
||||
var AMnames = []; //list of input symbols
|
||||
|
||||
function initSymbols() {
|
||||
var texsymbols = [], i;
|
||||
for (i=0; i<AMsymbols.length; i++)
|
||||
if (AMsymbols[i].tex)
|
||||
texsymbols[texsymbols.length] = {input:AMsymbols[i].tex,
|
||||
tag:AMsymbols[i].tag, output:AMsymbols[i].output, ttype:AMsymbols[i].ttype};
|
||||
AMsymbols = AMsymbols.concat(texsymbols);
|
||||
refreshSymbols();
|
||||
}
|
||||
|
||||
function refreshSymbols(){
|
||||
var i;
|
||||
AMsymbols.sort(compareNames);
|
||||
for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;
|
||||
//MOD: The following lines are commented out as we're not supporting LaTeX input
|
||||
// LMsymbols.sort(compareNames);
|
||||
// for (i=0; i<LMsymbols.length; i++) LMnames[i] = LMsymbols[i].input;
|
||||
}
|
||||
|
||||
function define(oldstr,newstr) {
|
||||
//MOD: The following lines are commented out as we're not supporting LaTeX input
|
||||
// if(oldstr.substr(0,1)=="\\")
|
||||
// LMsymbols = LMsymbols.concat([{input:oldstr, tag:"mo", output:newstr,
|
||||
// ttype:DEFINITION}]);
|
||||
// else
|
||||
AMsymbols = AMsymbols.concat([{input:oldstr, tag:"mo", output:newstr,
|
||||
tex:null, ttype:DEFINITION}]);
|
||||
refreshSymbols(); // this may be a problem if many symbols are defined!
|
||||
}
|
||||
|
||||
|
||||
function AMremoveCharsAndBlanks(str,n) {
|
||||
//remove n characters and any following blanks
|
||||
var st;
|
||||
if (str.charAt(n)=="\\" && str.charAt(n+1)!="\\" && str.charAt(n+1)!=" ")
|
||||
st = str.slice(n+1);
|
||||
else st = str.slice(n);
|
||||
for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1);
|
||||
return st.slice(i);
|
||||
}
|
||||
|
||||
function position(arr, str, n) {
|
||||
// return position >=n where str appears or would be inserted
|
||||
// assumes arr is sorted
|
||||
if (n==0) {
|
||||
var h,m;
|
||||
n = -1;
|
||||
h = arr.length;
|
||||
while (n+1<h) {
|
||||
m = (n+h) >> 1;
|
||||
if (arr[m]<str) n = m; else h = m;
|
||||
}
|
||||
return h;
|
||||
} else
|
||||
for (var i=n; i<arr.length && arr[i]<str; i++);
|
||||
return i; // i=arr.length || arr[i]>=str
|
||||
}
|
||||
|
||||
function AMgetSymbol(str) {
|
||||
//return maximal initial substring of str that appears in names
|
||||
//return null if there is none
|
||||
var k = 0; //new pos
|
||||
var j = 0; //old pos
|
||||
var mk; //match pos
|
||||
var st;
|
||||
var tagst;
|
||||
var match = "";
|
||||
var more = true;
|
||||
for (var i=1; i<=str.length && more; i++) {
|
||||
st = str.slice(0,i); //initial substring of length i
|
||||
j = k;
|
||||
k = position(AMnames, st, j);
|
||||
if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){
|
||||
match = AMnames[k];
|
||||
mk = k;
|
||||
i = match.length;
|
||||
}
|
||||
more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k];
|
||||
}
|
||||
AMpreviousSymbol=AMcurrentSymbol;
|
||||
if (match!=""){
|
||||
AMcurrentSymbol=AMsymbols[mk].ttype;
|
||||
return AMsymbols[mk];
|
||||
}
|
||||
// if str[0] is a digit or - return maxsubstring of digits.digits
|
||||
AMcurrentSymbol=CONST;
|
||||
k = 1;
|
||||
st = str.slice(0,1);
|
||||
var integ = true;
|
||||
while ("0"<=st && st<="9" && k<=str.length) {
|
||||
st = str.slice(k,k+1);
|
||||
k++;
|
||||
}
|
||||
if (st == decimalsign) {
|
||||
st = str.slice(k,k+1);
|
||||
if ("0"<=st && st<="9") {
|
||||
integ = false;
|
||||
k++;
|
||||
while ("0"<=st && st<="9" && k<=str.length) {
|
||||
st = str.slice(k,k+1);
|
||||
k++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((integ && k>1) || k>2) {
|
||||
st = str.slice(0,k-1);
|
||||
tagst = "mn";
|
||||
} else {
|
||||
k = 2;
|
||||
st = str.slice(0,1); //take 1 character
|
||||
tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi");
|
||||
}
|
||||
if (st=="-" && AMpreviousSymbol==INFIX) {
|
||||
AMcurrentSymbol = INFIX; //trick "/" into recognizing "-" on second parse
|
||||
return {input:st, tag:tagst, output:st, ttype:UNARY, func:true};
|
||||
}
|
||||
return {input:st, tag:tagst, output:st, ttype:CONST};
|
||||
}
|
||||
|
||||
function AMremoveBrackets(node) {
|
||||
var st;
|
||||
if (node.nodeName=="mrow") {
|
||||
st = node.firstChild.firstChild.nodeValue;
|
||||
if (st=="(" || st=="[" || st=="{") node.removeChild(node.firstChild);
|
||||
}
|
||||
if (node.nodeName=="mrow") {
|
||||
st = node.lastChild.firstChild.nodeValue;
|
||||
if (st==")" || st=="]" || st=="}") node.removeChild(node.lastChild);
|
||||
}
|
||||
}
|
||||
|
||||
/*Parsing ASCII math expressions with the following grammar
|
||||
v ::= [A-Za-z] | greek letters | numbers | other constant symbols
|
||||
u ::= sqrt | text | bb | other unary symbols for font commands
|
||||
b ::= frac | root | stackrel binary symbols
|
||||
l ::= ( | [ | { | (: | {: left brackets
|
||||
r ::= ) | ] | } | :) | :} right brackets
|
||||
S ::= v | lEr | uS | bSS Simple expression
|
||||
I ::= S_S | S^S | S_S^S | S Intermediate expression
|
||||
E ::= IE | I/I Expression
|
||||
Each terminal symbol is translated into a corresponding mathml node.*/
|
||||
|
||||
var AMnestingDepth,AMpreviousSymbol,AMcurrentSymbol;
|
||||
|
||||
function AMparseSexpr(str) { //parses str and returns [node,tailstr]
|
||||
var symbol, node, result, i, st,// rightvert = false,
|
||||
newFrag = document.createDocumentFragment();
|
||||
str = AMremoveCharsAndBlanks(str,0);
|
||||
symbol = AMgetSymbol(str); //either a token or a bracket or empty
|
||||
if (symbol == null || symbol.ttype == RIGHTBRACKET && AMnestingDepth > 0) {
|
||||
return [null,str];
|
||||
}
|
||||
if (symbol.ttype == DEFINITION) {
|
||||
str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
symbol = AMgetSymbol(str);
|
||||
}
|
||||
switch (symbol.ttype) { case UNDEROVER:
|
||||
case CONST:
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
return [createMmlNode(symbol.tag, //its a constant
|
||||
document.createTextNode(symbol.output)),str];
|
||||
case LEFTBRACKET: //read (expr+)
|
||||
AMnestingDepth++;
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
result = AMparseExpr(str,true);
|
||||
AMnestingDepth--;
|
||||
if (typeof symbol.invisible == "boolean" && symbol.invisible)
|
||||
node = createMmlNode("mrow",result[0]);
|
||||
else {
|
||||
node = createMmlNode("mo",document.createTextNode(symbol.output));
|
||||
node = createMmlNode("mrow",node);
|
||||
node.appendChild(result[0]);
|
||||
}
|
||||
return [node,result[1]];
|
||||
case TEXT:
|
||||
if (symbol!=AMquote) str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
if (str.charAt(0)=="{") i=str.indexOf("}");
|
||||
else if (str.charAt(0)=="(") i=str.indexOf(")");
|
||||
else if (str.charAt(0)=="[") i=str.indexOf("]");
|
||||
else if (symbol==AMquote) i=str.slice(1).indexOf("\"")+1;
|
||||
else i = 0;
|
||||
if (i==-1) i = str.length;
|
||||
st = str.slice(1,i);
|
||||
if (st.charAt(0) == " ") {
|
||||
node = createMmlNode("mspace");
|
||||
node.setAttribute("width","1ex");
|
||||
newFrag.appendChild(node);
|
||||
}
|
||||
newFrag.appendChild(
|
||||
createMmlNode(symbol.tag,document.createTextNode(st)));
|
||||
if (st.charAt(st.length-1) == " ") {
|
||||
node = createMmlNode("mspace");
|
||||
node.setAttribute("width","1ex");
|
||||
newFrag.appendChild(node);
|
||||
}
|
||||
str = AMremoveCharsAndBlanks(str,i+1);
|
||||
return [createMmlNode("mrow",newFrag),str];
|
||||
case UNARY:
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
result = AMparseSexpr(str);
|
||||
if (result[0]==null) return [createMmlNode(symbol.tag,
|
||||
document.createTextNode(symbol.output)),str];
|
||||
if (typeof symbol.func == "boolean" && symbol.func) { // functions hack
|
||||
st = str.charAt(0);
|
||||
if (st=="^" || st=="_" || st=="/" || st=="|" || st==",") {
|
||||
return [createMmlNode(symbol.tag,
|
||||
document.createTextNode(symbol.output)),str];
|
||||
} else {
|
||||
node = createMmlNode("mrow",
|
||||
createMmlNode(symbol.tag,document.createTextNode(symbol.output)));
|
||||
node.appendChild(result[0]);
|
||||
return [node,result[1]];
|
||||
}
|
||||
}
|
||||
AMremoveBrackets(result[0]);
|
||||
if (symbol.input == "sqrt") { // sqrt
|
||||
return [createMmlNode(symbol.tag,result[0]),result[1]];
|
||||
} else if (typeof symbol.acc == "boolean" && symbol.acc) { // accent
|
||||
node = createMmlNode(symbol.tag,result[0]);
|
||||
node.appendChild(createMmlNode("mo",document.createTextNode(symbol.output)));
|
||||
return [node,result[1]];
|
||||
} else { // font change command
|
||||
// MOD: The following code generates invalid MathML, so is commented out for the time being.
|
||||
// if (!isIE && typeof symbol.codes != "undefined") {
|
||||
// for (i=0; i<result[0].childNodes.length; i++)
|
||||
// if (result[0].childNodes.item(i).nodeName=="mi" || result[0].nodeName=="mi") {
|
||||
// st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue:
|
||||
// result[0].childNodes.item(i).firstChild.nodeValue);
|
||||
// var newst = [];
|
||||
// for (var j=0; j<st.length; j++)
|
||||
// if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91) newst = newst +
|
||||
// String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]);
|
||||
// else newst = newst + st.charAt(j);
|
||||
// if (result[0].nodeName=="mi") {
|
||||
// result[0]=createMmlNode("mo").
|
||||
// appendChild(document.createTextNode(newst));
|
||||
// }
|
||||
// else result[0].replaceChild(createMmlNode("mo").
|
||||
// appendChild(document.createTextNode(newst)),
|
||||
// result[0].childNodes.item(i));
|
||||
// }
|
||||
// }
|
||||
node = createMmlNode(symbol.tag,result[0]);
|
||||
node.setAttribute(symbol.atname,symbol.atval);
|
||||
return [node,result[1]];
|
||||
}
|
||||
case BINARY:
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
result = AMparseSexpr(str);
|
||||
if (result[0]==null) return [createMmlNode("mo",
|
||||
document.createTextNode(symbol.input)),str];
|
||||
AMremoveBrackets(result[0]);
|
||||
var result2 = AMparseSexpr(result[1]);
|
||||
if (result2[0]==null) return [createMmlNode("mo",
|
||||
document.createTextNode(symbol.input)),str];
|
||||
AMremoveBrackets(result2[0]);
|
||||
if (symbol.input=="root" || symbol.input=="stackrel")
|
||||
newFrag.appendChild(result2[0]);
|
||||
newFrag.appendChild(result[0]);
|
||||
if (symbol.input=="frac") newFrag.appendChild(result2[0]);
|
||||
return [createMmlNode(symbol.tag,newFrag),result2[1]];
|
||||
case INFIX:
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
return [createMmlNode("mo",document.createTextNode(symbol.output)),str];
|
||||
case SPACE:
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
node = createMmlNode("mspace");
|
||||
node.setAttribute("width","1ex");
|
||||
newFrag.appendChild(node);
|
||||
newFrag.appendChild(
|
||||
createMmlNode(symbol.tag,document.createTextNode(symbol.output)));
|
||||
node = createMmlNode("mspace");
|
||||
node.setAttribute("width","1ex");
|
||||
newFrag.appendChild(node);
|
||||
return [createMmlNode("mrow",newFrag),str];
|
||||
case LEFTRIGHT:
|
||||
// if (rightvert) return [null,str]; else rightvert = true;
|
||||
AMnestingDepth++;
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
result = AMparseExpr(str,false);
|
||||
AMnestingDepth--;
|
||||
var st = "";
|
||||
if (result[0].lastChild!=null)
|
||||
st = result[0].lastChild.firstChild.nodeValue;
|
||||
if (st == "|") { // its an absolute value subterm
|
||||
node = createMmlNode("mo",document.createTextNode(symbol.output));
|
||||
node = createMmlNode("mrow",node);
|
||||
node.appendChild(result[0]);
|
||||
return [node,result[1]];
|
||||
} else { // the "|" is a \mid so use unicode 2223 (divides) for spacing
|
||||
node = createMmlNode("mo",document.createTextNode("\u2223"));
|
||||
node = createMmlNode("mrow",node);
|
||||
return [node,str];
|
||||
}
|
||||
default:
|
||||
//alert("default");
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
return [createMmlNode(symbol.tag, //its a constant
|
||||
document.createTextNode(symbol.output)),str];
|
||||
}
|
||||
}
|
||||
|
||||
function AMparseIexpr(str) {
|
||||
var symbol, sym1, sym2, node, result, underover;
|
||||
str = AMremoveCharsAndBlanks(str,0);
|
||||
sym1 = AMgetSymbol(str);
|
||||
result = AMparseSexpr(str);
|
||||
node = result[0];
|
||||
str = result[1];
|
||||
symbol = AMgetSymbol(str);
|
||||
if (symbol.ttype == INFIX && symbol.input != "/") {
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
// if (symbol.input == "/") result = AMparseIexpr(str); else ...
|
||||
result = AMparseSexpr(str);
|
||||
if (result[0] == null) // show box in place of missing argument
|
||||
result[0] = createMmlNode("mo",document.createTextNode("\u25A1"));
|
||||
else AMremoveBrackets(result[0]);
|
||||
str = result[1];
|
||||
// if (symbol.input == "/") AMremoveBrackets(node);
|
||||
if (symbol.input == "_") {
|
||||
sym2 = AMgetSymbol(str);
|
||||
underover = (sym1.ttype == UNDEROVER);
|
||||
if (sym2.input == "^") {
|
||||
str = AMremoveCharsAndBlanks(str,sym2.input.length);
|
||||
var res2 = AMparseSexpr(str);
|
||||
AMremoveBrackets(res2[0]);
|
||||
str = res2[1];
|
||||
node = createMmlNode((underover?"munderover":"msubsup"),node);
|
||||
node.appendChild(result[0]);
|
||||
node.appendChild(res2[0]);
|
||||
node = createMmlNode("mrow",node); // so sum does not stretch
|
||||
} else {
|
||||
node = createMmlNode((underover?"munder":"msub"),node);
|
||||
node.appendChild(result[0]);
|
||||
}
|
||||
} else {
|
||||
node = createMmlNode(symbol.tag,node);
|
||||
node.appendChild(result[0]);
|
||||
}
|
||||
}
|
||||
return [node,str];
|
||||
}
|
||||
|
||||
function AMparseExpr(str,rightbracket) {
|
||||
var symbol, node, result, i, nodeList = [],
|
||||
newFrag = document.createDocumentFragment();
|
||||
do {
|
||||
str = AMremoveCharsAndBlanks(str,0);
|
||||
result = AMparseIexpr(str);
|
||||
node = result[0];
|
||||
str = result[1];
|
||||
symbol = AMgetSymbol(str);
|
||||
if (symbol.ttype == INFIX && symbol.input == "/") {
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
result = AMparseIexpr(str);
|
||||
if (result[0] == null) // show box in place of missing argument
|
||||
result[0] = createMmlNode("mo",document.createTextNode("\u25A1"));
|
||||
else AMremoveBrackets(result[0]);
|
||||
str = result[1];
|
||||
AMremoveBrackets(node);
|
||||
node = createMmlNode(symbol.tag,node);
|
||||
node.appendChild(result[0]);
|
||||
newFrag.appendChild(node);
|
||||
symbol = AMgetSymbol(str);
|
||||
}
|
||||
else if (node!=undefined) newFrag.appendChild(node);
|
||||
} while ((symbol.ttype != RIGHTBRACKET &&
|
||||
(symbol.ttype != LEFTRIGHT || rightbracket)
|
||||
|| AMnestingDepth == 0) && symbol!=null && symbol.output!="");
|
||||
if (symbol.ttype == RIGHTBRACKET || symbol.ttype == LEFTRIGHT) {
|
||||
// if (AMnestingDepth > 0) AMnestingDepth--;
|
||||
var len = newFrag.childNodes.length;
|
||||
if (len>0 && newFrag.childNodes.item(len-1).nodeName == "mrow" && len>1 &&
|
||||
newFrag.childNodes.item(len-2).nodeName == "mo" &&
|
||||
newFrag.childNodes.item(len-2).firstChild.nodeValue == ",") { //matrix
|
||||
var right = newFrag.childNodes.item(len-1).lastChild.firstChild.nodeValue;
|
||||
if (right==")" || right=="]") {
|
||||
var left = newFrag.childNodes.item(len-1).firstChild.firstChild.nodeValue;
|
||||
if (left=="(" && right==")" && symbol.output != "}" ||
|
||||
left=="[" && right=="]") {
|
||||
var pos = []; // positions of commas
|
||||
var matrix = true;
|
||||
var m = newFrag.childNodes.length;
|
||||
for (i=0; matrix && i<m; i=i+2) {
|
||||
pos[i] = [];
|
||||
node = newFrag.childNodes.item(i);
|
||||
if (matrix) matrix = node.nodeName=="mrow" &&
|
||||
(i==m-1 || node.nextSibling.nodeName=="mo" &&
|
||||
node.nextSibling.firstChild.nodeValue==",")&&
|
||||
node.firstChild.firstChild.nodeValue==left &&
|
||||
node.lastChild.firstChild.nodeValue==right;
|
||||
if (matrix)
|
||||
for (var j=0; j<node.childNodes.length; j++)
|
||||
if (node.childNodes.item(j).firstChild.nodeValue==",")
|
||||
pos[i][pos[i].length]=j;
|
||||
if (matrix && i>1) matrix = pos[i].length == pos[i-2].length;
|
||||
}
|
||||
if (matrix) {
|
||||
var row, frag, n, k, table = document.createDocumentFragment();
|
||||
for (i=0; i<m; i=i+2) {
|
||||
row = document.createDocumentFragment();
|
||||
frag = document.createDocumentFragment();
|
||||
node = newFrag.firstChild; // <mrow>(-,-,...,-,-)</mrow>
|
||||
n = node.childNodes.length;
|
||||
k = 0;
|
||||
node.removeChild(node.firstChild); //remove (
|
||||
for (j=1; j<n-1; j++) {
|
||||
if (typeof pos[i][k] != "undefined" && j==pos[i][k]){
|
||||
node.removeChild(node.firstChild); //remove ,
|
||||
row.appendChild(createMmlNode("mtd",frag));
|
||||
k++;
|
||||
} else frag.appendChild(node.firstChild);
|
||||
}
|
||||
row.appendChild(createMmlNode("mtd",frag));
|
||||
if (newFrag.childNodes.length>2) {
|
||||
newFrag.removeChild(newFrag.firstChild); //remove <mrow>)</mrow>
|
||||
newFrag.removeChild(newFrag.firstChild); //remove <mo>,</mo>
|
||||
}
|
||||
table.appendChild(createMmlNode("mtr",row));
|
||||
}
|
||||
node = createMmlNode("mtable",table);
|
||||
if (typeof symbol.invisible == "boolean" && symbol.invisible) node.setAttribute("columnalign","left");
|
||||
newFrag.replaceChild(node,newFrag.firstChild);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
str = AMremoveCharsAndBlanks(str,symbol.input.length);
|
||||
if (typeof symbol.invisible != "boolean" || !symbol.invisible) {
|
||||
node = createMmlNode("mo",document.createTextNode(symbol.output));
|
||||
newFrag.appendChild(node);
|
||||
}
|
||||
}
|
||||
return [newFrag,str];
|
||||
}
|
||||
|
||||
//MOD: The rest of the code is not required!
|
||||
|
||||
//-------------------------------------------------------------
|
||||
|
||||
/* ASCIIMathML.js has ended! */
|
||||
|
||||
initSymbols();
|
||||
|
||||
/* Parses the given ASCIIMathInput, returning a <math> DOM Element */
|
||||
this.parseAsciiMathInput = function(asciiMathInput) {
|
||||
var options = arguments[1] || {};
|
||||
|
||||
/* Call up ASCIIMath to do the actual parsing, generating a document fragment */
|
||||
var content = AMparseExpr(asciiMathInput.replace(/^\s+/g,""), false)[0];
|
||||
|
||||
/* If adding source annotation, then we need to wrap things up appropriately */
|
||||
if (options.addSourceAnnotation) {
|
||||
var semantics = createMmlNode("semantics", content.length==1 ? content : createMmlNode("mrow", content));
|
||||
|
||||
var annotation = createMmlNode("annotation", document.createTextNode(asciiMathInput));
|
||||
annotation.setAttribute("encoding", "ASCIIMathInput");
|
||||
semantics.appendChild(annotation);
|
||||
|
||||
content = semantics;
|
||||
}
|
||||
|
||||
/* Create the containing <math> element */
|
||||
var math = createMmlNode("math", content);
|
||||
if (options.displayMode) {
|
||||
math.setAttribute("display", "block");
|
||||
}
|
||||
return math;
|
||||
};
|
||||
|
||||
// (end of unindented constructor defined at top of file)
|
||||
};
|
||||
function plantuml(dom, asciiMathInput) {
|
||||
var asciiMathParser = new AsciiMathParser(dom);
|
||||
var mathElement = asciiMathParser.parseAsciiMathInput(asciiMathInput);
|
||||
return mathElement;
|
||||
}
|
102
src/net/sourceforge/plantuml/math/AsciiMathSafe.java
Normal file
102
src/net/sourceforge/plantuml/math/AsciiMathSafe.java
Normal file
@ -0,0 +1,102 @@
|
||||
package net.sourceforge.plantuml.math;
|
||||
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.Log;
|
||||
import net.sourceforge.plantuml.api.ImageDataSimple;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
|
||||
public class AsciiMathSafe {
|
||||
|
||||
private AsciiMath math;
|
||||
private final String form;
|
||||
|
||||
public AsciiMathSafe(String form) {
|
||||
this.form = form;
|
||||
try {
|
||||
this.math = new AsciiMath(form);
|
||||
} catch (Exception e) {
|
||||
Log.info("Error parsing " + form);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
AsciiMathSafe math = new AsciiMathSafe("sum_(i=1)^n i^3=((n(n+1))/2)^2");
|
||||
PrintWriter pw = new PrintWriter(new File("math2.svg"));
|
||||
pw.println(math.getSvg());
|
||||
pw.close();
|
||||
ImageIO.write(math.getImage(), "png", new File("math2.png"));
|
||||
}
|
||||
|
||||
private ImageData dimSvg;
|
||||
|
||||
public String getSvg() {
|
||||
try {
|
||||
final String svg = math.getSvg();
|
||||
dimSvg = new ImageDataSimple(math.getDimension());
|
||||
return svg;
|
||||
} catch (Exception e) {
|
||||
final ImageBuilder imageBuilder = getRollback();
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try {
|
||||
dimSvg = imageBuilder.writeImageTOBEMOVED(new FileFormatOption(FileFormat.SVG), baos);
|
||||
} catch (IOException e1) {
|
||||
return null;
|
||||
}
|
||||
return new String(baos.toByteArray());
|
||||
}
|
||||
}
|
||||
|
||||
public BufferedImage getImage() {
|
||||
try {
|
||||
return math.getImage();
|
||||
} catch (Exception e) {
|
||||
final ImageBuilder imageBuilder = getRollback();
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try {
|
||||
imageBuilder.writeImageTOBEMOVED(new FileFormatOption(FileFormat.PNG), baos);
|
||||
return ImageIO.read(new ByteArrayInputStream(baos.toByteArray()));
|
||||
} catch (IOException e1) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ImageBuilder getRollback() {
|
||||
final TextBlock block = GraphicStrings.createBlackOnWhiteMonospaced(Arrays.asList(form));
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, null, null, null, 0, 0,
|
||||
null, false);
|
||||
imageBuilder.setUDrawable(block);
|
||||
return imageBuilder;
|
||||
}
|
||||
|
||||
public ImageData export(OutputStream os, FileFormatOption fileFormat) throws IOException {
|
||||
if (fileFormat.getFileFormat() == FileFormat.PNG) {
|
||||
final BufferedImage image = getImage();
|
||||
ImageIO.write(image, "png", os);
|
||||
return new ImageDataSimple(image.getWidth(), image.getHeight());
|
||||
}
|
||||
if (fileFormat.getFileFormat() == FileFormat.SVG) {
|
||||
os.write(getSvg().getBytes());
|
||||
return dimSvg;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
62
src/net/sourceforge/plantuml/math/PSystemMath.java
Normal file
62
src/net/sourceforge/plantuml/math/PSystemMath.java
Normal file
@ -0,0 +1,62 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2017, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.math;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
import net.sourceforge.plantuml.AbstractPSystem;
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
|
||||
public class PSystemMath extends AbstractPSystem {
|
||||
|
||||
private String math = "";
|
||||
|
||||
public PSystemMath() {
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
return new DiagramDescriptionImpl("(Math)", getClass());
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
AsciiMathSafe asciiMath = new AsciiMathSafe(math);
|
||||
return asciiMath.export(os, fileFormat);
|
||||
}
|
||||
|
||||
public void doCommandLine(String line) {
|
||||
this.math = line;
|
||||
}
|
||||
|
||||
}
|
@ -25,48 +25,32 @@
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.turing;
|
||||
package net.sourceforge.plantuml.math;
|
||||
|
||||
import net.sourceforge.plantuml.command.PSystemBasicFactory;
|
||||
import net.sourceforge.plantuml.core.DiagramType;
|
||||
|
||||
public class PSystemTuringFactory extends PSystemBasicFactory<PSystemTuring> {
|
||||
public class PSystemMathFactory extends PSystemBasicFactory<PSystemMath> {
|
||||
|
||||
private StringBuilder prg;
|
||||
private StringBuilder input;
|
||||
|
||||
public PSystemTuringFactory() {
|
||||
super(DiagramType.TURING);
|
||||
public PSystemMathFactory(DiagramType type) {
|
||||
super(type);
|
||||
}
|
||||
|
||||
public PSystemTuring init(String startLine) {
|
||||
prg = null;
|
||||
input = null;
|
||||
if ("@startturing".equalsIgnoreCase(startLine)) {
|
||||
prg = new StringBuilder();
|
||||
public PSystemMath init(String startLine) {
|
||||
if (getDiagramType() == DiagramType.MATH) {
|
||||
return new PSystemMath();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PSystemTuring executeLine(PSystemTuring system, String line) {
|
||||
if (prg == null) {
|
||||
return null;
|
||||
}
|
||||
if (input == null) {
|
||||
if (line.length() == 0) {
|
||||
input = new StringBuilder();
|
||||
} else {
|
||||
prg.append(line);
|
||||
prg.append('\n');
|
||||
}
|
||||
} else {
|
||||
input.append(line);
|
||||
input.append('\n');
|
||||
}
|
||||
return new PSystemTuring(prg.toString(), input == null ? "" : input.toString());
|
||||
public PSystemMath executeLine(PSystemMath system, String line) {
|
||||
system.doCommandLine(line);
|
||||
return system;
|
||||
}
|
||||
|
||||
}
|
@ -30,7 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.openiconic;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@ -45,24 +44,22 @@ import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.openiconic.data.DummyIcon;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemListOpenIconic extends AbstractPSystem {
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
final List<String> lines = new ArrayList<String>();
|
||||
lines.add("<b>List Open Iconic");
|
||||
lines.add("<i>Credit to");
|
||||
@ -77,11 +74,7 @@ public class PSystemListOpenIconic extends AbstractPSystem {
|
||||
}
|
||||
br.close();
|
||||
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
final GraphicStrings graphicStrings = new GraphicStrings(lines, font, HtmlColorUtils.BLACK,
|
||||
HtmlColorUtils.WHITE, UAntiAliasing.ANTI_ALIASING_ON);
|
||||
graphicStrings.setMaxLine(35);
|
||||
return graphicStrings;
|
||||
return GraphicStrings.createBlackOnWhite(lines, null, null, 35);
|
||||
}
|
||||
|
||||
private InputStream getRessourceAllTxt() {
|
||||
|
@ -30,7 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.oregon;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
@ -43,11 +42,9 @@ import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemOregon extends AbstractPSystem {
|
||||
|
||||
@ -94,17 +91,15 @@ public class PSystemOregon extends AbstractPSystem {
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
final UFont font = new UFont("Monospaced", Font.PLAIN, 14);
|
||||
return new GraphicStrings(getScreen().getLines(), font, HtmlColorUtils.GREEN, HtmlColorUtils.BLACK,
|
||||
UAntiAliasing.ANTI_ALIASING_OFF);
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
return GraphicStrings.createGreenOnBlackMonospaced(getScreen().getLines());
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
|
@ -44,7 +44,6 @@ import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.FileUtils;
|
||||
import net.sourceforge.plantuml.Log;
|
||||
import net.sourceforge.plantuml.SplitParam;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorSimple;
|
||||
|
||||
public class PngSplitter {
|
||||
|
||||
|
@ -30,8 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.preproc;
|
||||
|
||||
import gen.lib.pack.pack__c;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
|
@ -34,7 +34,6 @@ import java.awt.geom.Dimension2D;
|
||||
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
||||
import net.sourceforge.plantuml.png.PngTitler;
|
||||
import net.sourceforge.plantuml.utils.MathUtils;
|
||||
|
||||
|
@ -78,7 +78,8 @@ public enum VisibilityModifier {
|
||||
};
|
||||
}
|
||||
|
||||
public TextBlock getUBlock(final int size, final HtmlColor foregroundColor, final HtmlColor backgoundColor) {
|
||||
public TextBlock getUBlock(final int size, final HtmlColor foregroundColor, final HtmlColor backgoundColor,
|
||||
final boolean withInvisibleRectanble) {
|
||||
return new AbstractTextBlock() {
|
||||
|
||||
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||
@ -91,6 +92,9 @@ public enum VisibilityModifier {
|
||||
}
|
||||
|
||||
public void drawU(UGraphic ug) {
|
||||
if (withInvisibleRectanble) {
|
||||
ug.apply(new UChangeColor(null)).draw(new URectangle(size * 2, size));
|
||||
}
|
||||
drawInternal(ug, size, foregroundColor, backgoundColor, 0, 0);
|
||||
}
|
||||
};
|
||||
|
90
src/net/sourceforge/plantuml/stats/FormatCounter.java
Normal file
90
src/net/sourceforge/plantuml/stats/FormatCounter.java
Normal file
@ -0,0 +1,90 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2017, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.stats;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.prefs.BackingStoreException;
|
||||
import java.util.prefs.Preferences;
|
||||
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
|
||||
public class FormatCounter {
|
||||
|
||||
private ConcurrentMap<FileFormat, AtomicLong> data = new ConcurrentHashMap<FileFormat, AtomicLong>();
|
||||
|
||||
public FormatCounter() {
|
||||
for (FileFormat format : FileFormat.values()) {
|
||||
data.put(format, new AtomicLong());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void plusOne(FileFormat fileFormat, long duration) {
|
||||
final AtomicLong n = data.get(fileFormat);
|
||||
n.addAndGet(1);
|
||||
}
|
||||
|
||||
public void printTable(List<String> strings) {
|
||||
Stats.addLine(strings, false, "Format", "#");
|
||||
long total = 0;
|
||||
for (Map.Entry<FileFormat, AtomicLong> ent : data.entrySet()) {
|
||||
final long value = ent.getValue().get();
|
||||
Stats.addLine(strings, false, ent.getKey().name(), value);
|
||||
total += value;
|
||||
}
|
||||
Stats.addLine(strings, true, "Total", total);
|
||||
|
||||
}
|
||||
|
||||
public void reload(String prefix, Preferences prefs) throws BackingStoreException {
|
||||
for (String key : prefs.keys()) {
|
||||
if (key.startsWith(prefix)) {
|
||||
try {
|
||||
final FileFormat format = FileFormat.valueOf(key.substring(prefix.length()));
|
||||
final long value = prefs.getLong(key, 0);
|
||||
data.put(format, new AtomicLong(value));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void save(String prefix, Preferences prefs, FileFormat fileFormat) {
|
||||
final String key = prefix + fileFormat.name();
|
||||
prefs.putLong(key, data.get(fileFormat).get());
|
||||
}
|
||||
|
||||
}
|
@ -27,9 +27,8 @@
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.turing;
|
||||
package net.sourceforge.plantuml.stats;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
@ -40,47 +39,38 @@ import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicPosition;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemTuring extends AbstractPSystem {
|
||||
public class PSystemStats extends AbstractPSystem {
|
||||
|
||||
private final String program;
|
||||
private final String input;
|
||||
private final List<String> strings = new ArrayList<String>();
|
||||
|
||||
PSystemTuring(String program, String input) {
|
||||
this.program = program;
|
||||
this.input = input;
|
||||
PSystemStats() throws IOException {
|
||||
final Stats stats = StatsUtils.getStats();
|
||||
stats.printMe(strings);
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
final List<String> strings = new ArrayList<String>();
|
||||
final BFMachine machine = new BFMachine(program, input);
|
||||
/* final boolean ok = */machine.run();
|
||||
final String output = machine.getOutput();
|
||||
for (String s : output.split("\n")) {
|
||||
strings.add(s);
|
||||
}
|
||||
final UFont font = new UFont("Monospaced", Font.PLAIN, 14);
|
||||
return new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, UAntiAliasing.ANTI_ALIASING_ON,
|
||||
null, GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT);
|
||||
public static PSystemStats create() throws IOException {
|
||||
return new PSystemStats();
|
||||
}
|
||||
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
return GraphicStrings.createBlackOnWhite(strings);
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
return new DiagramDescriptionImpl("(Turing)", getClass());
|
||||
return new DiagramDescriptionImpl("(Stats)", getClass());
|
||||
}
|
||||
|
||||
}
|
@ -25,23 +25,26 @@
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.eggs;
|
||||
package net.sourceforge.plantuml.stats;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import net.sourceforge.plantuml.AbstractPSystem;
|
||||
import net.sourceforge.plantuml.Log;
|
||||
import net.sourceforge.plantuml.command.PSystemSingleLineFactory;
|
||||
import net.sourceforge.plantuml.webp.Portrait;
|
||||
import net.sourceforge.plantuml.webp.Portraits;
|
||||
|
||||
public class PSystemMemorialFactory extends PSystemSingleLineFactory {
|
||||
public class PSystemStatsFactory extends PSystemSingleLineFactory {
|
||||
|
||||
@Override
|
||||
protected AbstractPSystem executeLine(String line) {
|
||||
final Portrait portrait = Portraits.getOne(line);
|
||||
if (portrait != null) {
|
||||
return new PSystemMemorial(portrait);
|
||||
try {
|
||||
if (line.matches("(?i)^stats\\s*$")) {
|
||||
return PSystemStats.create();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Log.error("Error " + e);
|
||||
}
|
||||
return null;
|
||||
}
|
134
src/net/sourceforge/plantuml/stats/Stats.java
Normal file
134
src/net/sourceforge/plantuml/stats/Stats.java
Normal file
@ -0,0 +1,134 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2017, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.stats;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeSet;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
import net.sourceforge.plantuml.api.NumberAnalyzed;
|
||||
|
||||
public class Stats {
|
||||
|
||||
private final long firstEverStartingTime;
|
||||
private final long lastStartingTime;
|
||||
private final long currentStartingTime;
|
||||
private final long jvmcounting;
|
||||
private final Map<String, NumberAnalyzed> parsingEver;
|
||||
private final Map<String, NumberAnalyzed> generatingEver;
|
||||
private final Map<String, NumberAnalyzed> parsingCurrent;
|
||||
private final Map<String, NumberAnalyzed> generatingCurrent;
|
||||
private final FormatCounter formatCounterCurrent;
|
||||
private final FormatCounter formatCounterEver;
|
||||
|
||||
Stats(long firstEverStartingTime, long lastStartingTime, long thisStartingTime, long jvmcounting,
|
||||
Map<String, NumberAnalyzed> parsingEver, Map<String, NumberAnalyzed> generatingEver,
|
||||
ConcurrentMap<String, NumberAnalyzed> parsingCurrent,
|
||||
ConcurrentMap<String, NumberAnalyzed> generatingCurrent, FormatCounter formatCounterCurrent,
|
||||
FormatCounter formatCounterEver) {
|
||||
this.firstEverStartingTime = firstEverStartingTime;
|
||||
this.lastStartingTime = lastStartingTime;
|
||||
this.currentStartingTime = thisStartingTime;
|
||||
this.jvmcounting = jvmcounting;
|
||||
this.parsingEver = parsingEver;
|
||||
this.generatingEver = generatingEver;
|
||||
this.parsingCurrent = parsingCurrent;
|
||||
this.generatingCurrent = generatingCurrent;
|
||||
this.formatCounterCurrent = formatCounterCurrent;
|
||||
this.formatCounterEver = formatCounterEver;
|
||||
}
|
||||
|
||||
public void printMe(List<String> strings) {
|
||||
strings.add("<b><size:16>Statistics</b>");
|
||||
strings.add("| Parameter | Value |");
|
||||
strings.add("| <i>First Starting Time Ever</i> | " + new Date(firstEverStartingTime) + "|");
|
||||
strings.add("| <i>Last Starting Time</i> | " + new Date(lastStartingTime) + "|");
|
||||
strings.add("| <i>Current Starting Time</i> | " + new Date(currentStartingTime) + "|");
|
||||
strings.add("| <i>Total launch</i> | " + jvmcounting + "|");
|
||||
strings.add(" ");
|
||||
strings.add("<b><size:16>Current session statistics</b>");
|
||||
printTable(strings, parsingCurrent, generatingCurrent);
|
||||
strings.add(" ");
|
||||
formatCounterCurrent.printTable(strings);
|
||||
strings.add(" ");
|
||||
strings.add("<b><size:16>General statistics since ever</b>");
|
||||
printTable(strings, parsingEver, generatingEver);
|
||||
strings.add(" ");
|
||||
formatCounterEver.printTable(strings);
|
||||
|
||||
}
|
||||
|
||||
private static void printTable(List<String> strings, Map<String, NumberAnalyzed> parsingEver,
|
||||
Map<String, NumberAnalyzed> generatingEver) {
|
||||
final TreeSet<String> keys = new TreeSet<String>(parsingEver.keySet());
|
||||
keys.addAll(generatingEver.keySet());
|
||||
addLine(strings, false, "Diagram type", "# Parsed", "Mean parsing\\ntime (ms)", "Max parsing\\ntime (ms)",
|
||||
"# Generated", "Mean generation\\ntime (ms)", "Max generation\\ntime (ms)");
|
||||
NumberAnalyzed totalParsing = new NumberAnalyzed();
|
||||
NumberAnalyzed totalGenerating = new NumberAnalyzed();
|
||||
for (String key : keys) {
|
||||
NumberAnalyzed parse = parsingEver.get(key);
|
||||
if (parse == null) {
|
||||
parse = new NumberAnalyzed();
|
||||
}
|
||||
NumberAnalyzed generate = generatingEver.get(key);
|
||||
if (generate == null) {
|
||||
generate = new NumberAnalyzed();
|
||||
}
|
||||
totalParsing.add(parse);
|
||||
totalGenerating.add(generate);
|
||||
addLine(strings, false, key, parse.getNb(), parse.getMean(), parse.getMax(), generate.getNb(),
|
||||
generate.getMean(), generate.getMax());
|
||||
}
|
||||
addLine(strings, true, "Total", totalParsing.getNb(), totalParsing.getMean(), totalParsing.getMax(),
|
||||
totalGenerating.getNb(), totalGenerating.getMean(), totalGenerating.getMax());
|
||||
}
|
||||
|
||||
static void addLine(List<String> strings, boolean bold, Object... data) {
|
||||
final StringBuilder result = new StringBuilder();
|
||||
for (Object v : data) {
|
||||
result.append("| ");
|
||||
if (bold) {
|
||||
result.append("<b>");
|
||||
}
|
||||
result.append(v.toString());
|
||||
if (bold) {
|
||||
result.append("</b>");
|
||||
}
|
||||
result.append(" ");
|
||||
}
|
||||
result.append("|");
|
||||
strings.add(result.toString());
|
||||
}
|
||||
|
||||
}
|
175
src/net/sourceforge/plantuml/stats/StatsUtils.java
Normal file
175
src/net/sourceforge/plantuml/stats/StatsUtils.java
Normal file
@ -0,0 +1,175 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2017, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.stats;
|
||||
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.core.Diagram;
|
||||
|
||||
public class StatsUtils {
|
||||
|
||||
public static void onceMoreParse(long duration, Class<? extends Diagram> type) {
|
||||
}
|
||||
|
||||
public static void onceMoreGenerate(long duration, Class<? extends Diagram> type, FileFormat fileFormat) {
|
||||
}
|
||||
|
||||
public static Stats getStats() {
|
||||
return null;
|
||||
}
|
||||
|
||||
// final private static Preferences prefs = Preferences.userNodeForPackage(StatsUtils.class);
|
||||
//
|
||||
// private static long firstEverStartingTime;
|
||||
// private static long lastStartingTime;
|
||||
// private static final long currentStartingTime;
|
||||
// private static final long jvmCounting;
|
||||
//
|
||||
// private static ConcurrentMap<String, NumberAnalyzed> parsingEver = new ConcurrentHashMap<String,
|
||||
// NumberAnalyzed>();
|
||||
// private static ConcurrentMap<String, NumberAnalyzed> generatingEver = new ConcurrentHashMap<String,
|
||||
// NumberAnalyzed>();
|
||||
// private static ConcurrentMap<String, NumberAnalyzed> parsingCurrent = new ConcurrentHashMap<String,
|
||||
// NumberAnalyzed>();
|
||||
// private static ConcurrentMap<String, NumberAnalyzed> generatingCurrent = new ConcurrentHashMap<String,
|
||||
// NumberAnalyzed>();
|
||||
//
|
||||
// private static FormatCounter formatCounterCurrent = new FormatCounter();
|
||||
// private static FormatCounter formatCounterEver = new FormatCounter();
|
||||
//
|
||||
// public static void onceMoreParse(long duration, Class<? extends Diagram> type) {
|
||||
// getNumber("parse.", type, parsingCurrent).addValue(duration);
|
||||
// final NumberAnalyzed n1 = getNumber("parse.", type, parsingEver);
|
||||
// n1.addValue(duration);
|
||||
// n1.save(prefs);
|
||||
// }
|
||||
//
|
||||
// public static void onceMoreGenerate(long duration, Class<? extends Diagram> type, FileFormat fileFormat) {
|
||||
// getNumber("generate.", type, generatingCurrent).addValue(duration);
|
||||
// final NumberAnalyzed n1 = getNumber("generate.", type, generatingEver);
|
||||
// n1.addValue(duration);
|
||||
// formatCounterCurrent.plusOne(fileFormat, duration);
|
||||
// formatCounterEver.plusOne(fileFormat, duration);
|
||||
// formatCounterEver.save("format.", prefs, fileFormat);
|
||||
// n1.save(prefs);
|
||||
// }
|
||||
//
|
||||
// public static Stats getStats() {
|
||||
// return new Stats(firstEverStartingTime, lastStartingTime, currentStartingTime, jvmCounting, parsingEver,
|
||||
// generatingEver, parsingCurrent, generatingCurrent, formatCounterCurrent, formatCounterEver);
|
||||
// }
|
||||
//
|
||||
// private static NumberAnalyzed getNumber(String prefix, Class<? extends Diagram> type,
|
||||
// ConcurrentMap<String, NumberAnalyzed> map) {
|
||||
// final String name = name(type);
|
||||
// NumberAnalyzed n = map.get(name);
|
||||
// if (n == null) {
|
||||
// map.putIfAbsent(name, new NumberAnalyzed(prefix + name));
|
||||
// n = map.get(name);
|
||||
// }
|
||||
// return n;
|
||||
// }
|
||||
//
|
||||
// private static String name(Class<? extends Diagram> type) {
|
||||
// if (type == PSystemError.class) {
|
||||
// return "Error";
|
||||
// }
|
||||
// if (type == ActivityDiagram3.class) {
|
||||
// return "ActivityDiagramBeta";
|
||||
// }
|
||||
// if (type == PSystemSalt.class) {
|
||||
// return "Salt";
|
||||
// }
|
||||
// if (type == PSystemSudoku.class) {
|
||||
// return "Sudoku";
|
||||
// }
|
||||
// if (type == PSystemDot.class) {
|
||||
// return "Dot";
|
||||
// }
|
||||
// if (type == PSystemEmpty.class) {
|
||||
// return "Welcome";
|
||||
// }
|
||||
// if (type == PSystemDitaa.class) {
|
||||
// return "Ditaa";
|
||||
// }
|
||||
// if (type == PSystemJcckit.class) {
|
||||
// return "Jcckit";
|
||||
// }
|
||||
// final String name = type.getSimpleName();
|
||||
// if (name.endsWith("Diagram")) {
|
||||
// return name;
|
||||
// }
|
||||
// // return "Other " + name;
|
||||
// return "Other";
|
||||
// }
|
||||
//
|
||||
// static {
|
||||
// // try {
|
||||
// // prefs.clear();
|
||||
// // } catch (BackingStoreException e1) {
|
||||
// // e1.printStackTrace();
|
||||
// // }
|
||||
// currentStartingTime = System.currentTimeMillis();
|
||||
// firstEverStartingTime = prefs.getLong("firstEverStartingTime", 0);
|
||||
// if (firstEverStartingTime == 0) {
|
||||
// firstEverStartingTime = currentStartingTime;
|
||||
// prefs.putLong("firstEverStartingTime", firstEverStartingTime);
|
||||
// }
|
||||
// lastStartingTime = prefs.getLong("lastStartingTime", 0);
|
||||
// if (lastStartingTime == 0) {
|
||||
// lastStartingTime = currentStartingTime;
|
||||
// }
|
||||
// prefs.putLong("lastStartingTime", currentStartingTime);
|
||||
// jvmCounting = prefs.getLong("JVMcounting", 0) + 1;
|
||||
// prefs.putLong("JVMcounting", jvmCounting);
|
||||
// try {
|
||||
// reload("parse.", parsingEver);
|
||||
// reload("generate.", generatingEver);
|
||||
// formatCounterEver.reload("format.", prefs);
|
||||
// } catch (BackingStoreException e) {
|
||||
// Log.error("Error reloading stats " + e);
|
||||
// parsingEver.clear();
|
||||
// generatingEver.clear();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// private static void reload(final String tree, Map<String, NumberAnalyzed> data) throws BackingStoreException {
|
||||
// for (String key : prefs.keys()) {
|
||||
// if (key.startsWith(tree) && key.endsWith(".nb")) {
|
||||
// final String name = key.substring(0, key.length() - 3);
|
||||
// final NumberAnalyzed numberAnalyzed = NumberAnalyzed.load(name, prefs);
|
||||
// if (numberAnalyzed != null) {
|
||||
// data.put(name.substring(tree.length()), numberAnalyzed);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
@ -257,7 +257,7 @@ public final class DotDataImageBuilder {
|
||||
msg.add(" ");
|
||||
msg.add("java -jar plantuml.jar -testdot");
|
||||
msg.add(" ");
|
||||
return GraphicStrings.createDefault(msg, false);
|
||||
return GraphicStrings.createForError(msg, false);
|
||||
}
|
||||
|
||||
private void printEntities(DotStringFactory dotStringFactory, Collection<ILeaf> entities2) {
|
||||
|
@ -30,13 +30,13 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.svek;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||
import net.sourceforge.plantuml.OptionPrint;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.GraphvizUtils;
|
||||
import net.sourceforge.plantuml.flashcode.FlashCodeFactory;
|
||||
import net.sourceforge.plantuml.flashcode.FlashCodeUtils;
|
||||
@ -48,8 +48,6 @@ import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.graphic.QuoteUtils;
|
||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.UImage;
|
||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||
@ -57,16 +55,14 @@ import net.sourceforge.plantuml.version.Version;
|
||||
|
||||
public class GraphvizCrash extends AbstractTextBlock implements IEntityImage {
|
||||
|
||||
private static final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
|
||||
private final GraphicStrings graphicStrings;
|
||||
private final TextBlockBackcolored graphicStrings;
|
||||
private final BufferedImage flashCode;
|
||||
|
||||
public GraphvizCrash(String text) {
|
||||
final FlashCodeUtils utils = FlashCodeFactory.getFlashCodeUtils();
|
||||
flashCode = utils.exportFlashcode(text);
|
||||
this.graphicStrings = new GraphicStrings(init(), font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE,
|
||||
UAntiAliasing.ANTI_ALIASING_ON, IconLoader.getRandom(), GraphicPosition.BACKGROUND_CORNER_TOP_RIGHT);
|
||||
this.graphicStrings = GraphicStrings.createBlackOnWhite(init(), IconLoader.getRandom(),
|
||||
GraphicPosition.BACKGROUND_CORNER_TOP_RIGHT);
|
||||
}
|
||||
|
||||
public static List<String> anErrorHasOccured(Throwable exception) {
|
||||
@ -101,14 +97,13 @@ public class GraphvizCrash extends AbstractTextBlock implements IEntityImage {
|
||||
strings.add("post to <b>http://plantuml.com/qa</b> to solve this issue.");
|
||||
strings.add("You can try to turn arround this issue by simplifing your diagram.");
|
||||
}
|
||||
|
||||
|
||||
public static void thisMayBeCaused(final List<String> strings) {
|
||||
strings.add("This may be caused by :");
|
||||
strings.add(" - a bug in PlantUML");
|
||||
strings.add(" - a problem in GraphViz");
|
||||
}
|
||||
|
||||
|
||||
private List<String> init() {
|
||||
final List<String> strings = anErrorHasOccured(null);
|
||||
strings.add("For some reason, dot/Graphviz has crashed.");
|
||||
@ -138,17 +133,13 @@ public class GraphvizCrash extends AbstractTextBlock implements IEntityImage {
|
||||
}
|
||||
|
||||
public static void addProperties(final List<String> strings) {
|
||||
addTextProperty(strings, "os.version");
|
||||
addTextProperty(strings, "os.name");
|
||||
addTextProperty(strings, "java.vm.vendor");
|
||||
addTextProperty(strings, "java.vm.version");
|
||||
addTextProperty(strings, "java.version");
|
||||
addTextProperty(strings, "user.language");
|
||||
strings.addAll(OptionPrint.interestingProperties());
|
||||
strings.addAll(OptionPrint.interestingValues());
|
||||
}
|
||||
|
||||
private static void addTextProperty(final List<String> strings, String prop) {
|
||||
strings.add(prop + ": " + System.getProperty(prop));
|
||||
}
|
||||
// private static void addTextProperty(final List<String> strings, String prop) {
|
||||
// strings.add(prop + ": " + System.getProperty(prop));
|
||||
// }
|
||||
|
||||
public boolean isHidden() {
|
||||
return false;
|
||||
|
@ -86,7 +86,7 @@ public class EntityImageClassHeader2 extends AbstractEntityImage {
|
||||
final HtmlColor back = rose.getHtmlColor(skinParam, modifier.getBackground());
|
||||
final HtmlColor fore = rose.getHtmlColor(skinParam, modifier.getForeground());
|
||||
|
||||
final TextBlock uBlock = modifier.getUBlock(skinParam.classAttributeIconSize(), fore, back);
|
||||
final TextBlock uBlock = modifier.getUBlock(skinParam.classAttributeIconSize(), fore, back, false);
|
||||
name = TextBlockUtils.mergeLR(uBlock, name, VerticalAlignment.CENTER);
|
||||
name = TextBlockUtils.withMargin(name, 3, 3, 0, 0);
|
||||
}
|
||||
|
@ -411,6 +411,8 @@ public class SvgGraphics {
|
||||
String textBackColor) {
|
||||
if (hidden == false) {
|
||||
final Element elt = (Element) document.createElement("text");
|
||||
// required for web-kit based browsers
|
||||
// elt.setAttribute("text-rendering", "geometricPrecision");
|
||||
elt.setAttribute("x", format(x));
|
||||
elt.setAttribute("y", format(y));
|
||||
elt.setAttribute("fill", fill);
|
||||
|
@ -71,6 +71,7 @@ import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.GeneratedImage;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.version.PSystemVersion;
|
||||
@ -279,7 +280,7 @@ class ImageWindow2 extends JFrame {
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
final String msg = "Error reading file: " + ex.toString();
|
||||
final GraphicStrings error = GraphicStrings.createDefault(Arrays.asList(msg), false);
|
||||
final TextBlockBackcolored error = GraphicStrings.createForError(Arrays.asList(msg), false);
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, error.getBackcolor(),
|
||||
null, null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(error);
|
||||
|
@ -103,7 +103,7 @@ public class MainWindow2 extends JFrame {
|
||||
}
|
||||
|
||||
private String getDefaultFileExtensions() {
|
||||
return "txt, tex, java, htm, html, c, h, cpp, apt, pu";
|
||||
return "txt, tex, java, htm, html, c, h, cpp, apt, pu, puml";
|
||||
}
|
||||
|
||||
private void changeExtensions(String ext) {
|
||||
|
@ -58,12 +58,14 @@ public class TikzGraphics {
|
||||
private Color color = Color.BLACK;
|
||||
private Color fillcolor = Color.BLACK;
|
||||
private double thickness = 1.0;
|
||||
private final double scale;
|
||||
private String dash = null;
|
||||
|
||||
private final Map<Color, String> colornames = new LinkedHashMap<Color, String>();
|
||||
|
||||
public TikzGraphics(boolean withPreamble) {
|
||||
public TikzGraphics(double scale, boolean withPreamble) {
|
||||
this.withPreamble = withPreamble;
|
||||
this.scale = scale;
|
||||
}
|
||||
|
||||
private String getColorName(Color c) {
|
||||
@ -130,11 +132,17 @@ public class TikzGraphics {
|
||||
out(os, definecolor(ent.getValue(), ent.getKey()));
|
||||
|
||||
}
|
||||
if (scale != 1) {
|
||||
out(os, "\\scalebox{" + format(scale) + "}{");
|
||||
}
|
||||
out(os, "\\begin{tikzpicture}[yscale=-1]");
|
||||
for (String s : cmd) {
|
||||
out(os, s);
|
||||
}
|
||||
out(os, "\\end{tikzpicture}");
|
||||
if (scale != 1) {
|
||||
out(os, "}");
|
||||
}
|
||||
if (withPreamble) {
|
||||
out(os, "\\end{document}");
|
||||
}
|
||||
|
@ -369,9 +369,9 @@ public class ImageBuilder {
|
||||
case VDX:
|
||||
return new UGraphicVdx(colorMapper);
|
||||
case LATEX:
|
||||
return new UGraphicTikz(colorMapper, true);
|
||||
return new UGraphicTikz(colorMapper, dpiFactor, true);
|
||||
case LATEX_NO_PREAMBLE:
|
||||
return new UGraphicTikz(colorMapper, false);
|
||||
return new UGraphicTikz(colorMapper, dpiFactor, false);
|
||||
case BRAILLE_PNG:
|
||||
return new UGraphicBraille(colorMapper, fileFormat);
|
||||
default:
|
||||
|
@ -37,7 +37,6 @@ import net.sourceforge.plantuml.EnsureVisible;
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
||||
|
||||
public class UGraphicNull extends AbstractUGraphic<String> implements EnsureVisible, UGraphic2 {
|
||||
|
||||
|
@ -30,7 +30,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.ugraphic.sprite;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
@ -42,23 +41,21 @@ import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemListInternalSprites extends AbstractPSystem {
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormat, os);
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
final List<String> lines = new ArrayList<String>();
|
||||
lines.add("<b>List Current Sprits");
|
||||
lines.add("<i>Credit to");
|
||||
@ -75,11 +72,7 @@ public class PSystemListInternalSprites extends AbstractPSystem {
|
||||
}
|
||||
}
|
||||
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
final GraphicStrings graphicStrings = new GraphicStrings(lines, font, HtmlColorUtils.BLACK,
|
||||
HtmlColorUtils.WHITE, UAntiAliasing.ANTI_ALIASING_ON);
|
||||
graphicStrings.setMaxLine(35);
|
||||
return graphicStrings;
|
||||
return GraphicStrings.createBlackOnWhite(lines, null, null, 35);
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
|
@ -64,8 +64,8 @@ public class UGraphicTikz extends AbstractUGraphic<TikzGraphics> implements Clip
|
||||
|
||||
}
|
||||
|
||||
public UGraphicTikz(ColorMapper colorMapper, boolean withPreamble) {
|
||||
this(colorMapper, new TikzGraphics(withPreamble));
|
||||
public UGraphicTikz(ColorMapper colorMapper, double scale, boolean withPreamble) {
|
||||
this(colorMapper, new TikzGraphics(scale, withPreamble));
|
||||
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.version;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
@ -40,13 +39,10 @@ import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.graphic.GraphicPosition;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemLicense extends AbstractPSystem {
|
||||
|
||||
@ -57,7 +53,7 @@ public class PSystemLicense extends AbstractPSystem {
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = getGraphicStrings();
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
@ -68,10 +64,8 @@ public class PSystemLicense extends AbstractPSystem {
|
||||
return new PSystemLicense();
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
return new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, UAntiAliasing.ANTI_ALIASING_ON,
|
||||
null, GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT);
|
||||
private TextBlockBackcolored getGraphicStrings() throws IOException {
|
||||
return GraphicStrings.createBlackOnWhite(strings);
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
|
@ -29,7 +29,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.version;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
@ -41,7 +40,6 @@ import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@ -57,11 +55,9 @@ import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.GraphvizUtils;
|
||||
import net.sourceforge.plantuml.graphic.GraphicPosition;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UAntiAliasing;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class PSystemVersion extends AbstractPSystem {
|
||||
|
||||
@ -134,7 +130,8 @@ public class PSystemVersion extends AbstractPSystem {
|
||||
}
|
||||
|
||||
public ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException {
|
||||
final GraphicStrings result = getGraphicStrings();
|
||||
final TextBlockBackcolored result = GraphicStrings.createBlackOnWhite(strings, image,
|
||||
GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT);
|
||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||
getMetadata(), null, 0, 0, null, false);
|
||||
imageBuilder.setUDrawable(result);
|
||||
@ -150,9 +147,8 @@ public class PSystemVersion extends AbstractPSystem {
|
||||
|
||||
strings.addAll(GraphvizUtils.getTestDotStrings(true));
|
||||
strings.add(" ");
|
||||
final Properties p = System.getProperties();
|
||||
for (String name : OptionPrint.interestingProperties()) {
|
||||
strings.add(p.getProperty(name));
|
||||
strings.add(name);
|
||||
}
|
||||
for (String v : OptionPrint.interestingValues()) {
|
||||
strings.add(v);
|
||||
@ -260,12 +256,6 @@ public class PSystemVersion extends AbstractPSystem {
|
||||
return new PSystemVersion(false, strings);
|
||||
}
|
||||
|
||||
private GraphicStrings getGraphicStrings() throws IOException {
|
||||
final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
|
||||
return new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE,
|
||||
UAntiAliasing.ANTI_ALIASING_ON, image, GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT);
|
||||
}
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
return new DiagramDescriptionImpl("(Version)", getClass());
|
||||
}
|
||||
|
114
src/net/sourceforge/plantuml/version/Professionnal.java
Normal file
114
src/net/sourceforge/plantuml/version/Professionnal.java
Normal file
@ -0,0 +1,114 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2017, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.version;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Date;
|
||||
import java.util.prefs.Preferences;
|
||||
|
||||
import net.sourceforge.plantuml.OptionPrint;
|
||||
import net.sourceforge.plantuml.dedication.DecoderInputStream;
|
||||
import net.sourceforge.plantuml.dedication.Dedication;
|
||||
import net.sourceforge.plantuml.dedication.QBlocks;
|
||||
|
||||
public class Professionnal {
|
||||
|
||||
final private static Preferences prefs = Preferences.userNodeForPackage(Professionnal.class);
|
||||
|
||||
private final String hostname;
|
||||
private final String organization;
|
||||
private final String mail;
|
||||
private final Date date1;
|
||||
private final Date date2;
|
||||
|
||||
private Professionnal(String hostname, String organization, String mail, int date1, int date2) {
|
||||
this.hostname = hostname;
|
||||
this.organization = organization;
|
||||
this.mail = mail;
|
||||
this.date1 = new Date(date1 * 1000L);
|
||||
this.date2 = new Date(date2 * 1000L);
|
||||
}
|
||||
|
||||
public static Professionnal decodeNow(final String license) throws IOException {
|
||||
final QBlocks data = QBlocks.descodeAscii(license);
|
||||
final QBlocks decrypted = data.change(Dedication.E, Dedication.N);
|
||||
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
decrypted.writeTo(baos, Dedication.SIZE);
|
||||
baos.close();
|
||||
|
||||
final String hostname = OptionPrint.getHostName();
|
||||
InputStream source1 = null;
|
||||
try {
|
||||
source1 = new DecoderInputStream(new ByteArrayInputStream(baos.toByteArray()), hostname);
|
||||
final DataInputStream src = new DataInputStream(source1);
|
||||
final int version = src.readByte();
|
||||
if (version != 42) {
|
||||
throw new IOException();
|
||||
}
|
||||
final String host1 = src.readUTF();
|
||||
final String organization = src.readUTF();
|
||||
final String mail = src.readUTF();
|
||||
final int date1 = src.readInt();
|
||||
final int date2 = src.readInt();
|
||||
|
||||
return new Professionnal(host1, organization, mail, date1, date2);
|
||||
} finally {
|
||||
if (source1 != null) {
|
||||
source1.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String getHostname() {
|
||||
return hostname;
|
||||
}
|
||||
|
||||
public String getMail() {
|
||||
return mail;
|
||||
}
|
||||
|
||||
public String getOrganization() {
|
||||
return organization;
|
||||
}
|
||||
|
||||
public Date getDate1() {
|
||||
return date1;
|
||||
}
|
||||
|
||||
public Date getDate2() {
|
||||
return date2;
|
||||
}
|
||||
|
||||
}
|
@ -36,7 +36,7 @@ import java.util.Date;
|
||||
public class Version {
|
||||
|
||||
public static int version() {
|
||||
return 8049;
|
||||
return 8050;
|
||||
}
|
||||
|
||||
public static String versionString() {
|
||||
@ -68,7 +68,7 @@ public class Version {
|
||||
}
|
||||
|
||||
public static long compileTime() {
|
||||
return 1478283413822L;
|
||||
return 1479491794397L;
|
||||
}
|
||||
|
||||
public static String compileTimeString() {
|
||||
|
Loading…
Reference in New Issue
Block a user