1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-11-22 04:55:10 +00:00
Arnaud Roques 2023-06-11 20:44:08 +02:00
parent c95bbfe585
commit 4a246c7cb9
21 changed files with 345 additions and 166 deletions

View File

@ -1,4 +1,4 @@
# Warning, "version" should be the same in gradle.properties and Version.java # Warning, "version" should be the same in gradle.properties and Version.java
# Any idea anyone how to magically synchronize those :-) ? # Any idea anyone how to magically synchronize those :-) ?
version = 1.2023.9beta2 version = 1.2023.9beta3
org.gradle.workers.max = 3 org.gradle.workers.max = 3

View File

@ -70,6 +70,7 @@ import net.sourceforge.plantuml.eggs.PSystemWelcomeFactory;
import net.sourceforge.plantuml.emoji.PSystemListEmojiFactory; import net.sourceforge.plantuml.emoji.PSystemListEmojiFactory;
import net.sourceforge.plantuml.error.PSystemError; import net.sourceforge.plantuml.error.PSystemError;
import net.sourceforge.plantuml.error.PSystemErrorUtils; import net.sourceforge.plantuml.error.PSystemErrorUtils;
import net.sourceforge.plantuml.filesdiagram.FilesDiagramFactory;
import net.sourceforge.plantuml.flowdiagram.FlowDiagramFactory; import net.sourceforge.plantuml.flowdiagram.FlowDiagramFactory;
import net.sourceforge.plantuml.font.PSystemListFontsFactory; import net.sourceforge.plantuml.font.PSystemListFontsFactory;
import net.sourceforge.plantuml.gitlog.GitDiagramFactory; import net.sourceforge.plantuml.gitlog.GitDiagramFactory;
@ -101,7 +102,6 @@ import net.sourceforge.plantuml.sudoku.PSystemSudokuFactory;
import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.timingdiagram.TimingDiagramFactory; import net.sourceforge.plantuml.timingdiagram.TimingDiagramFactory;
import net.sourceforge.plantuml.utils.Log; import net.sourceforge.plantuml.utils.Log;
import net.sourceforge.plantuml.version.License;
import net.sourceforge.plantuml.version.PSystemLicenseFactory; import net.sourceforge.plantuml.version.PSystemLicenseFactory;
import net.sourceforge.plantuml.version.PSystemVersionFactory; import net.sourceforge.plantuml.version.PSystemVersionFactory;
import net.sourceforge.plantuml.wbs.WBSDiagramFactory; import net.sourceforge.plantuml.wbs.WBSDiagramFactory;
@ -251,6 +251,7 @@ public class PSystemBuilder {
factories.add(new JsonDiagramFactory()); factories.add(new JsonDiagramFactory());
factories.add(new GitDiagramFactory()); factories.add(new GitDiagramFactory());
// ::comment when __CORE__ // ::comment when __CORE__
factories.add(new FilesDiagramFactory());
factories.add(new BoardDiagramFactory()); factories.add(new BoardDiagramFactory());
// ::done // ::done
factories.add(new YamlDiagramFactory()); factories.add(new YamlDiagramFactory());

View File

@ -181,6 +181,8 @@ public class FtileBox extends AbstractFtile {
@Override @Override
public String toString() { public String toString() {
if (print == null)
return super.toString();
return print; return print;
} }

View File

@ -105,9 +105,9 @@ public final class CommandFactorySprite implements SingleMultiFactoryCommand<Wit
lines = lines.subExtract(1, 1); lines = lines.subExtract(1, 1);
lines = lines.removeEmptyColumns(); lines = lines.removeEmptyColumns();
if (lines.size() == 0) { if (lines.size() == 0)
return CommandExecutionResult.error("No sprite defined."); return CommandExecutionResult.error("No sprite defined.");
}
return executeInternal(system, line0, lines.getLinesAsStringForSprite()); return executeInternal(system, line0, lines.getLinesAsStringForSprite());
} }
@ -123,17 +123,17 @@ public final class CommandFactorySprite implements SingleMultiFactoryCommand<Wit
final int height = Integer.parseInt(line0.get("DIM", 1)); final int height = Integer.parseInt(line0.get("DIM", 1));
if (line0.get("DIM", 4) == null) { if (line0.get("DIM", 4) == null) {
final int nbLevel = Integer.parseInt(line0.get("DIM", 2)); final int nbLevel = Integer.parseInt(line0.get("DIM", 2));
if (nbLevel != 4 && nbLevel != 8 && nbLevel != 16) { if (nbLevel != 4 && nbLevel != 8 && nbLevel != 16)
return CommandExecutionResult.error("Only 4, 8 or 16 graylevel are allowed."); return CommandExecutionResult.error("Only 4, 8 or 16 graylevel are allowed.");
}
final SpriteGrayLevel level = SpriteGrayLevel.get(nbLevel); final SpriteGrayLevel level = SpriteGrayLevel.get(nbLevel);
if (line0.get("DIM", 3) == null) { if (line0.get("DIM", 3) == null) {
sprite = level.buildSprite(width, height, strings); sprite = level.buildSprite(width, height, strings);
} else { } else {
sprite = level.buildSpriteZ(width, height, concat(strings)); sprite = level.buildSpriteZ(width, height, concat(strings));
if (sprite == null) { if (sprite == null)
return CommandExecutionResult.error("Cannot decode sprite."); return CommandExecutionResult.error("Cannot decode sprite.");
}
} }
} else { } else {
sprite = SpriteColorBuilder4096.buildSprite(strings); sprite = SpriteColorBuilder4096.buildSprite(strings);
@ -145,9 +145,9 @@ public final class CommandFactorySprite implements SingleMultiFactoryCommand<Wit
private String concat(final List<String> strings) { private String concat(final List<String> strings) {
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (String s : strings) { for (String s : strings)
sb.append(StringUtils.trin(s)); sb.append(StringUtils.trin(s));
}
return sb.toString(); return sb.toString();
} }

View File

@ -40,7 +40,7 @@ import net.sourceforge.plantuml.utils.StartUtils;
public enum DiagramType { public enum DiagramType {
// ::remove folder when __HAXE__ // ::remove folder when __HAXE__
UML, BPM, DITAA, DOT, PROJECT, JCCKIT, SALT, FLOW, CREOLE, JUNGLE, CUTE, MATH, LATEX, DEFINITION, GANTT, NW, UML, BPM, DITAA, DOT, PROJECT, JCCKIT, SALT, FLOW, CREOLE, JUNGLE, CUTE, MATH, LATEX, DEFINITION, GANTT, NW,
MINDMAP, WBS, WIRE, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, UNKNOWN; MINDMAP, WBS, WIRE, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, FILES, UNKNOWN;
static public DiagramType getTypeFromArobaseStart(String s) { static public DiagramType getTypeFromArobaseStart(String s) {
s = s.toLowerCase(); s = s.toLowerCase();
@ -125,6 +125,9 @@ public enum DiagramType {
if (StartUtils.startsWithSymbolAnd("startregex", s)) if (StartUtils.startsWithSymbolAnd("startregex", s))
return REGEX; return REGEX;
if (StartUtils.startsWithSymbolAnd("startfiles", s))
return FILES;
return UNKNOWN; return UNKNOWN;
} }
} }

View File

@ -0,0 +1,85 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.filesdiagram;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.core.DiagramDescription;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.core.UmlSource;
import net.sourceforge.plantuml.klimt.shape.TextBlock;
import net.sourceforge.plantuml.skin.UmlDiagramType;
import net.sourceforge.plantuml.text.StringLocated;
public class FilesDiagram extends UmlDiagram {
private final FilesListing list;
public FilesDiagram(UmlSource source) {
super(source, UmlDiagramType.FILES, null);
this.list = new FilesListing(getSkinParam());
final Iterator<StringLocated> it = source.iterator2();
it.next();
while (true) {
final String line = it.next().getString();
if (it.hasNext() == false)
break;
this.list.add(line);
}
}
public DiagramDescription getDescription() {
return new DiagramDescription("(Files)");
}
@Override
protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os);
}
@Override
protected TextBlock getTextBlock() {
return list;
}
}

View File

@ -0,0 +1,56 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.filesdiagram;
import java.util.Map;
import net.sourceforge.plantuml.command.PSystemAbstractFactory;
import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.core.DiagramType;
import net.sourceforge.plantuml.core.UmlSource;
public class FilesDiagramFactory extends PSystemAbstractFactory {
public FilesDiagramFactory() {
super(DiagramType.FILES);
}
@Override
public Diagram createSystem(UmlSource source, Map<String, String> skinParam) {
return new FilesDiagram(source);
}
}

View File

@ -0,0 +1,83 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.filesdiagram;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.klimt.UTranslate;
import net.sourceforge.plantuml.klimt.creole.Display;
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
import net.sourceforge.plantuml.klimt.font.FontConfiguration;
import net.sourceforge.plantuml.klimt.font.StringBounder;
import net.sourceforge.plantuml.klimt.font.UFont;
import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment;
import net.sourceforge.plantuml.klimt.geom.XDimension2D;
import net.sourceforge.plantuml.klimt.shape.AbstractTextBlock;
import net.sourceforge.plantuml.klimt.shape.TextBlock;
import net.sourceforge.plantuml.style.ISkinParam;
public class FilesListing extends AbstractTextBlock {
private final ISkinParam skinParam;
private final FontConfiguration fontConfiguration = FontConfiguration.blackBlueTrue(UFont.courier(14));
private final List<String> tmp = new ArrayList<>();
public FilesListing(ISkinParam skinParam) {
this.skinParam = skinParam;
}
@Override
public XDimension2D calculateDimension(StringBounder stringBounder) {
return new XDimension2D(200, 200);
}
@Override
public void drawU(UGraphic ug) {
for (String s : tmp) {
final Display display = Display.getWithNewlines("<:1f4c4:>" + s);
TextBlock result = display.create(fontConfiguration, HorizontalAlignment.LEFT, skinParam);
result.drawU(ug);
ug = ug.apply(UTranslate.dy(result.calculateDimension(ug.getStringBounder()).getHeight()));
}
}
public void add(String line) {
if (line.startsWith("/"))
tmp.add(line.substring(1));
}
}

View File

@ -49,9 +49,9 @@ public class Commit {
this.name = name; this.name = name;
this.position = position; this.position = position;
this.comment = position.getCommentInLine(); this.comment = position.getCommentInLine();
if (position.matches("* ") == false && position.matches("*-") == false) { if (position.matches("* ") == false && position.matches("*-") == false)
throw new IllegalArgumentException(); throw new IllegalArgumentException();
}
} }
public String getComment() { public String getComment() {
@ -94,15 +94,15 @@ public class Commit {
} }
private static void addAbove(List<CursorPosition> result, CursorPosition here) { private static void addAbove(List<CursorPosition> result, CursorPosition here) {
if (here.move(0, 1).matches("|")) { if (here.move(0, 1).matches("|"))
result.add(here.move(0, 1)); result.add(here.move(0, 1));
}
if (here.move(1, 1).matches("\\")) { if (here.move(1, 1).matches("\\"))
result.add(here.move(1, 1)); result.add(here.move(1, 1));
}
if (here.move(-1, 1).matches("/")) { if (here.move(-1, 1).matches("/"))
result.add(here.move(-1, 1)); result.add(here.move(-1, 1));
}
} }
public List<Commit> getAncestors() { public List<Commit> getAncestors() {

View File

@ -61,43 +61,43 @@ public class CursorPosition {
} }
public boolean matches(String prefix) { public boolean matches(String prefix) {
if (x < 0) { if (x < 0)
return false; return false;
}
final String line = getCurrentLine(); final String line = getCurrentLine();
if (x > line.length()) { if (x > line.length())
return false; return false;
}
return line.substring(x).startsWith(prefix); return line.substring(x).startsWith(prefix);
} }
public String getCommentInLine() { public String getCommentInLine() {
final String line = getCurrentLine(); final String line = getCurrentLine();
final int x = line.indexOf("*"); final int x = line.indexOf("*");
if (x == -1) { if (x == -1)
return null; return null;
}
final int y = line.indexOf("(", x); final int y = line.indexOf("(", x);
if (y == -1) { if (y == -1)
return null; return null;
}
final int z = line.indexOf(")", y); final int z = line.indexOf(")", y);
if (z == -1) { if (z == -1)
return null; return null;
}
return line.substring(y + 1, z); return line.substring(y + 1, z);
} }
public static String getCommitNameInLine(String s) { public static String getCommitNameInLine(String s) {
final int x = s.indexOf("*"); final int x = s.indexOf("*");
if (x == -1) { if (x == -1)
return null; return null;
}
s = s.replaceAll("[-.*|/\\\\]", "").trim(); s = s.replaceAll("[-.*|/\\\\]", "").trim();
final int space = s.indexOf(" "); final int space = s.indexOf(" ");
if (space == -1) { if (space == -1)
return s; return s;
}
final String name = s.substring(0, space); final String name = s.substring(0, space);
return name; return name;
} }
@ -116,9 +116,9 @@ public class CursorPosition {
private static CursorPosition getDownFromInternal(CursorPosition current) { private static CursorPosition getDownFromInternal(CursorPosition current) {
while (true) { while (true) {
if (current.matches("* ")) { if (current.matches("* "))
return current; return current;
}
if (current.matches("/") && current.move(-2, 0).matches("_|/")) { if (current.matches("/") && current.move(-2, 0).matches("_|/")) {
current = current.move(-2, 0); current = current.move(-2, 0);
continue; continue;

View File

@ -44,7 +44,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
public class GNodeBuilder { public class GNodeBuilder {
// ::remove folder when __HAXE__ // ::remove folder when __HAXE__
private final List<GNode> all = new ArrayList<>(); private final List<GNode> all = new ArrayList<>();
@ -58,11 +58,9 @@ public class GNodeBuilder {
tmp.put(commit.getName(), node); tmp.put(commit.getName(), node);
} }
for (Commit commit : allCommits) { for (Commit commit : allCommits)
for (Commit parent : commit.getAncestors()) { for (Commit parent : commit.getAncestors())
GNode.link(tmp.get(commit.getName()), tmp.get(parent.getName())); GNode.link(tmp.get(commit.getName()), tmp.get(parent.getName()));
}
}
this.all.addAll(tmp.values()); this.all.addAll(tmp.values());
@ -82,9 +80,9 @@ public class GNodeBuilder {
break; break;
} }
} }
if (changed == false) { if (changed == false)
return; return;
}
} }
} }

View File

@ -57,25 +57,24 @@ public class GitCurve {
public GitCurve(ST_Agedgeinfo_t data, Mirror xMirror) { public GitCurve(ST_Agedgeinfo_t data, Mirror xMirror) {
this.xMirror = xMirror; this.xMirror = xMirror;
final ST_splines splines = data.spl; final ST_splines splines = data.spl;
if (splines.size != 1) { if (splines.size != 1)
throw new IllegalStateException(); throw new IllegalStateException();
}
final ST_bezier beziers = splines.list.get__(0); final ST_bezier beziers = splines.list.get__(0);
for (int i = 0; i < beziers.size; i++) { for (int i = 0; i < beziers.size; i++) {
final XPoint2D pt = getPoint(splines, i); final XPoint2D pt = getPoint(splines, i);
points.add(pt); points.add(pt);
} }
if (beziers.sp.x == 0 && beziers.sp.y == 0) { if (beziers.sp.x == 0 && beziers.sp.y == 0)
sp = null; sp = null;
} else { else
sp = new XPoint2D(beziers.sp.x, beziers.sp.y); sp = new XPoint2D(beziers.sp.x, beziers.sp.y);
}
if (beziers.ep.x == 0 && beziers.ep.y == 0) { if (beziers.ep.x == 0 && beziers.ep.y == 0)
ep = null; ep = null;
} else { else
ep = new XPoint2D(beziers.ep.x, beziers.ep.y); ep = new XPoint2D(beziers.ep.x, beziers.ep.y);
}
} }

View File

@ -55,9 +55,9 @@ public class GitTextArea {
final String name = CursorPosition.getCommitNameInLine(s); final String name = CursorPosition.getCommitNameInLine(s);
final int x = s.indexOf("*"); final int x = s.indexOf("*");
assert (name == null) == (x == -1); assert (name == null) == (x == -1);
if (x == -1) { if (x == -1)
continue; continue;
}
commits.add(new Commit(name, new CursorPosition(this, x, y))); commits.add(new Commit(name, new CursorPosition(this, x, y)));
} }
@ -69,18 +69,17 @@ public class GitTextArea {
} }
public String getLine(int y) { public String getLine(int y) {
if (y >= lines.size()) { if (y >= lines.size())
return ""; return "";
}
return lines.get(y); return lines.get(y);
} }
public Commit getCommitByName(String name) { public Commit getCommitByName(String name) {
for (Commit commit : getAllCommits()) { for (Commit commit : getAllCommits())
if (commit.getName().equals(name)) { if (commit.getName().equals(name))
return commit; return commit;
}
}
return null; return null;
} }

View File

@ -63,13 +63,13 @@ public class HColorGradient extends HColor {
return color2; return color2;
} }
public final Color getColor(ColorMapper mapper, double coeff) { public final Color getColor(ColorMapper mapper, double coeff, int alpha) {
if (coeff > 1 || coeff < 0) if (coeff > 1 || coeff < 0)
throw new IllegalArgumentException("c=" + coeff); throw new IllegalArgumentException("c=" + coeff);
final Color c1 = color1.toColor(mapper); final Color c1 = color1.toColor(mapper);
final Color c2 = color2.toColor(mapper); final Color c2 = color2.toColor(mapper);
final int diffRed = c2.getRed() - c1.getRed(); final int diffRed = c2.getRed() - c1.getRed();
final int diffGreen = c2.getGreen() - c1.getGreen(); final int diffGreen = c2.getGreen() - c1.getGreen();
final int diffBlue = c2.getBlue() - c1.getBlue(); final int diffBlue = c2.getBlue() - c1.getBlue();
@ -77,12 +77,12 @@ public class HColorGradient extends HColor {
final int vRed = (int) (coeff * diffRed); final int vRed = (int) (coeff * diffRed);
final int vGreen = (int) (coeff * diffGreen); final int vGreen = (int) (coeff * diffGreen);
final int vBlue = (int) (coeff * diffBlue); final int vBlue = (int) (coeff * diffBlue);
final int red = c1.getRed() + vRed; final int red = c1.getRed() + vRed;
final int green = c1.getGreen() + vGreen; final int green = c1.getGreen() + vGreen;
final int blue = c1.getBlue() + vBlue; final int blue = c1.getBlue() + vBlue;
return new Color(red, green, blue); return new Color(red, green, blue, alpha);
} }

View File

@ -99,7 +99,7 @@ public class SpriteColor implements Sprite {
} }
public UImage toUImage(ColorMapper colorMapper, HColor backcolor, HColor forecolor) { public UImage toUImage(ColorMapper colorMapper, HColor backcolor, HColor forecolor) {
final BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); final BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
if (backcolor == null) { if (backcolor == null) {
backcolor = HColors.WHITE; backcolor = HColors.WHITE;
@ -113,7 +113,7 @@ public class SpriteColor implements Sprite {
final int localColor = color[line][col]; final int localColor = color[line][col];
if (localColor == -1) { if (localColor == -1) {
final double coef = 1.0 * gray[line][col] / (16 - 1); final double coef = 1.0 * gray[line][col] / (16 - 1);
final Color c = gradient.getColor(colorMapper, coef); final Color c = gradient.getColor(colorMapper, coef, 255);
im.setRGB(col, line, c.getRGB()); im.setRGB(col, line, c.getRGB());
} else { } else {
im.setRGB(col, line, localColor); im.setRGB(col, line, localColor);

View File

@ -184,26 +184,23 @@ public class SpriteMonochrome implements Sprite {
if (color == null || color.isTransparent()) if (color == null || color.isTransparent())
color = HColors.BLACK.withDark(HColors.WHITE); color = HColors.BLACK.withDark(HColors.WHITE);
final BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); final BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
final HColorGradient gradient = HColors.gradient(backcolor, color, '\0'); final HColorGradient gradient = HColors.gradient(backcolor, color, '\0');
for (int col = 0; col < width; col++) { double maxCoef = 0;
for (int line = 0; line < height; line++) { for (int col = 0; col < width; col++)
final double coef = 1.0 * gray[line][col] / (grayLevel - 1); for (int line = 0; line < height; line++)
final Color c = gradient.getColor(colorMapper, coef); maxCoef = Math.max(maxCoef, 1.0 * gray[line][col] / (grayLevel - 1));
im.setRGB(col, line, c.getRGB());
}
}
return new UImage(new PixelImage(im, AffineTransformType.TYPE_BILINEAR));
}
private UImage special(ColorMapper colorMapper, HColorGradient backcolor, HColor color) {
final BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int col = 0; col < width; col++) { for (int col = 0; col < width; col++) {
for (int line = 0; line < height; line++) { for (int line = 0; line < height; line++) {
final HColor backColorLocal = HColors.simple(backcolor.getColor(colorMapper, 1.0 * line / height)); final int grayValue = gray[line][col];
final HColorGradient gradient = HColors.gradient(backColorLocal, color, '\0'); final double coef = 1.0 * grayValue / (grayLevel - 1);
final double coef = 1.0 * gray[line][col] / (grayLevel - 1); final int alpha;
final Color c = gradient.getColor(colorMapper, coef); if (coef > maxCoef / 4)
alpha = 255;
else
alpha = (int) (255 * (coef * 4 / maxCoef));
final Color c = gradient.getColor(colorMapper, coef, alpha);
im.setRGB(col, line, c.getRGB()); im.setRGB(col, line, c.getRGB());
} }
} }

View File

@ -118,6 +118,8 @@ public class NwDiagram extends UmlDiagram {
@Override @Override
public void makeDiagramReady() { public void makeDiagramReady() {
super.makeDiagramReady(); super.makeDiagramReady();
if (networks.size() == 0)
createNetwork("").goInvisible();
for (NServer server : servers.values()) { for (NServer server : servers.values()) {
server.connectMeIfAlone(networks.get(0)); server.connectMeIfAlone(networks.get(0));
playField.addInPlayfield(server.getBar()); playField.addInPlayfield(server.getBar());
@ -179,11 +181,26 @@ public class NwDiagram extends UmlDiagram {
return veryFirstLink(name1, name2); return veryFirstLink(name1, name2);
return CommandExecutionResult.error("what about " + name1); return CommandExecutionResult.error("what about " + name1);
} }
if (server1.isAlone()) {
if (networks.size() == 0)
createNetwork("").goInvisible();
server1.connectMeIfAlone(networks.get(0));
}
final Network tmp1 = server1.getMainNetworkNext();
final Network justAfter = justAfter(tmp1);
final Network network;
if (justAfter != null && justAfter.isVisible() == false)
network = justAfter;
else
network = createNetwork("");
NServer server2 = servers.get(name2); NServer server2 = servers.get(name2);
final Network network = createNetwork("");
network.goInvisible(); network.goInvisible();
if (server2 == null) { if (server2 == null) {
// server2 = NServer.create(name2, getSkinParam());
server2 = new NServer(name2, server1.getBar(), getSkinParam()); server2 = new NServer(name2, server1.getBar(), getSkinParam());
servers.put(name2, server2); servers.put(name2, server2);
server1.connectTo(network, ""); server1.connectTo(network, "");
@ -199,6 +216,13 @@ public class NwDiagram extends UmlDiagram {
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
private Network justAfter(Network n) {
final int x = networks.indexOf(n);
if (x != -1 && x < networks.size() - 1)
return networks.get(x + 1);
return null;
}
private CommandExecutionResult veryFirstLink(String name1, String name2) { private CommandExecutionResult veryFirstLink(String name1, String name2) {
Network network = createNetwork(name1); Network network = createNetwork(name1);
NServer server2 = NServer.create(name2, getSkinParam()); NServer server2 = NServer.create(name2, getSkinParam());
@ -208,45 +232,6 @@ public class NwDiagram extends UmlDiagram {
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
private CommandExecutionResult linkOld(String name1, String name2) {
if (initDone == false)
return errorNoInit();
String existingAddress = "";
final NServer server2;
Network created = null;
if (currentNetwork() == null && networks.size() == 0) {
created = createNetwork(name1);
server2 = NServer.create(name2, getSkinParam());
} else {
final NServer server1 = servers.get(name1);
final NServer previous2 = servers.get(name2);
if (previous2 != null)
existingAddress = previous2.someAddress();
created = createNetwork("");
created.goInvisible();
if (server1 != null) {
final Network someNetwork = server1.someNetwork();
if (someNetwork != null && someNetwork.isVisible() == false && someNetwork.getUp() == null) {
final String tmp = server1.someAddress();
server1.blankSomeAddress();
server1.connectTo(created, tmp);
} else {
server1.connectTo(created, "");
}
}
server2 = new NServer(name2, server1.getBar(), getSkinParam());
}
servers.put(name2, server2);
if (created == null)
server2.connectTo(currentNetwork(), existingAddress);
else
server2.connectTo(created, existingAddress);
playField.addInPlayfield(server2.getBar());
return CommandExecutionResult.ok();
}
public CommandExecutionResult addElement(String name, String definition) { public CommandExecutionResult addElement(String name, String definition) {
if (initDone == false) if (initDone == false)
return errorNoInit(); return errorNoInit();
@ -269,6 +254,13 @@ public class NwDiagram extends UmlDiagram {
} }
} }
if (networks.size() == 0 || currentNetwork() == null) {
server.updateProperties(props);
server.learnThisAddress(props.get("address"));
return CommandExecutionResult.ok();
}
if (networks.size() == 0) { if (networks.size() == 0) {
final Network network = createNetwork(""); final Network network = createNetwork("");
network.goInvisible(); network.goInvisible();
@ -291,46 +283,6 @@ public class NwDiagram extends UmlDiagram {
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
private CommandExecutionResult addElementOld(String name, String definition) {
if (initDone == false)
return errorNoInit();
if (currentGroup() != null) {
if (alreadyInSomeGroup(name))
return CommandExecutionResult.error("Element already in another group.");
currentGroup().addName(name);
}
NServer server = null;
Network created = null;
if (currentNetwork() == null) {
if (currentGroup() != null)
return CommandExecutionResult.ok();
assert currentGroup() == null;
created = createNetwork("");
created.goInvisible();
server = NServer.create(name, getSkinParam());
servers.put(name, server);
server.doNotPrintFirstLink();
} else {
server = servers.get(name);
if (server == null) {
server = NServer.create(name, getSkinParam());
servers.put(name, server);
}
}
final Map<String, String> props = toSet(definition);
if (created == null)
server.connectTo(currentNetwork(), props.get("address"));
else
server.connectTo(created, props.get("address"));
server.updateProperties(props);
playField.addInPlayfield(server.getBar());
return CommandExecutionResult.ok();
}
private boolean alreadyInSomeGroup(String name) { private boolean alreadyInSomeGroup(String name) {
for (NwGroup g : groups) for (NwGroup g : groups)
if (g.names().contains(name)) if (g.names().contains(name))

View File

@ -79,13 +79,17 @@ public class NServer {
} }
public void connectMeIfAlone(Network network) { public void connectMeIfAlone(Network network) {
if (connections.size() == 0) { if (isAlone()) {
connectTo(network, ""); connectTo(network, "");
if (network.isVisible() == false) if (network.isVisible() == false)
this.doNotPrintFirstLink(); this.doNotPrintFirstLink();
} }
} }
public boolean isAlone() {
return connections.size() == 0;
}
public String someAddress() { public String someAddress() {
if (connections.size() > 0 && connections.values().iterator().next().length() > 0) if (connections.size() > 0 && connections.values().iterator().next().length() > 0)
return connections.values().iterator().next(); return connections.values().iterator().next();

View File

@ -39,7 +39,7 @@ import net.sourceforge.plantuml.style.SName;
public enum UmlDiagramType { public enum UmlDiagramType {
SEQUENCE, STATE, CLASS, OBJECT, ACTIVITY, DESCRIPTION, COMPOSITE, FLOW, TIMING, BPM, NWDIAG, MINDMAP, WBS, WIRE, SEQUENCE, STATE, CLASS, OBJECT, ACTIVITY, DESCRIPTION, COMPOSITE, FLOW, TIMING, BPM, NWDIAG, MINDMAP, WBS, WIRE,
HELP, GANTT, SALT, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX; HELP, GANTT, SALT, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, FILES;
public SName getStyleName() { public SName getStyleName() {
if (this == SEQUENCE) if (this == SEQUENCE)

View File

@ -46,7 +46,7 @@ public class Version {
// Warning, "version" should be the same in gradle.properties and Version.java // Warning, "version" should be the same in gradle.properties and Version.java
// Any idea anyone how to magically synchronize those :-) ? // Any idea anyone how to magically synchronize those :-) ?
private static final String version = "1.2023.9beta2"; private static final String version = "1.2023.9beta3";
public static String versionString() { public static String versionString() {
return version; return version;

View File

@ -159,8 +159,8 @@ class PipeTest {
// no links/invalid input => no pipemap to output (no error as of // no links/invalid input => no pipemap to output (no error as of
// https://forum.plantuml.net/10049/2019-pipemap-diagrams-containing-links-give-zero-exit-code // https://forum.plantuml.net/10049/2019-pipemap-diagrams-containing-links-give-zero-exit-code
// ) // )
l.add(TestCase.of("-pipemap", "@startuml\na->b\n@enduml", "<map id=\"plantuml_map\" name=\"plantuml_map\">\n</map>\n\n", Verification.EXACT, false, false)); l.add(TestCase.of("-pipemap", "@startuml\na->b\n@enduml", "\n", Verification.EXACT, false, false));
l.add(TestCase.of("-pipemap", "@startuml\na\n@enduml", "<map id=\"plantuml_map\" name=\"plantuml_map\">\n</map>\n\n", Verification.EXACT, false, false)); l.add(TestCase.of("-pipemap", "@startuml\na\n@enduml", "\n", Verification.EXACT, false, false));
return l; return l;
} }