mirror of
https://github.com/octoleo/plantuml.git
synced 2024-11-22 04:55:10 +00:00
fix: better support for package with ELK layout
https://forum.plantuml.net/13709/eclipse-layout-kernel?show=18389#a18389
This commit is contained in:
parent
f91a19413b
commit
546174d17f
@ -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.13beta1
|
version = 1.2023.13beta2
|
||||||
org.gradle.workers.max = 3
|
org.gradle.workers.max = 3
|
@ -127,6 +127,7 @@ import net.sourceforge.plantuml.style.StyleSignatureBasic;
|
|||||||
import net.sourceforge.plantuml.svek.Bibliotekon;
|
import net.sourceforge.plantuml.svek.Bibliotekon;
|
||||||
import net.sourceforge.plantuml.svek.Cluster;
|
import net.sourceforge.plantuml.svek.Cluster;
|
||||||
import net.sourceforge.plantuml.svek.ClusterDecoration;
|
import net.sourceforge.plantuml.svek.ClusterDecoration;
|
||||||
|
import net.sourceforge.plantuml.svek.ClusterHeader;
|
||||||
import net.sourceforge.plantuml.svek.CucaDiagramFileMaker;
|
import net.sourceforge.plantuml.svek.CucaDiagramFileMaker;
|
||||||
import net.sourceforge.plantuml.svek.DotStringFactory;
|
import net.sourceforge.plantuml.svek.DotStringFactory;
|
||||||
import net.sourceforge.plantuml.svek.GeneralImageBuilder;
|
import net.sourceforge.plantuml.svek.GeneralImageBuilder;
|
||||||
@ -298,12 +299,12 @@ public class CucaDiagramFileMakerElk implements CucaDiagramFileMaker {
|
|||||||
// final double roundCorner = group.getUSymbol() == null ? 0
|
// final double roundCorner = group.getUSymbol() == null ? 0
|
||||||
// : group.getUSymbol().getSkinParameter().getRoundCorner(skinParam, group.getStereotype());
|
// : group.getUSymbol().getSkinParameter().getRoundCorner(skinParam, group.getStereotype());
|
||||||
|
|
||||||
final TextBlock ztitle = getTitleBlock(group);
|
|
||||||
final TextBlock zstereo = TextBlockUtils.empty(0, 0);
|
|
||||||
|
|
||||||
final RectangleArea rectangleArea = new RectangleArea(0, 0, elkNode.getWidth(), elkNode.getHeight());
|
final RectangleArea rectangleArea = new RectangleArea(0, 0, elkNode.getWidth(), elkNode.getHeight());
|
||||||
final ClusterDecoration decoration = new ClusterDecoration(packageStyle, group.getUSymbol(), ztitle,
|
final ClusterHeader clusterHeader = new ClusterHeader(group, diagram.getSkinParam(), diagram,
|
||||||
zstereo, rectangleArea, stroke);
|
stringBounder);
|
||||||
|
|
||||||
|
final ClusterDecoration decoration = new ClusterDecoration(packageStyle, group.getUSymbol(),
|
||||||
|
clusterHeader.getTitle(), clusterHeader.getStereo(), rectangleArea, stroke);
|
||||||
|
|
||||||
final HColor borderColor = HColors.BLACK;
|
final HColor borderColor = HColors.BLACK;
|
||||||
decoration.drawU(ug.apply(UTranslate.point(corner)), backColor, borderColor, shadowing, roundCorner,
|
decoration.drawU(ug.apply(UTranslate.point(corner)), backColor, borderColor, shadowing, roundCorner,
|
||||||
@ -314,16 +315,6 @@ public class CucaDiagramFileMakerElk implements CucaDiagramFileMaker {
|
|||||||
// ug.apply(HColorUtils.BLACK).apply(UStroke.withThickness(1.5)).apply(new UTranslate(corner)).draw(rect);
|
// ug.apply(HColorUtils.BLACK).apply(UStroke.withThickness(1.5)).apply(new UTranslate(corner)).draw(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
private TextBlock getTitleBlock(Entity g) {
|
|
||||||
final Display label = g.getDisplay();
|
|
||||||
if (label == null)
|
|
||||||
return TextBlockUtils.empty(0, 0);
|
|
||||||
|
|
||||||
final ISkinParam skinParam = diagram.getSkinParam();
|
|
||||||
final FontConfiguration fontConfiguration = g.getFontConfigurationForTitle(skinParam);
|
|
||||||
return label.create(fontConfiguration, HorizontalAlignment.CENTER, skinParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
private HColor getBackColor(UmlDiagramType umlDiagramType) {
|
private HColor getBackColor(UmlDiagramType umlDiagramType) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -429,7 +420,14 @@ public class CucaDiagramFileMakerElk implements CucaDiagramFileMaker {
|
|||||||
// We create the "cluster" in ELK for this group
|
// We create the "cluster" in ELK for this group
|
||||||
final ElkNode elkCluster = ElkGraphUtil.createNode(cluster);
|
final ElkNode elkCluster = ElkGraphUtil.createNode(cluster);
|
||||||
elkCluster.setProperty(CoreOptions.DIRECTION, Direction.DOWN);
|
elkCluster.setProperty(CoreOptions.DIRECTION, Direction.DOWN);
|
||||||
elkCluster.setProperty(CoreOptions.PADDING, new ElkPadding(40, 15, 15, 15));
|
|
||||||
|
final ClusterHeader clusterHeader = new ClusterHeader(g, diagram.getSkinParam(), diagram,
|
||||||
|
stringBounder);
|
||||||
|
|
||||||
|
final int titleAndAttributeHeight = clusterHeader.getTitleAndAttributeHeight();
|
||||||
|
|
||||||
|
final double topPadding = Math.max(25, titleAndAttributeHeight) + 15;
|
||||||
|
elkCluster.setProperty(CoreOptions.PADDING, new ElkPadding(topPadding, 15, 15, 15));
|
||||||
|
|
||||||
// Not sure this is usefull to put a label on a "cluster"
|
// Not sure this is usefull to put a label on a "cluster"
|
||||||
final ElkLabel label = ElkGraphUtil.createLabel(elkCluster);
|
final ElkLabel label = ElkGraphUtil.createLabel(elkCluster);
|
||||||
|
@ -97,7 +97,10 @@ public class FormatCounter {
|
|||||||
final String name = removeDotSaved(key);
|
final String name = removeDotSaved(key);
|
||||||
final NumberAnalyzed value = NumberAnalyzed.load(name, prefs);
|
final NumberAnalyzed value = NumberAnalyzed.load(name, prefs);
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
final FileFormat format = FileFormat.valueOf(name.substring(prefix.length()));
|
final String subname = name.substring(prefix.length());
|
||||||
|
if (subname.equals("ANIMATED_GIF"))
|
||||||
|
continue;
|
||||||
|
final FileFormat format = FileFormat.valueOf(subname);
|
||||||
data.put(format, value);
|
data.put(format, value);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -617,7 +617,7 @@ public final class GeneralImageBuilder {
|
|||||||
if (g.getGroupType() == GroupType.CONCURRENT_STATE)
|
if (g.getGroupType() == GroupType.CONCURRENT_STATE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
final ClusterHeader clusterHeader = new ClusterHeader((Entity) g, dotData.getSkinParam(), dotData,
|
final ClusterHeader clusterHeader = new ClusterHeader(g, dotData.getSkinParam(), dotData,
|
||||||
stringBounder);
|
stringBounder);
|
||||||
dotStringFactory.openCluster(g, clusterHeader);
|
dotStringFactory.openCluster(g, clusterHeader);
|
||||||
this.printEntities(dotStringFactory, g.leafs());
|
this.printEntities(dotStringFactory, g.leafs());
|
||||||
|
150
src/net/sourceforge/plantuml/syntax/SyntaxChecker.java
Normal file
150
src/net/sourceforge/plantuml/syntax/SyntaxChecker.java
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* 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.syntax;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.BlockUml;
|
||||||
|
import net.sourceforge.plantuml.ErrorUml;
|
||||||
|
import net.sourceforge.plantuml.OptionFlags;
|
||||||
|
import net.sourceforge.plantuml.SourceStringReader;
|
||||||
|
import net.sourceforge.plantuml.UmlDiagram;
|
||||||
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemError;
|
||||||
|
import net.sourceforge.plantuml.preproc.Defines;
|
||||||
|
import net.sourceforge.plantuml.text.BackSlash;
|
||||||
|
import net.sourceforge.plantuml.utils.LineLocation;
|
||||||
|
import net.sourceforge.plantuml.utils.LineLocationImpl;
|
||||||
|
|
||||||
|
public class SyntaxChecker {
|
||||||
|
// ::remove folder when __HAXE__
|
||||||
|
// ::remove file when __CORE__
|
||||||
|
|
||||||
|
public static SyntaxResult checkSyntax(List<String> source) {
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
for (String s : source) {
|
||||||
|
sb.append(s);
|
||||||
|
sb.append(BackSlash.NEWLINE);
|
||||||
|
}
|
||||||
|
return checkSyntax(sb.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SyntaxResult checkSyntax(String source) {
|
||||||
|
OptionFlags.getInstance().setQuiet(true);
|
||||||
|
final SyntaxResult result = new SyntaxResult();
|
||||||
|
|
||||||
|
if (source.startsWith("@startuml\n") == false) {
|
||||||
|
result.setError(true);
|
||||||
|
result.setLineLocation(new LineLocationImpl("", null).oneLineRead());
|
||||||
|
result.addErrorText("No @startuml/@enduml found");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (source.endsWith("@enduml\n") == false && source.endsWith("@enduml") == false) {
|
||||||
|
result.setError(true);
|
||||||
|
result.setLineLocation(lastLineNumber(source));
|
||||||
|
result.addErrorText("No @enduml found");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
final SourceStringReader sourceStringReader = new SourceStringReader(Defines.createEmpty(), source,
|
||||||
|
Collections.<String>emptyList());
|
||||||
|
|
||||||
|
final List<BlockUml> blocks = sourceStringReader.getBlocks();
|
||||||
|
if (blocks.size() == 0) {
|
||||||
|
result.setError(true);
|
||||||
|
result.setLineLocation(lastLineNumber(source));
|
||||||
|
result.addErrorText("No @enduml found");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
final Diagram system = blocks.get(0).getDiagram();
|
||||||
|
result.setCmapData(system.hasUrl());
|
||||||
|
if (system instanceof UmlDiagram) {
|
||||||
|
result.setUmlDiagramType(((UmlDiagram) system).getUmlDiagramType());
|
||||||
|
result.setDescription(system.getDescription().getDescription());
|
||||||
|
} else if (system instanceof PSystemError) {
|
||||||
|
result.setError(true);
|
||||||
|
final PSystemError sys = (PSystemError) system;
|
||||||
|
result.setLineLocation(sys.getLineLocation());
|
||||||
|
result.setSystemError(sys);
|
||||||
|
for (ErrorUml er : sys.getErrorsUml())
|
||||||
|
result.addErrorText(er.getError());
|
||||||
|
} else {
|
||||||
|
result.setDescription(system.getDescription().getDescription());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SyntaxResult checkSyntaxFair(String source) {
|
||||||
|
final SyntaxResult result = new SyntaxResult();
|
||||||
|
final SourceStringReader sourceStringReader = new SourceStringReader(Defines.createEmpty(), source,
|
||||||
|
Collections.<String>emptyList());
|
||||||
|
|
||||||
|
final List<BlockUml> blocks = sourceStringReader.getBlocks();
|
||||||
|
if (blocks.size() == 0) {
|
||||||
|
result.setError(true);
|
||||||
|
result.setLineLocation(lastLineNumber(source));
|
||||||
|
result.addErrorText("No @enduml found");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Diagram system = blocks.get(0).getDiagram();
|
||||||
|
result.setCmapData(system.hasUrl());
|
||||||
|
if (system instanceof UmlDiagram) {
|
||||||
|
result.setUmlDiagramType(((UmlDiagram) system).getUmlDiagramType());
|
||||||
|
result.setDescription(system.getDescription().getDescription());
|
||||||
|
} else if (system instanceof PSystemError) {
|
||||||
|
result.setError(true);
|
||||||
|
final PSystemError sys = (PSystemError) system;
|
||||||
|
result.setLineLocation(sys.getLineLocation());
|
||||||
|
for (ErrorUml er : sys.getErrorsUml()) {
|
||||||
|
result.addErrorText(er.getError());
|
||||||
|
}
|
||||||
|
result.setSystemError(sys);
|
||||||
|
} else {
|
||||||
|
result.setDescription(system.getDescription().getDescription());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LineLocation lastLineNumber(String source) {
|
||||||
|
LineLocationImpl result = new LineLocationImpl("", null).oneLineRead();
|
||||||
|
for (int i = 0; i < source.length(); i++)
|
||||||
|
if (source.charAt(i) == '\n')
|
||||||
|
result = result.oneLineRead();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@ -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.13beta1";
|
private static final String version = "1.2023.13beta2";
|
||||||
|
|
||||||
public static String versionString() {
|
public static String versionString() {
|
||||||
return version;
|
return version;
|
||||||
|
Loading…
Reference in New Issue
Block a user