version 1.2018.7

This commit is contained in:
Arnaud Roques 2018-06-12 22:50:45 +02:00
parent 55390ef1d1
commit 84e117e287
137 changed files with 2581 additions and 1100 deletions

View File

@ -30,13 +30,12 @@
Script Author: Julien Eluard
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.sourceforge.plantuml</groupId>
<artifactId>plantuml</artifactId>
<version>1.2018.6-SNAPSHOT</version>
<version>1.2018.8-SNAPSHOT</version>
<packaging>jar</packaging>
<name>PlantUML</name>

View File

@ -63,7 +63,7 @@ public final class BlockUmlBuilder implements DefinitionsContainer {
Preprocessor includer = null;
this.defines = defines;
try {
reader2 = new UncommentReadLine(new ReadLineReader(reader, desc));
reader2 = new UncommentReadLine(ReadLineReader.create(reader, desc));
includer = new Preprocessor(config, reader2, charset, defines, newCurrentDir, this);
init(includer);
} finally {

View File

@ -0,0 +1,122 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* 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;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import net.sourceforge.plantuml.core.DiagramDescription;
public class ClipboardLoop {
public static void runLoop() throws IOException, InterruptedException {
final ClipboardLoop clipboardLoop = new ClipboardLoop();
while (true) {
final String text = clipboardLoop.getClipboardText();
if (clipboardLoop.isTextOk(text)) {
clipboardLoop.runText(text);
}
Thread.sleep(10000L);
}
}
public static void runOnce() throws IOException, InterruptedException {
final ClipboardLoop clipboardLoop = new ClipboardLoop();
final String text = clipboardLoop.getClipboardText();
if (clipboardLoop.isTextOk(text)) {
clipboardLoop.runText(text);
} else {
clipboardLoop.setClipboardImage(new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB));
}
}
private boolean isTextOk(String text) {
if (text == null) {
return false;
}
return text.startsWith("@start");
}
private void runText(String text) throws IOException, InterruptedException {
Log.info("Getting some text from clipboard");
final SourceStringReader source = new SourceStringReader(text);
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final DiagramDescription desc = source.outputImage(baos);
if (desc == null) {
Log.info("No image generated");
} else {
Log.info("Image ok " + desc.getDescription());
final byte[] data = baos.toByteArray();
baos.close();
final ByteArrayInputStream bais = new ByteArrayInputStream(data);
final BufferedImage image = ImageIO.read(bais);
setClipboardImage(image);
bais.close();
Log.info("Image copied in clipboard");
}
}
private String getClipboardText() {
final Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
try {
if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
final String text = (String) t.getTransferData(DataFlavor.stringFlavor);
return text;
}
} catch (UnsupportedFlavorException e) {
Log.error(e.toString());
} catch (IOException e) {
Log.error(e.toString());
}
return null;
}
private void setClipboardImage(BufferedImage image) {
final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(new ImageSelection(image), null);
}
}

View File

@ -0,0 +1,64 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* 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;
import java.awt.Image;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
public class ImageSelection implements Transferable {
private Image image;
public ImageSelection(Image image) {
this.image = image;
}
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { DataFlavor.imageFlavor };
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
return DataFlavor.imageFlavor.equals(flavor);
}
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
return image;
}
}

View File

@ -43,9 +43,6 @@ public class LineLocationImpl implements LineLocation {
@Override
public String toString() {
if (desc == null) {
return "[?] : " + position;
}
return desc + " : " + position;
}
@ -54,6 +51,9 @@ public class LineLocationImpl implements LineLocation {
}
private LineLocationImpl(String desc, LineLocation parent, int position) {
if (desc == null) {
throw new IllegalArgumentException();
}
this.parent = parent;
this.desc = desc;
this.position = position;

View File

@ -108,7 +108,13 @@ public class Option {
}
for (int i = 0; i < arg.length; i++) {
String s = arg[i];
if (s.equalsIgnoreCase("-tsvg") || s.equalsIgnoreCase("-svg")) {
if (s.equalsIgnoreCase("-headless")) {
// Useless because done in Run.java
if (i != 0) {
Log.error("Warning: -headless flag must be the first one in the command line");
}
System.setProperty("java.awt.headless", "true");
} else if (s.equalsIgnoreCase("-tsvg") || s.equalsIgnoreCase("-svg")) {
setFileFormatOption(new FileFormatOption(FileFormat.SVG));
} else if (s.equalsIgnoreCase("-tsvg:nornd") || s.equalsIgnoreCase("-svg:nornd")) {
setFileFormatOption(new FileFormatOption(FileFormat.SVG));
@ -306,6 +312,12 @@ public class Option {
OptionFlags.getInstance().setEnableStats(false);
} else if (s.equalsIgnoreCase("-extractstdlib")) {
OptionFlags.getInstance().setExtractStdLib(true);
} else if (s.equalsIgnoreCase("-stdlib")) {
OptionFlags.getInstance().setStdLib(true);
} else if (s.equalsIgnoreCase("-clipboard")) {
OptionFlags.getInstance().setClipboard(true);
} else if (s.equalsIgnoreCase("-clipboardloop")) {
OptionFlags.getInstance().setClipboardLoop(true);
} else if (s.equalsIgnoreCase("-htmlstats")) {
StatsUtils.setHtmlStats(true);
} else if (s.equalsIgnoreCase("-xmlstats")) {

View File

@ -123,7 +123,10 @@ public class OptionFlags {
private boolean loopStats;
private boolean overwrite;
private boolean enableStats = defaultForStats();
private boolean stdLib;
private boolean extractStdLib;
private boolean clipboardLoop;
private boolean clipboard;
private String fileSeparator = "_";
private long timeoutMs = 15 * 60 * 1000L; // 15 minutes
private File logData;
@ -339,7 +342,31 @@ public class OptionFlags {
this.extractStdLib = extractStdLib;
}
public boolean getExtractStdLib() {
public boolean isExtractStdLib() {
return extractStdLib;
}
public final boolean isClipboardLoop() {
return clipboardLoop;
}
public final void setClipboardLoop(boolean clipboardLoop) {
this.clipboardLoop = clipboardLoop;
}
public final boolean isClipboard() {
return clipboard;
}
public final void setClipboard(boolean clipboard) {
this.clipboard = clipboard;
}
public final boolean isStdLib() {
return stdLib;
}
public final void setStdLib(boolean stdLib) {
this.stdLib = stdLib;
}
}

View File

@ -142,6 +142,7 @@ public class OptionPrint {
System.out.println(" -splash\t\tTo display a splash screen with some progress bar");
System.out.println(" -progress\t\tTo display a textual progress bar in console");
System.out.println(" -pipeimageindex N\tTo generate the Nth image with pipe option");
System.out.println(" -stdlib\tTo print standart library info");
System.out.println(" -extractstdlib\tTo extract PlantUML Standard Library into stdlib folder");
System.out.println(" -filename \"example.puml\"\tTo override %filename% variable");
System.out.println();

View File

@ -206,22 +206,6 @@ public class PSystemError extends AbstractPSystem {
result.add(" ");
}
// final int limit = 4;
// int start;
// final int skip = higherErrorPosition - limit + 1;
// if (skip <= 0) {
// start = 0;
// } else {
// if (skip == 1) {
// result.add("... (skipping 1 line) ...");
// } else {
// result.add("... (skipping " + skip + " lines) ...");
// }
// start = higherErrorPosition - limit + 1;
// }
// for (int i = start; i < higherErrorPosition; i++) {
// result.add(getSource().getLine(i));
// }
for (String s : getPartialCode()) {
result.add(s);
}
@ -288,11 +272,13 @@ public class PSystemError extends AbstractPSystem {
List<String> result = new ArrayList<String>();
for (Iterator<CharSequence2> it = getSource().iterator2(); it.hasNext();) {
final CharSequence2 s = it.next();
if (s.getLocation().compareTo(higherErrorPosition) < 0) {
result.add(s.toString());
result.add(s.toString());
if (s.getLocation().getDescription().equals(higherErrorPosition.getDescription())
&& s.getLocation().compareTo(higherErrorPosition) >= 0) {
break;
}
}
final int limit = 4;
final int limit = 5;
if (result.size() > limit) {
final int skip = result.size() - limit + 1;
final String skipMessage;
@ -314,30 +300,20 @@ public class PSystemError extends AbstractPSystem {
htmlStrings.add("----");
}
// final int limit = 4;
// int start;
// final int skip = higherErrorPosition - limit + 1;
// if (skip <= 0) {
// start = 0;
// } else {
// if (skip == 1) {
// htmlStrings.add("... (skipping 1 line) ...");
// } else {
// htmlStrings.add("... (skipping " + skip + " lines) ...");
// }
// start = higherErrorPosition - limit + 1;
// }
// for (int i = start; i < higherErrorPosition; i++) {
// htmlStrings.add(StringUtils.hideComparatorCharacters(getSource().getLine(i)));
// }
for (String s : getPartialCode()) {
final List<String> partialCode = getPartialCode();
for (String s : partialCode) {
htmlStrings.add(StringUtils.hideComparatorCharacters(s));
}
final String errorLine = getSource().getLine(higherErrorPosition);
final String err = StringUtils.hideComparatorCharacters(errorLine);
if (StringUtils.isNotEmpty(err)) {
htmlStrings.add("<w:" + getRed(useRed) + ">" + err + "</w>");
if (partialCode.size() > 0) {
final int idx = htmlStrings.size() - 1;
final String last = htmlStrings.get(idx);
htmlStrings.set(idx, "<w:" + getRed(useRed) + ">" + last + "</w>");
}
// final String errorLine = getSource().getLine(higherErrorPosition);
// final String err = StringUtils.hideComparatorCharacters(errorLine);
// if (StringUtils.isNotEmpty(err)) {
// htmlStrings.add("<w:" + getRed(useRed) + ">" + err + "</w>");
// }
final Collection<String> textErrors = new LinkedHashSet<String>();
for (ErrorUml er : printedErrors) {
textErrors.add(er.getError());
@ -360,7 +336,7 @@ public class PSystemError extends AbstractPSystem {
return htmlStrings;
}
public List<String> getSuggest() {
private List<String> getSuggest() {
boolean suggested = false;
for (ErrorUml er : printedErrors) {
if (er.hasSuggest()) {
@ -391,16 +367,6 @@ public class PSystemError extends AbstractPSystem {
return result;
}
// private int getHigherErrorPosition(ErrorUmlType type, List<ErrorUml> all) {
// int max = Integer.MIN_VALUE;
// for (ErrorUml error : getErrors(type, all)) {
// if (error.getPosition() > max) {
// max = error.getPosition();
// }
// }
// return max;
// }
private LineLocation getHigherErrorPosition2(ErrorUmlType type, List<ErrorUml> all) {
LineLocation max = null;
for (ErrorUml error : getErrors(type, all)) {
@ -411,16 +377,6 @@ public class PSystemError extends AbstractPSystem {
return max;
}
// private List<ErrorUml> getErrorsAt(int position, ErrorUmlType type, List<ErrorUml> all) {
// final List<ErrorUml> result = new ArrayList<ErrorUml>();
// for (ErrorUml error : getErrors(type, all)) {
// if (error.getPosition() == position && StringUtils.isNotEmpty(error.getError())) {
// result.add(error);
// }
// }
// return result;
// }
private List<ErrorUml> getErrorsAt2(LineLocation position, ErrorUmlType type, List<ErrorUml> all) {
final List<ErrorUml> result = new ArrayList<ErrorUml>();
for (ErrorUml error : getErrors(type, all)) {

View File

@ -62,7 +62,7 @@ import net.sourceforge.plantuml.descdiagram.DescriptionDiagramFactory;
import net.sourceforge.plantuml.ftp.FtpServer;
import net.sourceforge.plantuml.objectdiagram.ObjectDiagramFactory;
import net.sourceforge.plantuml.png.MetadataTag;
import net.sourceforge.plantuml.preproc.StdlibOld;
import net.sourceforge.plantuml.preproc.Stdlib;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory;
import net.sourceforge.plantuml.statediagram.StateDiagramFactory;
import net.sourceforge.plantuml.stats.StatsUtils;
@ -74,12 +74,28 @@ import net.sourceforge.plantuml.version.Version;
public class Run {
public static void main(String[] argsArray) throws IOException, InterruptedException {
System.setProperty("log4j.debug", "false");
final long start = System.currentTimeMillis();
if (argsArray.length > 0 && argsArray[0].equalsIgnoreCase("-headless")) {
System.setProperty("java.awt.headless", "true");
}
saveCommandLine(argsArray);
final Option option = new Option(argsArray);
ProgressBar.setEnable(option.isTextProgressBar());
if (OptionFlags.getInstance().getExtractStdLib()) {
StdlibOld.extractStdLib();
if (OptionFlags.getInstance().isClipboardLoop()) {
ClipboardLoop.runLoop();
return;
}
if (OptionFlags.getInstance().isClipboard()) {
ClipboardLoop.runOnce();
return;
}
if (OptionFlags.getInstance().isExtractStdLib()) {
Stdlib.extractStdLib();
return;
}
if (OptionFlags.getInstance().isStdLib()) {
Stdlib.printStdLib();
return;
}
if (OptionFlags.getInstance().isDumpStats()) {

View File

@ -83,7 +83,7 @@ public class SourceStringReader {
synchronized (SourceStringReader.class) {
try {
final BlockUmlBuilder builder = new BlockUmlBuilder(config, charset, defines, new StringReader(source),
newCurrentDir, null);
newCurrentDir, "string");
this.blocks = builder.getBlockUmls();
} catch (IOException e) {
Log.error("error " + e);

View File

@ -108,7 +108,7 @@ public class CommandLinkLongActivity extends CommandMultilines2<ActivityDiagram>
new RegexLeaf("$"));
}
public CommandExecutionResult executeNow(final ActivityDiagram diagram, BlocLines lines) {
protected CommandExecutionResult executeNow(final ActivityDiagram diagram, BlocLines lines) {
lines = lines.trim(false);
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));

View File

@ -72,7 +72,7 @@ public class CommandActivityLong3 extends CommandMultilines2<ActivityDiagram3> {
new RegexLeaf("$"));
}
public CommandExecutionResult executeNow(ActivityDiagram3 diagram, BlocLines lines) {
protected CommandExecutionResult executeNow(ActivityDiagram3 diagram, BlocLines lines) {
lines = lines.removeEmptyColumns();
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
final Colors colors = color().getColor(line0, diagram.getSkinParam().getIHtmlColorSet());

View File

@ -70,7 +70,7 @@ public class CommandArrowLong3 extends CommandMultilines2<ActivityDiagram3> {
new RegexLeaf("$"));
}
public CommandExecutionResult executeNow(ActivityDiagram3 diagram, BlocLines lines) {
protected CommandExecutionResult executeNow(ActivityDiagram3 diagram, BlocLines lines) {
lines = lines.removeEmptyColumns();
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
// final HtmlColor color = diagram.getSkinParam().getIHtmlColorSet().getColorIfValid(line0.get("COLOR", 0));

View File

@ -66,7 +66,7 @@ public class CommandNoteLong3 extends CommandMultilines2<ActivityDiagram3> {
return "(?i)^end[%s]?note$";
}
public CommandExecutionResult executeNow(final ActivityDiagram3 diagram, BlocLines lines) {
protected CommandExecutionResult executeNow(final ActivityDiagram3 diagram, BlocLines lines) {
// final List<? extends CharSequence> in = StringUtils.removeEmptyColumns2(lines.subList(1, lines.size() - 1));
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
lines = lines.subExtract(1, 1);

View File

@ -74,7 +74,7 @@ public class CommandRepeatWhile3Multilines extends CommandMultilines3<ActivityDi
}
@Override
public CommandExecutionResult executeNow(ActivityDiagram3 diagram, BlocLines lines) {
protected CommandExecutionResult executeNow(ActivityDiagram3 diagram, BlocLines lines) {
lines = lines.trim(false);
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
final RegexResult lineLast = getPatternEnd2().matcher(lines.getLast499().toString());

View File

@ -221,4 +221,8 @@ public class CollisionDetector implements UGraphic {
return false;
}
public double dpiFactor() {
return 1;
}
}

View File

@ -50,6 +50,7 @@ import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.ugraphic.CompressionTransform;
import net.sourceforge.plantuml.ugraphic.MinMax;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UPolygon;
import net.sourceforge.plantuml.ugraphic.UShape;
@ -273,4 +274,8 @@ public class Snake implements UShape {
this.emphasizeDirection = direction;
}
public boolean doesHorizontalCross(MinMax minMax) {
return worm.doesHorizontalCross(minMax);
}
}

View File

@ -193,44 +193,7 @@ public class Swimlanes extends AbstractTextBlock implements TextBlock {
return;
}
// if (OptionFlags.SWI2) {
//
// final SlotFinderX slotFinder = new SlotFinderX(ug.getStringBounder());
// drawWhenSwimlanes(slotFinder, full);
// final SlotSet slotX = slotFinder.getXSlotSet().reverse();
// //
// // // final SlotSet ysSlotSet = slotFinder.getYSlotSet().reverse().smaller(5.0);
// //
// System.err.println("slotX=" + slotX);
//
// printDebug(ug, slotX, HtmlColorUtils.GRAY, full);
//
// double x2 = 0;
// double y2 = 0;
// final double stepy = 40;
// int i = 0;
// final SlotSet deconnectedSwimlanes = new SlotSet();
// for (Swimlane swimlane : swimlanes) {
// final UGraphic ug2 = ug.apply(new UChangeColor(HtmlColorUtils.GREEN)).apply(
// new UChangeBackColor(HtmlColorUtils.GREEN));
// final double totalWidth = swimlane.getTotalWidth();
// final SlotSet slot2 = slotX.filter(x2 + separationMargin, x2 + totalWidth - separationMargin);
// deconnectedSwimlanes.addAll(slot2);
// // ug2.apply(new UTranslate(x2, y2)).draw(new URectangle(totalWidth, stepy));
// x2 += totalWidth;
// y2 += stepy;
// i++;
// }
// // printDebug(ug, deconnectedSwimlanes, HtmlColorUtils.GRAY, full);
//
// //
// final CompressionTransform compressionTransform = new CompressionTransform(deconnectedSwimlanes);
// // ug = new UGraphicCompress2(ug, compressionTransform);
// drawWhenSwimlanes(ug, full);
// } else {
drawWhenSwimlanes(ug, full);
// }
// getCollisionDetector(ug, titleHeightTranslate).drawDebug(ug);
}
static private void printDebug(UGraphic ug, SlotSet slot, HtmlColor col, TextBlock full) {
@ -257,13 +220,11 @@ public class Swimlanes extends AbstractTextBlock implements TextBlock {
+ titleHeightTranslate.getDy()));
}
// if (OptionFlags.SWI2 == false) {
final TextBlock swTitle = swimlane.getDisplay().create(getFontConfiguration(), HorizontalAlignment.LEFT,
skinParam);
final double titleWidth = swTitle.calculateDimension(stringBounder).getWidth();
final double posTitle = x2 + (swimlane.getTotalWidth() - titleWidth) / 2;
swTitle.drawU(ug.apply(new UTranslate(posTitle, 0)));
// }
drawSeparation(ug.apply(new UTranslate(x2, 0)), dimensionFull.getHeight() + titleHeightTranslate.getDy());
@ -273,6 +234,7 @@ public class Swimlanes extends AbstractTextBlock implements TextBlock {
}
drawSeparation(ug.apply(new UTranslate(x2, 0)), dimensionFull.getHeight() + titleHeightTranslate.getDy());
final Cross cross = new Cross(ug.apply(titleHeightTranslate));
full.drawU(cross);
cross.flushUg();
@ -321,32 +283,6 @@ public class Swimlanes extends AbstractTextBlock implements TextBlock {
}
}
private void computeSizeOld(UGraphic ug, TextBlock full) {
double x1 = 0;
final StringBounder stringBounder = ug.getStringBounder();
for (Swimlane swimlane : swimlanes) {
final LimitFinder limitFinder = new LimitFinder(stringBounder, false);
final UGraphicInterceptorOneSwimlane interceptor = new UGraphicInterceptorOneSwimlane(new UGraphicForSnake(
limitFinder), swimlane);
full.drawU(interceptor);
interceptor.flushUg();
final MinMax minMax = limitFinder.getMinMax();
final double drawingWidth = minMax.getWidth() + 2 * separationMargin;
final TextBlock swTitle = swimlane.getDisplay().create(getFontConfiguration(), HorizontalAlignment.LEFT,
skinParam);
final double titleWidth = swTitle.calculateDimension(stringBounder).getWidth();
final double totalWidth = Math.max(drawingWidth, titleWidth + 2 * separationMargin);
final UTranslate translate = new UTranslate(x1 - minMax.getMinX() + separationMargin
+ (totalWidth - drawingWidth) / 2.0, 0);
swimlane.setTranslateAndWidth(translate, totalWidth);
x1 += totalWidth;
}
}
private UTranslate getTitleHeightTranslate(final StringBounder stringBounder) {
double titlesHeight = 0;
for (Swimlane swimlane : swimlanes) {
@ -359,26 +295,6 @@ public class Swimlanes extends AbstractTextBlock implements TextBlock {
return titleHeightTranslate;
}
private CollisionDetector getCollisionDetector(UGraphic ug, final UTranslate titleHeightTranslate) {
final FtileFactory factory = getFtileFactory(ug.getStringBounder());
final TextBlock full = root.createFtile(factory);
ug = new UGraphicForSnake(ug);
final CollisionDetector collisionDetector = new CollisionDetector(ug.getStringBounder());
for (Swimlane swimlane : swimlanes) {
full.drawU(new UGraphicInterceptorOneSwimlane(collisionDetector, swimlane).apply(swimlane.getTranslate())
.apply(titleHeightTranslate));
}
collisionDetector.setManageSnakes(true);
final Cross cross = new Cross(collisionDetector.apply(titleHeightTranslate));
full.drawU(cross);
cross.flushUg();
return collisionDetector;
}
private void drawSeparation(UGraphic ug, double height) {
HtmlColor color = skinParam.getHtmlColor(ColorParam.swimlaneBorder, null, false);
if (color == null) {
@ -388,21 +304,10 @@ public class Swimlanes extends AbstractTextBlock implements TextBlock {
ug.apply(thickness).apply(new UChangeColor(color)).draw(new ULine(0, height));
}
// private Dimension2D cachedDimension;
public Dimension2D calculateDimension(StringBounder stringBounder) {
return getMinMax(stringBounder).getDimension();
// if (cachedDimension == null) {
// cachedDimension = calculateDimensionSlow(stringBounder);
// }
// return cachedDimension;
}
// private Dimension2D calculateDimensionSlow(StringBounder stringBounder) {
// final Dimension2D result = TextBlockUtils.getMinMax(this, stringBounder).getDimension();
// return result;
// }
public Instruction getCurrent() {
return currentInstruction;
}
@ -425,7 +330,7 @@ public class Swimlanes extends AbstractTextBlock implements TextBlock {
public Swimlane getCurrentSwimlane() {
return currentSwimlane;
}
private MinMax cachedMinMax;
@Override
@ -436,5 +341,4 @@ public class Swimlanes extends AbstractTextBlock implements TextBlock {
return cachedMinMax;
}
}

View File

@ -47,6 +47,7 @@ import net.sourceforge.plantuml.Direction;
import net.sourceforge.plantuml.cucadiagram.LinkStyle;
import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.graphic.HtmlColorAndStyle;
import net.sourceforge.plantuml.ugraphic.MinMax;
import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
import net.sourceforge.plantuml.ugraphic.UChangeColor;
import net.sourceforge.plantuml.ugraphic.UGraphic;
@ -231,6 +232,17 @@ public class Worm implements Iterable<Point2D.Double> {
return Collections.unmodifiableCollection(points).iterator();
}
public boolean doesHorizontalCross(MinMax area) {
for (int i = 0; i < points.size() - 1; i++) {
final Point2D.Double pt1 = get(i);
final Point2D.Double pt2 = get(i + 1);
if (pt1.getY() == pt2.getY() && area.doesHorizontalCross(pt1, pt2)) {
return true;
}
}
return false;
}
public int size() {
return this.points.size();
}

View File

@ -0,0 +1,74 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* 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.activitydiagram3.ftile;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
import net.sourceforge.plantuml.ugraphic.MinMax;
import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
import net.sourceforge.plantuml.ugraphic.UChangeColor;
import net.sourceforge.plantuml.ugraphic.UGraphic;
public class Zad {
private final List<MinMax> rectangles = new ArrayList<MinMax>();
public void add(MinMax rect) {
// System.err.println("add " + rect);
this.rectangles.add(rect);
}
public void drawDebug(UGraphic ug) {
ug = ug.apply(new UChangeBackColor(HtmlColorUtils.BLUE)).apply(new UChangeColor(HtmlColorUtils.RED_LIGHT));
for (MinMax minMax : rectangles) {
System.err.println("minmax=" + minMax);
minMax.drawGrey(ug);
}
}
public boolean doesHorizontalCross(Snake snake) {
for (MinMax minMax : rectangles) {
if (snake.doesHorizontalCross(minMax)) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,135 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* 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.activitydiagram3.ftile;
import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.ugraphic.ColorMapper;
import net.sourceforge.plantuml.ugraphic.MinMax;
import net.sourceforge.plantuml.ugraphic.UChange;
import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
import net.sourceforge.plantuml.ugraphic.UChangeColor;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UParam;
import net.sourceforge.plantuml.ugraphic.UParamNull;
import net.sourceforge.plantuml.ugraphic.URectangle;
import net.sourceforge.plantuml.ugraphic.UShape;
import net.sourceforge.plantuml.ugraphic.UStroke;
import net.sourceforge.plantuml.ugraphic.UTranslate;
public class ZadBuilder implements UGraphic {
public UGraphic apply(UChange change) {
if (change instanceof UTranslate) {
return new ZadBuilder(stringBounder, translate.compose((UTranslate) change), this.context);
} else if (change instanceof UStroke) {
return new ZadBuilder(this);
} else if (change instanceof UChangeBackColor) {
return new ZadBuilder(this);
} else if (change instanceof UChangeColor) {
return new ZadBuilder(this);
}
throw new UnsupportedOperationException();
}
private final StringBounder stringBounder;
private final UTranslate translate;
private final Context context;
static class Context {
private final Zad zad = new Zad();
}
public ZadBuilder(StringBounder stringBounder) {
this(stringBounder, new UTranslate(), new Context());
}
private ZadBuilder(StringBounder stringBounder, UTranslate translate, Context context) {
this.stringBounder = stringBounder;
this.translate = translate;
this.context = context;
}
private ZadBuilder(ZadBuilder other) {
this(other.stringBounder, other.translate, other.context);
}
public StringBounder getStringBounder() {
return stringBounder;
}
public UParam getParam() {
return new UParamNull();
}
public void draw(UShape shape) {
if (shape instanceof URectangle) {
drawRectangle((URectangle) shape);
}
}
private void drawRectangle(URectangle shape) {
final MinMax area = shape.getMinMax().translate(translate);
// System.err.println("ZadBuilder " + shape + " " + area);
context.zad.add(area);
}
public ColorMapper getColorMapper() {
throw new UnsupportedOperationException();
}
public void startUrl(Url url) {
}
public void closeAction() {
}
public void flushUg() {
}
public boolean matchesProperty(String propertyName) {
return false;
}
public double dpiFactor() {
return 1;
}
public Zad getZad() {
return context.zad;
}
}

View File

@ -111,7 +111,8 @@ public class ParallelBuilderSplit2 extends ParallelFtilesBuilder {
}
final Rainbow thinColor = result.getInLinkRendering().getRainbow(HtmlColorAndStyle.build(skinParam()));
final Ftile out = new FtileThinSplit(skinParam(), thinColor.getColor(), getList().get(0).getSwimlaneIn());
// final Ftile out = new FtileThinSplit(skinParam(), thinColor.getColor(), getList().get(0).getSwimlaneIn());
final Ftile out = new FtileThinSplit(skinParam(), thinColor.getColor(), swimlane());
result = new FtileAssemblySimple(result, out);
final List<Connection> conns = new ArrayList<Connection>();
double x = 0;

View File

@ -40,4 +40,6 @@ public interface INumberAnalyzed {
public long getMean();
public long getSliddingMean();
}

View File

@ -29,7 +29,6 @@
package net.sourceforge.plantuml.api;
import java.util.StringTokenizer;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.prefs.Preferences;
@ -38,7 +37,7 @@ import net.sourceforge.plantuml.Log;
public class NumberAnalyzed implements INumberAnalyzed {
private static final int SLIDING_WINDOW = 512;
private static final int SLIDING_WINDOW = 1024;
private long nb;
private long sum;
@ -211,6 +210,16 @@ public class NumberAnalyzed implements INumberAnalyzed {
return sum / nb;
}
synchronized public final long getSliddingMean() {
if (nb == 0) {
return 0;
}
if (nb < SLIDING_WINDOW) {
return sum / nb;
}
return sliddingSum / nb;
}
public final long getStandardDeviation() {
final long sum1;
final long sumOfSquare1;

View File

@ -162,9 +162,21 @@ public class NumberAnalyzed2 implements INumberAnalyzed {
if (nb.get() == 0) {
return 0;
}
// Bad
return sum.get() / nb.get();
}
public final long getSliddingMean() {
if (nb.get() == 0) {
return 0;
}
if (nb.get() < SLIDING_WINDOW) {
return sum.get() / nb.get();
}
// Bad
return sliddingSum.get() / nb.get();
}
final public String getName() {
return name;
}

View File

@ -99,21 +99,23 @@ public class ClassDiagramFactory extends UmlDiagramFactory {
cmds.add(new CommandHideShow2());
cmds.add(new CommandRemoveRestore());
cmds.add(new CommandCreateClassMultilines());
cmds.add(new CommandCreateEntityObjectMultilines());
cmds.add(new CommandCreateClass());
cmds.add(new CommandCreateEntityObject());
cmds.add(new CommandAllowMixing());
cmds.add(new CommandLayoutNewLine());
cmds.add(new CommandCreateElementFull2(Mode.NORMAL_KEYWORD));
cmds.add(new CommandCreateElementFull2(Mode.WITH_MIX_PREFIX));
final FactoryNoteCommand factoryNoteCommand = new FactoryNoteCommand();
cmds.add(factoryNoteCommand.createSingleLine());
cmds.add(new CommandPackage());
cmds.add(new CommandEndPackage());
cmds.add(new CommandPackageEmpty());
cmds.add(new CommandPackageWithUSymbol());
cmds.add(new CommandCreateElementFull2(Mode.NORMAL_KEYWORD));
cmds.add(new CommandCreateElementFull2(Mode.WITH_MIX_PREFIX));
final FactoryNoteCommand factoryNoteCommand = new FactoryNoteCommand();
cmds.add(factoryNoteCommand.createSingleLine());
cmds.add(new CommandNamespace());
cmds.add(new CommandStereotype());
@ -137,9 +139,6 @@ public class ClassDiagramFactory extends UmlDiagramFactory {
cmds.add(factoryNoteOnEntityCommand.createMultiLine(false));
cmds.add(factoryNoteCommand.createMultiLine(false));
cmds.add(new CommandCreateClassMultilines());
cmds.add(new CommandCreateEntityObjectMultilines());
final FactoryNoteOnLinkCommand factoryNoteOnLinkCommand = new FactoryNoteOnLinkCommand();
cmds.add(factoryNoteOnLinkCommand.createSingleLine());
cmds.add(factoryNoteOnLinkCommand.createMultiLine(false));

View File

@ -114,14 +114,19 @@ public class CommandCreateClassMultilines extends CommandMultilines2<ClassDiagra
new RegexLeaf("IMPLEMENTS", "([%s]+(implements)[%s]+(" + CODES + "))?"), //
new RegexLeaf("[%s]*\\{[%s]*$"));
}
@Override
public boolean syntaxWithFinalBracket() {
return true;
}
private static ColorParser color() {
return ColorParser.simpleColor(ColorType.BACK);
}
public CommandExecutionResult executeNow(ClassDiagram diagram, BlocLines lines) {
protected CommandExecutionResult executeNow(ClassDiagram diagram, BlocLines lines) {
lines = lines.trimSmart(1);
lines = lines.removeComments();
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
final IEntity entity = executeArg0(diagram, line0);
if (entity == null) {

View File

@ -52,7 +52,7 @@ public class ArobaseStringCompressor implements StringCompressor {
private final static Pattern2 p = MyPattern.cmpile("(?s)(?i)^[%s]*(@startuml[^\\n\\r]*)?[%s]*(.*?)[%s]*(@enduml)?[%s]*$");
public String compress(final String data) throws IOException {
final ReadLine r = new UncommentReadLine(new ReadLineReader(new StringReader(data), "COMPRESS"));
final ReadLine r = new UncommentReadLine(ReadLineReader.create(new StringReader(data), "COMPRESS"));
final StringBuilder sb = new StringBuilder();
final StringBuilder full = new StringBuilder();
CharSequence2 s = null;

View File

@ -43,7 +43,6 @@ import java.util.List;
import net.sourceforge.plantuml.BackSlash;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.command.regex.MyPattern;
import net.sourceforge.plantuml.cucadiagram.Display;
public class BlocLines implements Iterable<CharSequence> {
@ -94,7 +93,7 @@ public class BlocLines implements Iterable<CharSequence> {
}
public CharSequence getFirst499() {
if (lines.size()==0) {
if (lines.size() == 0) {
return null;
}
return lines.get(0);
@ -232,38 +231,19 @@ public class BlocLines implements Iterable<CharSequence> {
return lines.iterator();
}
@Deprecated
public BlocLines removeComments() {
public BlocLines eventuallyMoveBracket() {
if (size() < 2) {
return this;
}
final String first = StringUtils.trin(getFirst499());
final String second = StringUtils.trin(get499(1));
if (first.endsWith("{") == false && second.equals("{")) {
final String vline = first + " {";
final List<CharSequence> result = new ArrayList<CharSequence>();
result.add(vline);
result.addAll(this.lines.subList(2, this.lines.size()));
return new BlocLines(result);
}
return this;
// final List<CharSequence> copy = new ArrayList<CharSequence>();
// boolean inComment = false;
// for (CharSequence cs : lines) {
// if (inComment == false && MyPattern.mtches(cs, CommandMultilinesComment.COMMENT_SINGLE_LINE)) {
// continue;
// }
// if (inComment == false && MyPattern.mtches(cs, CommandMultilinesComment.COMMENT_MULTILINE_START)) {
// inComment = true;
// continue;
// }
// if (inComment && MyPattern.mtches(cs, CommandMultilinesComment.COMMENT_MULTILINE_END)) {
// inComment = false;
// continue;
// }
// if (inComment == false) {
// copy.add(cs);
// }
// }
// return new BlocLines(copy);
}
@Deprecated
public BlocLines removeInnerComments() {
return this;
// final List<CharSequence> copy = new ArrayList<CharSequence>();
// for (CharSequence cs : lines) {
// copy.add(MyPattern.removeAll(cs, CommandMultilinesComment.INNER_COMMENT));
// }
// return new BlocLines(copy);
}
}

View File

@ -55,6 +55,10 @@ public abstract class CommandMultilines2<S extends Diagram> implements Command<S
this.starting = patternStart;
}
public boolean syntaxWithFinalBracket() {
return false;
}
public abstract String getPatternEnd();
public String[] getDescription() {
@ -66,6 +70,16 @@ public abstract class CommandMultilines2<S extends Diagram> implements Command<S
if (isCommandForbidden()) {
return CommandControl.NOT_OK;
}
if (syntaxWithFinalBracket()) {
if (lines.size() == 1 && StringUtils.trin(lines.getFirst499()).endsWith("{") == false) {
final String vline = lines.get499(0).toString() + " {";
if (isValid(BlocLines.single(vline)) == CommandControl.OK_PARTIAL) {
return CommandControl.OK_PARTIAL;
}
return CommandControl.NOT_OK;
}
lines = lines.eventuallyMoveBracket();
}
final CharSequence first = lines.getFirst499();
if (first == null) {
return CommandControl.NOT_OK;
@ -89,10 +103,13 @@ public abstract class CommandMultilines2<S extends Diagram> implements Command<S
public final CommandExecutionResult execute(S system, BlocLines lines) {
lines = lines.cleanList2(strategy);
if (syntaxWithFinalBracket()) {
lines = lines.eventuallyMoveBracket();
}
return executeNow(system, lines);
}
public abstract CommandExecutionResult executeNow(S system, BlocLines lines);
protected abstract CommandExecutionResult executeNow(S system, BlocLines lines);
protected boolean isCommandForbidden() {
return false;

View File

@ -91,7 +91,7 @@ public abstract class CommandMultilines3<S extends Diagram> implements Command<S
return executeNow(system, lines);
}
public abstract CommandExecutionResult executeNow(S system, BlocLines lines);
protected abstract CommandExecutionResult executeNow(S system, BlocLines lines);
protected boolean isCommandForbidden() {
return false;

View File

@ -65,7 +65,7 @@ public class CommandMultilinesLegend extends CommandMultilines2<UmlDiagram> {
}
@Override
public CommandExecutionResult executeNow(UmlDiagram diagram, BlocLines lines) {
protected CommandExecutionResult executeNow(UmlDiagram diagram, BlocLines lines) {
lines = lines.trimSmart(1);
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
final String align = line0.get("ALIGN", 0);

View File

@ -82,6 +82,11 @@ public class CommandPackage extends SingleLineCommand2<AbstractEntityDiagram> {
new RegexLeaf("[%s]*\\{$"));
}
@Override
public boolean syntaxWithFinalBracket() {
return true;
}
private static ColorParser color() {
return ColorParser.simpleColor(ColorType.BACK);
}

View File

@ -98,7 +98,6 @@ public class CommandSkinParamMultilines extends CommandMultilinesBracket<UmlDiag
}
lines = lines.subExtract(1, 1);
lines = lines.removeComments();
lines = lines.trim(true);
for (CharSequence s : lines) {

View File

@ -46,6 +46,7 @@ import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf;
import net.sourceforge.plantuml.command.regex.RegexResult;
import net.sourceforge.plantuml.ugraphic.sprite.Sprite;
import net.sourceforge.plantuml.ugraphic.sprite.SpriteColorBuilder4096;
import net.sourceforge.plantuml.ugraphic.sprite.SpriteGrayLevel;
public final class FactorySpriteCommand implements SingleMultiFactoryCommand<UmlDiagram> {
@ -54,7 +55,7 @@ public final class FactorySpriteCommand implements SingleMultiFactoryCommand<Uml
return new RegexConcat(new RegexLeaf("^"), //
new RegexLeaf("sprite[%s]+\\$?"), //
new RegexLeaf("NAME", "([\\p{L}0-9_]+)[%s]*"), //
new RegexLeaf("DIM", "(?:\\[(\\d+)x(\\d+)/(\\d+)(z)?\\])?"), //
new RegexLeaf("DIM", "(?:\\[(\\d+)x(\\d+)/(?:(\\d+)(z)?|(color))\\])?"), //
new RegexLeaf("[%s]*\\{"), //
new RegexLeaf("$"));
}
@ -63,7 +64,7 @@ public final class FactorySpriteCommand implements SingleMultiFactoryCommand<Uml
return new RegexConcat(new RegexLeaf("^"), //
new RegexLeaf("sprite[%s]+\\$?"), //
new RegexLeaf("NAME", "([\\p{L}0-9_]+)[%s]*"), //
new RegexLeaf("DIM", "(?:\\[(\\d+)x(\\d+)/(\\d+)(z)\\])?"), //
new RegexLeaf("DIM", "(?:\\[(\\d+)x(\\d+)/(?:(\\d+)(z)|(color))\\])?"), //
new RegexLeaf("[%s]+"), //
new RegexLeaf("DATA", "([-_A-Za-z0-9]+)"), //
new RegexLeaf("$"));
@ -88,7 +89,7 @@ public final class FactorySpriteCommand implements SingleMultiFactoryCommand<Uml
return "(?i)^end[%s]?sprite|\\}$";
}
public CommandExecutionResult executeNow(final UmlDiagram system, BlocLines lines) {
protected CommandExecutionResult executeNow(final UmlDiagram system, BlocLines lines) {
lines = lines.trim(true);
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
@ -112,15 +113,19 @@ public final class FactorySpriteCommand implements SingleMultiFactoryCommand<Uml
} else {
final int width = Integer.parseInt(line0.get("DIM", 0));
final int height = Integer.parseInt(line0.get("DIM", 1));
final int nbColor = Integer.parseInt(line0.get("DIM", 2));
if (nbColor != 4 && nbColor != 8 && nbColor != 16) {
return CommandExecutionResult.error("Only 4, 8 or 16 graylevel are allowed.");
}
final SpriteGrayLevel level = SpriteGrayLevel.get(nbColor);
if (line0.get("DIM", 3) == null) {
sprite = level.buildSprite(width, height, strings);
if (line0.get("DIM", 4) == null) {
final int nbLevel = Integer.parseInt(line0.get("DIM", 2));
if (nbLevel != 4 && nbLevel != 8 && nbLevel != 16) {
return CommandExecutionResult.error("Only 4, 8 or 16 graylevel are allowed.");
}
final SpriteGrayLevel level = SpriteGrayLevel.get(nbLevel);
if (line0.get("DIM", 3) == null) {
sprite = level.buildSprite(width, height, strings);
} else {
sprite = level.buildSpriteZ(width, height, concat(strings));
}
} else {
sprite = level.buildSpriteZ(width, height, concat(strings));
sprite = SpriteColorBuilder4096.buildSprite(strings);
}
}
system.addSprite(line0.get("NAME", 0), sprite);

View File

@ -45,6 +45,9 @@ public class ProtectedCommand<S extends Diagram> implements Command<S> {
public ProtectedCommand(Command<S> cmd) {
this.cmd = cmd;
if (cmd == null) {
throw new IllegalArgumentException();
}
}
public CommandExecutionResult execute(S system, BlocLines lines) {
@ -58,8 +61,8 @@ public class ProtectedCommand<S extends Diagram> implements Command<S> {
} catch (Throwable t) {
Log.error("Error " + t);
t.printStackTrace();
String msg = "You should send a mail to plantuml@gmail.com or post to http://plantuml.com/qa with this log (V" + Version.versionString()
+ ")";
String msg = "You should send a mail to plantuml@gmail.com or post to http://plantuml.com/qa with this log (V"
+ Version.versionString() + ")";
Log.error(msg);
msg += " " + t.toString();
return CommandExecutionResult.error(msg, t);

View File

@ -66,7 +66,6 @@ public abstract class SingleLineCommand<S extends Diagram> implements Command<S>
if (lines.size() != 1) {
return CommandControl.NOT_OK;
}
lines = lines.removeInnerComments();
if (isCommandForbidden()) {
return CommandControl.NOT_OK;
}
@ -90,7 +89,6 @@ public abstract class SingleLineCommand<S extends Diagram> implements Command<S>
if (lines.size() != 1) {
throw new IllegalArgumentException();
}
lines = lines.removeInnerComments();
final String line = StringUtils.trin(lines.getFirst499());
if (isForbidden(line)) {
return CommandExecutionResult.error("Syntax error: " + line);

View File

@ -56,19 +56,32 @@ public abstract class SingleLineCommand2<S extends Diagram> implements Command<S
this.pattern = pattern;
}
public boolean syntaxWithFinalBracket() {
return false;
}
public String[] getDescription() {
return new String[] { pattern.getPattern() };
}
final public CommandControl isValid(BlocLines lines) {
if (lines.size() == 2 && syntaxWithFinalBracket()) {
return isValidBracket(lines);
}
if (lines.size() != 1) {
return CommandControl.NOT_OK;
}
lines = lines.removeInnerComments();
if (isCommandForbidden()) {
return CommandControl.NOT_OK;
}
final String line = StringUtils.trin(lines.getFirst499());
if (syntaxWithFinalBracket() && line.endsWith("{") == false) {
final String vline = lines.get499(0).toString() + " {";
if (isValid(BlocLines.single(vline)) == CommandControl.OK) {
return CommandControl.OK_PARTIAL;
}
return CommandControl.NOT_OK;
}
final boolean result = pattern.match(line);
if (result) {
actionIfCommandValid();
@ -76,6 +89,16 @@ public abstract class SingleLineCommand2<S extends Diagram> implements Command<S
return result ? CommandControl.OK : CommandControl.NOT_OK;
}
private CommandControl isValidBracket(BlocLines lines) {
assert lines.size() == 2;
assert syntaxWithFinalBracket();
if (StringUtils.trin(lines.get499(1)).equals("{") == false) {
return CommandControl.NOT_OK;
}
final String vline = lines.get499(0).toString() + " {";
return isValid(BlocLines.single(vline));
}
protected boolean isCommandForbidden() {
return false;
}
@ -84,10 +107,13 @@ public abstract class SingleLineCommand2<S extends Diagram> implements Command<S
}
public final CommandExecutionResult execute(S system, BlocLines lines) {
if (syntaxWithFinalBracket() && lines.size() == 2) {
assert StringUtils.trin(lines.get499(1)).equals("{");
lines = BlocLines.single(lines.getFirst499() + " {");
}
if (lines.size() != 1) {
throw new IllegalArgumentException();
}
lines = lines.removeInnerComments();
final String line = StringUtils.trin(lines.getFirst499());
if (isForbidden(line)) {
return CommandExecutionResult.error("Syntax error: " + line);

View File

@ -45,7 +45,6 @@ import net.sourceforge.plantuml.CharSequence2;
import net.sourceforge.plantuml.ErrorUml;
import net.sourceforge.plantuml.ErrorUmlType;
import net.sourceforge.plantuml.NewpagedDiagram;
import net.sourceforge.plantuml.OptionFlags;
import net.sourceforge.plantuml.PSystemError;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.classdiagram.command.CommandHideShowByGender;
@ -53,9 +52,6 @@ import net.sourceforge.plantuml.classdiagram.command.CommandHideShowByVisibility
import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.core.DiagramType;
import net.sourceforge.plantuml.core.UmlSource;
import net.sourceforge.plantuml.suggest.SuggestEngine;
import net.sourceforge.plantuml.suggest.SuggestEngineResult;
import net.sourceforge.plantuml.suggest.SuggestEngineStatus;
import net.sourceforge.plantuml.utils.StartUtils;
import net.sourceforge.plantuml.version.IteratorCounter2;
@ -103,7 +99,7 @@ public abstract class UmlDiagramFactory extends PSystemAbstractFactory {
sys.setSource(source);
return sys;
}
sys = executeOneLine(sys, source, it);
sys = executeFewLines(sys, source, it);
if (sys instanceof PSystemError) {
return sys;
}
@ -113,90 +109,57 @@ public abstract class UmlDiagramFactory extends PSystemAbstractFactory {
}
private AbstractPSystem executeOneLine(AbstractPSystem sys, UmlSource source, final IteratorCounter2 it) {
final CommandControl commandControl = isValid2(it);
if (commandControl == CommandControl.NOT_OK) {
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", /* it.currentNum(), */it.peek()
.getLocation());
if (OptionFlags.getInstance().isUseSuggestEngine2()) {
final SuggestEngine engine = new SuggestEngine(source, this);
final SuggestEngineResult result = engine.tryToSuggest(sys);
if (result.getStatus() == SuggestEngineStatus.ONE_SUGGESTION) {
err.setSuggest(result);
}
}
sys = new PSystemError(source, err, null);
} else if (commandControl == CommandControl.OK_PARTIAL) {
final IteratorCounter2 saved = it.cloneMe();
final CommandExecutionResult result = manageMultiline2(it, sys);
if (result.isOk() == false) {
final ErrorUml err = new ErrorUml(ErrorUmlType.EXECUTION_ERROR, result.getError(),
/* it.currentNum() - 1, */saved.next().getLocation());
sys = new PSystemError(source, err, null);
private AbstractPSystem executeFewLines(AbstractPSystem sys, UmlSource source, final IteratorCounter2 it) {
final Step step = getCandidate(it);
if (step == null) {
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", it.peek().getLocation());
return new PSystemError(source, err, null);
}
}
} else if (commandControl == CommandControl.OK) {
final CharSequence line = it.next();
final BlocLines lines = BlocLines.single(line);
Command cmd = getFirstCommandOkForLines(lines);
final CommandExecutionResult result = sys.executeCommand(cmd, lines);
if (result.isOk() == false) {
final ErrorUml err = new ErrorUml(ErrorUmlType.EXECUTION_ERROR, result.getError(),
/* it.currentNum() - 1, */((CharSequence2) line).getLocation());
sys = new PSystemError(source, err,
result.getDebugLines());
}
if (result.getNewDiagram() != null) {
sys = result.getNewDiagram();
}
} else {
assert false;
final CommandExecutionResult result = sys.executeCommand(step.command, step.blocLines);
if (result.isOk() == false) {
final ErrorUml err = new ErrorUml(ErrorUmlType.EXECUTION_ERROR, result.getError(),
((CharSequence2) step.blocLines.getFirst499()).getLocation());
sys = new PSystemError(source, err, result.getDebugLines());
}
if (result.getNewDiagram() != null) {
sys = result.getNewDiagram();
}
return sys;
}
public CommandControl isValid2(final IteratorCounter2 it) {
final BlocLines lines = BlocLines.single(it.peek());
for (Command cmd : cmds) {
final CommandControl result = cmd.isValid(lines);
if (result == CommandControl.OK) {
return result;
}
if (result == CommandControl.OK_PARTIAL && isMultilineCommandOk(it.cloneMe(), cmd) != null) {
return result;
}
static class Step {
final Command command;
final BlocLines blocLines;
Step(Command command, BlocLines blocLines) {
this.command = command;
this.blocLines = blocLines;
}
return CommandControl.NOT_OK;
}
public CommandControl goForwardMultiline(final IteratorCounter2 it) {
final BlocLines lines = BlocLines.single(it.peek());
private Step getCandidate(final IteratorCounter2 it) {
final BlocLines single = BlocLines.single(it.peek());
for (Command cmd : cmds) {
final CommandControl result = cmd.isValid(lines);
final CommandControl result = cmd.isValid(single);
if (result == CommandControl.OK) {
throw new IllegalStateException();
it.next();
return new Step(cmd, single);
}
if (result == CommandControl.OK_PARTIAL && isMultilineCommandOk(it, cmd) != null) {
return result;
}
}
return CommandControl.NOT_OK;
// throw new IllegalStateException();
}
private CommandExecutionResult manageMultiline2(IteratorCounter2 it, AbstractPSystem system) {
for (Command cmd : cmds) {
if (isMultilineCommandOk(it.cloneMe(), cmd) != null) {
final BlocLines lines = isMultilineCommandOk(it, cmd);
if (system instanceof NewpagedDiagram) {
final NewpagedDiagram newpagedDiagram = (NewpagedDiagram) system;
return cmd.execute(newpagedDiagram.getLastDiagram(), lines);
if (result == CommandControl.OK_PARTIAL) {
final IteratorCounter2 cloned = it.cloneMe();
final BlocLines lines = isMultilineCommandOk(cloned, cmd);
if (lines == null) {
continue;
}
return cmd.execute(system, lines);
it.copyStateFrom(cloned);
assert lines != null;
return new Step(cmd, lines);
}
}
return CommandExecutionResult.ok();
return null;
}
private BlocLines isMultilineCommandOk(IteratorCounter2 it, Command cmd) {
@ -236,38 +199,14 @@ public abstract class UmlDiagramFactory extends PSystemAbstractFactory {
// -----------------------------------
final public CommandControl isValid(BlocLines lines) {
for (Command cmd : cmds) {
final CommandControl result = cmd.isValid(lines);
if (result == CommandControl.OK) {
return result;
}
if (result == CommandControl.OK_PARTIAL) {
return result;
}
}
return CommandControl.NOT_OK;
}
private Command getFirstCommandOkForLines(BlocLines lines) {
for (Command cmd : cmds) {
final CommandControl result = cmd.isValid(lines);
if (result == CommandControl.OK) {
return cmd;
}
}
throw new IllegalArgumentException();
}
protected abstract List<Command> createCommands();
public abstract AbstractPSystem createEmptyDiagram();
final protected void addCommonCommands(List<Command> cmds) {
cmds.add(new CommandNope());
// cmds.add(new CommandComment());
// cmds.add(new CommandMultilinesComment());
// cmds.add(new CommandComment());
// cmds.add(new CommandMultilinesComment());
cmds.add(new CommandPragma());
cmds.add(new CommandTitle());
cmds.add(new CommandCaption());

View File

@ -0,0 +1,374 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* 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.command;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import net.sourceforge.plantuml.AbstractPSystem;
import net.sourceforge.plantuml.CharSequence2;
import net.sourceforge.plantuml.ErrorUml;
import net.sourceforge.plantuml.ErrorUmlType;
import net.sourceforge.plantuml.NewpagedDiagram;
import net.sourceforge.plantuml.OptionFlags;
import net.sourceforge.plantuml.PSystemError;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.classdiagram.command.CommandHideShowByGender;
import net.sourceforge.plantuml.classdiagram.command.CommandHideShowByVisibility;
import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.core.DiagramType;
import net.sourceforge.plantuml.core.UmlSource;
import net.sourceforge.plantuml.suggest.SuggestEngine;
import net.sourceforge.plantuml.suggest.SuggestEngineResult;
import net.sourceforge.plantuml.suggest.SuggestEngineStatus;
import net.sourceforge.plantuml.utils.StartUtils;
import net.sourceforge.plantuml.version.IteratorCounter2;
public abstract class UmlDiagramFactoryOld extends PSystemAbstractFactory {
private final List<Command> cmds;
protected UmlDiagramFactoryOld() {
this(DiagramType.UML);
}
protected UmlDiagramFactoryOld(DiagramType type) {
super(type);
cmds = createCommands();
}
final public Diagram createSystem(UmlSource source) {
final IteratorCounter2 it = source.iterator2();
final CharSequence2 startLine = it.next();
if (StartUtils.isArobaseStartDiagram(startLine) == false) {
throw new UnsupportedOperationException();
}
if (source.isEmpty()) {
return buildEmptyError(source, startLine.getLocation());
}
AbstractPSystem sys = createEmptyDiagram();
while (it.hasNext()) {
if (StartUtils.isArobaseEndDiagram(it.peek())) {
if (sys == null) {
return null;
}
final String err = sys.checkFinalError();
if (err != null) {
return buildExecutionError(source, err, it.peek().getLocation());
}
if (source.getTotalLineCount() == 2) {
return buildEmptyError(source, it.peek().getLocation());
}
sys.makeDiagramReady();
if (sys.isOk() == false) {
return null;
}
sys.setSource(source);
return sys;
}
sys = executeOneLine(sys, source, it);
if (sys instanceof PSystemError) {
return sys;
}
}
sys.setSource(source);
return sys;
}
private AbstractPSystem executeOneLine(AbstractPSystem sys, UmlSource source, final IteratorCounter2 it) {
final CommandControl commandControl = isValid2(it);
if (commandControl == CommandControl.NOT_OK) {
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", /* it.currentNum(), */it.peek()
.getLocation());
if (OptionFlags.getInstance().isUseSuggestEngine2()) {
final SuggestEngine engine = new SuggestEngine(source, this);
final SuggestEngineResult result = engine.tryToSuggest(sys);
if (result.getStatus() == SuggestEngineStatus.ONE_SUGGESTION) {
err.setSuggest(result);
}
}
sys = new PSystemError(source, err, null);
// } else if (commandControl == CommandControl.MISSING_FINAL_BRACKET) {
// final IteratorCounter2 saved = it.cloneMe();
// final CommandExecutionResult result = manageMissingBracket(it, sys);
// if (result.isOk() == false) {
// final ErrorUml err = new ErrorUml(ErrorUmlType.EXECUTION_ERROR, result.getError(),
// /* it.currentNum() - 1, */saved.next().getLocation());
// sys = new PSystemError(source, err, null);
//
// }
} else if (commandControl == CommandControl.OK_PARTIAL) {
final IteratorCounter2 saved = it.cloneMe();
final CommandExecutionResult result = manageMultiline2(it, sys);
if (result.isOk() == false) {
final ErrorUml err = new ErrorUml(ErrorUmlType.EXECUTION_ERROR, result.getError(),
/* it.currentNum() - 1, */saved.next().getLocation());
sys = new PSystemError(source, err, null);
}
} else if (commandControl == CommandControl.OK) {
final CharSequence line = it.next();
final BlocLines lines = BlocLines.single(line);
Command cmd = getFirstCommandOkForLines(lines);
final CommandExecutionResult result = sys.executeCommand(cmd, lines);
if (result.isOk() == false) {
final ErrorUml err = new ErrorUml(ErrorUmlType.EXECUTION_ERROR, result.getError(),
/* it.currentNum() - 1, */((CharSequence2) line).getLocation());
sys = new PSystemError(source, err, result.getDebugLines());
}
if (result.getNewDiagram() != null) {
sys = result.getNewDiagram();
}
} else {
assert false;
}
return sys;
}
public CommandControl isValid2(final IteratorCounter2 it) {
final BlocLines lines = BlocLines.single(it.peek());
for (Command cmd : cmds) {
final CommandControl result = cmd.isValid(lines);
if (result == CommandControl.OK) {
return result;
}
// if (result == CommandControl.MISSING_FINAL_BRACKET && isNextLineBracket(it.cloneMe())) {
// return result;
// }
if (result == CommandControl.OK_PARTIAL && isMultilineCommandOk(it.cloneMe(), cmd) != null) {
return result;
}
}
return CommandControl.NOT_OK;
}
private boolean isNextLineBracket(final IteratorCounter2 it) {
it.next();
return (StringUtils.trin(it.peek()).equals("{"));
}
public CommandControl goForwardMultiline(final IteratorCounter2 it) {
final BlocLines lines = BlocLines.single(it.peek());
for (Command cmd : cmds) {
final CommandControl result = cmd.isValid(lines);
if (result == CommandControl.OK) {
throw new IllegalStateException();
}
if (result == CommandControl.OK_PARTIAL && isMultilineCommandOk(it, cmd) != null) {
return result;
}
}
return CommandControl.NOT_OK;
// throw new IllegalStateException();
}
private CommandExecutionResult manageMissingBracket(IteratorCounter2 it, AbstractPSystem system) {
for (Command cmd : cmds) {
if (cmd instanceof SingleLineCommand2 == false) {
continue;
}
SingleLineCommand2 cmd2 = (SingleLineCommand2) cmd;
if (cmd2.syntaxWithFinalBracket() == false) {
continue;
}
if (isMultilineBracketOk(it.cloneMe(), cmd) != null) {
final BlocLines lines = isMultilineBracketOk(it, cmd);
if (system instanceof NewpagedDiagram) {
final NewpagedDiagram newpagedDiagram = (NewpagedDiagram) system;
return cmd.execute(newpagedDiagram.getLastDiagram(), lines);
}
return cmd.execute(system, lines);
}
}
return CommandExecutionResult.error("No bracket");
}
private BlocLines isMultilineBracketOk(IteratorCounter2 it, Command cmd) {
BlocLines lines = new BlocLines();
int nb = 0;
while (it.hasNext()) {
// System.err.println("nb=" + nb);
lines = addOneSingleLineManageEmbedded2(it, lines);
final CommandControl result = cmd.isValid(lines);
if (result == CommandControl.NOT_OK) {
return null;
}
if (result == CommandControl.OK) {
return lines;
}
nb++;
if (nb > 1) {
return null;
}
}
return null;
}
private CommandExecutionResult manageMultiline2(IteratorCounter2 it, AbstractPSystem system) {
for (Command cmd : cmds) {
if (isMultilineCommandOk(it.cloneMe(), cmd) != null) {
final BlocLines lines = isMultilineCommandOk(it, cmd);
if (system instanceof NewpagedDiagram) {
final NewpagedDiagram newpagedDiagram = (NewpagedDiagram) system;
return cmd.execute(newpagedDiagram.getLastDiagram(), lines);
}
return cmd.execute(system, lines);
}
}
return CommandExecutionResult.ok();
}
private BlocLines isMultilineCommandOk(IteratorCounter2 it, Command cmd) {
BlocLines lines = new BlocLines();
int nb = 0;
while (it.hasNext()) {
lines = addOneSingleLineManageEmbedded2(it, lines);
final CommandControl result = cmd.isValid(lines);
if (result == CommandControl.NOT_OK) {
return null;
}
if (result == CommandControl.OK) {
return lines;
}
nb++;
if (cmd instanceof CommandDecoratorMultine && nb > ((CommandDecoratorMultine) cmd).getNbMaxLines()) {
return null;
}
}
return null;
}
private BlocLines addOneSingleLineManageEmbedded2(IteratorCounter2 it, BlocLines lines) {
final CharSequence linetoBeAdded = it.next();
lines = lines.add2(linetoBeAdded);
if (StringUtils.trinNoTrace(linetoBeAdded).equals("{{")) {
while (it.hasNext()) {
final CharSequence s = it.next();
lines = lines.add2(s);
if (StringUtils.trinNoTrace(s).equals("}}")) {
return lines;
}
}
}
return lines;
}
// -----------------------------------
final public CommandControl isValid(BlocLines lines) {
for (Command cmd : cmds) {
final CommandControl result = cmd.isValid(lines);
if (result == CommandControl.OK) {
return result;
}
if (result == CommandControl.OK_PARTIAL) {
return result;
}
}
return CommandControl.NOT_OK;
}
private Command getFirstCommandOkForLines(BlocLines lines) {
for (Command cmd : cmds) {
final CommandControl result = cmd.isValid(lines);
if (result == CommandControl.OK) {
return cmd;
}
}
throw new IllegalArgumentException();
}
protected abstract List<Command> createCommands();
public abstract AbstractPSystem createEmptyDiagram();
final protected void addCommonCommands(List<Command> cmds) {
cmds.add(new CommandNope());
// cmds.add(new CommandComment());
// cmds.add(new CommandMultilinesComment());
cmds.add(new CommandPragma());
cmds.add(new CommandTitle());
cmds.add(new CommandCaption());
cmds.add(new CommandMultilinesTitle());
cmds.add(new CommandMultilinesLegend());
cmds.add(new CommandFooter());
cmds.add(new CommandMultilinesFooter());
cmds.add(new CommandHeader());
cmds.add(new CommandMultilinesHeader());
cmds.add(new CommandSkinParam());
cmds.add(new CommandSkinParamMultilines());
cmds.add(new CommandMinwidth());
cmds.add(new CommandRotate());
cmds.add(new CommandScale());
cmds.add(new CommandScaleWidthAndHeight());
cmds.add(new CommandScaleWidthOrHeight());
cmds.add(new CommandScaleMaxWidth());
cmds.add(new CommandScaleMaxHeight());
cmds.add(new CommandScaleMaxWidthAndHeight());
cmds.add(new CommandAffineTransform());
cmds.add(new CommandAffineTransformMultiline());
cmds.add(new CommandHideUnlinked());
final FactorySpriteCommand factorySpriteCommand = new FactorySpriteCommand();
cmds.add(factorySpriteCommand.createMultiLine(false));
cmds.add(factorySpriteCommand.createSingleLine());
cmds.add(new CommandSpriteFile());
cmds.add(new CommandHideShowByVisibility());
cmds.add(new CommandHideShowByGender());
}
final public List<String> getDescription() {
final List<String> result = new ArrayList<String>();
for (Command cmd : createCommands()) {
result.addAll(Arrays.asList(cmd.getDescription()));
}
return Collections.unmodifiableList(result);
}
}

View File

@ -101,7 +101,7 @@ public final class FactoryNoteCommand implements SingleMultiFactoryCommand<Abstr
return "(?i)^[%s]*end[%s]?note$";
}
public CommandExecutionResult executeNow(final AbstractEntityDiagram system, BlocLines lines) {
protected CommandExecutionResult executeNow(final AbstractEntityDiagram system, BlocLines lines) {
// StringUtils.trim(lines, false);
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
lines = lines.subExtract(1, 1);

View File

@ -137,7 +137,7 @@ public final class FactoryNoteOnEntityCommand implements SingleMultiFactoryComma
return "(?i)^[%s]*(end[%s]?note)$";
}
public CommandExecutionResult executeNow(final AbstractEntityDiagram system, BlocLines lines) {
protected CommandExecutionResult executeNow(final AbstractEntityDiagram system, BlocLines lines) {
// StringUtils.trim(lines, false);
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
lines = lines.subExtract(1, 1);

View File

@ -87,7 +87,7 @@ public final class FactoryNoteOnLinkCommand implements SingleMultiFactoryCommand
return "(?i)^[%s]*end[%s]?note$";
}
public CommandExecutionResult executeNow(final CucaDiagram system, BlocLines lines) {
protected CommandExecutionResult executeNow(final CucaDiagram system, BlocLines lines) {
final String line0 = lines.getFirst499().toString();
lines = lines.subExtract(1, 1);
lines = lines.removeEmptyColumns();

View File

@ -98,7 +98,7 @@ public final class FactoryTipOnEntityCommand implements SingleMultiFactoryComman
return "(?i)^[%s]*(end[%s]?note)$";
}
public CommandExecutionResult executeNow(final AbstractEntityDiagram system, BlocLines lines) {
protected CommandExecutionResult executeNow(final AbstractEntityDiagram system, BlocLines lines) {
// StringUtils.trim(lines, false);
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
lines = lines.subExtract(1, 1);

View File

@ -108,7 +108,7 @@ public final class FactorySequenceNoteCommand implements SingleMultiFactoryComma
return "(?i)^end[%s]?(note|hnote|rnote)$";
}
public CommandExecutionResult executeNow(final SequenceDiagram system, BlocLines lines) {
protected CommandExecutionResult executeNow(final SequenceDiagram system, BlocLines lines) {
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
lines = lines.subExtract(1, 1);
lines = lines.removeEmptyColumns();

View File

@ -102,7 +102,7 @@ public final class FactorySequenceNoteOnArrowCommand implements SingleMultiFacto
return "(?i)^[%s]*end[%s]?note$";
}
public CommandExecutionResult executeNow(final SequenceDiagram system, BlocLines lines) {
protected CommandExecutionResult executeNow(final SequenceDiagram system, BlocLines lines) {
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
lines = lines.subExtract(1, 1);
lines = lines.removeEmptyColumns();

View File

@ -113,7 +113,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
return "(?i)^end[%s]?(note|hnote|rnote)$";
}
public CommandExecutionResult executeNow(final SequenceDiagram system, BlocLines lines) {
protected CommandExecutionResult executeNow(final SequenceDiagram system, BlocLines lines) {
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
lines = lines.subExtract(1, 1);
lines = lines.removeEmptyColumns();

View File

@ -158,7 +158,7 @@ public class AtomImg implements Atom {
public void drawU(UGraphic ug) {
// final double h = calculateDimension(ug.getStringBounder()).getHeight();
ug.draw(new UImage(image, scale));
ug.draw(new UImage(image).scale(scale));
// tileImage.drawU(ug.apply(new UTranslate(0, -h)));
}

View File

@ -90,11 +90,12 @@ public class AtomMath implements Atom {
back = getColor(background == null ? ug.getParam().getBackcolor() : background, Color.WHITE);
}
final Color fore = getColor(foreground, Color.BLACK);
final double dpiFactor = ug.dpiFactor();
if (isSvg) {
final SvgString svg = math.getSvg(scale, fore, back);
ug.draw(new UImageSvg(svg));
} else {
ug.draw(new UImage(math.getImage(scale, fore, back)));
ug.draw(new UImage(math.getImage(scale * dpiFactor, fore, back)));
}
}

View File

@ -106,14 +106,17 @@ public class StripeTable implements Stripe {
return line.substring(idx2 + 1);
}
private static final String hiddenBar = "\uE000";
private void analyzeAndAddInternal(String line, Mode mode) {
line = line.replace("\\|", hiddenBar);
HtmlColor lineBackColor = getBackOrFrontColor(line, 0);
if (lineBackColor != null) {
line = withouBackColor(line);
}
table.newLine(lineBackColor);
for (final StringTokenizer st = new StringTokenizer(line, "|"); st.hasMoreTokens();) {
String v = st.nextToken();
String v = st.nextToken().replace(hiddenBar.charAt(0), '|');
HtmlColor cellBackColor = getBackOrFrontColor(v, 0);
if (cellBackColor != null) {
v = withouBackColor(v);

View File

@ -107,7 +107,7 @@ public class CommandCreateElementMultilines extends CommandMultilines2<AbstractE
throw new IllegalArgumentException();
}
public CommandExecutionResult executeNow(AbstractEntityDiagram diagram, BlocLines lines) {
protected CommandExecutionResult executeNow(AbstractEntityDiagram diagram, BlocLines lines) {
lines = lines.trim(false);
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
final String symbol = StringUtils.goUpperCase(line0.get("TYPE", 0));

View File

@ -67,19 +67,19 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
import net.sourceforge.plantuml.version.PSystemVersion;
public class PSystemDonors extends AbstractPSystem {
public static final String DONORS = "6rO702mEpFCVHV0StDQFZQ4KYXIQJO-ICGuxFM7I4cYu9-jpVDvE66nDSPvH5Fk0vi0crmphPDt6pjY2"
+ "uBcYk88Aa1TYgjX-ouJsTXreG_9MC8x0dygP_yi5DYP8xwonAVBmEA0r5cwBnhJ_ZygwwBzeW4wmQLIs"
+ "B2eDyYodLy4aXy6fi-EKKF9GZEahKfJronQWb8u5cMrdTOGVP9jzenQfIMis3PbP0ehBI95eFZPQsNTo"
+ "-rx62I1QVZzWAy4E9PAR732Ml16Z8zC3WjGeRiO6QjvvmeC93LHemnSbgQaj93BAm417xXueeFHdd83O"
+ "9sMKv6p3su3yBR95HOEWZkytflF7XsKfUtvfE4OUa7FG2g02o7-W6_wqDdE9SHcR0ZFaNHZ7ib78QwgN"
+ "KTuyqDTQ5mRWPV9aHk-N7stV5j8vvJh7hyu6UTMGbKTx66kySWdk-SzS2ksB1LG_WBRjEn3Z_SFvpK9t"
+ "28yfTI6LS_pE_IO2eXjBOQ4tSSbgzfztwHP3HVDepc8ySh-EjnA17LnNucxeSYr_YZedb6mQwjTBNXqw"
+ "hYBN-DNcVObUaqr3_7-jbZA3T0UjxiA6ws8493WMLkNYeel0OT2_8RSakP7Q3fD7_R1yYP_t9yczroA1"
+ "A6mws3_LP-0cDxim6xfqOXCF0AysYNQZe_0WCmYh0nq7bMTas5t_kqdFiAanQTxfre5XDuRwHxgxSZDz"
+ "CvTq2qE_B9hjkzep70NSYXFAuNUr_hOAPN89xwP5Q7oImVejp1c1z1bHzZrjoNHJ1ymiZmMlwkBltUta"
+ "pqFd_xwzMzHmTFvxjtzqVPl9p-RKKeyeQzTWsDlWiZPhuqLr0MrBvNcWEpCk0gvN9XigkOMEp72MGyoJ"
+ "95JsWuDZwC5DdQ1jFR8pDIrXRZrMoS2Mv8VKdJGgjGDFsETsU-SPeqM1_SbvErOzrBSXnTy558aXmLCg"
+ "m7s45FMmEPrCDywsjBkJxtfhymN3DQfnuKw3meybchJSOF4fm8oT_80qdff8j97NSIPA0B_Zz1lq3DdF" + "hgxRk8wMLW00";
public static final String DONORS = "6tC70AmEU9ELAuNYZT_MZn6AGOgeeHNOWjgQuZoZA1P0SxnDhXdMoRgDdR45mND5SGKL8Az2C-THCiPX"
+ "qGYJjjcQVk6-VTu2CLLilsL2UtyTQ4BoLZ2km4tbpF_b0XiJv0R8GZti1NIpXNlZcZIctJyBxB_e5sW1"
+ "JwFBbaMbGPxbz2gOv30uCySffUIX6EKhKjYwiGMmql4WLnkhGtmZTVQTMa2JrcmQChC65Cj8aMW-Dbex"
+ "3h1z10CdEhIhmmPaXn87UODnG7qZHacvWWQPKToC3TMyymI32JTKs8alIb9pj93CA4C7EhGjK83rPu80"
+ "s2VbbEHiwMr0mHRPegP1KkTUTwQB_SEoL22_D9m07JG7hQ1M0FaFTCEViyrSubp7hgWPygwCSzauvBNH"
+ "gzZVFD3NMLS6oilcnSnyBJ-gMmlfd79TurTNW_pGa9MzFOmrNbb2UFutbqBxOW4S7q37MaF5-FlX_6OX"
+ "7S9ZIbt8mJbvPxk905bbAIpuBYvPBV3pBc6nkbWUpLayH-VNkLOoe8Ch4fkXZsi5iwjpHadLKF-yv5NN"
+ "yIboJT1itfVeHx9fIFp_BMLMqnsqteGFroM8KgElhAh5HHS1qw1_Gsu1kGFLq-JHTLg-9Bxt1-JUUv50"
+ "53OJx9-wPjIdtBo4UM9Bfwfu01Zj4kr6X_4WCuYg0rq7bMTas5s_tQHdsDGOEJTwHRrfDmQkZtIwSZDz"
+ "DnVu3CEWB9e3XzfR70NSXnFCeTNYRHN3vXhUROlKU2U3_JNC6O7q6L6E8st9zAcEChCybhofIxoRsyMV"
+ "Xox-wTsY5ZhlRly8VR_9hwIMUiHuT0s6lKMNzLkRB3eMu5iZ8u7BW9tMxSRaG2MtqAaDPqLFSGBMlQrp"
+ "S5oBuA9ftQnaPsedrypQGGThaXzqD61KP2UIWw_jpiWp7ekgzYVddLZrKD-757yNK2o614-fKBOHKdI5"
+ "pUbamhZTC-uEtiUjpHUgs_ZcmXC61HzBj6cvmUjJAlSKya5J1v0wQrNoqiV42E1tVFq6FS-j3ZJAQ6cL" + "SNPmGsH9";
@Override
final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed)

View File

@ -49,6 +49,9 @@ public abstract class UGraphicDelegator implements UGraphic {
return ug.matchesProperty(propertyName);
}
public double dpiFactor() {
return ug.dpiFactor();
}
public UGraphicDelegator(UGraphic ug) {
this.ug = ug;

View File

@ -82,10 +82,14 @@ public class AsciiMath implements ScientificEquation {
final ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.eval(JAVASCRIPT_CODE);
final Invocable inv = (Invocable) engine;
this.tex = (String) inv.invokeFunction("plantuml", form);
this.tex = patchColor((String) inv.invokeFunction("plantuml", form));
this.builder = new LatexBuilder(tex);
}
private String patchColor(String latex) {
return latex.replace("\\color{", "\\textcolor{");
}
public Dimension2D getDimension() {
return builder.getDimension();
}

View File

@ -41,12 +41,19 @@ import java.io.OutputStream;
import net.sourceforge.plantuml.AbstractPSystem;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.core.DiagramDescription;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.graphic.HtmlColorSetSimple;
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
public class PSystemMath extends AbstractPSystem {
private String math = "";
private float scale = 1;
private Color color = Color.BLACK;
private Color backColor = Color.WHITE;
public PSystemMath() {
}
@ -59,11 +66,53 @@ public class PSystemMath extends AbstractPSystem {
final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed)
throws IOException {
final ScientificEquationSafe asciiMath = ScientificEquationSafe.fromAsciiMath(math);
return asciiMath.export(os, fileFormat, 1, Color.BLACK, Color.WHITE);
return asciiMath.export(os, fileFormat, scale, color, backColor);
}
public void doCommandLine(String line) {
this.math = line;
final String lineLower = StringUtils.trin(StringUtils.goLowerCase(line));
final String colorParam = "color ";
final String backParam = "backgroundcolor ";
if (lineLower.startsWith(colorParam)) {
final Color col3 = getColor(line.substring(colorParam.length()));
if (col3 != null) {
color = col3;
}
} else if (lineLower.startsWith(backParam)) {
final Color col3 = getColor(line.substring(backParam.length()));
if (col3 != null) {
backColor = col3;
}
} else if (lineLower.startsWith("scale ")) {
final String value = line.substring("scale ".length());
try {
final float scale1 = Float.parseFloat(value);
if (scale1 > 0) {
scale = scale1;
}
} catch (Exception e) {
e.printStackTrace();
}
} else if (lineLower.startsWith("dpi ")) {
final String value = line.substring("dpi ".length());
try {
final float dpi1 = Float.parseFloat(value);
if (dpi1 > 0) {
scale = dpi1 / 96;
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
this.math = line;
}
}
private Color getColor(final String col) {
final HtmlColor col2 = new HtmlColorSetSimple().getColorIfValid(col);
final Color col3 = new ColorMapperIdentity().getMappedColor(col2);
return col3;
}
}

View File

@ -79,7 +79,7 @@ public class CommandCreateEntityObjectMultilines extends CommandMultilines2<Abst
return "(?i)^[%s]*\\}[%s]*$";
}
public CommandExecutionResult executeNow(AbstractClassOrObjectDiagram diagram, BlocLines lines) {
protected CommandExecutionResult executeNow(AbstractClassOrObjectDiagram diagram, BlocLines lines) {
lines = lines.trim(true);
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
final IEntity entity = executeArg0(diagram, line0);

View File

@ -34,6 +34,7 @@
*
*/
package net.sourceforge.plantuml.pdf;
import java.io.File;
import java.lang.reflect.Method;
@ -50,6 +51,9 @@ public class PdfConverter {
}
try {
// https://stackoverflow.com/questions/12579468/how-to-set-log4j-property-file
System.setProperty("log4j.debug", "false");
final Class<?> clSVGConverter = Class.forName("org.apache.batik.apps.rasterizer.SVGConverter");
final Object converter = clSVGConverter.newInstance();

View File

@ -266,7 +266,7 @@ public class PreprocessorInclude implements ReadLine {
}
private InputStream getStdlibInputStream(String filename) {
return StdlibOld.getResourceAsStream(filename);
return Stdlib.getResourceAsStream(filename);
}
private InputStream getStdlibInputStreamOld(String filename) {
@ -285,16 +285,17 @@ public class PreprocessorInclude implements ReadLine {
if (is == null) {
return null;
}
final String description = "<" + filename + ">";
try {
if (StartDiagramExtractReader.containsStartDiagram(s, is)) {
if (StartDiagramExtractReader.containsStartDiagram(s, is, description)) {
is = getStdlibInputStream(filename);
return new StartDiagramExtractReader(s, is);
return new StartDiagramExtractReader(s, is, description);
}
is = getStdlibInputStream(filename);
if (is == null) {
return null;
}
return new ReadLineReader(new InputStreamReader(is), filename);
return ReadLineReader.create(new InputStreamReader(is), filename);
} catch (IOException e) {
return new ReadLineSimple(s, e.toString());
}
@ -318,10 +319,10 @@ public class PreprocessorInclude implements ReadLine {
}
if (charset == null) {
Log.info("Using default charset");
return new ReadLineReader(new FileReader(f), f.getAbsolutePath(), s.getLocation());
return ReadLineReader.create(new FileReader(f), f.getAbsolutePath(), s.getLocation());
}
Log.info("Using charset " + charset);
return new ReadLineReader(new InputStreamReader(new FileInputStream(f), charset), f.getAbsolutePath(),
return ReadLineReader.create(new InputStreamReader(new FileInputStream(f), charset), f.getAbsolutePath(),
s.getLocation());
} catch (IOException e) {
return new ReadLineSimple(s, e.toString());
@ -337,10 +338,10 @@ public class PreprocessorInclude implements ReadLine {
final InputStream is = url.openStream();
if (charset == null) {
Log.info("Using default charset");
return new ReadLineReader(new InputStreamReader(is), url.toString(), s.getLocation());
return ReadLineReader.create(new InputStreamReader(is), url.toString(), s.getLocation());
}
Log.info("Using charset " + charset);
return new ReadLineReader(new InputStreamReader(is, charset), url.toString(), s.getLocation());
return ReadLineReader.create(new InputStreamReader(is, charset), url.toString(), s.getLocation());
} catch (IOException e) {
return new ReadLineSimple(s, e.toString());
}

View File

@ -50,15 +50,26 @@ public class ReadLineReader implements ReadLine {
private final BufferedReader br;
private LineLocationImpl location;
public ReadLineReader(Reader reader, String desc, LineLocation parent) {
private ReadLineReader(Reader reader, String description, LineLocation parent) {
if (description == null) {
description = "?";
}
br = new BufferedReader(reader);
location = new LineLocationImpl(desc, parent);
location = new LineLocationImpl(description, parent);
}
public ReadLineReader(Reader reader, String desc) {
private ReadLineReader(Reader reader, String desc) {
this(reader, desc, null);
}
public static ReadLine create(Reader reader, String description) {
return new ReadLineReader(reader, description, null);
}
public static ReadLine create(Reader reader, String description, LineLocation parent) {
return new ReadLineReader(reader, description, parent);
}
public CharSequence2 readLine() throws IOException {
String s = br.readLine();
location = location.oneLineRead();

View File

@ -60,8 +60,8 @@ public class StartDiagramExtractReader implements ReadLine {
this(getReadLine(s, url, charset), uid);
}
public StartDiagramExtractReader(CharSequence2 s, InputStream is) {
this(getReadLine(s, is), null);
public StartDiagramExtractReader(CharSequence2 s, InputStream is, String desc) {
this(getReadLine(s, is, desc), null);
}
private StartDiagramExtractReader(ReadLine raw, String suf) {
@ -107,29 +107,29 @@ public class StartDiagramExtractReader implements ReadLine {
try {
if (charset == null) {
Log.info("Using default charset");
return new UncommentReadLine(new ReadLineReader(new FileReader(f), f.getAbsolutePath()));
return new UncommentReadLine(ReadLineReader.create(new FileReader(f), f.getAbsolutePath()));
}
Log.info("Using charset " + charset);
return new UncommentReadLine(new ReadLineReader(new InputStreamReader(new FileInputStream(f), charset),
return new UncommentReadLine(ReadLineReader.create(new InputStreamReader(new FileInputStream(f), charset),
f.getAbsolutePath()));
} catch (IOException e) {
return new ReadLineSimple(s, e.toString());
}
}
private static ReadLine getReadLine(CharSequence2 s, InputStream is) {
return new UncommentReadLine(new ReadLineReader(new InputStreamReader(is), null));
private static ReadLine getReadLine(CharSequence2 s, InputStream is, String description) {
return new UncommentReadLine(ReadLineReader.create(new InputStreamReader(is), description));
}
private static ReadLine getReadLine(CharSequence2 s, URL url, String charset) {
try {
if (charset == null) {
Log.info("Using default charset");
return new UncommentReadLine(
new ReadLineReader(new InputStreamReader(url.openStream()), url.toString()));
return new UncommentReadLine(ReadLineReader.create(new InputStreamReader(url.openStream()),
url.toString()));
}
Log.info("Using charset " + charset);
return new UncommentReadLine(new ReadLineReader(new InputStreamReader(url.openStream(), charset),
return new UncommentReadLine(ReadLineReader.create(new InputStreamReader(url.openStream(), charset),
url.toString()));
} catch (IOException e) {
return new ReadLineSimple(s, e.toString());
@ -146,8 +146,8 @@ public class StartDiagramExtractReader implements ReadLine {
return containsStartDiagram(r);
}
static public boolean containsStartDiagram(CharSequence2 s, InputStream is) throws IOException {
final ReadLine r = getReadLine(s, is);
static public boolean containsStartDiagram(CharSequence2 s, InputStream is, String description) throws IOException {
final ReadLine r = getReadLine(s, is, description);
return containsStartDiagram(r);
}

View File

@ -0,0 +1,307 @@
package net.sourceforge.plantuml.preproc;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sourceforge.plantuml.Log;
import net.sourceforge.plantuml.brotli.BrotliInputStream;
public class Stdlib {
private static final Map<String, Stdlib> all = new ConcurrentHashMap<String, Stdlib>();
private static final String SEPARATOR = "\uF8FF";
private static final Pattern sizePattern = Pattern.compile("\\[(\\d+)x(\\d+)/16\\]");
private final Map<String, SoftReference<String>> cache = new ConcurrentHashMap<String, SoftReference<String>>();
private final String name;
private final Map<String, String> info = new HashMap<String, String>();
public static InputStream getResourceAsStream(String fullname) {
fullname = fullname.toLowerCase().replace(".puml", "");
final int last = fullname.indexOf('/');
if (last == -1) {
return null;
}
try {
final Stdlib folder = retrieve(fullname.substring(0, last));
if (folder == null || folder.info.size() == 0) {
return null;
}
final String data = folder.loadRessource(fullname.substring(last + 1));
if (data == null) {
return null;
}
return new ByteArrayInputStream(data.getBytes("UTF-8"));
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private static Stdlib retrieve(final String name) throws IOException {
Stdlib result = all.get(name);
if (result == null) {
final DataInputStream dataStream = getDataStream(name);
if (dataStream == null) {
return null;
}
final String info = dataStream.readUTF();
dataStream.close();
result = new Stdlib(name, info);
all.put(name, result);
}
return result;
}
private String loadRessource(String file) throws IOException {
final SoftReference<String> cached = cache.get(file.toLowerCase());
if (cached != null) {
final String cachedResult = cached.get();
if (cachedResult != null) {
return cachedResult;
}
}
final DataInputStream dataStream = getDataStream();
if (dataStream == null) {
return null;
}
dataStream.readUTF();
final InputStream spriteStream = getSpriteStream();
if (spriteStream == null) {
dataStream.close();
return null;
}
try {
StringBuilder found = null;
while (true) {
final String filename = dataStream.readUTF();
if (filename.equals(SEPARATOR)) {
return null;
}
if (filename.equalsIgnoreCase(file)) {
found = new StringBuilder();
}
while (true) {
final String s = dataStream.readUTF();
if (s.equals(SEPARATOR)) {
if (found != null) {
final String result = found.toString();
cache.put(file.toLowerCase(), new SoftReference<String>(result));
return result;
}
break;
}
if (found != null) {
found.append(s);
found.append("\n");
}
if (isSpriteLine(s)) {
final Matcher m = sizePattern.matcher(s);
final boolean ok = m.find();
if (ok == false) {
throw new IOException(s);
}
final int width = Integer.parseInt(m.group(1));
final int height = Integer.parseInt(m.group(2));
final String sprite = readSprite(width, height, spriteStream);
if (found != null) {
found.append(sprite);
found.append("}\n");
}
}
}
}
} finally {
dataStream.close();
spriteStream.close();
}
}
private Stdlib(String name, String info) throws IOException {
this.name = name;
fillMap(info);
}
private String readSprite(int width, int height, InputStream inputStream) throws IOException {
final StringBuilder result = new StringBuilder();
final int nbLines = (height + 1) / 2;
int line = 0;
for (int j = 0; j < nbLines; j++) {
final StringBuilder sb1 = new StringBuilder();
final StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < width; i++) {
final int b = inputStream.read();
final int b1 = (b & 0xF0) >> 4;
final int b2 = (b & 0x0F);
sb1.append(toHexString(b1));
sb2.append(toHexString(b2));
}
result.append(sb1.toString());
result.append("\n");
line++;
if (line < height) {
result.append(sb2.toString());
result.append("\n");
line++;
}
}
return result.toString();
}
private String toHexString(final int b) {
return Integer.toHexString(b).toUpperCase();
}
private boolean isSpriteLine(String s) {
return s.trim().startsWith("sprite") && s.trim().endsWith("{");
}
private void fillMap(String infoString) {
for (String s : infoString.split("\n")) {
if (s.contains("=")) {
final String data[] = s.split("=");
this.info.put(data[0], data[1]);
}
}
}
private static DataInputStream getDataStream(String name) throws IOException {
final InputStream raw = getInternalInputStream(name, "-abx.repx");
if (raw == null) {
return null;
}
return new DataInputStream(new BrotliInputStream(raw));
}
private DataInputStream getDataStream() throws IOException {
return getDataStream(name);
}
private InputStream getSpriteStream() throws IOException {
final InputStream raw = getInternalInputStream(name, "-dex.repx");
if (raw == null) {
return null;
}
return new BrotliInputStream(raw);
}
private static InputStream getInternalInputStream(String fullname, String extension) {
final String res = "/stdlib/" + fullname + extension;
return Stdlib.class.getResourceAsStream(res);
}
public static void extractStdLib() throws IOException {
for (String name : getAll()) {
final Stdlib folder = Stdlib.retrieve(name);
folder.extractMeFull(new File("stdlib", name));
}
}
private static Collection<String> getAll() throws IOException {
final Set<String> result = new TreeSet<String>();
final InputStream home = getInternalInputStream("home", ".repx");
final BufferedReader br = new BufferedReader(new InputStreamReader(home));
String name;
while ((name = br.readLine()) != null) {
result.add(name);
}
return Collections.unmodifiableCollection(result);
}
private void extractMeFull(File dir) throws IOException {
final DataInputStream dataStream = getDataStream();
if (dataStream == null) {
return;
}
dataStream.readUTF();
final InputStream spriteStream = getSpriteStream();
try {
while (true) {
final String filename = dataStream.readUTF();
if (filename.equals(SEPARATOR)) {
return;
}
final File f = new File("stdlib/" + name + "/" + filename + ".puml");
f.getParentFile().mkdirs();
final PrintWriter fos = new PrintWriter(f);
while (true) {
final String s = dataStream.readUTF();
if (s.equals(SEPARATOR)) {
break;
}
fos.println(s);
if (isSpriteLine(s)) {
final Matcher m = sizePattern.matcher(s);
final boolean ok = m.find();
if (ok == false) {
throw new IOException(s);
}
final int width = Integer.parseInt(m.group(1));
final int height = Integer.parseInt(m.group(2));
final String sprite = readSprite(width, height, spriteStream);
fos.println(sprite);
fos.println("}");
}
}
fos.close();
}
} finally {
dataStream.close();
spriteStream.close();
}
}
public static void addInfoVersion(List<String> strings, boolean details) {
try {
for (String name : getAll()) {
final Stdlib folder = Stdlib.retrieve(name);
if (details) {
strings.add("<b>" + name);
strings.add("Version " + folder.getVersion());
strings.add("Delivered by " + folder.getSource());
strings.add(" ");
} else {
strings.add("* " + name + " (Version " + folder.getVersion() + ")");
}
}
} catch (IOException e) {
Log.error("Error " + e);
return;
}
}
private String getVersion() {
return info.get("VERSION");
}
private String getSource() {
return info.get("SOURCE");
}
public static void printStdLib() {
final List<String> print = new ArrayList<String>();
addInfoVersion(print, true);
for (String s : print) {
System.out.println(s.replace("<b>", ""));
}
}
}

View File

@ -1,265 +0,0 @@
package net.sourceforge.plantuml.preproc;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sourceforge.plantuml.Log;
import net.sourceforge.plantuml.brotli.BrotliInputStream;
public class Stdlib6 {
static private final Map<String, Stdlib6> all = new ConcurrentHashMap<String, Stdlib6>();
private static final String SEPARATOR = "\uF8FF";
private final Map<String, List<String>> raw = new HashMap<String, List<String>>();
// private final Map<String, SoftReference<byte[]>> cache = new ConcurrentHashMap<String, SoftReference<byte[]>>();
private final String name;
private final Map<String, String> info = new HashMap<String, String>();
public static InputStream getResourceAsStream(String fullname) {
fullname = fullname.toLowerCase().replace(".puml", "");
final int last = fullname.indexOf('/');
if (last == -1) {
return null;
}
try {
final Stdlib6 folder = retrieve(fullname.substring(0, last));
if (folder == null || folder.raw.size() == 0) {
return null;
}
final byte[] data = folder.getData(fullname.substring(last + 1));
if (data == null) {
return null;
}
return new ByteArrayInputStream(data);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private static InputStream getInternalInputStream(String fullname, String extension) {
final String res = "/stdlib/" + fullname + extension;
return Stdlib6.class.getResourceAsStream(res);
}
private static Stdlib6 retrieve(final String name) throws IOException {
Stdlib6 result = all.get(name);
if (result == null) {
result = new Stdlib6(name);
all.put(name, result);
}
return result;
}
private final Pattern sizePattern = Pattern.compile("\\[(\\d+)x(\\d+)/16\\]");
private Stdlib6(String name) throws IOException {
this.name = name;
Log.info("Opening archive " + name);
final DataInputStream dataStream = getDataStream();
if (dataStream == null) {
return;
}
fillMap(dataStream.readUTF());
// final InputStream spriteStream = getSpriteStream();
int pos = 0;
while (true) {
final String filename = dataStream.readUTF();
// System.err.println("filename=" + filename);
if (filename.equals(SEPARATOR)) {
break;
}
final List<String> text = new ArrayList<String>();
while (true) {
final String s = dataStream.readUTF();
if (s.equals(SEPARATOR)) {
break;
}
text.add(s);
if (isSpriteLine(s)) {
final Matcher m = sizePattern.matcher(s);
final boolean ok = m.find();
if (ok == false) {
throw new IOException(s);
}
final int width = Integer.parseInt(m.group(1));
final int height = Integer.parseInt(m.group(2));
text.add("" + pos);
pos += spriteSize(width, height);
// System.err.println("Sprite! " + width + " " + height + " " + s);
text.add("}");
}
}
raw.put(filename.toLowerCase(), text);
// System.err.println("data=" + text.size());
// final int len = is.readInt();
// this.data.put(filename.toLowerCase(), new Portion(pos, len));
// pos += len;
}
dataStream.close();
}
private int spriteSize(int width, int height) {
final int nbLines = (height + 1) / 2;
return width * nbLines;
}
private String readSprite(int width, int height, InputStream inputStream) throws IOException {
final StringBuilder result = new StringBuilder();
final int nbLines = (height + 1) / 2;
int line = 0;
for (int j = 0; j < nbLines; j++) {
final StringBuilder sb1 = new StringBuilder();
final StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < width; i++) {
final int b = inputStream.read();
final int b1 = (b & 0xF0) >> 4;
final int b2 = (b & 0x0F);
sb1.append(toHexString(b1));
sb2.append(toHexString(b2));
}
result.append(sb1.toString());
result.append("\n");
line++;
if (line < height) {
result.append(sb2.toString());
result.append("\n");
line++;
}
}
return result.toString();
}
private String toHexString(final int b) {
return Integer.toHexString(b).toUpperCase();
}
private boolean isSpriteLine(String s) {
return s.trim().startsWith("sprite") && s.trim().endsWith("{");
}
private void fillMap(String infoString) {
for (String s : infoString.split("\n")) {
if (s.contains("=")) {
final String data[] = s.split("=");
this.info.put(data[0], data[1]);
}
}
}
private DataInputStream getDataStream() throws IOException {
final InputStream raw = getInternalInputStream(name, "-dat2.repx");
if (raw == null) {
return null;
}
return new DataInputStream(new BrotliInputStream(raw));
}
private InputStream getSpriteStream() throws IOException {
final InputStream raw = getInternalInputStream(name, "-spr.repx");
if (raw == null) {
return null;
}
return new BrotliInputStream(raw);
}
private byte[] getData(String filename) throws IOException {
final List<String> result = raw.get(filename);
if (result == null) {
return null;
}
final StringBuilder sb = new StringBuilder();
for (Iterator<String> it = result.iterator(); it.hasNext();) {
final String s = it.next();
sb.append(s);
sb.append("\n");
if (isSpriteLine(s)) {
final Matcher m = sizePattern.matcher(s);
final boolean ok = m.find();
if (ok == false) {
throw new IOException(s);
}
final int width = Integer.parseInt(m.group(1));
final int height = Integer.parseInt(m.group(2));
final InputStream spriteStream = getSpriteStream();
final int pos = Integer.parseInt(it.next());
// System.err.println("pos=" + pos);
spriteStream.skip(pos);
sb.append(readSprite(width, height, spriteStream));
sb.append("\n");
spriteStream.close();
}
}
return sb.toString().getBytes("UTF-8");
}
public static void extractStdLib() throws IOException {
// for (String name : getAll()) {
// final Stdlib6 folder = new Stdlib6(name);
// folder.extractMeFull(new File("stdlib", name));
// }
}
private static List<String> getAll() throws IOException {
final List<String> result = new ArrayList<String>();
final InputStream home = getInternalInputStream("home", ".repx");
final BufferedReader br = new BufferedReader(new InputStreamReader(home));
String name;
while ((name = br.readLine()) != null) {
result.add(name);
}
return Collections.unmodifiableList(result);
}
// private void extractMeFull(File dir) throws IOException {
// final DataInputStream idx = getDataIndex();
// final DataInputStream txt = getFullTexts();
// final String infoString = idx.readUTF();
// while (true) {
// final String filename = idx.readUTF();
// if (filename.length() == 0) {
// idx.close();
// txt.close();
// return;
// }
// final int len = idx.readInt();
// final File f = new File("stdlib/" + name + "/" + filename + ".puml");
// f.getParentFile().mkdirs();
// final FileOutputStream fos = new FileOutputStream(f);
// final byte data[] = new byte[len];
// txt.readFully(data);
// fos.write(data);
// fos.close();
// }
// }
public static void addInfoVersion(List<String> strings) {
try {
for (String name : getAll()) {
final Stdlib6 folder = new Stdlib6(name);
strings.add("* " + name + " (Version " + folder.getVersion() + ")");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String getVersion() {
return info.get("VERSION");
}
}

View File

@ -1,202 +0,0 @@
package net.sourceforge.plantuml.preproc;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import net.sourceforge.plantuml.Log;
import net.sourceforge.plantuml.brotli.BrotliInputStream;
public class StdlibOld {
static private final Map<String, StdlibOld> all = new ConcurrentHashMap<String, StdlibOld>();
static class Portion {
int position;
int length;
Portion(int position, int length) {
this.position = position;
this.length = length;
}
public byte[] of(DataInputStream is) throws IOException {
is.skipBytes(position);
final byte result[] = new byte[length];
is.readFully(result);
is.close();
return result;
}
}
private final Map<String, Portion> data = new HashMap<String, Portion>();
private final Map<String, SoftReference<byte[]>> cache = new ConcurrentHashMap<String, SoftReference<byte[]>>();
private final String name;
private final Map<String, String> info = new HashMap<String, String>();
public static InputStream getResourceAsStream(String fullname) {
fullname = fullname.toLowerCase().replace(".puml", "");
final int last = fullname.indexOf('/');
if (last == -1) {
return null;
}
try {
final StdlibOld folder = retrieve(fullname.substring(0, last));
if (folder == null) {
return null;
}
final byte[] data = folder.getData(fullname.substring(last + 1));
if (data == null) {
return null;
}
return new ByteArrayInputStream(data);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private static InputStream getInternalInputStream(String fullname, String extension) {
final String res = "/stdlib/" + fullname + extension;
return StdlibOld.class.getResourceAsStream(res);
}
private static StdlibOld retrieve(final String name) throws IOException {
StdlibOld result = all.get(name);
if (result == null) {
result = new StdlibOld(name);
all.put(name, result);
}
return result;
}
private StdlibOld(String name) throws IOException {
this.name = name;
Log.info("Opening archive " + name);
int pos = 0;
final DataInputStream is = getDataIndex();
fillMap(is.readUTF());
while (true) {
final String filename = is.readUTF();
if (filename.length() == 0) {
break;
}
final int len = is.readInt();
this.data.put(filename.toLowerCase(), new Portion(pos, len));
pos += len;
}
is.close();
}
private void fillMap(String infoString) {
for (String s : infoString.split("\n")) {
if (s.contains("=")) {
final String data[] = s.split("=");
this.info.put(data[0], data[1]);
}
}
}
private DataInputStream getDataIndex() {
final InputStream raw = getInternalInputStream(name, "-idx.repx");
if (raw == null) {
return null;
}
return new DataInputStream(raw);
}
private DataInputStream getFullTexts() throws IOException {
final InputStream raw = getInternalInputStream(name, "-dat.repx");
if (raw == null) {
return null;
}
return new DataInputStream(new BrotliInputStream(raw));
}
private byte[] getData(String filename) throws IOException {
final SoftReference<byte[]> ref = cache.get(filename);
byte[] result = ref == null ? null : ref.get();
final String full = name + "/" + filename + ".puml";
if (result == null) {
result = getDataSlow(filename);
cache.put(filename, new SoftReference<byte[]>(result));
Log.info("Reading " + full);
} else {
Log.info("Retrieving " + full);
}
return result;
}
private byte[] getDataSlow(String filename) throws IOException {
final Portion portion = data.get(filename);
return portion.of(getFullTexts());
}
public static void extractStdLib() throws IOException {
for (String name : getAll()) {
final StdlibOld folder = new StdlibOld(name);
folder.extractMeFull(new File("stdlib", name));
}
}
private static List<String> getAll() throws IOException {
final List<String> result = new ArrayList<String>();
final InputStream home = getInternalInputStream("home", ".repx");
final BufferedReader br = new BufferedReader(new InputStreamReader(home));
String name;
while ((name = br.readLine()) != null) {
result.add(name);
}
return Collections.unmodifiableList(result);
}
private void extractMeFull(File dir) throws IOException {
final DataInputStream idx = getDataIndex();
final DataInputStream txt = getFullTexts();
final String infoString = idx.readUTF();
while (true) {
final String filename = idx.readUTF();
if (filename.length() == 0) {
idx.close();
txt.close();
return;
}
final int len = idx.readInt();
final File f = new File("stdlib/" + name + "/" + filename + ".puml");
f.getParentFile().mkdirs();
final FileOutputStream fos = new FileOutputStream(f);
final byte data[] = new byte[len];
txt.readFully(data);
fos.write(data);
fos.close();
}
}
public static void addInfoVersion(List<String> strings) {
try {
for (String name : getAll()) {
final StdlibOld folder = new StdlibOld(name);
strings.add("* " + name + " (Version " + folder.getVersion() + ")");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String getVersion() {
return info.get("VERSION");
}
}

View File

@ -145,10 +145,10 @@ public class SubPreprocessor implements ReadLine {
try {
if (charset == null) {
Log.info("Using default charset");
return new ReadLineReader(new FileReader(f), f.getAbsolutePath(), s.getLocation());
return ReadLineReader.create(new FileReader(f), f.getAbsolutePath(), s.getLocation());
}
Log.info("Using charset " + charset);
return new ReadLineReader(new InputStreamReader(new FileInputStream(f), charset), f.getAbsolutePath(),
return ReadLineReader.create(new InputStreamReader(new FileInputStream(f), charset), f.getAbsolutePath(),
s.getLocation());
} catch (IOException e) {
return new ReadLineSimple(s, e.toString());

View File

@ -61,11 +61,17 @@ public class Englober {
final private TileArguments tileArguments;
final private Real core1;
final private Real core2;
final private boolean isTeoz;
private double marginX = 0;
@Deprecated
public Englober(ParticipantEnglober participantEnglober, Participant first, ISkinParam skinParam, Skin skin,
public static Englober createPuma(ParticipantEnglober englober, Participant first, ISkinParam skinParam, Skin skin,
StringBounder stringBounder) {
this(participantEnglober, first, convertFunctionToBeRemoved(skinParam, skin, stringBounder));
return new Englober(englober, first, convertFunctionToBeRemoved(skinParam, skin, stringBounder), false);
}
public static Englober createTeoz(ParticipantEnglober participantEnglober, Participant first,
TileArguments tileArguments) {
return new Englober(participantEnglober, first, tileArguments, true);
}
private static TileArguments convertFunctionToBeRemoved(ISkinParam skinParam, Skin skin, StringBounder stringBounder) {
@ -73,10 +79,12 @@ public class Englober {
return result;
}
public Englober(ParticipantEnglober participantEnglober, Participant first, TileArguments tileArguments) {
private Englober(ParticipantEnglober participantEnglober, Participant first, TileArguments tileArguments,
boolean isTeoz) {
if (tileArguments == null) {
throw new IllegalArgumentException();
}
this.isTeoz = isTeoz;
this.participantEnglober = participantEnglober;
this.participants.add(first);
this.tileArguments = tileArguments;
@ -163,6 +171,13 @@ public class Englober {
}
private double getPreferredWidth() {
if (isTeoz) {
return 10;
}
return getTitleWidth();
}
private double getTitleWidth() {
return getComponent().getPreferredWidth(tileArguments.getStringBounder());
}
@ -181,14 +196,22 @@ public class Englober {
}
private Real getX2() {
return RealUtils.max(getPosD(), core2);
return RealUtils.max(getPosD(), core2).addFixed(marginX);
}
private Real getX1() {
return RealUtils.min(getPosB(), core1);
return RealUtils.min(getPosB(), core1).addFixed(-marginX);
}
public void addInternalConstraints() {
assert isTeoz;
final double titleWidth = getTitleWidth();
final double x1 = getX1().getCurrentValue();
final double x2 = getX2().getCurrentValue();
final double actualWidth = x2 - x1;
if (titleWidth > actualWidth + 20) {
this.marginX = (titleWidth - actualWidth - 20) / 2;
}
getX1().ensureBiggerThan(getPosAA().addFixed(10));
final Real posZZ = getPosZZ();
final Real limit = getX2().addFixed(10);

View File

@ -129,7 +129,12 @@ abstract class CommandExoArrowAny extends SingleLineCommand2<SequenceDiagram> {
final Url urlLink = urlBuilder.getUrl(arg.get("URL", 0));
msg.setUrl(urlLink);
}
final boolean parallel = arg.get("PARALLEL", 0) != null;
if (parallel) {
msg.goParallel();
}
final String error = diagram.addMessage(msg);
if (error != null) {
return CommandExecutionResult.error(error);

View File

@ -50,6 +50,7 @@ public class CommandExoArrowLeft extends CommandExoArrowAny {
static RegexConcat getRegexConcat() {
return new RegexConcat(new RegexLeaf("^"), //
new RegexLeaf("PARALLEL", "(&%s*)?"), //
new RegexLeaf("SHORT", "([?\\[\\]][ox]?)?"), //
new RegexOr( //
new RegexConcat( //

View File

@ -50,6 +50,7 @@ public class CommandExoArrowRight extends CommandExoArrowAny {
static RegexConcat getRegexConcat() {
return new RegexConcat(new RegexLeaf("^"), //
new RegexLeaf("PARALLEL", "(&%s*)?"), //
new RegexLeaf("PARTICIPANT", "([\\p{L}0-9_.@]+|[%g][^%g]+[%g])"), //
new RegexLeaf("[%s]*"), //
new RegexLeaf("ARROW_SUPPCIRCLE", "([%s]+[ox])?"), //

View File

@ -167,7 +167,7 @@ public class DrawableSet {
pending.add(ent.getKey());
continue;
}
pending = new Englober(englober, ent.getKey(), getSkinParam(), skin, stringBounder);
pending = Englober.createPuma(englober, ent.getKey(), getSkinParam(), skin, stringBounder);
result.add(pending);
}
return Collections.unmodifiableList(result);

View File

@ -64,7 +64,7 @@ public class Englobers {
pending.add(p);
continue;
}
pending = new Englober(englober, p, tileArguments);
pending = Englober.createTeoz(englober, p, tileArguments);
englobers.add(pending);
}
}

View File

@ -50,6 +50,7 @@ import net.sourceforge.plantuml.sequencediagram.Grouping;
import net.sourceforge.plantuml.sequencediagram.GroupingLeaf;
import net.sourceforge.plantuml.sequencediagram.GroupingStart;
import net.sourceforge.plantuml.sequencediagram.GroupingType;
import net.sourceforge.plantuml.sequencediagram.Message;
import net.sourceforge.plantuml.skin.Area;
import net.sourceforge.plantuml.skin.Component;
import net.sourceforge.plantuml.skin.ComponentType;
@ -64,7 +65,7 @@ public class GroupingTile implements TileWithCallbackY {
private static final int EXTERNAL_MARGINX2 = 9;
private static final int MARGINX = 16;
private static final int MARGINY = 10;
private final List<Tile> tiles = new ArrayList<Tile>();
private List<Tile> tiles = new ArrayList<Tile>();
private final Real min;
private final Real max;
private final GroupingStart start;
@ -102,17 +103,21 @@ public class GroupingTile implements TileWithCallbackY {
}
for (Tile tile : TileBuilder.buildOne(it, tileArgumentsOriginal, ev, this)) {
tiles.add(tile);
bodyHeight += tile.getPreferredHeight(stringBounder);
if (ev instanceof GroupingLeaf && ((Grouping) ev).getType() == GroupingType.ELSE) {
allElses.add(tile);
continue;
}
min2.add(tile.getMinX(stringBounder).addFixed(-MARGINX));
final Real m = tile.getMaxX(stringBounder);
// max2.add(m == tileArgumentsOriginal.getOmega() ? m : m.addFixed(MARGINX));
max2.add(m.addFixed(MARGINX));
}
}
tiles = mergeParallel(tiles);
for (Tile tile : tiles) {
bodyHeight += tile.getPreferredHeight(stringBounder);
final Event ev = tile.getEvent();
if (ev instanceof GroupingLeaf && ((Grouping) ev).getType() == GroupingType.ELSE) {
allElses.add(tile);
continue;
}
min2.add(tile.getMinX(stringBounder).addFixed(-MARGINX));
final Real m = tile.getMaxX(stringBounder);
// max2.add(m == tileArgumentsOriginal.getOmega() ? m : m.addFixed(MARGINX));
max2.add(m.addFixed(MARGINX));
}
final Dimension2D dim1 = getPreferredDimensionIfEmpty(stringBounder);
final double width = dim1.getWidth();
if (min2.size() == 0) {
@ -152,9 +157,9 @@ public class GroupingTile implements TileWithCallbackY {
double h = dim1.getHeight() + MARGINY / 2;
for (Tile tile : tiles) {
ug.apply(new UTranslate(0, h)).draw(tile);
h += tile.getPreferredHeight(stringBounder);
final double preferredHeight = tile.getPreferredHeight(stringBounder);
h += preferredHeight;
}
}
private double getTotalHeight(StringBounder stringBounder) {
@ -213,23 +218,39 @@ public class GroupingTile implements TileWithCallbackY {
public static double fillPositionelTiles(StringBounder stringBounder, double y, List<Tile> tiles,
final List<YPositionedTile> positionedTiles) {
double lastY = y;
for (Tile tile : tiles) {
if (tile.getEvent().isParallel()) {
y = lastY;
}
for (Tile tile : mergeParallel(tiles)) {
positionedTiles.add(new YPositionedTile(tile, y));
if (tile instanceof GroupingTile) {
final GroupingTile groupingTile = (GroupingTile) tile;
fillPositionelTiles(stringBounder, y, groupingTile.tiles, new ArrayList<YPositionedTile>());
final double headerHeight = groupingTile.getPreferredDimensionIfEmpty(stringBounder).getHeight();
fillPositionelTiles(stringBounder, y + headerHeight, groupingTile.tiles,
new ArrayList<YPositionedTile>());
}
lastY = y;
y += tile.getPreferredHeight(stringBounder);
}
return y;
}
private static List<Tile> mergeParallel(List<Tile> tiles) {
TileParallel pending = null;
final List<Tile> result = new ArrayList<Tile>();
for (Tile tile : tiles) {
if (tile instanceof TileParallel == false && tile.getEvent().isParallel()) {
if (pending == null) {
pending = new TileParallel();
pending.add(result.get(result.size() - 1));
result.set(result.size() - 1, pending);
}
pending.add(tile);
} else {
result.add(tile);
pending = null;
}
}
return result;
}
// public double getStartY() {
// return y + MARGINY;
// }

View File

@ -55,6 +55,11 @@ public class LiveBoxFinder implements UGraphic {
public boolean matchesProperty(String propertyName) {
return false;
}
public double dpiFactor() {
return 1;
}
public UGraphic apply(UChange change) {
if (change instanceof UTranslate) {
@ -100,6 +105,8 @@ public class LiveBoxFinder implements UGraphic {
((GroupingTile) shape).drawU(this);
} else if (shape instanceof TileWithUpdateStairs) {
((TileWithUpdateStairs) shape).updateStairs(stringBounder, y);
} else if (shape instanceof EmptyTile) {
// Nothing ?
} else if (shape instanceof NotesTile) {
// Nothing ?
} else if (shape instanceof Tile) {

View File

@ -0,0 +1,137 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* 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.sequencediagram.teoz;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.real.RealUtils;
import net.sourceforge.plantuml.sequencediagram.Event;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate;
public class TileParallel implements Tile {
private final List<Tile> tiles = new ArrayList<Tile>();
public void add(Tile tile) {
this.tiles.add(tile);
}
public void drawU(UGraphic ug) {
final StringBounder stringBounder = ug.getStringBounder();
final double totalHeight = getPreferredHeight(stringBounder);
for (Tile tile : tiles) {
tile.drawU(ug.apply(new UTranslate(0, totalHeight - tile.getPreferredHeight(stringBounder))));
}
}
public double getPreferredHeight(StringBounder stringBounder) {
double height = 0;
for (Tile tile : tiles) {
height = Math.max(height, tile.getPreferredHeight(stringBounder));
}
return height;
}
public void addConstraints(StringBounder stringBounder) {
for (Tile tile : tiles) {
tile.addConstraints(stringBounder);
}
}
public Real getMinX(final StringBounder stringBounder) {
return RealUtils.min(new AbstractCollection<Real>() {
public Iterator<Real> iterator() {
return new Iterator<Real>() {
private final Iterator<Tile> source = tiles.iterator();
public boolean hasNext() {
return source.hasNext();
}
public Real next() {
return source.next().getMinX(stringBounder);
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public int size() {
return tiles.size();
}
});
}
public Real getMaxX(final StringBounder stringBounder) {
return RealUtils.max(new AbstractCollection<Real>() {
public Iterator<Real> iterator() {
return new Iterator<Real>() {
private final Iterator<Tile> source = tiles.iterator();
public boolean hasNext() {
return source.hasNext();
}
public Real next() {
return source.next().getMaxX(stringBounder);
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public int size() {
return tiles.size();
}
});
}
public Event getEvent() {
return null;
}
}

View File

@ -36,16 +36,12 @@
package net.sourceforge.plantuml.suggest;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import net.sourceforge.plantuml.AbstractPSystem;
import net.sourceforge.plantuml.CharSequence2;
import net.sourceforge.plantuml.CharSequence2Impl;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.command.BlocLines;
import net.sourceforge.plantuml.command.CommandControl;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.core.UmlSource;
import net.sourceforge.plantuml.utils.StartUtils;
@ -60,6 +56,10 @@ final public class SuggestEngine {
private final IteratorCounter2 it99;
public SuggestEngine(UmlSource source, Object foo) {
throw new UnsupportedOperationException();
}
public SuggestEngine(UmlSource source, UmlDiagramFactory systemFactory) {
this.systemFactory = systemFactory;
this.it99 = source.iterator2();
@ -74,79 +74,81 @@ final public class SuggestEngine {
}
private SuggestEngineResult executeUmlCommand(AbstractPSystem system) {
while (it99.hasNext()) {
if (StartUtils.isArobaseEndDiagram(it99.peek())) {
return SuggestEngineResult.SYNTAX_OK;
}
final SuggestEngineResult check = checkAndCorrect();
if (check.getStatus() != SuggestEngineStatus.SYNTAX_OK) {
return check;
}
final CommandControl commandControl = systemFactory.isValid2(it99);
if (commandControl == CommandControl.OK_PARTIAL) {
systemFactory.goForwardMultiline(it99);
// if (ok == false) {
// return SuggestEngineResult.CANNOT_CORRECT;
// }
} else if (commandControl == CommandControl.OK) {
it99.next();
// final Command cmd = new ProtectedCommand(systemFactory.createCommand(Arrays.asList(s)));
// final CommandExecutionResult result = cmd.execute(system, Arrays.asList(s));
// if (result.isOk() == false) {
// return SuggestEngineResult.CANNOT_CORRECT;
// }
} else {
return SuggestEngineResult.CANNOT_CORRECT;
}
}
return SuggestEngineResult.CANNOT_CORRECT;
// throw new IllegalStateException();
throw new UnsupportedOperationException();
// while (it99.hasNext()) {
// if (StartUtils.isArobaseEndDiagram(it99.peek())) {
// return SuggestEngineResult.SYNTAX_OK;
// }
// final SuggestEngineResult check = checkAndCorrect();
// if (check.getStatus() != SuggestEngineStatus.SYNTAX_OK) {
// return check;
// }
// final CommandControl commandControl = systemFactory.isValid2(it99);
// if (commandControl == CommandControl.OK_PARTIAL) {
// systemFactory.goForwardMultiline(it99);
// // if (ok == false) {
// // return SuggestEngineResult.CANNOT_CORRECT;
// // }
// } else if (commandControl == CommandControl.OK) {
// it99.next();
// // final Command cmd = new ProtectedCommand(systemFactory.createCommand(Arrays.asList(s)));
// // final CommandExecutionResult result = cmd.execute(system, Arrays.asList(s));
// // if (result.isOk() == false) {
// // return SuggestEngineResult.CANNOT_CORRECT;
// // }
// } else {
// return SuggestEngineResult.CANNOT_CORRECT;
// }
// }
// return SuggestEngineResult.CANNOT_CORRECT;
}
SuggestEngineResult checkAndCorrect() {
final String incorrectLine = it99.peek().toString();
if (incorrectLine.length() > LIMIT) {
return SuggestEngineResult.CANNOT_CORRECT;
}
final CommandControl commandControl = systemFactory.isValid2(it99);
if (commandControl != CommandControl.NOT_OK) {
return SuggestEngineResult.SYNTAX_OK;
}
if (StringUtils.trin(incorrectLine).startsWith("{")
&& systemFactory.isValid(BlocLines.single(it99.peekPrevious() + " {")) != CommandControl.NOT_OK) {
return new SuggestEngineResult(it99.peekPrevious() + " {");
}
final Collection<Iterator<String>> all = new ArrayList<Iterator<String>>();
all.add(new VariatorRemoveOneChar(incorrectLine));
all.add(new VariatorSwapLetter(incorrectLine));
// all.add(new VariatorAddOneCharBetweenWords(incorrectLine, ':'));
all.add(new VariatorAddOneCharBetweenWords(incorrectLine, '-'));
all.add(new VariatorAddOneCharBetweenWords(incorrectLine, ' '));
// all.add(new VariatorAddTwoChar(incorrectLine, '\"'));
for (Iterator<String> it2 : all) {
final SuggestEngineResult result = tryThis(it2);
if (result != null) {
return result;
}
}
return SuggestEngineResult.CANNOT_CORRECT;
throw new UnsupportedOperationException();
// final String incorrectLine = it99.peek().toString();
// if (incorrectLine.length() > LIMIT) {
// return SuggestEngineResult.CANNOT_CORRECT;
// }
// final CommandControl commandControl = systemFactory.isValid2(it99);
// if (commandControl != CommandControl.NOT_OK) {
// return SuggestEngineResult.SYNTAX_OK;
// }
//
// if (StringUtils.trin(incorrectLine).startsWith("{")
// && systemFactory.isValid(BlocLines.single(it99.peekPrevious() + " {")) != CommandControl.NOT_OK) {
// return new SuggestEngineResult(it99.peekPrevious() + " {");
// }
//
// final Collection<Iterator<String>> all = new ArrayList<Iterator<String>>();
// all.add(new VariatorRemoveOneChar(incorrectLine));
// all.add(new VariatorSwapLetter(incorrectLine));
// // all.add(new VariatorAddOneCharBetweenWords(incorrectLine, ':'));
// all.add(new VariatorAddOneCharBetweenWords(incorrectLine, '-'));
// all.add(new VariatorAddOneCharBetweenWords(incorrectLine, ' '));
// // all.add(new VariatorAddTwoChar(incorrectLine, '\"'));
//
// for (Iterator<String> it2 : all) {
// final SuggestEngineResult result = tryThis(it2);
// if (result != null) {
// return result;
// }
// }
// return SuggestEngineResult.CANNOT_CORRECT;
}
private SuggestEngineResult tryThis(Iterator<String> it2) {
while (it2.hasNext()) {
final String newS = it2.next();
if (StringUtils.trin(newS).length() == 0) {
continue;
}
final CommandControl commandControl = systemFactory.isValid2(replaceFirstLine(newS));
if (commandControl == CommandControl.OK) {
return new SuggestEngineResult(newS);
}
}
return null;
throw new UnsupportedOperationException();
// while (it2.hasNext()) {
// final String newS = it2.next();
// if (StringUtils.trin(newS).length() == 0) {
// continue;
// }
// final CommandControl commandControl = systemFactory.isValid2(replaceFirstLine(newS));
// if (commandControl == CommandControl.OK) {
// return new SuggestEngineResult(newS);
// }
// }
// return null;
}
private IteratorCounter2 replaceFirstLine(String s) {

View File

@ -394,7 +394,7 @@ public final class DotDataImageBuilder {
}
}
if (leaf.getLeafType() == LeafType.USECASE) {
return new EntityImageUseCase(leaf, skinParam);
return new EntityImageUseCase(leaf, skinParam, portionShower);
}
// if (leaf.getEntityType() == LeafType.CIRCLE_INTERFACE) {
// return new EntityImageCircleInterface(leaf, skinParam);

View File

@ -68,11 +68,11 @@ public class UGraphicForSnake extends UGraphicDelegator {
this.dy = dy;
}
public void drawInternal() {
void drawInternal() {
snake.drawInternal(ug);
}
public void removeEndDecorationIfTouches(List<PendingSnake> snakes) {
void removeEndDecorationIfTouches(List<PendingSnake> snakes) {
for (PendingSnake other : snakes) {
if (moved().touches(other.moved())) {
this.snake.removeEndDecoration();
@ -80,7 +80,7 @@ public class UGraphicForSnake extends UGraphicDelegator {
}
}
}
private Snake moved() {
return snake.move(dx, dy);
}

View File

@ -46,7 +46,9 @@ import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.creole.Stencil;
import net.sourceforge.plantuml.cucadiagram.BodyEnhanced;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.cucadiagram.EntityPortion;
import net.sourceforge.plantuml.cucadiagram.ILeaf;
import net.sourceforge.plantuml.cucadiagram.PortionShower;
import net.sourceforge.plantuml.cucadiagram.Stereotype;
import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -74,14 +76,15 @@ public class EntityImageUseCase extends AbstractEntityImage {
final private Url url;
public EntityImageUseCase(ILeaf entity, ISkinParam skinParam) {
public EntityImageUseCase(ILeaf entity, ISkinParam skinParam, PortionShower portionShower) {
super(entity, skinParam);
final Stereotype stereotype = entity.getStereotype();
final TextBlock tmp = new BodyEnhanced(entity.getDisplay(), FontParam.USECASE, skinParam,
HorizontalAlignment.CENTER, stereotype, true, false, entity);
if (stereotype == null || stereotype.getLabel(false) == null) {
if (stereotype == null || stereotype.getLabel(false) == null
|| portionShower.showPortion(EntityPortion.STEREOTYPE, entity) == false) {
this.desc = tmp;
} else {
final TextBlock stereo = Display.getWithNewlines(stereotype.getLabel(getSkinParam().useGuillemet()))

View File

@ -73,6 +73,10 @@ public class Footprint {
private final UTranslate translate;
private final List<Point2D.Double> all;
public double dpiFactor() {
return 1;
}
private MyUGraphic(List<Point2D.Double> all, UTranslate translate) {
this.all = all;
this.translate = translate;

View File

@ -40,9 +40,6 @@ import java.awt.Dimension;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
@ -75,6 +72,7 @@ import javax.swing.WindowConstants;
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.GeneratedImage;
import net.sourceforge.plantuml.ImageSelection;
import net.sourceforge.plantuml.graphic.GraphicStrings;
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
@ -442,30 +440,3 @@ class ImageWindow2 extends JFrame {
}
}
// This class is used to hold an image while on the clipboard.
class ImageSelection implements Transferable {
private Image image;
public ImageSelection(Image image) {
this.image = image;
}
// Returns supported flavors
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { DataFlavor.imageFlavor };
}
// Returns true if flavor is supported
public boolean isDataFlavorSupported(DataFlavor flavor) {
return DataFlavor.imageFlavor.equals(flavor);
}
// Returns image
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if (!DataFlavor.imageFlavor.equals(flavor)) {
throw new UnsupportedFlavorException(flavor);
}
return image;
}
}

View File

@ -289,6 +289,7 @@ public class MainWindow2 extends JFrame {
final JFileChooser chooser = new JFileChooser();
chooser.setDialogType(JFileChooser.CUSTOM_DIALOG);
chooser.setDialogTitle("Directory to watch:");
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setAcceptAllFileFilterUsed(false);
final String currentPath = prefs.get(KEY_DIR, ".");
chooser.setCurrentDirectory(new File(currentPath));
@ -297,11 +298,7 @@ public class MainWindow2 extends JFrame {
Log.info("Closing OpenDialog");
if (returnVal == JFileChooser.APPROVE_OPTION) {
final File dir = chooser.getSelectedFile();
if (dir.isDirectory()) {
changeDir(dir);
} else {
changeDir(dir.getParentFile());
}
changeDir(dir);
}
}

View File

@ -111,6 +111,7 @@ public class SpriteWindow extends JFrame {
return;
}
final StringBuilder sb = new StringBuilder();
encodeColor(img, sb);
encode(img, SpriteGrayLevel.GRAY_16, sb);
encodeCompressed(img, SpriteGrayLevel.GRAY_16, sb);
encode(img, SpriteGrayLevel.GRAY_8, sb);
@ -120,6 +121,12 @@ public class SpriteWindow extends JFrame {
printData(sb.toString());
}
private void encodeColor(BufferedImage img, StringBuilder sb) {
sb.append("\n");
sb.append(SpriteUtils.encodeColor(img, "demo"));
}
private void encodeCompressed(BufferedImage img, SpriteGrayLevel level, StringBuilder sb) {
sb.append("\n");
sb.append(SpriteUtils.encodeCompressed(img, "demo", level));

View File

@ -71,7 +71,7 @@ public class SyntaxChecker {
result.setLineLocation(new LineLocationImpl(null, null).oneLineRead());
// result.setErrorLinePosition(0);
result.addErrorText("No @startuml found");
result.setSuggest(Arrays.asList("Did you mean:", "@startuml"));
// result.setSuggest(Arrays.asList("Did you mean:", "@startuml"));
return result;
}
if (source.endsWith("@enduml\n") == false && source.endsWith("@enduml") == false) {
@ -79,7 +79,7 @@ public class SyntaxChecker {
result.setLineLocation(lastLineNumber2(source));
// result.setErrorLinePosition(lastLineNumber(source));
result.addErrorText("No @enduml found");
result.setSuggest(Arrays.asList("Did you mean:", "@enduml"));
// result.setSuggest(Arrays.asList("Did you mean:", "@enduml"));
return result;
}
final SourceStringReader sourceStringReader = new SourceStringReader(Defines.createEmpty(), source,
@ -91,7 +91,7 @@ public class SyntaxChecker {
result.setLineLocation(lastLineNumber2(source));
// result.setErrorLinePosition(lastLineNumber(source));
result.addErrorText("No @enduml found");
result.setSuggest(Arrays.asList("Did you mean:", "@enduml"));
// result.setSuggest(Arrays.asList("Did you mean:", "@enduml"));
return result;
}
final Diagram system = blocks.get(0).getDiagram();
@ -108,7 +108,7 @@ public class SyntaxChecker {
for (ErrorUml er : sys.getErrorsUml()) {
result.addErrorText(er.getError());
}
result.setSuggest(sys.getSuggest());
// result.setSuggest(sys.getSuggest());
} else {
result.setDescription(system.getDescription().getDescription());
}
@ -125,7 +125,7 @@ public class SyntaxChecker {
result.setError(true);
result.setLineLocation(lastLineNumber2(source));
result.addErrorText("No @enduml found");
result.setSuggest(Arrays.asList("Did you mean:", "@enduml"));
// result.setSuggest(Arrays.asList("Did you mean:", "@enduml"));
return result;
}
@ -143,7 +143,7 @@ public class SyntaxChecker {
result.addErrorText(er.getError());
}
result.setSystemError(sys);
result.setSuggest(sys.getSuggest());
// result.setSuggest(sys.getSuggest());
} else {
result.setDescription(system.getDescription().getDescription());
}

View File

@ -54,7 +54,7 @@ public class SyntaxResult {
private String description;
// private int errorLinePosition;
private Collection<String> errors = new TreeSet<String>();
private List<String> suggest;
// private List<String> suggest;
private boolean hasCmapData;
private PSystemError systemError;
private LineLocation lineLocation;
@ -71,13 +71,13 @@ public class SyntaxResult {
return description;
}
// public int getErrorLinePosition() {
// return errorLinePosition;
// }
// public int getErrorLinePosition() {
// return errorLinePosition;
// }
public List<String> getSuggest() {
return suggest;
}
// public List<String> getSuggest() {
// return suggest;
// }
public Collection<String> getErrors() {
return Collections.unmodifiableCollection(errors);
@ -95,17 +95,17 @@ public class SyntaxResult {
this.description = description;
}
// public void setErrorLinePosition(int errorLinePosition) {
// this.errorLinePosition = errorLinePosition;
// }
// public void setErrorLinePosition(int errorLinePosition) {
// this.errorLinePosition = errorLinePosition;
// }
public void addErrorText(String error) {
this.errors.add(error);
}
public void setSuggest(List<String> suggest) {
this.suggest = suggest;
}
// public void setSuggest(List<String> suggest) {
// this.suggest = suggest;
// }
public final boolean hasCmapData() {
return hasCmapData;

View File

@ -345,6 +345,7 @@ public class TikzGraphics {
text = text.replaceAll("<", "\\\\textless ");
text = text.replaceAll(">", "\\\\textgreater ");
text = text.replaceAll("&", "\\\\&");
text = text.replaceAll("%", "\\\\%");
text = text.replaceAll("~", "\\\\~{}");
return text;
}

View File

@ -56,7 +56,7 @@ public class CommandNoteLong extends CommandMultilines2<TimingDiagram> {
return "(?i)^end[%s]?note$";
}
public CommandExecutionResult executeNow(final TimingDiagram diagram, BlocLines lines) {
protected CommandExecutionResult executeNow(final TimingDiagram diagram, BlocLines lines) {
final RegexResult line0 = getStartingPattern().matcher(StringUtils.trin(lines.getFirst499()));
lines = lines.subExtract(1, 1);

View File

@ -41,7 +41,7 @@ import net.sourceforge.plantuml.command.regex.RegexResult;
public class TimeTickBuilder {
private static final String WITHOUT_AROBASE = "(\\+?)(\\d+\\.?\\d*)";
private static final String WITHOUT_AROBASE = "(\\+?)(-?\\d+\\.?\\d*)";
private static final String WITH_AROBASE = "@" + WITHOUT_AROBASE;
public static RegexLeaf expressionAtWithoutArobase(String name) {

View File

@ -93,11 +93,8 @@ public class TimingDiagram extends UmlDiagram implements Clock {
final ImageBuilder imageBuilder = new ImageBuilder(getSkinParam(), dpiFactor,
fileFormatOption.isWithMetadata() ? getMetadata() : null, getWarningOrError(), margin, margin,
getAnimation());
// imageBuilder.setUDrawable(getUDrawable());
TextBlock result = getTextBlock();
// TextBlock result = new TextBlockCompressed(getTextBlock());
// result = new TextBlockRecentred(result);
final ISkinParam skinParam = getSkinParam();
result = new AnnotatedWorker(this, skinParam).addAdd(result);
imageBuilder.setUDrawable(result);
@ -105,14 +102,6 @@ public class TimingDiagram extends UmlDiagram implements Clock {
return imageBuilder.writeImageTOBEMOVED(fileFormatOption, seed(), os);
}
private UDrawable getUDrawable() {
return new UDrawable() {
public void drawU(UGraphic ug) {
drawInternal(ug);
}
};
}
private TextBlockBackcolored getTextBlock() {
return new TextBlockBackcolored() {

View File

@ -64,6 +64,11 @@ public class TimingRuler {
private long tickIntervalInPixels = 50;
private long tickUnitary;
public TimingRuler(ISkinParam skinParam) {
this.skinParam = skinParam;
this.times.add(new TimeTick(BigDecimal.ZERO));
}
public void scaleInPixels(long tick, long pixel) {
this.tickIntervalInPixels = pixel;
this.tickUnitary = tick;
@ -81,7 +86,8 @@ public class TimingRuler {
if (times.size() == 0) {
return 1;
}
return (int) (1 + getMax().getTime().longValue() / tickUnitary());
final long delta = getMax().getTime().longValue() - getMin().getTime().longValue();
return (int) (1 + delta / tickUnitary());
}
public double getWidth() {
@ -89,13 +95,10 @@ public class TimingRuler {
}
private double getPosInPixel(double time) {
time -= getMin().getTime().doubleValue();
return time / tickUnitary() * tickIntervalInPixels;
}
public TimingRuler(ISkinParam skinParam) {
this.skinParam = skinParam;
}
public void addTime(TimeTick time) {
final boolean added = times.add(time);
if (added) {
@ -104,7 +107,8 @@ public class TimingRuler {
if (highestCommonFactor == -1) {
highestCommonFactor = time.getTime().longValue();
} else {
highestCommonFactor = computeHighestCommonFactor(highestCommonFactor, time.getTime().longValue());
highestCommonFactor = computeHighestCommonFactor(highestCommonFactor,
Math.abs(time.getTime().longValue()));
}
}
}
@ -158,12 +162,19 @@ public class TimingRuler {
}
private TimeTick getMax() {
if (times.size() == 0) {
throw new IllegalStateException("Empty list!");
}
// if (times.size() == 0) {
// throw new IllegalStateException("Empty list!");
// }
return times.last();
}
private TimeTick getMin() {
// if (times.size() == 0) {
// throw new IllegalStateException("Empty list!");
// }
return times.first();
}
private static long computeHighestCommonFactor(long a, long b) {
long r = a;
while (r != 0) {

View File

@ -51,6 +51,10 @@ public abstract class AbstractCommonUGraphic implements UGraphic {
private UClip clip;
private double scale = 1;
public double dpiFactor() {
return 1;
}
public UGraphic apply(UChange change) {
final AbstractCommonUGraphic copy = copyUGraphic();
if (change instanceof UTranslate) {
@ -142,10 +146,9 @@ public abstract class AbstractCommonUGraphic implements UGraphic {
public void flushUg() {
}
public boolean matchesProperty(String propertyName) {
return false;
}
}

View File

@ -47,6 +47,10 @@ public class LimitFinder implements UGraphic {
public boolean matchesProperty(String propertyName) {
return false;
}
public double dpiFactor() {
return 1;
}
public UGraphic apply(UChange change) {
if (change instanceof UTranslate) {
@ -61,6 +65,8 @@ public class LimitFinder implements UGraphic {
return new LimitFinder(this);
} else if (change instanceof UAntiAliasing) {
return new LimitFinder(this);
} else if (change instanceof UScale) {
return new LimitFinder(this);
} else if (change instanceof UClip) {
final LimitFinder copy = new LimitFinder(this);
copy.clip = (UClip) change;

View File

@ -49,6 +49,26 @@ public class MinMax {
private final double minX;
private final double minY;
public boolean doesHorizontalCross(Point2D.Double pt1, Point2D.Double pt2) {
if (pt1.getY() != pt2.getY()) {
throw new IllegalArgumentException();
}
if (pt1.getX() == pt2.getX()) {
throw new IllegalArgumentException();
}
final double y = pt1.getY();
if (y < minY || y > maxY) {
return false;
}
if (pt1.getX() < minX && pt2.getX() > maxX) {
return true;
}
if (pt2.getX() < minX && pt1.getX() > maxX) {
return true;
}
return false;
}
public static MinMax getEmpty(boolean initToZero) {
if (initToZero) {
return new MinMax(0, 0, 0, 0);
@ -81,7 +101,8 @@ public class MinMax {
}
public MinMax addMinMax(MinMax other) {
return new MinMax(Math.min(other.minX, minX), Math.min(other.minY, minY), Math.max(other.maxX, maxX), Math.max(other.maxY, maxY));
return new MinMax(Math.min(other.minX, minX), Math.min(other.minY, minY), Math.max(other.maxX, maxX), Math.max(
other.maxY, maxY));
}
public static MinMax fromMax(double maxX, double maxY) {

View File

@ -44,6 +44,10 @@ public class SlotFinder implements UGraphic {
return false;
}
public double dpiFactor() {
return 1;
}
public UGraphic apply(UChange change) {
if (change instanceof UTranslate) {
return new SlotFinder(stringBounder, yslot, translate.compose((UTranslate) change));

View File

@ -44,6 +44,10 @@ public class SlotFinderX implements UGraphic {
return false;
}
public double dpiFactor() {
return 1;
}
public UGraphic apply(UChange change) {
if (change instanceof UTranslate) {
return new SlotFinderX(stringBounder, xslot, yslot, translate.compose((UTranslate) change));

View File

@ -45,6 +45,11 @@ public class TextLimitFinder implements UGraphic {
public boolean matchesProperty(String propertyName) {
return false;
}
public double dpiFactor() {
return 1;
}
public UGraphic apply(UChange change) {
if (change instanceof UTranslate) {

View File

@ -57,4 +57,6 @@ public interface UGraphic {
public void flushUg();
public boolean matchesProperty(String propertyName);
public double dpiFactor();
}

View File

@ -43,27 +43,42 @@ public class UImage implements UShape {
private final BufferedImage image;
// public final double getScale() {
// return scale;
// }
public UImage(BufferedImage image) {
this.image = image;
}
public UImage(BufferedImage before, double scale) {
if (scale == 1) {
this.image = before;
return;
}
// public UImage(BufferedImage before, double scale) {
// this.image = before;
// this.scale = scale;
// // if (scale == 1) {
// // this.image = before;
// // return;
// // }
//
// // final int w = (int) Math.round(before.getWidth() * scale);
// // final int h = (int) Math.round(before.getHeight() * scale);
// // final BufferedImage after = new BufferedImage(w, h, before.getType());
// // final AffineTransform at = new AffineTransform();
// // at.scale(scale, scale);
// // final AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
// // this.image = scaleOp.filter(before, after);
// }
final int w = (int) Math.round(before.getWidth() * scale);
final int h = (int) Math.round(before.getHeight() * scale);
final BufferedImage after = new BufferedImage(w, h, before.getType());
public UImage scale(double scale) {
if (scale == 1) {
return this;
}
final int w = (int) Math.round(image.getWidth() * scale);
final int h = (int) Math.round(image.getHeight() * scale);
final BufferedImage after = new BufferedImage(w, h, image.getType());
final AffineTransform at = new AffineTransform();
at.scale(scale, scale);
final AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
this.image = scaleOp.filter(before, after);
}
public UImage scale(double scale) {
return new UImage(image, scale);
return new UImage(scaleOp.filter(image, after));
}
public final BufferedImage getImage() {
@ -71,11 +86,15 @@ public class UImage implements UShape {
}
public double getWidth() {
return image.getWidth()-1;
return image.getWidth() - 1;
}
public double getHeight() {
return image.getHeight()-1;
return image.getHeight() - 1;
}
// public UShape getScaled(double scale) {
// return scale(scale);
// }
}

View File

@ -60,6 +60,11 @@ public class UGraphicCrossing implements UGraphic {
private final UGraphic ug;
private final List<Pending> lines;
private final UTranslate translate;
public double dpiFactor() {
return ug.dpiFactor();
}
static class Pending {
final UGraphic ug;

View File

@ -36,6 +36,7 @@
package net.sourceforge.plantuml.ugraphic.g2d;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import net.sourceforge.plantuml.EnsureVisible;
import net.sourceforge.plantuml.ugraphic.ColorMapper;
@ -48,19 +49,24 @@ import net.sourceforge.plantuml.ugraphic.UShape;
public class DriverImageG2d implements UDriver<Graphics2D> {
private final EnsureVisible visible;
private final double dpiFactor;
public DriverImageG2d(EnsureVisible visible) {
public DriverImageG2d(double dpiFactor, EnsureVisible visible) {
this.visible = visible;
this.dpiFactor = dpiFactor;
}
public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, Graphics2D g2d) {
if (ushape instanceof UImageSvg) {
return;
}
final UImage shape = (UImage) ushape;
final UImage shape = ((UImage) ushape);
visible.ensureVisible(x, y);
visible.ensureVisible(x + shape.getWidth(), y + shape.getHeight());
g2d.drawImage(shape.getImage(), (int) x, (int) y, null);
final AffineTransform back = g2d.getTransform();
g2d.scale(1 / dpiFactor, 1 / dpiFactor);
g2d.drawImage(shape.getImage(), (int) (x * dpiFactor), (int) (y * dpiFactor), null);
g2d.setTransform(back);
}
}

View File

@ -150,8 +150,8 @@ public class UGraphicG2d extends AbstractUGraphic<Graphics2D> implements EnsureV
registerDriver(UPixel.class, new DriverPixelG2d());
registerDriver(UPolygon.class, new DriverPolygonG2d(dpiFactor, this));
registerDriver(UEllipse.class, new DriverEllipseG2d(dpiFactor, this));
registerDriver(UImageSvg.class, new DriverImageG2d(this));
registerDriver(UImage.class, new DriverImageG2d(this));
registerDriver(UImageSvg.class, new DriverImageG2d(dpiFactor, this));
registerDriver(UImage.class, new DriverImageG2d(dpiFactor, this));
registerDriver(DotPath.class, new DriverDotPathG2d(this));
registerDriver(UPath.class, new DriverPathG2d(dpiFactor));
registerDriver(UCenteredCharacter.class, new DriverCenteredCharacterG2d());
@ -222,4 +222,9 @@ public class UGraphicG2d extends AbstractUGraphic<Graphics2D> implements EnsureV
PngIO.write(im, os, metadata, dpi);
}
@Override
public double dpiFactor() {
return dpiFactor;
}
}

Some files were not shown because too many files have changed in this diff Show More