diff --git a/gradle.properties b/gradle.properties index 1c37c43d3..5151972fb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ # Warning, "version" should be the same in gradle.properties and Version.java # Any idea anyone how to magically synchronize those :-) ? -version = 1.2023.9 +version = 1.2023.10beta1 org.gradle.workers.max = 3 \ No newline at end of file diff --git a/skin/plantuml.skin b/skin/plantuml.skin index f851a3336..b48a58394 100644 --- a/skin/plantuml.skin +++ b/skin/plantuml.skin @@ -65,6 +65,14 @@ document { } } + +package { + title { + FontStyle bold + } +} + + stereotype { FontStyle italic } diff --git a/src/net/sourceforge/plantuml/command/CommandPackage.java b/src/net/sourceforge/plantuml/command/CommandPackage.java index 89f36e0bb..d0d64c477 100644 --- a/src/net/sourceforge/plantuml/command/CommandPackage.java +++ b/src/net/sourceforge/plantuml/command/CommandPackage.java @@ -111,7 +111,8 @@ public class CommandPackage extends SingleLineCommand2 { if (name.length() == 0) { idShort = "##" + diagram.getUniqueSequence(); display = null; - throw new IllegalStateException("AS"); + return CommandExecutionResult.error("Error in name"); + // throw new IllegalStateException("AS"); } else { idShort = name; display = idShort; diff --git a/src/net/sourceforge/plantuml/cucadiagram/BodyFactory.java b/src/net/sourceforge/plantuml/cucadiagram/BodyFactory.java index f423b2fd0..2f22cef1c 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/BodyFactory.java +++ b/src/net/sourceforge/plantuml/cucadiagram/BodyFactory.java @@ -77,8 +77,8 @@ public class BodyFactory { } public static TextBlock create3(Display rawBody, ISkinSimple skinParam, HorizontalAlignment align, - FontConfiguration titleConfig, LineBreakStrategy lineBreakStrategy, Style style) { - return new BodyEnhanced2(rawBody, skinParam, align, titleConfig, lineBreakStrategy, style); + FontConfiguration fc, LineBreakStrategy lineBreakStrategy, Style style) { + return new BodyEnhanced2(rawBody, skinParam, align, fc, lineBreakStrategy, style); } } diff --git a/src/net/sourceforge/plantuml/elk/CucaDiagramFileMakerElk.java b/src/net/sourceforge/plantuml/elk/CucaDiagramFileMakerElk.java index 588b96538..0f94cb8fe 100644 --- a/src/net/sourceforge/plantuml/elk/CucaDiagramFileMakerElk.java +++ b/src/net/sourceforge/plantuml/elk/CucaDiagramFileMakerElk.java @@ -283,14 +283,16 @@ public class CucaDiagramFileMakerElk implements CucaDiagramFileMaker { final UmlDiagramType umlDiagramType = diagram.getUmlDiagramType(); - final Style style = Cluster.getDefaultStyleDefinition(umlDiagramType.getStyleName(), group.getUSymbol()) + final Style style = Cluster + .getDefaultStyleDefinition(umlDiagramType.getStyleName(), group.getUSymbol(), group.getGroupType()) .getMergedStyle(skinParam.getCurrentStyleBuilder()); final double shadowing = style.value(PName.Shadowing).asDouble(); final UStroke stroke = Cluster.getStrokeInternal(group, style); HColor backColor = getBackColor(umlDiagramType); backColor = Cluster.getBackColor(backColor, group.getStereotype(), umlDiagramType.getStyleName(), - group.getUSymbol(), skinParam.getCurrentStyleBuilder(), skinParam.getIHtmlColorSet()); + group.getUSymbol(), skinParam.getCurrentStyleBuilder(), skinParam.getIHtmlColorSet(), + group.getGroupType()); final double roundCorner = style.value(PName.RoundCorner).asDouble(); // final double roundCorner = group.getUSymbol() == null ? 0 diff --git a/src/net/sourceforge/plantuml/klimt/shape/UImageSvg.java b/src/net/sourceforge/plantuml/klimt/shape/UImageSvg.java index 65fb8496f..6fb7586bd 100644 --- a/src/net/sourceforge/plantuml/klimt/shape/UImageSvg.java +++ b/src/net/sourceforge/plantuml/klimt/shape/UImageSvg.java @@ -43,7 +43,7 @@ import net.sourceforge.plantuml.klimt.UShape; import net.sourceforge.plantuml.utils.SignatureUtils; public class UImageSvg implements UShape { - // ::remove file when __HAXE__ + // ::remove file when __HAXE__ private final String svg; private final double scale; @@ -77,8 +77,12 @@ public class UImageSvg implements UShape { final String style = extractSvgStyle(); if (style != null) { final String background = extractBackground(style); - if (background != null) - result = result.replaceFirst("", " "); + if (background != null) { + final int width = getData("width"); + final int height = getData("height"); + result = result.replaceFirst("", " "); + } } if (result.startsWith("") == false) diff --git a/src/net/sourceforge/plantuml/svek/Cluster.java b/src/net/sourceforge/plantuml/svek/Cluster.java index c47076852..8bcd1519d 100644 --- a/src/net/sourceforge/plantuml/svek/Cluster.java +++ b/src/net/sourceforge/plantuml/svek/Cluster.java @@ -52,6 +52,7 @@ import java.util.Set; import net.sourceforge.plantuml.abel.CucaNote; import net.sourceforge.plantuml.abel.Entity; import net.sourceforge.plantuml.abel.EntityPosition; +import net.sourceforge.plantuml.abel.GroupType; import net.sourceforge.plantuml.abel.Together; import net.sourceforge.plantuml.cucadiagram.ICucaDiagram; import net.sourceforge.plantuml.decoration.symbol.USymbol; @@ -75,7 +76,6 @@ import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.klimt.shape.UComment; import net.sourceforge.plantuml.klimt.shape.ULine; import net.sourceforge.plantuml.skin.AlignmentParam; -import net.sourceforge.plantuml.skin.ComponentStyle; import net.sourceforge.plantuml.skin.UmlDiagramType; import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.style.ISkinParam; @@ -274,12 +274,16 @@ public class Cluster implements Moveable { this.xyNoteBottom = pos; } - static public StyleSignatureBasic getDefaultStyleDefinition(SName diagramStyleName, USymbol symbol) { + static public StyleSignatureBasic getDefaultStyleDefinition(SName diagramStyleName, USymbol symbol, + GroupType groupType) { if (diagramStyleName == SName.stateDiagram) return StyleSignatureBasic.of(SName.root, SName.element, SName.stateDiagram, SName.state, SName.group); - if (symbol == null) - return StyleSignatureBasic.of(SName.root, SName.element, diagramStyleName, SName.group); - return StyleSignatureBasic.of(SName.root, SName.element, diagramStyleName, SName.group, symbol.getSName()); + if (symbol != null) + return StyleSignatureBasic.of(SName.root, SName.element, diagramStyleName, SName.group, symbol.getSName()); + if (groupType == GroupType.PACKAGE) + return StyleSignatureBasic.of(SName.root, SName.element, diagramStyleName, SName.package_, SName.group); + + return StyleSignatureBasic.of(SName.root, SName.element, diagramStyleName, SName.group); } public void drawU(UGraphic ug, UmlDiagramType umlDiagramType) { @@ -298,7 +302,7 @@ public class Cluster implements Moveable { ug.draw(new UComment("cluster " + fullName)); final USymbol uSymbol = group.getUSymbol() == null ? USymbols.PACKAGE : group.getUSymbol(); - Style style = getDefaultStyleDefinition(umlDiagramType.getStyleName(), uSymbol) + Style style = getDefaultStyleDefinition(umlDiagramType.getStyleName(), uSymbol, group.getGroupType()) .withTOBECHANGED(group.getStereotype()).getMergedStyle(skinParam.getCurrentStyleBuilder()); final double shadowing = style.value(PName.Shadowing).asDouble(); HColor borderColor; @@ -341,7 +345,8 @@ public class Cluster implements Moveable { HColor backColor = getBackColor(umlDiagramType, style); backColor = getBackColor(backColor, group.getStereotype(), umlDiagramType.getStyleName(), - group.getUSymbol(), skinParam.getCurrentStyleBuilder(), skinParam.getIHtmlColorSet()); + group.getUSymbol(), skinParam.getCurrentStyleBuilder(), skinParam.getIHtmlColorSet(), + group.getGroupType()); final ClusterDecoration decoration = new ClusterDecoration(packageStyle, group.getUSymbol(), clusterHeader.getTitle(), clusterHeader.getStereo(), rectangleArea, stroke); @@ -638,9 +643,9 @@ public class Cluster implements Moveable { } public static HColor getBackColor(HColor backColor, Stereotype stereotype, SName styleName, USymbol symbol, - StyleBuilder styleBuilder, HColorSet colorSet) { + StyleBuilder styleBuilder, HColorSet colorSet, GroupType groupType) { - final Style style = getDefaultStyleDefinition(styleName, symbol).getMergedStyle(styleBuilder); + final Style style = getDefaultStyleDefinition(styleName, symbol, groupType).getMergedStyle(styleBuilder); if (backColor == null) backColor = style.value(PName.BackGroundColor).asColor(colorSet); diff --git a/src/net/sourceforge/plantuml/svek/ClusterHeader.java b/src/net/sourceforge/plantuml/svek/ClusterHeader.java index 8ac7751af..f1d99820e 100644 --- a/src/net/sourceforge/plantuml/svek/ClusterHeader.java +++ b/src/net/sourceforge/plantuml/svek/ClusterHeader.java @@ -118,6 +118,8 @@ public final class ClusterHeader { else if (uSymbol != null) signature = StyleSignatureBasic.of(SName.root, SName.element, sname, uSymbol.getSName(), SName.composite, SName.title); + else if (g.getGroupType() == GroupType.PACKAGE) + signature = StyleSignatureBasic.of(SName.root, SName.element, sname, SName.package_, SName.title); else signature = StyleSignatureBasic.of(SName.root, SName.element, sname, SName.composite, SName.title); @@ -163,7 +165,7 @@ public final class ClusterHeader { return TextBlockUtils.empty(0, 0); final Style style = Cluster - .getDefaultStyleDefinition(skinParam.getUmlDiagramType().getStyleName(), g.getUSymbol()) + .getDefaultStyleDefinition(skinParam.getUmlDiagramType().getStyleName(), g.getUSymbol(), g.getGroupType()) .forStereotypeItself(g.getStereotype()).getMergedStyle(skinParam.getCurrentStyleBuilder()); final FontConfiguration fontConfiguration = style.getFontConfiguration(skinParam.getIHtmlColorSet()); diff --git a/src/net/sourceforge/plantuml/svek/PointListIteratorImpl.java b/src/net/sourceforge/plantuml/svek/PointListIteratorImpl.java index 95c97821d..b1502346d 100644 --- a/src/net/sourceforge/plantuml/svek/PointListIteratorImpl.java +++ b/src/net/sourceforge/plantuml/svek/PointListIteratorImpl.java @@ -70,7 +70,7 @@ class PointListIteratorImpl implements PointListIterator { } public List next() { - if (pos == -1) { + if (pos < 0) { pos = -2; return Collections.emptyList(); } @@ -83,7 +83,7 @@ class PointListIteratorImpl implements PointListIterator { pos = svg.indexOf(SvgResult.POINTS_EQUALS, pos) + SvgResult.POINTS_EQUALS.length() + 1; return result; } catch (StringIndexOutOfBoundsException e) { - Log.error("Error " + e); + Log.error("ErrorString " + e); return Collections.emptyList(); } } diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageDescription.java b/src/net/sourceforge/plantuml/svek/image/EntityImageDescription.java index 3dc9daf2d..63ab206a3 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageDescription.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageDescription.java @@ -145,8 +145,9 @@ public class EntityImageDescription extends AbstractEntityImage { final Style styleStereo = tmp.forStereotypeItself(stereotype) .getMergedStyle(getSkinParam().getCurrentStyleBuilder()); - final Style style = StyleSignatureBasic.of(SName.root, SName.element, styleName, symbol.getSName()) - .withTOBECHANGED(stereotype).getMergedStyle(getSkinParam().getCurrentStyleBuilder()) + final StyleSignatureBasic tmp2 = StyleSignatureBasic.of(SName.root, SName.element, styleName, + symbol.getSName()); + final Style style = tmp2.withTOBECHANGED(stereotype).getMergedStyle(getSkinParam().getCurrentStyleBuilder()) .eventuallyOverride(colors); final HColor forecolor = styleTitle.value(PName.LineColor).asColor(getSkinParam().getIHtmlColorSet()); @@ -160,6 +161,7 @@ public class EntityImageDescription extends AbstractEntityImage { final double deltaShadow = styleTitle.value(PName.Shadowing).asDouble(); final UStroke stroke = styleTitle.getStroke(colors); final FontConfiguration fcTitle = styleTitle.getFontConfiguration(getSkinParam().getIHtmlColorSet()); + final FontConfiguration fc = style.getFontConfiguration(getSkinParam().getIHtmlColorSet()); final FontConfiguration fcStereo = styleStereo.getFontConfiguration(getSkinParam().getIHtmlColorSet()); final HorizontalAlignment defaultAlign = styleTitle.getHorizontalAlignment(); @@ -172,9 +174,11 @@ public class EntityImageDescription extends AbstractEntityImage { if ((entity.getDisplay().equalsLike(codeDisplay) && symbol.getSName() == SName.package_) || entity.getDisplay().isWhite()) desc = TextBlockUtils.empty(style.value(PName.MinimumWidth).asDouble(), 0); - else + else if (entity.getDisplay().equalsLike(codeDisplay)) desc = BodyFactory.create3(entity.getDisplay(), getSkinParam(), defaultAlign, fcTitle, style.wrapWidth(), styleTitle); + else + desc = BodyFactory.create3(entity.getDisplay(), getSkinParam(), defaultAlign, fc, style.wrapWidth(), style); stereo = TextBlockUtils.empty(0, 0); diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerAnalog.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerAnalog.java index c56c06a44..88d37427a 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerAnalog.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerAnalog.java @@ -105,10 +105,12 @@ public class PlayerAnalog extends Player { return max; } + @Override public double getFullHeight(StringBounder stringBounder) { return getHeightForConstraints(stringBounder) + suggestedHeight; } + @Override public IntricatedPoint getTimeProjection(StringBounder stringBounder, TimeTick tick) { final double x = ruler.getPosInPixel(tick); final double value = getValueAt(stringBounder, tick); @@ -139,14 +141,17 @@ public class PlayerAnalog extends Player { return last.getValue(); } + @Override public void addNote(TimeTick now, Display note, Position position) { throw new UnsupportedOperationException(); } + @Override public void defineState(String stateCode, String label) { throw new UnsupportedOperationException(); } + @Override public void setState(TimeTick now, String comment, Colors color, String... valueString) { final double value = getState(valueString[0]); if (now == null) @@ -256,6 +261,7 @@ public class PlayerAnalog extends Player { } + @Override public UDrawable getPart2() { return new UDrawable() { public void drawU(UGraphic ug) { diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java index 72054b3fc..c34f5d486 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java @@ -58,6 +58,7 @@ import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.style.SName; +import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.style.StyleSignatureBasic; import net.sourceforge.plantuml.timingdiagram.graphic.IntricatedPoint; @@ -72,6 +73,8 @@ public class PlayerBinary extends Player { private final SortedMap values = new TreeMap<>(); private ChangeState initialState; + private final List notes = new ArrayList<>(); + public PlayerBinary(String code, ISkinParam skinParam, TimingRuler ruler, boolean compact, Stereotype stereotype) { super(code, skinParam, ruler, compact, stereotype); this.suggestedHeight = 30; @@ -81,8 +84,10 @@ public class PlayerBinary extends Player { return TimeConstraint.getHeightForConstraints(stringBounder, constraints); } + @Override public double getFullHeight(StringBounder stringBounder) { - return getHeightForConstraints(stringBounder) + suggestedHeight; + return getHeightForConstraints(stringBounder) + getHeightForNotes(stringBounder, Position.TOP) + suggestedHeight + + getHeightForNotes(stringBounder, Position.BOTTOM); } @Override @@ -91,20 +96,28 @@ public class PlayerBinary extends Player { .withTOBECHANGED(stereotype); } + @Override public IntricatedPoint getTimeProjection(StringBounder stringBounder, TimeTick tick) { final double x = ruler.getPosInPixel(tick); return new IntricatedPoint(new XPoint2D(x, getYpos(stringBounder, HIGH_STRING)), new XPoint2D(x, getYpos(stringBounder, HIGH_STRING))); } + @Override public void addNote(TimeTick now, Display note, Position position) { - throw new UnsupportedOperationException(); + final StyleSignatureBasic signature = StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram, + SName.note); + final Style style = signature.getMergedStyle(skinParam.getCurrentStyleBuilder()); + + this.notes.add(new TimingNote(now, this, note, position, skinParam, style)); } + @Override public void defineState(String stateCode, String label) { throw new UnsupportedOperationException(); } + @Override public void setState(TimeTick now, String comment, Colors color, String... states) { final ChangeState cs = new ChangeState(now, comment, color, convert(states)); if (now == null) @@ -139,14 +152,16 @@ public class PlayerBinary extends Player { return getYhigh(stringBounder); } - private double getYlow(StringBounder stringBounder) { - return getFullHeight(stringBounder) - ymargin; - } - private double getYhigh(StringBounder stringBounder) { - return ymargin + getHeightForConstraints(stringBounder); + return ymargin + getHeightForConstraints(stringBounder) + getHeightForNotes(stringBounder, Position.TOP); } + private double getYlow(StringBounder stringBounder) { + return getHeightForConstraints(stringBounder) + getHeightForNotes(stringBounder, Position.TOP) + suggestedHeight + - ymargin; + } + + @Override public TextBlock getPart1(double fullAvailableWidth, double specialVSpace) { return new AbstractTextBlock() { @@ -165,6 +180,7 @@ public class PlayerBinary extends Player { }; } + @Override public UDrawable getPart2() { return new UDrawable() { public void drawU(UGraphic ug) { @@ -204,6 +220,12 @@ public class PlayerBinary extends Player { drawConstraints(ug.apply(UTranslate.dy(getHeightForConstraints(ug.getStringBounder())))); + drawNotes(ug.apply(UTranslate.dy(ymargin)), Position.TOP); + drawNotes( + ug.apply(UTranslate.dy(getHeightForConstraints(stringBounder) + + getHeightForNotes(stringBounder, Position.TOP) + suggestedHeight - ymargin / 2)), + Position.BOTTOM); + } }; } @@ -219,9 +241,26 @@ public class PlayerBinary extends Player { } private void drawConstraints(final UGraphic ug) { - for (TimeConstraint constraint : constraints) { + for (TimeConstraint constraint : constraints) constraint.drawU(ug, ruler); - } + } + + private void drawNotes(UGraphic ug, final Position position) { + for (TimingNote note : notes) + if (note.getPosition() == position) { + final TimeTick when = note.getWhen(); + final double x = when == null ? 0 : ruler.getPosInPixel(when); + note.drawU(ug.apply(UTranslate.dx(x))); + } + } + + private double getHeightForNotes(StringBounder stringBounder, Position position) { + double height = 0; + for (TimingNote note : notes) + if (note.getPosition() == position) + height = Math.max(height, note.getHeight(stringBounder)); + + return height; } } diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java index 2a80663f1..ac5a31880 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java @@ -73,6 +73,7 @@ public class PlayerClock extends Player { this.suggestedHeight = 30; } + @Override public double getFullHeight(StringBounder stringBounder) { return suggestedHeight + getTitleHeight(stringBounder); } @@ -87,22 +88,27 @@ public class PlayerClock extends Player { return 0; } + @Override protected StyleSignatureBasic getStyleSignature() { return StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram, SName.clock); } + @Override public IntricatedPoint getTimeProjection(StringBounder stringBounder, TimeTick tick) { throw new UnsupportedOperationException(); } + @Override public void addNote(TimeTick now, Display note, Position position) { throw new UnsupportedOperationException(); } + @Override public void defineState(String stateCode, String label) { throw new UnsupportedOperationException(); } + @Override public void setState(TimeTick now, String comment, Colors color, String... states) { throw new UnsupportedOperationException(); } @@ -116,6 +122,7 @@ public class PlayerClock extends Player { return period; } + @Override public TextBlock getPart1(double fullAvailableWidth, double specialVSpace) { if (displayTitle) return new AbstractTextBlock() { @@ -131,6 +138,7 @@ public class PlayerClock extends Player { return TextBlockUtils.empty(0, 0); } + @Override public UDrawable getPart2() { return new UDrawable() { diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java index dca634dc4..194e9dfe3 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java @@ -115,6 +115,7 @@ public final class PlayerRobustConcise extends Player { throw new IllegalStateException(); } + @Override public final TextBlock getPart1(final double fullAvailableWidth, final double specialVSpace) { return new AbstractTextBlock() { @@ -132,6 +133,7 @@ public final class PlayerRobustConcise extends Player { }; } + @Override public UDrawable getPart2() { return new UDrawable() { public void drawU(UGraphic ug) { @@ -145,6 +147,7 @@ public final class PlayerRobustConcise extends Player { return UTranslate.dy(getTitleHeight(stringBounder)); } + @Override public final double getFullHeight(StringBounder stringBounder) { return getTitleHeight(stringBounder) + getZoneHeight(stringBounder); } @@ -179,6 +182,7 @@ public final class PlayerRobustConcise extends Player { return getTimeDrawing().getFullHeight(stringBounder); } + @Override public final void setState(TimeTick now, String comment, Colors color, String... states) { for (int i = 0; i < states.length; i++) states[i] = decodeState(states[i]); @@ -200,6 +204,7 @@ public final class PlayerRobustConcise extends Player { return label; } + @Override public final IntricatedPoint getTimeProjection(StringBounder stringBounder, TimeTick tick) { if (tick == null) return null; @@ -211,6 +216,7 @@ public final class PlayerRobustConcise extends Player { return point.translated(translation); } + @Override public final void addNote(TimeTick now, Display note, Position position) { final StyleSignatureBasic signature = StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram, @@ -220,6 +226,7 @@ public final class PlayerRobustConcise extends Player { this.notes.add(new TimingNote(now, this, note, position, skinParam, style)); } + @Override public final void defineState(String stateCode, String label) { statesLabel.put(stateCode, label); } diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index 9dd4c5f39..2b14add8e 100644 --- a/src/net/sourceforge/plantuml/version/Version.java +++ b/src/net/sourceforge/plantuml/version/Version.java @@ -46,7 +46,7 @@ public class Version { // Warning, "version" should be the same in gradle.properties and Version.java // Any idea anyone how to magically synchronize those :-) ? - private static final String version = "1.2023.9"; + private static final String version = "1.2023.10beta1"; public static String versionString() { return version;