From c20b3d9642eb56600c6c22b09021b545b05f6174 Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Mon, 11 Dec 2023 18:34:23 +0100 Subject: [PATCH] feat: work on chronology --- gradle.properties | 2 +- .../plantuml/api/cheerpj/v1/DirectDraw.java | 3 +- src/com/plantuml/api/cheerpj/v1/Raw.java | 5 +- src/net/atmp/CucaDiagram.java | 4 +- .../sourceforge/plantuml/AbstractPSystem.java | 18 +- src/net/sourceforge/plantuml/Option.java | 2 + .../sourceforge/plantuml/PSystemBuilder.java | 8 +- .../sourceforge/plantuml/PlainDiagram.java | 7 +- .../plantuml/SourceStringReader.java | 12 +- .../sourceforge/plantuml/TitledDiagram.java | 6 +- .../command/CommandLinkActivity.java | 9 +- .../command/CommandLinkLongActivity.java | 5 +- .../command/CommandPartition.java | 13 +- .../activitydiagram3/ActivityDiagram3.java | 11 +- .../plantuml/activitydiagram3/Branch.java | 5 +- .../activitydiagram3/InstructionIf.java | 20 +- .../activitydiagram3/InstructionSwitch.java | 4 +- .../command/CommandActivity3.java | 5 +- .../command/CommandArrow3.java | 3 +- .../activitydiagram3/command/CommandIf2.java | 10 +- .../activitydiagram3/command/CommandIf4.java | 6 +- .../command/CommandIfLegacy1.java | 2 +- .../command/CommandPartition3.java | 5 +- .../command/CommandRepeat3.java | 3 +- .../activitydiagram3/ftile/FtileFactory.java | 2 +- .../ftile/FtileFactoryDelegator.java | 4 +- .../vcompact/FtileFactoryDelegatorIf.java | 5 +- .../ftile/vcompact/FtileForkInner.java | 12 +- .../ftile/vcompact/ParallelBuilderFork.java | 2 +- .../ftile/vcompact/VCompactFactory.java | 2 +- .../plantuml/board/BoardDiagram.java | 4 +- .../sourceforge/plantuml/bpm/BpmDiagram.java | 2 +- .../chronology/ChronologyDiagram.java | 853 ++++++++++++++++++ .../chronology/ChronologyDiagramFactory.java | 126 +++ .../chronology/ComplementAnything.java | 54 ++ .../plantuml/chronology/ComplementHour.java | 84 ++ .../plantuml/chronology/HourPattern.java | 136 +++ .../chronology/SentenceHappensChronology.java | 60 ++ .../plantuml/chronology/SubjectTask.java | 92 ++ .../plantuml/chronology/TaskChronology.java | 372 ++++++++ .../chronology/TimeHeaderChronology.java | 197 ++++ .../chronology/TimeScaleChronology.java | 81 ++ .../command/CommandCreateClass.java | 5 +- .../command/CommandCreateClassMultilines.java | 5 +- .../command/CommandCreateElementFull2.java | 24 +- .../command/CommandStereotype.java | 4 +- .../plantuml/command/CommandNamespace.java | 5 +- .../plantuml/command/CommandNamespace2.java | 5 +- .../command/CommandNamespaceEmpty.java | 5 +- .../plantuml/command/CommandPackage.java | 5 +- .../command/note/CommandFactoryNote.java | 9 +- .../note/CommandFactoryNoteOnEntity.java | 13 +- .../note/CommandFactoryTipOnEntity.java | 9 +- .../FactorySequenceNoteAcrossCommand.java | 17 +- .../sequence/FactorySequenceNoteCommand.java | 19 +- .../FactorySequenceNoteOnArrowCommand.java | 17 +- ...FactorySequenceNoteOverSeveralCommand.java | 17 +- .../sourceforge/plantuml/core/Diagram.java | 2 +- .../plantuml/core/DiagramType.java | 12 +- .../descdiagram/CommandCreateDomain.java | 7 +- .../descdiagram/command/CommandArchimate.java | 32 +- .../command/CommandArchimateMultilines.java | 11 +- .../command/CommandCreateElementFull.java | 27 +- .../CommandCreateElementMultilines.java | 9 +- .../command/CommandLinkElement.java | 5 +- .../command/CommandPackageWithUSymbol.java | 5 +- .../plantuml/ebnf/PSystemEbnf.java | 4 +- .../plantuml/filesdiagram/FilesDiagram.java | 4 +- .../plantuml/flowdiagram/FlowDiagram.java | 2 +- .../plantuml/gitlog/GitDiagram.java | 4 +- src/net/sourceforge/plantuml/help/Help.java | 2 +- .../plantuml/jsondiagram/JsonDiagram.java | 6 +- .../klimt/sprite/ListSpriteDiagram.java | 4 +- .../plantuml/klimt/sprite/StdlibDiagram.java | 4 +- .../plantuml/mindmap/MindMapDiagram.java | 4 +- .../plantuml/nwdiag/NwDiagram.java | 4 +- .../command/CommandCreateEntityObject.java | 5 +- .../CommandCreateEntityObjectMultilines.java | 5 +- .../command/CommandCreateJson.java | 5 +- .../command/CommandCreateJsonSingleLine.java | 5 +- .../command/CommandCreateMap.java | 5 +- .../plantuml/project/GanttDiagram.java | 18 +- .../plantuml/project/GanttDiagramFactory.java | 22 +- .../project/TimeHeaderParameters.java | 3 +- .../project/command/CommandColorTask.java | 3 +- .../project/command/CommandFootbox.java | 5 +- .../project/command/CommandGanttArrow.java | 3 +- .../command/CommandHideResourceFootbox.java | 2 +- .../command/CommandHideResourceName.java | 2 +- .../project/command/CommandLabelOnColumn.java | 3 +- .../project/command/CommandLanguage.java | 2 +- .../project/command/CommandPrintBetween.java | 2 +- .../project/command/CommandPrintScale.java | 2 +- .../command/CommandTaskCompleteDefault.java | 1 - .../project/command/NaturalCommand.java | 14 +- .../plantuml/project/core/AbstractTask.java | 13 + .../plantuml/project/core/Task.java | 5 + .../project/draw/AbstractTaskDraw.java | 8 +- .../project/draw/TaskDrawDiamond.java | 10 +- .../plantuml/project/draw/TaskDrawGroup.java | 13 +- .../project/draw/TaskDrawRegular.java | 18 +- .../project/draw/TimeHeaderSimple.java | 14 +- .../project/draw/TimeHeaderYearly.java | 1 - .../project/lang/ComplementAnything.java | 2 +- ...lementBeforeOrAfterOrAtTaskStartOrEnd.java | 2 +- .../project/lang/ComplementClose.java | 2 +- .../project/lang/ComplementCompleted.java | 2 +- .../plantuml/project/lang/ComplementDate.java | 2 +- .../project/lang/ComplementDates.java | 2 +- .../project/lang/ComplementDayOfWeek.java | 2 +- .../project/lang/ComplementEmpty.java | 2 +- .../project/lang/ComplementFromTo.java | 2 +- .../project/lang/ComplementInColors.java | 2 +- .../project/lang/ComplementInColors2.java | 2 +- .../lang/ComplementInColorsFromTo.java | 2 +- .../project/lang/ComplementNamed.java | 2 +- .../plantuml/project/lang/ComplementOpen.java | 2 +- .../project/lang/ComplementSeveralDays.java | 2 +- .../plantuml/project/lang/ComplementTask.java | 2 +- .../plantuml/project/lang/ComplementUrl.java | 2 +- .../project/lang/ComplementWithColorLink.java | 2 +- .../project/lang/PairOfSomething.java | 16 +- .../plantuml/project/lang/Sentence.java | 10 +- .../plantuml/project/lang/SentenceAnd.java | 12 +- .../plantuml/project/lang/SentenceAndAnd.java | 14 +- .../lang/SentenceDisplayOnSameRowAs.java | 2 +- .../plantuml/project/lang/SentenceEnds.java | 2 +- .../project/lang/SentenceHappens.java | 2 +- .../project/lang/SentenceHappensDate.java | 2 +- .../project/lang/SentenceIsColored.java | 2 +- .../lang/SentenceIsColoredForCompletion.java | 2 +- .../project/lang/SentenceIsDeleted.java | 2 +- .../project/lang/SentenceIsDisplayedAs.java | 2 +- .../project/lang/SentenceIsForTask.java | 2 +- .../project/lang/SentenceLinksTo.java | 2 +- .../plantuml/project/lang/SentenceOccurs.java | 2 +- .../project/lang/SentencePausesDate.java | 2 +- .../project/lang/SentencePausesDates.java | 2 +- .../project/lang/SentencePausesDayOfWeek.java | 2 +- .../project/lang/SentenceRequire.java | 2 +- .../plantuml/project/lang/SentenceSimple.java | 24 +- .../lang/SentenceTaskEndsAbsolute.java | 2 +- .../lang/SentenceTaskEndsOnlyRelative.java | 2 +- .../project/lang/SentenceTaskStarts.java | 2 +- .../lang/SentenceTaskStartsAbsolute.java | 2 +- .../lang/SentenceTaskStartsOnlyRelative.java | 2 +- .../lang/SentenceTaskStartsWithColor.java | 4 +- .../plantuml/project/lang/Something.java | 6 +- .../plantuml/project/lang/Subject.java | 8 +- .../project/lang/SubjectDayAsDate.java | 12 +- .../project/lang/SubjectDayOfWeek.java | 12 +- .../project/lang/SubjectDaysAsDates.java | 14 +- .../plantuml/project/lang/SubjectLinks.java | 6 +- .../plantuml/project/lang/SubjectProject.java | 8 +- .../project/lang/SubjectResource.java | 22 +- .../project/lang/SubjectSeparator.java | 12 +- .../plantuml/project/lang/SubjectTask.java | 35 +- .../plantuml/project/lang/SubjectToday.java | 12 +- .../plantuml/project/lang/Words.java | 1 + .../plantuml/project/time/Day.java | 25 +- .../plantuml/regexdiagram/PSystemRegex.java | 11 +- .../regexdiagram/RegexExpression.java | 13 +- .../plantuml/salt/PSystemSalt.java | 3 +- .../sequencediagram/SequenceDiagram.java | 6 +- .../sequencediagram/command/CommandArrow.java | 5 +- .../command/CommandBoxStart.java | 4 +- .../command/CommandParticipantA.java | 6 +- .../command/CommandParticipantA2.java | 5 +- .../command/CommandParticipantA3.java | 5 +- .../command/CommandParticipantA4.java | 5 +- .../command/CommandParticipantMultilines.java | 5 +- .../plantuml/skin/UmlDiagramType.java | 5 +- .../command/CommandCreatePackage2.java | 5 +- .../command/CommandCreatePackageState.java | 5 +- .../command/CommandCreateState.java | 5 +- .../plantuml/stereo/Stereotype.java | 2 + .../plantuml/stereo/StereotypePattern.java | 71 ++ .../plantuml/sudoku/PSystemSudoku.java | 2 +- src/net/sourceforge/plantuml/tim/Eater.java | 2 +- .../plantuml/timingdiagram/TimingDiagram.java | 4 +- .../timingdiagram/command/CommandAnalog.java | 9 +- .../timingdiagram/command/CommandBinary.java | 9 +- .../command/CommandRobustConcise.java | 9 +- .../plantuml/version/PSystemLicense.java | 2 +- .../sourceforge/plantuml/version/Version.java | 2 +- .../plantuml/wbs/CommandWBSLink.java | 5 +- .../sourceforge/plantuml/wbs/WBSDiagram.java | 4 +- .../plantuml/wire/WireDiagram.java | 4 +- test/net/sourceforge/plantuml/PipeTest.java | 2 +- test/nonreg/RenderViaApiTest.java | 56 ++ test/nonreg/RenderViaPipeTest.java | 63 ++ test/nonreg/simple/A0003_Test.java | 2 +- 192 files changed, 2806 insertions(+), 611 deletions(-) create mode 100644 src/net/sourceforge/plantuml/chronology/ChronologyDiagram.java create mode 100644 src/net/sourceforge/plantuml/chronology/ChronologyDiagramFactory.java create mode 100644 src/net/sourceforge/plantuml/chronology/ComplementAnything.java create mode 100644 src/net/sourceforge/plantuml/chronology/ComplementHour.java create mode 100644 src/net/sourceforge/plantuml/chronology/HourPattern.java create mode 100644 src/net/sourceforge/plantuml/chronology/SentenceHappensChronology.java create mode 100644 src/net/sourceforge/plantuml/chronology/SubjectTask.java create mode 100644 src/net/sourceforge/plantuml/chronology/TaskChronology.java create mode 100644 src/net/sourceforge/plantuml/chronology/TimeHeaderChronology.java create mode 100644 src/net/sourceforge/plantuml/chronology/TimeScaleChronology.java create mode 100644 src/net/sourceforge/plantuml/stereo/StereotypePattern.java create mode 100644 test/nonreg/RenderViaApiTest.java create mode 100644 test/nonreg/RenderViaPipeTest.java diff --git a/gradle.properties b/gradle.properties index 2318ed74a..ee1cf3aff 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.13beta3 +version = 1.2023.13beta4 org.gradle.workers.max = 3 \ No newline at end of file diff --git a/src/com/plantuml/api/cheerpj/v1/DirectDraw.java b/src/com/plantuml/api/cheerpj/v1/DirectDraw.java index 295b0cc0b..88572fcf6 100644 --- a/src/com/plantuml/api/cheerpj/v1/DirectDraw.java +++ b/src/com/plantuml/api/cheerpj/v1/DirectDraw.java @@ -53,6 +53,7 @@ import net.sourceforge.plantuml.BlockUml; import net.sourceforge.plantuml.BlockUmlBuilder; import net.sourceforge.plantuml.ErrorUml; import net.sourceforge.plantuml.FileFormat; +import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.error.PSystemError; import net.sourceforge.plantuml.klimt.color.ColorMapper; @@ -122,7 +123,7 @@ public class DirectDraw { ug.apply(back).apply(back.bg()).draw(URectangle.build(frameWidth, frameHeight)); WasmLog.log("...drawing..."); - system.exportDiagramGraphic(ug); + system.exportDiagramGraphic(ug, new FileFormatOption(FileFormat.PNG)); WasmLog.log("done!"); diff --git a/src/com/plantuml/api/cheerpj/v1/Raw.java b/src/com/plantuml/api/cheerpj/v1/Raw.java index c8a12200e..e1ec34f5c 100644 --- a/src/com/plantuml/api/cheerpj/v1/Raw.java +++ b/src/com/plantuml/api/cheerpj/v1/Raw.java @@ -55,6 +55,7 @@ import net.sourceforge.plantuml.BlockUmlBuilder; import net.sourceforge.plantuml.EmptyImageBuilder; import net.sourceforge.plantuml.ErrorUml; import net.sourceforge.plantuml.FileFormat; +import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.api.ImageDataSimple; import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.core.ImageData; @@ -124,7 +125,7 @@ public class Raw { ug.resetMax(); WasmLog.log("...drawing..."); - system.exportDiagramGraphic(ug); + system.exportDiagramGraphic(ug, new FileFormatOption(FileFormat.PNG)); final int width = (int) (2 + ug.getMaxX()); final int height = (int) (2 + ug.getMaxY()); @@ -208,7 +209,7 @@ public class Raw { ug.resetMax(); WasmLog.log("...drawing..."); - system.exportDiagramGraphic(ug); + system.exportDiagramGraphic(ug, new FileFormatOption(FileFormat.PNG)); final int width = (int) (2 + ug.getMaxX()); final int height = (int) (2 + ug.getMaxY()); diff --git a/src/net/atmp/CucaDiagram.java b/src/net/atmp/CucaDiagram.java index d13c5fda3..c91cc88d6 100644 --- a/src/net/atmp/CucaDiagram.java +++ b/src/net/atmp/CucaDiagram.java @@ -376,13 +376,13 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy, // ::done @Override - final public void exportDiagramGraphic(UGraphic ug) { + final public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { final CucaDiagramFileMaker maker = new CucaDiagramFileMakerSmetana(this, ug.getStringBounder()); maker.createOneGraphic(ug); } @Override - final protected TextBlock getTextBlock() { + final protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/AbstractPSystem.java b/src/net/sourceforge/plantuml/AbstractPSystem.java index abebc8b07..e45fe9f16 100644 --- a/src/net/sourceforge/plantuml/AbstractPSystem.java +++ b/src/net/sourceforge/plantuml/AbstractPSystem.java @@ -114,14 +114,14 @@ public abstract class AbstractPSystem implements Diagram { } final public String getMetadata() { - if (source == null) + if (source == null) return getVersion(); - + final String rawString = source.getRawString("\n"); final String plainString = source.getPlainString("\n"); - if (rawString != null && rawString.equals(plainString)) + if (rawString != null && rawString.equals(plainString)) return rawString + BackSlash.NEWLINE + getVersion(); - + return rawString + BackSlash.NEWLINE + plainString + BackSlash.NEWLINE + getVersion(); } @@ -130,9 +130,9 @@ public abstract class AbstractPSystem implements Diagram { } final public long seed() { - if (source == null) + if (source == null) return 42; - + return getSource().seed(); } @@ -159,9 +159,9 @@ public abstract class AbstractPSystem implements Diagram { } public DisplayPositionned getTitle() { - if (source == null) + if (source == null) return DisplayPositioned.single(Display.empty(), HorizontalAlignment.CENTER, VerticalAlignment.TOP); - + return DisplayPositioned.single(source.getTitle(), HorizontalAlignment.CENTER, VerticalAlignment.TOP); } @@ -247,7 +247,7 @@ public abstract class AbstractPSystem implements Diagram { } @Override - public void exportDiagramGraphic(UGraphic ug) { + public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { final UFont font = UFont.monospaced(14); final FontConfiguration fc = FontConfiguration.blackBlueTrue(font); final UText text = UText.build("Not implemented yet for " + getClass().getName(), fc); diff --git a/src/net/sourceforge/plantuml/Option.java b/src/net/sourceforge/plantuml/Option.java index 2f1db45a0..401ee8bcf 100644 --- a/src/net/sourceforge/plantuml/Option.java +++ b/src/net/sourceforge/plantuml/Option.java @@ -440,9 +440,11 @@ public class Option { } else if (s.equalsIgnoreCase("-preproc")) { preprocessorOutput = OptionPreprocOutputMode.NORMAL; + setFileFormatOption(new FileFormatOption(FileFormat.PREPROC)); } else if (s.equalsIgnoreCase("-cypher")) { preprocessorOutput = OptionPreprocOutputMode.CYPHER; + setFileFormatOption(new FileFormatOption(FileFormat.PREPROC)); } else if (s.equalsIgnoreCase("-checkmetadata")) { checkMetadata = true; diff --git a/src/net/sourceforge/plantuml/PSystemBuilder.java b/src/net/sourceforge/plantuml/PSystemBuilder.java index e1e2a3e7b..5d1fbca15 100644 --- a/src/net/sourceforge/plantuml/PSystemBuilder.java +++ b/src/net/sourceforge/plantuml/PSystemBuilder.java @@ -48,6 +48,7 @@ import net.sourceforge.plantuml.activitydiagram3.ActivityDiagramFactory3; import net.sourceforge.plantuml.api.PSystemFactory; import net.sourceforge.plantuml.board.BoardDiagramFactory; import net.sourceforge.plantuml.bpm.BpmDiagramFactory; +import net.sourceforge.plantuml.chronology.ChronologyDiagramFactory; import net.sourceforge.plantuml.classdiagram.ClassDiagramFactory; import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.core.DiagramType; @@ -223,7 +224,8 @@ public class PSystemBuilder { // factories.add(new PSystemSudokuFactory()); // ::done - // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or __LGPL__ + // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or + // __LGPL__ factories.add(new PSystemJcckitFactory()); factories.add(new PSystemSudokuFactory()); // ::done @@ -247,11 +249,13 @@ public class PSystemBuilder { // ::done factories.add(new PSystemCharlieFactory()); - // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or __LGPL__ + // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or + // __LGPL__ factories.add(new PSystemXearthFactory()); // ::done factories.add(new GanttDiagramFactory()); + factories.add(new ChronologyDiagramFactory()); factories.add(new FlowDiagramFactory()); // ::comment when __CORE__ diff --git a/src/net/sourceforge/plantuml/PlainDiagram.java b/src/net/sourceforge/plantuml/PlainDiagram.java index 7945b7feb..88385e9e5 100644 --- a/src/net/sourceforge/plantuml/PlainDiagram.java +++ b/src/net/sourceforge/plantuml/PlainDiagram.java @@ -66,14 +66,13 @@ public abstract class PlainDiagram extends AbstractPSystem { } @Override - public void exportDiagramGraphic(UGraphic ug) { - final FileFormatOption option = new FileFormatOption(FileFormat.PNG); + public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { try { - final UDrawable rootDrawable = getRootDrawable(option); + final UDrawable rootDrawable = getRootDrawable(fileFormatOption); rootDrawable.drawU(ug); } catch (IOException e) { e.printStackTrace(); - super.exportDiagramGraphic(ug); + super.exportDiagramGraphic(ug, fileFormatOption); } } diff --git a/src/net/sourceforge/plantuml/SourceStringReader.java b/src/net/sourceforge/plantuml/SourceStringReader.java index 32e7f5ace..a31dfe233 100644 --- a/src/net/sourceforge/plantuml/SourceStringReader.java +++ b/src/net/sourceforge/plantuml/SourceStringReader.java @@ -54,6 +54,7 @@ import net.sourceforge.plantuml.klimt.shape.GraphicStrings; import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.preproc.Defines; import net.sourceforge.plantuml.security.SFile; +import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.utils.Log; public class SourceStringReader { @@ -157,6 +158,14 @@ public class SourceStringReader { noValidStartFound(os, fileFormatOption); return null; } + if (fileFormatOption.getFileFormat() == FileFormat.PREPROC) { + final BlockUml first = blocks.get(0); + for (StringLocated s : first.getData()) { + os.write(s.getString().getBytes(UTF_8)); + os.write("\n".getBytes(UTF_8)); + } + return new DiagramDescription("PREPROC"); + } for (BlockUml b : blocks) { final Diagram system = b.getDiagram(); final int nbInSystem = system.getNbImages(); @@ -231,7 +240,8 @@ public class SourceStringReader { } public ImageData noValidStartFound(OutputStream os, FileFormatOption fileFormatOption) throws IOException { - final TextBlock error = GraphicStrings.createForError(Arrays.asList("No valid @start/@end found, please check the version"), + final TextBlock error = GraphicStrings.createForError( + Arrays.asList("No valid @start/@end found, please check the version"), fileFormatOption.isUseRedForError()); return plainImageBuilder(error, fileFormatOption).write(os); diff --git a/src/net/sourceforge/plantuml/TitledDiagram.java b/src/net/sourceforge/plantuml/TitledDiagram.java index f5faeba59..9f365f86c 100644 --- a/src/net/sourceforge/plantuml/TitledDiagram.java +++ b/src/net/sourceforge/plantuml/TitledDiagram.java @@ -253,11 +253,11 @@ public abstract class TitledDiagram extends AbstractPSystem implements Diagram, } - protected abstract TextBlock getTextBlock(); + protected abstract TextBlock getTextMainBlock(FileFormatOption fileFormatOption); @Override - public void exportDiagramGraphic(UGraphic ug) { - final TextBlock textBlock = getTextBlock(); + public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { + final TextBlock textBlock = getTextMainBlock(fileFormatOption); textBlock.drawU(ug); } diff --git a/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkActivity.java b/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkActivity.java index 6daa6844e..143b3225d 100644 --- a/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkActivity.java +++ b/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkActivity.java @@ -61,6 +61,7 @@ import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexPartialMatch; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -81,9 +82,7 @@ public class CommandLinkActivity extends SingleLineCommand2 { new RegexLeaf("CODE", "([%pLN][%pLN_.]*)"), // new RegexLeaf("BAR", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), // new RegexLeaf("QUOTED", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN_.]+))?"))), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // ColorParser.exp2(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // @@ -105,9 +104,7 @@ public class CommandLinkActivity extends SingleLineCommand2 { new RegexLeaf("BAR2", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), // new RegexLeaf("QUOTED2", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN][%pLN_.]*))?"), // new RegexLeaf("QUOTED_INVISIBLE2", "(\\w.*?)")), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE2"), // new RegexOptional( // new RegexConcat( // new RegexLeaf("in"), // diff --git a/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkLongActivity.java b/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkLongActivity.java index 4e008bac8..75d2551e1 100644 --- a/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkLongActivity.java +++ b/src/net/sourceforge/plantuml/activitydiagram/command/CommandLinkLongActivity.java @@ -64,6 +64,7 @@ import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.text.BackSlash; import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.url.Url; @@ -91,9 +92,7 @@ public class CommandLinkLongActivity extends CommandMultilines2 new RegexLeaf("CODE", "([%pLN][%pLN_.]*)"), // new RegexLeaf("BAR", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), // new RegexLeaf("QUOTED", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN_.]+))?"))), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("BACKCOLOR", "(#\\w+)?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java b/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java index 488cff81b..cef3f0753 100644 --- a/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java +++ b/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java @@ -52,6 +52,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.utils.LineLocation; public class CommandPartition extends SingleLineCommand2 { @@ -69,9 +70,7 @@ public class CommandPartition extends SingleLineCommand2 { new RegexOr(// color().getRegex(), // new RegexLeaf("LEGACYCOLORIGNORED", "(#[0-9a-fA-F]{6}|#?\\w+)?")), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("\\{?"), // RegexLeaf.end()); } @@ -89,12 +88,10 @@ public class CommandPartition extends SingleLineCommand2 { final Entity p = diagram.getCurrentGroup(); final Colors colors = color().getColor(arg, diagram.getSkinParam().getIHtmlColorSet()); - if (colors.isEmpty() == false) { + if (colors.isEmpty() == false) p.setColors(colors); - } - if (arg.get("STEREOTYPE", 0) != null) { - p.setStereotype(Stereotype.build(arg.get("STEREOTYPE", 0))); - } + + p.setStereotype(Stereotype.build(arg.get("STEREOTYPE", 0))); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java b/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java index 009bed4dc..4378abb42 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java @@ -40,7 +40,6 @@ import java.io.OutputStream; import java.util.Map; import java.util.Objects; -import net.sourceforge.plantuml.FileFormat; import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.UmlDiagram; import net.sourceforge.plantuml.activitydiagram3.ftile.BoxStyle; @@ -208,8 +207,7 @@ public class ActivityDiagram3 extends UmlDiagram { } @Override - protected TextBlock getTextBlock() { - final FileFormatOption fileFormatOption = new FileFormatOption(FileFormat.PNG); + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam()); return getTextBlock(stringBounder); } @@ -318,10 +316,10 @@ public class ActivityDiagram3 extends UmlDiagram { return CommandExecutionResult.error("Cannot find switch"); } - public void startIf(Display test, Display whenThen, HColor color, Url url) { + public void startIf(Display test, Display whenThen, HColor color, Url url, Stereotype stereotype) { manageSwimlaneStrategy(); final InstructionIf instructionIf = new InstructionIf(swinlanes.getCurrentSwimlane(), current(), test, - LinkRendering.none().withDisplay(whenThen), nextLinkRenderer(), color, getSkinParam(), url); + LinkRendering.none().withDisplay(whenThen), nextLinkRenderer(), color, getSkinParam(), url, stereotype); current().add(instructionIf); setNextLinkRendererInternal(LinkRendering.none()); setCurrent(instructionIf); @@ -392,7 +390,8 @@ public class ActivityDiagram3 extends UmlDiagram { manageSwimlaneStrategy(); if (current() instanceof InstructionRepeat) { final InstructionRepeat instructionRepeat = (InstructionRepeat) current(); - instructionRepeat.setBackward(label, swinlanes.getCurrentSwimlane(), boxStyle, incoming1, incoming2, stereotype); + instructionRepeat.setBackward(label, swinlanes.getCurrentSwimlane(), boxStyle, incoming1, incoming2, + stereotype); return CommandExecutionResult.ok(); } if (current() instanceof InstructionWhile) { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/Branch.java b/src/net/sourceforge/plantuml/activitydiagram3/Branch.java index 0a25a1dc9..35270db4d 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/Branch.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/Branch.java @@ -57,6 +57,7 @@ import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.klimt.shape.TextBlockUtils; import net.sourceforge.plantuml.sequencediagram.NotePosition; import net.sourceforge.plantuml.sequencediagram.NoteType; +import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; @@ -95,12 +96,12 @@ public class Branch { } public Branch(StyleBuilder styleBuilder, Swimlane swimlane, LinkRendering labelPositive, Display labelTest, - HColor color, LinkRendering inlabel) { + HColor color, LinkRendering inlabel, Stereotype stereotype) { this.inlabel = Objects.requireNonNull(inlabel); this.labelTest = Objects.requireNonNull(labelTest); this.labelPositive = Objects.requireNonNull(labelPositive); - final Style style = getDefaultStyleDefinitionDiamond().getMergedStyle(styleBuilder); + final Style style = getDefaultStyleDefinitionDiamond().withTOBECHANGED(stereotype).getMergedStyle(styleBuilder); this.color = color == null ? style.value(PName.BackGroundColor).asColor(styleBuilder.getSkinParam().getIHtmlColorSet()) : color; diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java index 23ddbae23..ee2b423b8 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java @@ -47,7 +47,6 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.FtileDecorateWelding; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint; -import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.FtileWithNoteOpale; import net.sourceforge.plantuml.activitydiagram3.gtile.Gtile; import net.sourceforge.plantuml.activitydiagram3.gtile.GtileIfAlone; import net.sourceforge.plantuml.activitydiagram3.gtile.GtileIfHexagon; @@ -56,9 +55,9 @@ import net.sourceforge.plantuml.klimt.color.Colors; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.font.StringBounder; -import net.sourceforge.plantuml.klimt.geom.VerticalAlignment; import net.sourceforge.plantuml.sequencediagram.NotePosition; import net.sourceforge.plantuml.sequencediagram.NoteType; +import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.url.Url; @@ -75,6 +74,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC private Branch current; private final LinkRendering topInlinkRendering; private LinkRendering outColor = LinkRendering.none(); + private final Stereotype stereotype; private final Swimlane swimlane; @@ -91,14 +91,15 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC } public InstructionIf(Swimlane swimlane, Instruction parent, Display labelTest, LinkRendering whenThen, - LinkRendering inlinkRendering, HColor color, ISkinParam skinParam, Url url) { + LinkRendering inlinkRendering, HColor color, ISkinParam skinParam, Url url, Stereotype stereotype) { this.url = url; + this.stereotype = stereotype; this.parent = parent; this.skinParam = skinParam; this.topInlinkRendering = Objects.requireNonNull(inlinkRendering); this.swimlane = swimlane; this.thens.add(new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, labelTest, color, - LinkRendering.none())); + LinkRendering.none(), stereotype)); this.current = this.thens.get(0); } @@ -138,11 +139,11 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC if (elseBranch == null) this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(), - Display.NULL, null, LinkRendering.none()); + Display.NULL, null, LinkRendering.none(), stereotype); elseBranch.updateFtile(factory); Ftile result = factory.createIf(swimlane, thens, elseBranch, outColor, topInlinkRendering, url, - getPositionedNotes()); + getPositionedNotes(), stereotype); // if (getPositionedNotes().size() > 0) // result = FtileWithNoteOpale.create(result, getPositionedNotes(), false, VerticalAlignment.CENTER); @@ -169,7 +170,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC this.current.setInlinkRendering(nextLinkRenderer); this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenElse, Display.NULL, null, - LinkRendering.none()); + LinkRendering.none(), stereotype); this.current = elseBranch; return true; } @@ -180,7 +181,8 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC return false; this.current.setSpecial(nextLinkRenderer); - this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, test, color, inlabel); + this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, test, color, inlabel, + stereotype); this.thens.add(current); return true; @@ -190,7 +192,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC endifCalled = true; if (elseBranch == null) this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(), - Display.NULL, null, LinkRendering.none()); + Display.NULL, null, LinkRendering.none(), stereotype); this.elseBranch.setSpecial(nextLinkRenderer); this.current.setInlinkRendering(nextLinkRenderer); diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java index 9ed4ddb98..dc9efedc6 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java @@ -58,7 +58,7 @@ import net.sourceforge.plantuml.sequencediagram.NoteType; import net.sourceforge.plantuml.style.ISkinParam; public class InstructionSwitch extends WithNote implements Instruction, InstructionCollection { - // ::remove folder when __HAXE__ + // ::remove folder when __HAXE__ private final List switches = new ArrayList<>(); private final ISkinParam skinParam; @@ -166,7 +166,7 @@ public class InstructionSwitch extends WithNote implements Instruction, Instruct this.current.setSpecial(nextLinkRenderer); this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none().withDisplay(labelCase), labelCase, null, - LinkRendering.none().withDisplay(labelCase)); + LinkRendering.none().withDisplay(labelCase), null); this.switches.add(this.current); return true; } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java index a78abd2eb..4a38e0c61 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java @@ -52,6 +52,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -104,9 +105,7 @@ public class CommandActivity3 extends SingleLineCommand2 { return RegexConcat.build(CommandActivity3.class.getName(), RegexLeaf.start(), // UrlBuilder.OPTIONAL, // color().getRegex(), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf(":"), // new RegexLeaf("LABEL", "(.*?)"), // new RegexLeaf("STYLE", endingGroupShort()), // diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandArrow3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandArrow3.java index 6f7f93d18..643717928 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandArrow3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandArrow3.java @@ -78,9 +78,8 @@ public class CommandArrow3 extends SingleLineCommand2 { diagram.setColorNextArrow(rainbow); } final String label = arg.get("LABEL", 0); - if (label != null && label.length() > 0) { + if (label != null && label.length() > 0) diagram.setLabelNextArrow(Display.getWithNewlines(label)); - } return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf2.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf2.java index efd28fb28..fca210ab9 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf2.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf2.java @@ -47,6 +47,8 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; +import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -63,7 +65,7 @@ public class CommandIf2 extends SingleLineCommand2 { UrlBuilder.OPTIONAL, // ColorParser.exp4(), // new RegexLeaf("if"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf("\\("), // new RegexLeaf("TEST", "(.*?)"), // new RegexLeaf("\\)"), // @@ -85,9 +87,8 @@ public class CommandIf2 extends SingleLineCommand2 { final HColor color = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s); String test = arg.get("TEST", 0); - if (test.length() == 0) { + if (test.length() == 0) test = null; - } final Url url; if (arg.get("URL", 0) == null) { @@ -96,8 +97,9 @@ public class CommandIf2 extends SingleLineCommand2 { final UrlBuilder urlBuilder = new UrlBuilder(diagram.getSkinParam().getValue("topurl"), UrlMode.STRICT); url = urlBuilder.getUrl(arg.get("URL", 0)); } + final Stereotype stereotype = Stereotype.build(arg.get("STEREO", 0)); - diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, url); + diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, url, stereotype); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf4.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf4.java index 926746f8e..331389707 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf4.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIf4.java @@ -82,10 +82,10 @@ public class CommandIf4 extends SingleLineCommand2 { final HColor color = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s); String test = arg.get("TEST", 0); - if (test.length() == 0) { + if (test.length() == 0) test = null; - } - diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, null); + + diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, null, null); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIfLegacy1.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIfLegacy1.java index 7f1b9a30d..78f120eaa 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIfLegacy1.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandIfLegacy1.java @@ -72,7 +72,7 @@ public class CommandIfLegacy1 extends SingleLineCommand2 { protected CommandExecutionResult executeArg(ActivityDiagram3 diagram, LineLocation location, RegexResult arg) { diagram.startIf(Display.getWithNewlines(arg.get("TEST", 0)), Display.getWithNewlines(arg.get("WHEN", 0)), null, - null); + null, null); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandPartition3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandPartition3.java index 63132a782..3e7dcc420 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandPartition3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandPartition3.java @@ -54,6 +54,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.utils.LineLocation; @@ -77,9 +78,7 @@ public class CommandPartition3 extends SingleLineCommand2 { new RegexConcat( // RegexLeaf.spaceOneOrMore(), // color("BACK2").getRegex())), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf("\\{?"), // RegexLeaf.end()); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandRepeat3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandRepeat3.java index 6289d2b60..82170a3e8 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandRepeat3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandRepeat3.java @@ -52,6 +52,7 @@ import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.utils.LineLocation; public class CommandRepeat3 extends SingleLineCommand2 { @@ -62,7 +63,7 @@ public class CommandRepeat3 extends SingleLineCommand2 { static IRegex getRegexConcat() { return RegexConcat.build(CommandRepeat3.class.getName(), RegexLeaf.start(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // + StereotypePattern.optional("STEREO"), // ColorParser.exp4(), // new RegexLeaf("repeat"), // RegexLeaf.spaceZeroOrMore(), // diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/FtileFactory.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/FtileFactory.java index 897491f1b..ada34034c 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/FtileFactory.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/FtileFactory.java @@ -89,7 +89,7 @@ public interface FtileFactory { HColor color, Instruction specialOut, Ftile backward, LinkRendering incoming1, LinkRendering incoming2); public Ftile createIf(Swimlane swimlane, List thens, Branch elseBranch, LinkRendering outColor, - LinkRendering topInlinkRendering, Url url, Collection notes); + LinkRendering topInlinkRendering, Url url, Collection notes, Stereotype stereotype); public Ftile createSwitch(Swimlane swimlane, List branches, LinkRendering afterEndwhile, LinkRendering topInlinkRendering, Display labelTest); diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/FtileFactoryDelegator.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/FtileFactoryDelegator.java index 5969966ce..c95352ecb 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/FtileFactoryDelegator.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/FtileFactoryDelegator.java @@ -188,8 +188,8 @@ public class FtileFactoryDelegator implements FtileFactory { @Override public Ftile createIf(Swimlane swimlane, List thens, Branch elseBranch, LinkRendering afterEndwhile, - LinkRendering topInlinkRendering, Url url, Collection notes) { - return factory.createIf(swimlane, thens, elseBranch, afterEndwhile, topInlinkRendering, url, notes); + LinkRendering topInlinkRendering, Url url, Collection notes, Stereotype stereotype) { + return factory.createIf(swimlane, thens, elseBranch, afterEndwhile, topInlinkRendering, url, notes, stereotype); } @Override diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileFactoryDelegatorIf.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileFactoryDelegatorIf.java index 4330e476b..bd116dc3f 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileFactoryDelegatorIf.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileFactoryDelegatorIf.java @@ -48,6 +48,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond.ConditionalBuilder; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.skin.Pragma; +import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.svek.ConditionEndStyle; @@ -65,14 +66,14 @@ public class FtileFactoryDelegatorIf extends FtileFactoryDelegator { @Override public Ftile createIf(Swimlane swimlane, List thens, Branch elseBranch, LinkRendering afterEndwhile, - LinkRendering topInlinkRendering, Url url, Collection notes) { + LinkRendering topInlinkRendering, Url url, Collection notes, Stereotype stereotype) { final ConditionStyle conditionStyle = skinParam().getConditionStyle(); final ConditionEndStyle conditionEndStyle = skinParam().getConditionEndStyle(); final Branch branch0 = thens.get(0); final Style styleArrow = getDefaultStyleDefinitionArrow().getMergedStyle(skinParam().getCurrentStyleBuilder()); - final Style styleDiamond = getDefaultStyleDefinitionDiamond() + final Style styleDiamond = getDefaultStyleDefinitionDiamond().withTOBECHANGED(stereotype) .getMergedStyle(skinParam().getCurrentStyleBuilder()); final HColor backColor = branch0.getColor() == null ? styleDiamond.value(PName.BackGroundColor).asColor(skinParam().getIHtmlColorSet()) diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileForkInner.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileForkInner.java index fd6a1a7cb..924829dd3 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileForkInner.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileForkInner.java @@ -81,9 +81,9 @@ class FtileForkInner extends AbstractFtile { public static Set mergeSwimlanes(List tiles) { final Set result = new HashSet<>(); - for (Ftile tile : tiles) { + for (Ftile tile : tiles) result.addAll(tile.getSwimlanes()); - } + return Collections.unmodifiableSet(result); } @@ -105,9 +105,9 @@ class FtileForkInner extends AbstractFtile { for (Ftile ftile : forks) { final XDimension2D dim = ftile.calculateDimension(stringBounder); width += dim.getWidth(); - if (dim.getHeight() > height) { + if (dim.getHeight() > height) height = dim.getHeight(); - } + } final XDimension2D dimTotal = new XDimension2D(width, height); return new FtileGeometry(dimTotal, dimTotal.getWidth() / 2, 0, dimTotal.getHeight()); @@ -116,9 +116,9 @@ class FtileForkInner extends AbstractFtile { public UTranslate getTranslateFor(Ftile searched, StringBounder stringBounder) { double xpos = 0; for (Ftile ftile : forks) { - if (ftile == searched) { + if (ftile == searched) return UTranslate.dx(xpos); - } + final XDimension2D dim = ftile.calculateDimension(stringBounder); xpos += dim.getWidth(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderFork.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderFork.java index 053470efe..90ce41f44 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderFork.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderFork.java @@ -85,7 +85,7 @@ public class ParallelBuilderFork extends AbstractParallelFtilesBuilder { Ftile result = middle; final List conns = new ArrayList<>(); final Swimlane swimlaneBlack = in; - final Style style = getStyleSignature().getMergedStyle(skinParam().getCurrentStyleBuilder()); + final Style style = getStyleSignatureArrow().getMergedStyle(skinParam().getCurrentStyleBuilder()); final Ftile black = new FtileBlackBlock(skinParam(), swimlaneBlack); double x = 0; for (Ftile tmp : list99) { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/VCompactFactory.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/VCompactFactory.java index 267511711..e2ee4eaa6 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/VCompactFactory.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/VCompactFactory.java @@ -169,7 +169,7 @@ public class VCompactFactory implements FtileFactory { @Override public Ftile createIf(Swimlane swimlane, List thens, Branch elseBranch, LinkRendering afterEndwhile, - LinkRendering topInlinkRendering, Url url, Collection notes) { + LinkRendering topInlinkRendering, Url url, Collection notes, Stereotype stereotype) { final List ftiles = new ArrayList<>(); for (Branch branch : thens) ftiles.add(branch.getFtile()); diff --git a/src/net/sourceforge/plantuml/board/BoardDiagram.java b/src/net/sourceforge/plantuml/board/BoardDiagram.java index 266c7cb8f..f7fc67e1b 100644 --- a/src/net/sourceforge/plantuml/board/BoardDiagram.java +++ b/src/net/sourceforge/plantuml/board/BoardDiagram.java @@ -73,11 +73,11 @@ public class BoardDiagram extends UmlDiagram { protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { diff --git a/src/net/sourceforge/plantuml/bpm/BpmDiagram.java b/src/net/sourceforge/plantuml/bpm/BpmDiagram.java index 2cbc3663e..c568879e4 100644 --- a/src/net/sourceforge/plantuml/bpm/BpmDiagram.java +++ b/src/net/sourceforge/plantuml/bpm/BpmDiagram.java @@ -194,7 +194,7 @@ public class BpmDiagram extends UmlDiagram { } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { throw new UnsupportedOperationException(); } } diff --git a/src/net/sourceforge/plantuml/chronology/ChronologyDiagram.java b/src/net/sourceforge/plantuml/chronology/ChronologyDiagram.java new file mode 100644 index 000000000..9731c3506 --- /dev/null +++ b/src/net/sourceforge/plantuml/chronology/ChronologyDiagram.java @@ -0,0 +1,853 @@ +/* ======================================================================== + * 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.chronology; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; + +import net.sourceforge.plantuml.FileFormatOption; +import net.sourceforge.plantuml.TitledDiagram; +import net.sourceforge.plantuml.WithSprite; +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.core.DiagramDescription; +import net.sourceforge.plantuml.core.ImageData; +import net.sourceforge.plantuml.core.UmlSource; +import net.sourceforge.plantuml.klimt.UTranslate; +import net.sourceforge.plantuml.klimt.color.HColorSet; +import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.StringBounder; +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.project.GanttStyle; +import net.sourceforge.plantuml.project.LabelPosition; +import net.sourceforge.plantuml.project.LabelStrategy; +import net.sourceforge.plantuml.project.LoadPlanable; +import net.sourceforge.plantuml.project.TimeHeaderParameters; +import net.sourceforge.plantuml.project.ToTaskDraw; +import net.sourceforge.plantuml.project.core.PrintScale; +import net.sourceforge.plantuml.project.core.Task; +import net.sourceforge.plantuml.project.core.TaskCode; +import net.sourceforge.plantuml.project.core.TaskGroup; +import net.sourceforge.plantuml.project.draw.TaskDraw; +import net.sourceforge.plantuml.project.draw.TaskDrawDiamond; +import net.sourceforge.plantuml.project.draw.TimeHeader; +import net.sourceforge.plantuml.project.time.Day; +import net.sourceforge.plantuml.project.timescale.TimeScale; +import net.sourceforge.plantuml.real.Real; +import net.sourceforge.plantuml.real.RealOrigin; +import net.sourceforge.plantuml.real.RealUtils; +import net.sourceforge.plantuml.skin.UmlDiagramType; +import net.sourceforge.plantuml.style.SName; +import net.sourceforge.plantuml.style.Style; +import net.sourceforge.plantuml.style.StyleSignatureBasic; + +public class ChronologyDiagram extends TitledDiagram implements ToTaskDraw, WithSprite, GanttStyle { + + private final Map draws = new LinkedHashMap(); + private final Map tasks = new LinkedHashMap(); + private final Map byShortName = new HashMap(); +// private final List constraints = new ArrayList<>(); + private final HColorSet colorSet = HColorSet.instance(); +// +// private final OpenClose openClose = new OpenClose(); +// +// private final Map resources = new LinkedHashMap(); +// private final Map colorDaysToday = new HashMap(); +// private final Map colorDaysInternal = new HashMap(); +// private final Map colorDaysOfWeek = new HashMap(); +// private final Map nameDays = new HashMap(); + private LabelStrategy labelStrategy = new LabelStrategy(LabelPosition.LEGACY, HorizontalAlignment.LEFT); +// +// // Let's follow ISO-8601 rules +// private WeekNumberStrategy weekNumberStrategy = new WeekNumberStrategy(DayOfWeek.MONDAY, 4); +// +// private PrintScale printScale = PrintScale.DAILY; +// private double factorScale = 1.0; + private Locale locale = Locale.ENGLISH; +// +// private Day today; +// private double totalHeightWithoutFooter; + private Day min; + private Day max; + private TimeScaleChronology timeScale; +// +// private Day printStart; +// private Day printEnd; +// + private final RealOrigin origin = RealUtils.createOrigin(); +// +// private int defaultCompletion = 100; +// +// private Task it; +// private Resource they; + + public CommandExecutionResult changeLanguage(String lang) { + this.locale = new Locale(lang); + return CommandExecutionResult.ok(); + } + + public DiagramDescription getDescription() { + return new DiagramDescription("(Chronology)"); + } + +// public void setWeekNumberStrategy(DayOfWeek firstDayOfWeek, int minimalDaysInFirstWeek) { +// this.weekNumberStrategy = new WeekNumberStrategy(firstDayOfWeek, minimalDaysInFirstWeek); +// } + + public ChronologyDiagram(UmlSource source) { + super(source, UmlDiagramType.CHRONOLOGY, null); + } + +// public final int getDpi(FileFormatOption fileFormatOption) { +// return 96; +// } + + @Override + protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption) + throws IOException { + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); + } + +// public void setPrintScale(PrintScale printScale) { +// this.printScale = printScale; +// } +// +// public void setFactorScale(double factorScale) { +// this.factorScale = factorScale; +// } +// +// private double getFactorScale() { +// return this.printScale.getDefaultScale() * this.factorScale; +// } +// +// private boolean isHidden(Task task) { +// if (printStart == null || task instanceof TaskSeparator) +// return false; +// +// if (task.getEnd().compareTo(min) < 0) +// return true; +// +// if (task.getStart().compareTo(max) > 0) +// return true; +// +// return false; +// } +// +// @Override +// public String checkFinalError() { +// try { +// initMinMax(); +// } catch (ImpossibleSolvingException ex) { +// return ex.getMessage(); +// } +// return null; +// } + + @Override + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { + final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam()); + initMinMax(); + + final TimeHeader timeHeader = new TimeHeaderChronology(stringBounder, thParam(), PrintScale.DAILY, + this.timeScale); + initTaskAndResourceDraws(timeHeader.getTimeScale(), timeHeader.getFullHeaderHeight(stringBounder), + stringBounder); + + return new AbstractTextBlock() { + public XDimension2D calculateDimension(StringBounder stringBounder) { + return new XDimension2D(1000, 1000); + } + + @Override + public void drawU(UGraphic ug) { + timeHeader.drawTimeHeader(ug, 200); + drawTasksRect(ug); + drawTasksTitle(ug, 0, 0); + } + }; + + } + +// +// private double getTitlesColumnWidth(StringBounder stringBounder) { +// if (labelStrategy.titleInside()) +// return 0; +// +// double width = 0; +// for (Task task : tasks.values()) { +// if (isHidden(task)) +// continue; +// +// width = Math.max(width, draws.get(task).getTitleWidth(stringBounder)); +// } +// return width; +// } +// +// public XDimension2D calculateDimension(StringBounder stringBounder) { +// return new XDimension2D(getTitlesColumnWidth(stringBounder) + getBarsColumnWidth(timeHeader), +// getTotalHeight(stringBounder, timeHeader)); +// } +// +// private double getBarsColumnWidth(final TimeHeader timeHeader) { +// final double xmin = timeHeader.getTimeScale().getStartingPosition(min); +// final double xmax = timeHeader.getTimeScale().getEndingPosition(max); +// return xmax - xmin; +// } +// +// }; +// } +// +// private TimeHeader getTimeHeader(StringBounder stringBounder) { +// if (openClose.getStartingDay() == null) +// return new TimeHeaderSimple(stringBounder, thParam(), printScale); +// else if (printScale == PrintScale.DAILY) +// return new TimeHeaderDaily(stringBounder, thParam(), nameDays, printStart, printEnd); +// else if (printScale == PrintScale.WEEKLY) +// return new TimeHeaderWeekly(stringBounder, thParam(), weekNumberStrategy, withCalendarDate); +// else if (printScale == PrintScale.MONTHLY) +// return new TimeHeaderMonthly(stringBounder, thParam()); +// else if (printScale == PrintScale.QUARTERLY) +// return new TimeHeaderQuarterly(stringBounder, thParam()); +// else if (printScale == PrintScale.YEARLY) +// return new TimeHeaderYearly(stringBounder, thParam()); +// else +// throw new IllegalStateException(); +// +// } + + private TimeHeaderParameters thParam() { + return new TimeHeaderParameters(null, 1, min, max, getIHtmlColorSet(), locale, null, null, null, this); + } + +// private Map colorDays() { +// colorDaysInternal.putAll(colorDaysToday); +// return Collections.unmodifiableMap(colorDaysInternal); +// } + + @Override + public final Style getStyle(SName param) { + return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, param) + .getMergedStyle(getCurrentStyleBuilder()); + } + + @Override + public final Style getStyle(SName param1, SName param2) { + return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, param1, param2) + .getMergedStyle(getCurrentStyleBuilder()); + } + +// private double getTotalHeight(StringBounder stringBounder, TimeHeader timeHeader) { +// if (showFootbox) +// return totalHeightWithoutFooter + timeHeader.getTimeFooterHeight(stringBounder); +// +// return totalHeightWithoutFooter; +// } + + private void drawTasksRect(UGraphic ug) { + for (Task task : tasks.values()) { +// if (isHidden(task)) +// continue; + + final TaskDraw draw = draws.get(task); + final UTranslate move = UTranslate.dy(draw.getY(ug.getStringBounder()).getCurrentValue()); + draw.drawU(ug.apply(move)); + } + } + +// private void drawConstraints(final UGraphic ug, TimeScale timeScale) { +// for (GanttConstraint constraint : constraints) { +// if (printStart != null && constraint.isHidden(min, max)) +// continue; +// +// constraint.getUDrawable(timeScale, this).drawU(ug); +// } +// +// } +// +// public StyleSignatureBasic getDefaultStyleDefinitionArrow() { +// return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.arrow); +// } + + private void drawTasksTitle(UGraphic ug, double colTitles, double colBars) { + for (Task task : tasks.values()) { +// if (isHidden(task)) +// continue; + + final TaskDraw draw = draws.get(task); + final UTranslate move = UTranslate.dy(draw.getY(ug.getStringBounder()).getCurrentValue()); + draw.drawTitle(ug.apply(move), labelStrategy, colTitles, colBars); + } + } + +// private void drawResources(UGraphic ug) { +// for (Resource res : resources.values()) { +// final ResourceDraw draw = res.getResourceDraw(); +// final UTranslate move = UTranslate.dy(draw.getY()); +// draw.drawU(ug.apply(move)); +// } +// } +// +// public void closeDayOfWeek(DayOfWeek day, String task) { +// openClose.close(day); +// } +// +// public void openDayOfWeek(DayOfWeek day, String task) { +// if (task.length() == 0) +// openClose.open(day); +// else +// getOpenCloseForTask(task).open(day); +// } +// +// public void closeDayAsDate(Day day, String task) { +// if (task.length() == 0) +// openClose.close(day); +// else +// getOpenCloseForTask(task).close(day); +// +// } +// +// public void openDayAsDate(Day day, String task) { +// if (task.length() == 0) +// openClose.open(day); +// else +// getOpenCloseForTask(task).open(day); +// +// } +// +// private OpenClose getOpenCloseForTask(String task) { +// OpenClose except = openCloseForTask.get(task); +// if (except == null) { +// except = new OpenClose(); +// openCloseForTask.put(task, except); +// } +// return except; +// } +// +// private final Map openCloseForTask = new HashMap<>(); +// + private void initTaskAndResourceDraws(TimeScale timeScale, double headerHeight, StringBounder stringBounder) { + Real y = origin; + y = y.addFixed(headerHeight); + for (Task task : tasks.values()) { + final TaskDraw draw; + final String disp = task.getCode().getSimpleDisplay(); + draw = new TaskDrawDiamond(timeScale, y, disp, task.getStart(), task, this, task.getStyleBuilder()); + final double height = draw.getFullHeightTask(stringBounder); + y = y.addAtLeast(height); +// if (task instanceof TaskSeparator) { +// final TaskSeparator taskSeparator = (TaskSeparator) task; +// draw = new TaskDrawSeparator(taskSeparator.getName(), timeScale, y, min, max, task.getStyleBuilder(), +// getSkinParam().getIHtmlColorSet()); +// } else if (task instanceof TaskGroup) { +// final TaskGroup taskGroup = (TaskGroup) task; +// draw = new TaskDrawGroup(timeScale, y, taskGroup.getCode().getSimpleDisplay(), getStart(taskGroup), +// getEnd(taskGroup), task, this, task.getStyleBuilder()); +// } else { +// final TaskImpl tmp = (TaskImpl) task; +// final String disp = hideResourceName ? tmp.getCode().getSimpleDisplay() : tmp.getPrettyDisplay(); +// if (tmp.isDiamond()) { +// draw = new TaskDrawDiamond(timeScale, y, disp, getStart(tmp), task, this, task.getStyleBuilder()); +// } else { +// final boolean oddStart = printStart != null && min.compareTo(getStart(tmp)) == 0; +// final boolean oddEnd = printStart != null && max.compareTo(getEnd(tmp)) == 0; +// draw = new TaskDrawRegular(timeScale, y, disp, getStart(tmp), getEnd(tmp), oddStart, oddEnd, +// getSkinParam(), task, this, getConstraints(task), task.getStyleBuilder()); +// } +// draw.setColorsAndCompletion(tmp.getColors(), tmp.getCompletion(), tmp.getUrl(), tmp.getNote()); +// } +// if (task.getRow() == null) +// y = y.addAtLeast(draw.getFullHeightTask(stringBounder)); +// + draws.put(task, draw); + } +// origin.compileNow(); +// magicPush(stringBounder); +// double yy = lastY(stringBounder); +// if (yy == 0) { +// yy = headerHeight; +// } else if (this.hideResourceFoobox == false) +// for (Resource res : resources.values()) { +// final ResourceDraw draw = buildResourceDraw(this, res, timeScale, yy, min, max); +// res.setTaskDraw(draw); +// yy += draw.getHeight(stringBounder); +// } +// +// this.totalHeightWithoutFooter = yy; + } + +// +// private ResourceDraw buildResourceDraw(ChronologyDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, +// Day max) { +// return new ResourceDrawBasic(gantt, res, timeScale, y, min, max); +// // return new ResourceDrawVersion2(gantt, res, timeScale, y, min, max); +// } +// +// private Collection getConstraints(Task task) { +// final List result = new ArrayList<>(); +// for (GanttConstraint constraint : constraints) { +// if (constraint.isOn(task)) +// result.add(constraint); +// +// } +// return Collections.unmodifiableCollection(result); +// } +// +// private double lastY(StringBounder stringBounder) { +// double result = 0; +// for (TaskDraw td : draws.values()) +// result = Math.max(result, td.getY(stringBounder).getCurrentValue() + td.getHeightMax(stringBounder)); +// +// return result; +// } +// +// private void magicPush(StringBounder stringBounder) { +// final List notes = new ArrayList<>(); +// for (TaskDraw td : draws.values()) { +// final FingerPrint taskPrint = td.getFingerPrint(stringBounder); +// final FingerPrint fingerPrintNote = td.getFingerPrintNote(stringBounder); +// +// if (td.getTrueRow() == null) +// for (TaskDraw note : notes) { +// final FingerPrint otherNote = note.getFingerPrintNote(stringBounder); +// final double deltaY = otherNote.overlap(taskPrint); +// if (deltaY > 0) { +// final Real bottom = note.getY(stringBounder).addAtLeast(note.getHeightMax(stringBounder)); +// td.getY(stringBounder).ensureBiggerThan(bottom); +// origin.compileNow(); +// } +// +// } +// +// if (fingerPrintNote != null) +// notes.add(td); +// +// } +// } +// +// private Day getStart(final Task tmp) { +// if (printStart == null) +// return tmp.getStart(); +// +// return Day.max(min, tmp.getStart()); +// } +// +// private Day getEnd(final Task tmp) { +// if (printStart == null) +// return tmp.getEnd(); +// +// return Day.min(max, tmp.getEnd()); +// } +// + private void initMinMax() { + if (tasks.size() == 0) { + throw new IllegalStateException(); + } + for (Task task : tasks.values()) { + if (this.min == null || this.max == null) { + this.min = task.getStart(); + this.max = task.getEnd(); + continue; + + } + if (this.min.compareTo(task.getStart()) > 0) + this.min = task.getStart(); + if (this.max.compareTo(task.getEnd()) < 0) + this.max = task.getEnd(); + } + + this.min = this.min.roundDayDown(); + this.max = this.max.roundDayUp(); + + this.timeScale = new TimeScaleChronology(1000); + this.timeScale.setMin(this.min.getMillis()); + this.timeScale.setMax(this.max.getMillis()); + } + +// public Day getThenDate() { +// Day result = getStartingDate(); +// for (Day d : colorDays().keySet()) +// if (d.compareTo(result) > 0) +// result = d; +// +// for (Day d : nameDays.keySet()) +// if (d.compareTo(result) > 0) +// result = d; +// +// return result; +// } +// +// public Task getExistingTask(String id) { +// final Task result = byShortName.get(Objects.requireNonNull(id)); +// if (result != null) +// return result; +// +// final TaskCode code = new TaskCode(id); +// return tasks.get(code); +// } +// +// public GanttConstraint forceTaskOrder(Task task1, Task task2) { +// final TaskInstant end1 = new TaskInstant(task1, TaskAttribute.END); +// task2.setStart(end1.getInstantPrecise()); +// final GanttConstraint result = new GanttConstraint(this.getIHtmlColorSet(), +// getSkinParam().getCurrentStyleBuilder(), end1, new TaskInstant(task2, TaskAttribute.START)); +// addContraint(result); +// return result; +// } + + public Task getOrCreateTask(String codeOrShortName, String shortName, boolean linkedToPrevious) { + Objects.requireNonNull(codeOrShortName); + Task result = shortName == null ? null : byShortName.get(shortName); + if (result != null) + return result; + + result = byShortName.get(codeOrShortName); + if (result != null) + return result; + + final TaskCode code = new TaskCode(codeOrShortName); + result = tasks.get(code); + if (result == null) { + + result = new TaskChronology(getSkinParam().getCurrentStyleBuilder(), code); + if (currentGroup != null) + currentGroup.addTask(result); + + tasks.put(code, result); + if (byShortName != null) + byShortName.put(shortName, result); + + } + return result; + } + +// private Task getLastCreatedTask() { +// final List all = new ArrayList<>(tasks.values()); +// for (int i = all.size() - 1; i >= 0; i--) +// if (all.get(i) instanceof TaskImpl) +// return all.get(i); +// +// return null; +// } +// +// public void addSeparator(String comment) { +// TaskSeparator separator = new TaskSeparator(getSkinParam().getCurrentStyleBuilder(), comment, tasks.size()); +// tasks.put(separator.getCode(), separator); +// } +// + private TaskGroup currentGroup = null; +// +// public CommandExecutionResult addGroup(String name) { +// TaskGroup group = new TaskGroup(this.currentGroup, getSkinParam().getCurrentStyleBuilder(), name); +// +// if (this.currentGroup != null) +// this.currentGroup.addTask(group); +// +// this.currentGroup = group; +// tasks.put(group.getCode(), group); +// return CommandExecutionResult.ok(); +// } +// +// public CommandExecutionResult endGroup() { +// if (this.currentGroup == null) +// return CommandExecutionResult.error("No group to be closed"); +// +// this.currentGroup = this.currentGroup.getParent(); +// +// return CommandExecutionResult.ok(); +// } +// +// public void addContraint(GanttConstraint constraint) { +// constraints.add(constraint); +// } +// +// public HColorSet getIHtmlColorSet() { +// return colorSet; +// } +// +// public void setProjectStartingDate(Day start) { +// openClose.setStartingDay(start); +// this.min = start; +// } +// +// public Day getStartingDate() { +// if (openClose.getStartingDay() == null) +// return min; +// +// return openClose.getStartingDay(); +// } +// +// public Day getEndingDate() { +// initMinMax(); +// return max; +// } +// +// public int daysInWeek() { +// return openClose.daysInWeek(); +// } +// +// public boolean isOpen(Day day) { +// return openClose.getLoadAt(day) > 0; +// } +// +// public boolean affectResource(Task result, String description) { +// final Pattern p = Pattern.compile("([^:]+)(:(\\d+))?"); +// final Matcher m = p.matcher(description); +// if (m.find() == false) +// throw new IllegalArgumentException(); +// +// final Resource resource = getResource(m.group(1)); +// int percentage = 100; +// if (m.group(3) != null) +// percentage = Integer.parseInt(m.group(3)); +// +// if (percentage == 0) +// return false; +// +// result.addResource(resource, percentage); +// return true; +// } +// +// public Resource getResource(String resourceName) { +// Resource resource = resources.get(resourceName); +// if (resource == null) +// resource = new Resource(resourceName); +// +// resources.put(resourceName, resource); +// return resource; +// } +// +// public int getLoadForResource(Resource res, Day i) { +// int result = 0; +// for (Task task : tasks.values()) { +// if (task instanceof TaskSeparator) +// continue; +// +// final TaskImpl task2 = (TaskImpl) task; +// result += task2.loadForResource(res, i); +// } +// return result; +// } +// +// public Moment getExistingMoment(String id) { +// Moment result = getExistingTask(id); +// if (result == null) { +// Day start = null; +// Day end = null; +// for (Map.Entry ent : nameDays.entrySet()) { +// if (ent.getValue().equalsIgnoreCase(id) == false) +// continue; +// +// start = min(start, ent.getKey()); +// end = max(end, ent.getKey()); +// } +// if (start != null) +// result = new MomentImpl(start, end); +// +// } +// return result; +// } +// +// private Day min(Day d1, Day d2) { +// if (d1 == null) +// return d2; +// +// if (d1.compareTo(d2) > 0) +// return d2; +// +// return d1; +// } +// +// private Day max(Day d1, Day d2) { +// if (d1 == null) +// return d2; +// +// if (d1.compareTo(d2) < 0) +// return d2; +// +// return d1; +// } +// +// public void colorDay(Day day, HColor color) { +// colorDaysInternal.put(day, color); +// } +// +// public void colorDay(DayOfWeek day, HColor color) { +// colorDaysOfWeek.put(day, color); +// } +// +// public void nameDay(Day day, String name) { +// nameDays.put(day, name); +// } +// +// public Day getToday() { +// if (today == null) +// this.today = Day.today(); +// +// return today; +// } +// +// public void setTodayColors(CenterBorderColor colors) { +// if (today == null) +// this.today = Day.today(); +// +// colorDaysToday.put(today, colors.getCenter()); +// } +// +// public CommandExecutionResult setToday(Day date) { +// this.today = date; +// return CommandExecutionResult.ok(); +// } +// +// public CommandExecutionResult deleteTask(Task task) { +// task.setColors(new CenterBorderColor(HColors.WHITE, HColors.BLACK)); +// return CommandExecutionResult.ok(); +// } +// +// public void setPrintInterval(Day start, Day end) { +// this.printStart = start; +// this.printEnd = end; +// } +// +// public TaskDraw getTaskDraw(Task task) { +// return draws.get(task); +// } +// +// public CommandExecutionResult addNote(Display note) { +// Task last = null; +// for (Task current : tasks.values()) +// last = current; +// if (last == null) +// return CommandExecutionResult.error("No task defined"); +// +// last.setNote(note); +// return CommandExecutionResult.ok(); +// } + + public LoadPlanable getDefaultPlan() { + throw new UnsupportedOperationException(); + } + + @Override + public TaskDraw getTaskDraw(Task task) { + // TODO Auto-generated method stub + return null; + } + + @Override + public HColorSet getIHtmlColorSet() { + return colorSet; + } + +// private boolean showFootbox = true; +// +// public void setShowFootbox(boolean footbox) { +// this.showFootbox = footbox; +// +// } +// +// @Override +// public ClockwiseTopRightBottomLeft getDefaultMargins() { +// return ClockwiseTopRightBottomLeft.none(); +// } +// +// public void setLabelStrategy(LabelStrategy strategy) { +// this.labelStrategy = strategy; +// } +// +// private boolean withCalendarDate; +// +// public void setWithCalendarDate(boolean withCalendarDate) { +// this.withCalendarDate = withCalendarDate; +// } +// +// private boolean hideResourceName; +// private boolean hideResourceFoobox; +// +// public CommandExecutionResult hideResourceName() { +// this.hideResourceName = true; +// return CommandExecutionResult.ok(); +// } +// +// public CommandExecutionResult hideResourceFootbox() { +// this.hideResourceFoobox = true; +// return CommandExecutionResult.ok(); +// } +// +// private final Set verticalSeparatorBefore = new HashSet<>(); +// +// public void addVerticalSeparatorBefore(Day day) { +// verticalSeparatorBefore.add(day); +// } +// +// public void setTaskDefaultCompletion(int defaultCompletion) { +// this.defaultCompletion = defaultCompletion; +// } +// +// public List getAllTasksForResource(Resource res) { +// final List result = new ArrayList(); +// for (Task task : tasks.values()) +// if (task.isAssignedTo(res)) { +// final TaskDrawRegular draw = (TaskDrawRegular) draws.get(task); +// result.add(draw); +// } +// +// return Collections.unmodifiableList(result); +// } +// +// public void setIt(Task result) { +// this.it = result; +// } +// +// public Task getIt() { +// return it; +// } +// +// public final Resource getThey() { +// return they; +// } +// +// public final void setThey(Resource they) { +// this.they = they; +// } + +} diff --git a/src/net/sourceforge/plantuml/chronology/ChronologyDiagramFactory.java b/src/net/sourceforge/plantuml/chronology/ChronologyDiagramFactory.java new file mode 100644 index 000000000..063b908f9 --- /dev/null +++ b/src/net/sourceforge/plantuml/chronology/ChronologyDiagramFactory.java @@ -0,0 +1,126 @@ +/* ======================================================================== + * 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.chronology; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import net.sourceforge.plantuml.command.Command; +import net.sourceforge.plantuml.command.CommonCommands; +import net.sourceforge.plantuml.command.PSystemCommandFactory; +import net.sourceforge.plantuml.core.DiagramType; +import net.sourceforge.plantuml.core.UmlSource; +import net.sourceforge.plantuml.project.command.NaturalCommand; +import net.sourceforge.plantuml.project.lang.SentenceAnd; +import net.sourceforge.plantuml.project.lang.SentenceAndAnd; +import net.sourceforge.plantuml.project.lang.SentenceSimple; +import net.sourceforge.plantuml.project.lang.Subject; + +public class ChronologyDiagramFactory extends PSystemCommandFactory { + + static private final List> subjects() { + return Arrays.asList(SubjectTask.ME); + } + + public ChronologyDiagramFactory() { + super(DiagramType.CHRONOLOGY); + } + + @Override + protected void initCommandsList(List cmds) { + CommonCommands.addTitleCommands(cmds); + CommonCommands.addCommonCommands2(cmds); + +// cmds.add(CommandStyleMultilinesCSS.ME); +// cmds.add(CommandStyleImport.ME); +// +// cmds.add(CommandNope.ME); + + addLanguageCommands(cmds); + +// cmds.add(new CommandGanttArrow()); +// cmds.add(new CommandGanttArrow2()); +// cmds.add(new CommandColorTask()); +// cmds.add(new CommandSeparator()); +// cmds.add(new CommandWeekNumberStrategy()); +// cmds.add(new CommandGroupStart()); +// cmds.add(new CommandGroupEnd()); +// +// cmds.add(new CommandLanguage()); +// cmds.add(new CommandPrintScale()); +// cmds.add(new CommandPrintBetween()); +// cmds.add(new CommandNoteBottom()); +// cmds.add(new CommandFootbox()); +// cmds.add(new CommandLabelOnColumn()); +// cmds.add(new CommandHideResourceName()); +// cmds.add(new CommandHideResourceFootbox()); +// cmds.add(new CommandTaskCompleteDefault()); + } + + private void addLanguageCommands(List cmd) { + for (Subject subject : subjects()) + for (SentenceSimple sentenceA : subject.getSentences()) { + cmd.add(NaturalCommand.create(sentenceA)); + for (SentenceSimple sentenceB : subject.getSentences()) { + final String signatureA = sentenceA.getSignature(); + final String signatureB = sentenceB.getSignature(); + if (signatureA.equals(signatureB) == false) + cmd.add(NaturalCommand.create(new SentenceAnd(sentenceA, sentenceB))); + + } + } + + for (Subject subject : subjects()) + for (SentenceSimple sentenceA : subject.getSentences()) + for (SentenceSimple sentenceB : subject.getSentences()) + for (SentenceSimple sentenceC : subject.getSentences()) { + final String signatureA = sentenceA.getSignature(); + final String signatureB = sentenceB.getSignature(); + final String signatureC = sentenceC.getSignature(); + if (signatureA.equals(signatureB) == false && signatureA.equals(signatureC) == false + && signatureC.equals(signatureB) == false) + cmd.add(NaturalCommand + .create(new SentenceAndAnd(sentenceA, sentenceB, sentenceC))); + } + } + + @Override + public ChronologyDiagram createEmptyDiagram(UmlSource source, Map skinParam) { + return new ChronologyDiagram(source); + } + +} diff --git a/src/net/sourceforge/plantuml/chronology/ComplementAnything.java b/src/net/sourceforge/plantuml/chronology/ComplementAnything.java new file mode 100644 index 000000000..436232f47 --- /dev/null +++ b/src/net/sourceforge/plantuml/chronology/ComplementAnything.java @@ -0,0 +1,54 @@ +/* ======================================================================== + * 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.chronology; + +import net.sourceforge.plantuml.project.Failable; +import net.sourceforge.plantuml.project.lang.Something; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexResult; + +public class ComplementAnything implements Something { + + public IRegex toRegex(String suffix) { + return new RegexLeaf("ANYTHING" + suffix, "(.*?)"); + } + + public Failable getMe(ChronologyDiagram system, RegexResult arg, String suffix) { + final String value = arg.get("ANYTHING" + suffix, 0); + return Failable.ok(value); + } +} diff --git a/src/net/sourceforge/plantuml/chronology/ComplementHour.java b/src/net/sourceforge/plantuml/chronology/ComplementHour.java new file mode 100644 index 000000000..d45338571 --- /dev/null +++ b/src/net/sourceforge/plantuml/chronology/ComplementHour.java @@ -0,0 +1,84 @@ +/* ======================================================================== + * 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.chronology; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +import net.sourceforge.plantuml.project.Failable; +import net.sourceforge.plantuml.project.lang.Something; +import net.sourceforge.plantuml.project.time.Day; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexConcat; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexOptional; +import net.sourceforge.plantuml.regex.RegexResult; + +public class ComplementHour implements Something { + + // [Task1] starts at 2023-11-28 15:41:21, ends at 2023-11-28 19:40:00 + + static private final SimpleDateFormat inputFormat; + static private final SimpleDateFormat inputFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + + static { + inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + inputFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + + } + + public IRegex toRegex(String suffix) { + return new RegexConcat( // + new RegexLeaf("TIME", "(\\d+-\\d+-\\d+ \\d+:\\d+:\\d+)"), // + new RegexOptional(new RegexLeaf("MS", "\\.(\\d+)")) // + ); // + } + + public Failable getMe(ChronologyDiagram system, RegexResult arg, String suffix) { + final String value = arg.get("TIME", 0); + System.err.println("value=" + value); + try { + final Date date = inputFormat.parse(value); + return Failable.ok(Day.create(date.getTime())); + } catch (ParseException e) { + e.printStackTrace(); + } + throw new IllegalStateException(); + } + +} diff --git a/src/net/sourceforge/plantuml/chronology/HourPattern.java b/src/net/sourceforge/plantuml/chronology/HourPattern.java new file mode 100644 index 000000000..f34c49290 --- /dev/null +++ b/src/net/sourceforge/plantuml/chronology/HourPattern.java @@ -0,0 +1,136 @@ +/* ======================================================================== + * 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.chronology; + +import net.sourceforge.plantuml.project.time.Day; +import net.sourceforge.plantuml.project.time.Month; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexConcat; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexOr; +import net.sourceforge.plantuml.regex.RegexResult; + +public class HourPattern { + + private final String id; + private final String yearKeyA; + private final String yearKeyB; + private final String yearKeyC; + private final String monthKeyA; + private final String monthKeyB; + private final String monthKeyC; + private final String dayKeyA; + private final String dayKeyB; + private final String dayKeyC; + + public HourPattern(String id) { + this.id = id; + this.yearKeyA = "AYEAR" + id; + this.yearKeyB = "BYEAR" + id; + this.yearKeyC = "CYEAR" + id; + this.monthKeyA = "AMONTH" + id; + this.monthKeyB = "BMONTH" + id; + this.monthKeyC = "CMONTH" + id; + this.dayKeyA = "ADAY" + id; + this.dayKeyB = "BDAY" + id; + this.dayKeyC = "CDAY" + id; + } + + public IRegex toRegex() { + return new RegexOr(toRegexA_DD_MONTH_YYYY(), toRegexB_YYYY_MM_DD(), toRegexC_MONTH_DD_YYYY()); + } + + public Day getDay(RegexResult arg) { + if (arg.get(dayKeyA, 0) != null) + return resultA(arg); + + if (arg.get(dayKeyB, 0) != null) + return resultB(arg); + + if (arg.get(dayKeyC, 0) != null) + return resultC(arg); + return null; + } + + private IRegex toRegexA_DD_MONTH_YYYY() { + return new RegexConcat( // + new RegexLeaf(dayKeyA, "([\\d]{1,2})"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(monthKeyA, "(" + Month.getRegexString() + ")"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(yearKeyA, "([\\d]{1,4})")); + } + + private Day resultA(RegexResult arg) { + final int day = Integer.parseInt(arg.get(dayKeyA, 0)); + final String month = arg.get(monthKeyA, 0); + final int year = Integer.parseInt(arg.get(yearKeyA, 0)); + return Day.create(year, month, day); + } + + private IRegex toRegexB_YYYY_MM_DD() { + return new RegexConcat( // + new RegexLeaf(yearKeyB, "([\\d]{1,4})"), // + new RegexLeaf("\\D"), // + new RegexLeaf(monthKeyB, "([\\d]{1,2})"), // + new RegexLeaf("\\D"), // + new RegexLeaf(dayKeyB, "([\\d]{1,2})")); + } + + private Day resultB(RegexResult arg) { + final int day = Integer.parseInt(arg.get(dayKeyB, 0)); + final int month = Integer.parseInt(arg.get(monthKeyB, 0)); + final int year = Integer.parseInt(arg.get(yearKeyB, 0)); + return Day.create(year, month, day); + } + + private IRegex toRegexC_MONTH_DD_YYYY() { + return new RegexConcat( // + new RegexLeaf(monthKeyC, "(" + Month.getRegexString() + ")"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(dayKeyC, "([\\d]{1,2})"), // + new RegexLeaf("[\\w, ]*?"), // + new RegexLeaf(yearKeyC, "([\\d]{1,4})")); + } + + private Day resultC(RegexResult arg) { + final int day = Integer.parseInt(arg.get(dayKeyC, 0)); + final String month = arg.get(monthKeyC, 0); + final int year = Integer.parseInt(arg.get(yearKeyC, 0)); + return Day.create(year, month, day); + } + +} diff --git a/src/net/sourceforge/plantuml/chronology/SentenceHappensChronology.java b/src/net/sourceforge/plantuml/chronology/SentenceHappensChronology.java new file mode 100644 index 000000000..2cfb488db --- /dev/null +++ b/src/net/sourceforge/plantuml/chronology/SentenceHappensChronology.java @@ -0,0 +1,60 @@ +/* ======================================================================== + * 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.chronology; + +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.project.core.Task; +import net.sourceforge.plantuml.project.lang.SentenceSimple; +import net.sourceforge.plantuml.project.lang.Verbs; +import net.sourceforge.plantuml.project.lang.Words; +import net.sourceforge.plantuml.project.time.Day; + +public class SentenceHappensChronology extends SentenceSimple { + + public SentenceHappensChronology() { + super(SubjectTask.ME, Verbs.happens, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), new ComplementHour()); + } + + @Override + public CommandExecutionResult execute(ChronologyDiagram project, Object subject, Object complement) { + final Task task = (Task) subject; + final Day start = (Day) complement; + task.setStart(start); + task.setEnd(start); + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/chronology/SubjectTask.java b/src/net/sourceforge/plantuml/chronology/SubjectTask.java new file mode 100644 index 000000000..cd5eeb396 --- /dev/null +++ b/src/net/sourceforge/plantuml/chronology/SubjectTask.java @@ -0,0 +1,92 @@ +/* ======================================================================== + * 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.chronology; + +import java.util.Arrays; +import java.util.Collection; + +import net.sourceforge.plantuml.project.Failable; +import net.sourceforge.plantuml.project.core.Task; +import net.sourceforge.plantuml.project.lang.SentenceSimple; +import net.sourceforge.plantuml.project.lang.Subject; +import net.sourceforge.plantuml.project.lang.Words; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexConcat; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexOptional; +import net.sourceforge.plantuml.regex.RegexOr; +import net.sourceforge.plantuml.regex.RegexResult; +import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; + +public class SubjectTask implements Subject { + + public static final Subject ME = new SubjectTask(); + + private SubjectTask() { + } + + public Failable getMe(ChronologyDiagram chronology, RegexResult arg) { + final Task result; + + final String subject = arg.get("SUBJECT", 0); + final String shortName = arg.get("SHORTNAME", 0); + final String stereotype = arg.get("STEREOTYPE", 0); + + result = chronology.getOrCreateTask(subject, shortName, false); + + if (stereotype != null) + result.setStereotype(Stereotype.build(arg.get("STEREOTYPE", 0))); + + return Failable.ok(result); + } + + public Collection> getSentences() { + return Arrays.asList(new SentenceHappensChronology()); + } + + public IRegex toRegex() { + return new RegexOr( // + new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\]"), // + StereotypePattern.optional("STEREOTYPE"), // + new RegexOptional(new RegexConcat(// + Words.exactly(Words.AS), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("SHORTNAME", "\\[([^\\[\\]]+?)\\]"))) // + ); + } + +} diff --git a/src/net/sourceforge/plantuml/chronology/TaskChronology.java b/src/net/sourceforge/plantuml/chronology/TaskChronology.java new file mode 100644 index 000000000..20d877c1e --- /dev/null +++ b/src/net/sourceforge/plantuml/chronology/TaskChronology.java @@ -0,0 +1,372 @@ +/* ======================================================================== + * 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.chronology; + +import net.sourceforge.plantuml.klimt.creole.Display; +import net.sourceforge.plantuml.project.Load; +import net.sourceforge.plantuml.project.core.AbstractTask; +import net.sourceforge.plantuml.project.core.Resource; +import net.sourceforge.plantuml.project.core.Task; +import net.sourceforge.plantuml.project.core.TaskCode; +import net.sourceforge.plantuml.project.lang.CenterBorderColor; +import net.sourceforge.plantuml.project.time.Day; +import net.sourceforge.plantuml.project.time.DayOfWeek; +import net.sourceforge.plantuml.style.StyleBuilder; +import net.sourceforge.plantuml.url.Url; + +public class TaskChronology extends AbstractTask implements Task { + + private Display note; + + private Url url; + private CenterBorderColor[] colors; + + private Day start; + private Day end; + + public void setUrl(Url url) { + this.url = url; + } + + public TaskChronology(StyleBuilder styleBuilder, TaskCode code) { + super(styleBuilder, code); + } + + @Override + public void setStart(Day start) { + this.start = start; + + } + + @Override + public Day getStart() { + return this.start; + } + + @Override + public void setEnd(Day end) { + this.end = end; + } + + @Override + public Day getEnd() { + return this.end; + } + + @Override + public Load getLoad() { + throw new UnsupportedOperationException(); + } + + @Override + public void setLoad(Load load) { + throw new UnsupportedOperationException(); + } + + @Override + public void addResource(Resource resource, int percentage) { + throw new UnsupportedOperationException(); + } + + @Override + public void setDiamond(boolean diamond) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isDiamond() { + return false; + } + + @Override + public void setCompletion(int completion) { + throw new UnsupportedOperationException(); + } + + @Override + public void addPause(Day pause) { + throw new UnsupportedOperationException(); + } + + @Override + public void addPause(DayOfWeek pause) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAssignedTo(Resource res) { + throw new UnsupportedOperationException(); + } + +// @Override +// public int getLoadAt(Day instant) { +// if (isPaused(instant)) +// return 0; +// +// LoadPlanable result = defaultPlan; +// if (resources.size() > 0) +// result = PlanUtils.multiply(defaultPlan, getResourcePlan()); +// +// return result.getLoadAt(instant); +// } +// +// private boolean isPaused(Day instant) { +// if (pausedDay.contains(instant)) +// return true; +// +// if (pausedDayOfWeek(instant)) +// return true; +// +// return false; +// } +// +// private boolean pausedDayOfWeek(Day instant) { +// for (DayOfWeek dayOfWeek : pausedDayOfWeek) +// if (instant.getDayOfWeek() == dayOfWeek) +// return true; +// +// return false; +// } +// +// public int loadForResource(Resource res, Day instant) { +// if (resources.keySet().contains(res) && instant.compareTo(getStart()) >= 0 +// && instant.compareTo(getEnd()) <= 0) { +// if (isPaused(instant)) +// return 0; +// +// if (res.isClosedAt(instant)) +// return 0; +// +// return resources.get(res); +// } +// return 0; +// } +// +// @Override +// public void addPause(Day pause) { +// this.pausedDay.add(pause); +// } +// +// @Override +// public void addPause(DayOfWeek pause) { +// this.pausedDayOfWeek.add(pause); +// } +// +// private LoadPlanable getResourcePlan() { +// if (resources.size() == 0) +// throw new IllegalStateException(); +// +// return new LoadPlanable() { +// public int getLoadAt(Day instant) { +// int result = 0; +// for (Map.Entry ent : resources.entrySet()) { +// final Resource res = ent.getKey(); +// if (res.isClosedAt(instant)) +// continue; +// +// final int percentage = ent.getValue(); +// result += percentage; +// } +// return result; +// } +// +// @Override +// public Day getLastDayIfAny() { +// return TaskChronology.this.getLastDayIfAny(); +// } +// }; +// } +// +// @Override +// public Day getLastDayIfAny() { +// Day result = null; +// +// for (Resource res : resources.keySet()) { +// if (res.getLastDayIfAny() == null) +// return null; +// +// if (result == null || result.compareTo(res.getLastDayIfAny()) < 0) +// result = res.getLastDayIfAny(); +// } +// +// return result; +// } +// +// public String getPrettyDisplay() { +// if (resources.size() > 0) { +// final StringBuilder result = new StringBuilder(getCode().getSimpleDisplay()); +// result.append(" "); +// for (Iterator> it = resources.entrySet().iterator(); it.hasNext();) { +// final Map.Entry ent = it.next(); +// result.append("{"); +// result.append(ent.getKey().getName()); +// final int percentage = ent.getValue(); +// if (percentage != 100) +// result.append(":" + percentage + "%"); +// +// result.append("}"); +// if (it.hasNext()) +// result.append(" "); +// +// } +// return result.toString(); +// } +// return getCode().getSimpleDisplay(); +// } +// +// @Override +// public String toString() { +// return getCode().toString(); +// } +// +// public String debug() { +// return "" + getStart() + " ---> " + getEnd() + " [" + getLoad() + "]"; +// } +// +// @Override +// public Day getStart() { +// Day result = (Day) solver.getData(TaskAttribute.START); +// if (diamond == false) +// while (getLoadAt(result) == 0) +// result = result.increment(); +// +// return result; +// } +// +// @Override +// public Day getEnd() { +// return (Day) solver.getData(TaskAttribute.END); +// } +// +// @Override +// public Load getLoad() { +// return (Load) solver.getData(TaskAttribute.LOAD); +// } +// +// @Override +// public void setLoad(Load load) { +// solver.setData(TaskAttribute.LOAD, load); +// } +// +// @Override +// public void setStart(Day start) { +// solver.setData(TaskAttribute.START, start); +// } +// +// @Override +// public void setEnd(Day end) { +// solver.setData(TaskAttribute.END, end); +// } + + @Override + public void setColors(CenterBorderColor... colors) { + this.colors = colors; + } + +// @Override +// public void addResource(Resource resource, int percentage) { +// this.resources.put(resource, percentage); +// } +// +// @Override +// public void setDiamond(boolean diamond) { +// this.diamond = diamond; +// } +// +// @Override +// public boolean isDiamond() { +// return this.diamond; +// } +// +// @Override +// public void setCompletion(int completion) { +// this.completion = completion; +// } +// +// public final Url getUrl() { +// return url; +// } +// +// public final CenterBorderColor getColors() { +// if (colors == null) +// return null; +// +// if (colors.length == 1) +// return colors[0]; +// +// return colors[0].unlinearTo(colors[1], completion); +// } +// +// public final int getCompletion() { +// return completion; +// } +// +// public final Collection getAllPaused() { +// final SortedSet result = new TreeSet<>(pausedDay); +// for (DayOfWeek dayOfWeek : pausedDayOfWeek) +// addAll(result, dayOfWeek); +// +// return Collections.unmodifiableCollection(result); +// } +// +// private void addAll(SortedSet result, DayOfWeek dayOfWeek) { +// final Day start = getStart(); +// final Day end = getEnd(); +// for (Day current = start; current.compareTo(end) <= 0; current = current.increment()) +// if (current.getDayOfWeek() == dayOfWeek) +// result.add(current); +// +// } + + @Override + public void setNote(Display note) { + this.note = note; + } + + public Display getNote() { + return note; + } + +// public LoadPlanable getDefaultPlan() { +// return defaultPlan; +// } +// +// @Override +// public boolean isAssignedTo(Resource res) { +// return resources.containsKey(res); +// } + +} diff --git a/src/net/sourceforge/plantuml/chronology/TimeHeaderChronology.java b/src/net/sourceforge/plantuml/chronology/TimeHeaderChronology.java new file mode 100644 index 000000000..fca77fb27 --- /dev/null +++ b/src/net/sourceforge/plantuml/chronology/TimeHeaderChronology.java @@ -0,0 +1,197 @@ +/* ======================================================================== + * 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.chronology; + +import net.sourceforge.plantuml.klimt.UTranslate; +import net.sourceforge.plantuml.klimt.color.HColor; +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.shape.TextBlock; +import net.sourceforge.plantuml.klimt.shape.ULine; +import net.sourceforge.plantuml.klimt.sprite.SpriteContainerEmpty; +import net.sourceforge.plantuml.project.TimeHeaderParameters; +import net.sourceforge.plantuml.project.core.PrintScale; +import net.sourceforge.plantuml.project.draw.TimeHeader; +import net.sourceforge.plantuml.project.time.Day; +import net.sourceforge.plantuml.project.timescale.TimeScale; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; + +public class TimeHeaderChronology extends TimeHeader { + + private final PrintScale printScale; + + @Override + public double getFullHeaderHeight(StringBounder stringBounder) { + return getTimeHeaderHeight(stringBounder) + getHeaderNameDayHeight(); + } + + @Override + public double getTimeHeaderHeight(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble(); + return h + 6; + } + + @Override + public double getTimeFooterHeight(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble(); + return h + 6; + } + + private double getHeaderNameDayHeight() { + return 0; + } + + public TimeHeaderChronology(StringBounder stringBounder, TimeHeaderParameters thParam, PrintScale printScale, + TimeScaleChronology timeScale) { + super(thParam, timeScale); + this.printScale = printScale; + } + + private void drawSmallVlinesDay(UGraphic ug, TimeScale timeScale, double totalHeightWithoutFooter) { + ug = ug.apply(getLineColor()); + ug = ug.apply(UTranslate.dy(6)); + final ULine vbar = ULine.vline(totalHeightWithoutFooter + 2); + for (Day i = getMin(); i.compareTo(getMax().increment()) < 0; i = i.increment(printScale)) { + final double x1 = timeScale.getStartingPosition(i); + ug.apply(UTranslate.dx(x1)).draw(vbar); + } + } + + private void drawSimpleDayCounter(UGraphic ug, TimeScale timeScale) { + for (Day i = getMin(); i.compareTo(getMax().increment()) < 0; i = i.increment(printScale)) { + final UFont font = thParam.getStyle(SName.timeline, SName.day).getUFont(); + final FontConfiguration fontConfiguration = getFontConfiguration(font, false, openFontColor()); + final TextBlock num = Display.getWithNewlines(i.toStringShort(thParam.getLocale())) + .create(fontConfiguration, HorizontalAlignment.LEFT, new SpriteContainerEmpty()); + final double x1 = timeScale.getStartingPosition(i); + final double x2; + if (printScale == PrintScale.WEEKLY) + x2 = timeScale.getEndingPosition(i.addDays(6)); + else + x2 = timeScale.getEndingPosition(i); + final double width = num.calculateDimension(ug.getStringBounder()).getWidth(); + final double delta = (x2 - x1) - width; + if (i.compareTo(getMax().increment()) < 0) + num.drawU(ug.apply(UTranslate.dx(x1 + delta / 2))); + + } + } + + @Override + public void drawTimeHeader(UGraphic ug, double totalHeightWithoutFooter) { + // drawTextsBackground(ug.apply(UTranslate.dy(-3)), totalHeightWithoutFooter + + // 6); + final double xmin = getTimeScale().getStartingPosition(getMin()); + final double xmax = getTimeScale().getEndingPosition(getMax()); + drawSmallVlinesDay(ug, getTimeScale(), totalHeightWithoutFooter); + // printVerticalSeparators(ug, totalHeightWithoutFooter); + drawSimpleDayCounter(ug, getTimeScale()); + // ug = ug.apply(getLineColor()); + // ug.draw(ULine.hline(xmax - xmin)); + // ug.apply(UTranslate.dy(getFullHeaderHeight(ug.getStringBounder()) - + // 3)).draw(ULine.hline(xmax - xmin)); + + } + + @Override + public void drawTimeFooter(UGraphic ug) { + final double xmin = getTimeScale().getStartingPosition(getMin()); + final double xmax = getTimeScale().getEndingPosition(getMax()); + ug = ug.apply(UTranslate.dy(3)); + // drawSmallVlinesDay(ug, getTimeScale(), + // getTimeFooterHeight(ug.getStringBounder()) - 3); + drawSimpleDayCounter(ug, getTimeScale()); + // ug.apply(getLineColor()).draw(ULine.hline(xmax - xmin)); + } + + // Duplicate in TimeHeaderDaily + class Pending { + final double x1; + double x2; + final HColor color; + + Pending(HColor color, double x1, double x2) { + this.x1 = x1; + this.x2 = x2; + this.color = color; + } + + public void draw(UGraphic ug, double height) { + drawRectangle(ug.apply(color.bg()), height, x1, x2); + } + } + + protected final void drawTextsBackground(UGraphic ug, double totalHeightWithoutFooter) { + + final double height = totalHeightWithoutFooter - getFullHeaderHeight(ug.getStringBounder()); + Pending pending = null; + + for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) { + final double x1 = getTimeScale().getStartingPosition(wink); + final double x2 = getTimeScale().getEndingPosition(wink); + HColor back = thParam.getColor(wink); +// // Day of week should be stronger than period of time (back color). +// final HColor backDoW = colorDaysOfWeek.get(wink.getDayOfWeek()); +// if (backDoW != null) { +// back = backDoW; +// } +// if (back == null && defaultPlan.getLoadAt(wink) == 0) { +// back = closedBackgroundColor(); +// } + if (back == null) { + if (pending != null) + pending.draw(ug, height); + pending = null; + } else { + if (pending != null && pending.color.equals(back) == false) { + pending.draw(ug, height); + pending = null; + } + if (pending == null) + pending = new Pending(back, x1, x2); + else + pending.x2 = x2; + + } + } + } + +} diff --git a/src/net/sourceforge/plantuml/chronology/TimeScaleChronology.java b/src/net/sourceforge/plantuml/chronology/TimeScaleChronology.java new file mode 100644 index 000000000..b77f714cd --- /dev/null +++ b/src/net/sourceforge/plantuml/chronology/TimeScaleChronology.java @@ -0,0 +1,81 @@ +/* ======================================================================== + * 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.chronology; + +import net.sourceforge.plantuml.project.time.Day; +import net.sourceforge.plantuml.project.timescale.TimeScale; + +public class TimeScaleChronology implements TimeScale { + + private final double fullWidth; + private long min; + private long max; + + public TimeScaleChronology(double fullWidth) { + this.fullWidth = fullWidth; + } + + public double getStartingPosition(Day instant) { + final long wink = instant.getMillis(); + if (wink < min) + throw new IllegalArgumentException(); + if (wink > max) + throw new IllegalArgumentException(); + + return fullWidth * (wink - min) / (max - min); + } + + public double getEndingPosition(Day instant) { + return getStartingPosition(instant); + } + + public double getWidth(Day instant) { + throw new UnsupportedOperationException(); + } + + public boolean isBreaking(Day instant) { + throw new UnsupportedOperationException(); + } + + public final void setMin(long min) { + this.min = min; + } + + public final void setMax(long max) { + this.max = max; + } + +} diff --git a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java index 7f42d13f0..0b5c8cd73 100644 --- a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java +++ b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java @@ -58,6 +58,7 @@ import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -101,9 +102,7 @@ public class CommandCreateClass extends SingleLineCommand2 { new RegexLeaf("GENERIC", "\\<(" + GenericRegexProducer.PATTERN + ")\\>"))), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClassMultilines.java b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClassMultilines.java index 2ddf84b86..dc1719990 100644 --- a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClassMultilines.java +++ b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClassMultilines.java @@ -65,6 +65,7 @@ import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.skin.VisibilityModifier; import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; @@ -115,9 +116,7 @@ public class CommandCreateClassMultilines extends CommandMultilines2"))), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateElementFull2.java b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateElementFull2.java index 906f0d877..cb1a677e8 100644 --- a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateElementFull2.java +++ b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateElementFull2.java @@ -53,11 +53,11 @@ import net.sourceforge.plantuml.klimt.font.FontParam; import net.sourceforge.plantuml.plasma.Quark; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; -import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -88,21 +88,14 @@ public class CommandCreateElementFull2 extends SingleLineCommand2 new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), // new RegexConcat(// new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("STEREOTYPE2", "(\\<\\<.+\\>\\>)") // - )), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE2"), // new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE2", CommandCreateElementFull.CODE)) // ), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // @@ -118,21 +111,14 @@ public class CommandCreateElementFull2 extends SingleLineCommand2 new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), // new RegexConcat(// new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("STEREOTYPE2", "(\\<\\<.+\\>\\>)") // - )), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE2"), // new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE2", CommandCreateElementFull.CODE)) // ), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/classdiagram/command/CommandStereotype.java b/src/net/sourceforge/plantuml/classdiagram/command/CommandStereotype.java index d4b8686b5..4d762c4f8 100644 --- a/src/net/sourceforge/plantuml/classdiagram/command/CommandStereotype.java +++ b/src/net/sourceforge/plantuml/classdiagram/command/CommandStereotype.java @@ -47,6 +47,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.utils.LineLocation; public class CommandStereotype extends SingleLineCommand2 { @@ -60,7 +61,8 @@ public class CommandStereotype extends SingleLineCommand2 { RegexLeaf.start(), // new RegexLeaf("NAME", "([%pLN_.]+|[%g][^%g]+[%g])"), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)"), RegexLeaf.end()); // + StereotypePattern.mandatory("STEREO"), // + RegexLeaf.end()); // } @Override diff --git a/src/net/sourceforge/plantuml/command/CommandNamespace.java b/src/net/sourceforge/plantuml/command/CommandNamespace.java index 67cf02b22..9404cd513 100644 --- a/src/net/sourceforge/plantuml/command/CommandNamespace.java +++ b/src/net/sourceforge/plantuml/command/CommandNamespace.java @@ -50,6 +50,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -68,9 +69,7 @@ public class CommandNamespace extends SingleLineCommand2 { new RegexLeaf("namespace"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("NAME", NAMESPACE_REGEX), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // diff --git a/src/net/sourceforge/plantuml/command/CommandNamespace2.java b/src/net/sourceforge/plantuml/command/CommandNamespace2.java index 768b1a181..f32845c77 100644 --- a/src/net/sourceforge/plantuml/command/CommandNamespace2.java +++ b/src/net/sourceforge/plantuml/command/CommandNamespace2.java @@ -48,6 +48,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -72,9 +73,7 @@ public class CommandNamespace2 extends SingleLineCommand2 { RegexLeaf.spaceOneOrMore(), // new RegexLeaf("NAME", CommandNamespace.NAMESPACE_REGEX), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // diff --git a/src/net/sourceforge/plantuml/command/CommandNamespaceEmpty.java b/src/net/sourceforge/plantuml/command/CommandNamespaceEmpty.java index 6e9e9c81b..00a0ab641 100644 --- a/src/net/sourceforge/plantuml/command/CommandNamespaceEmpty.java +++ b/src/net/sourceforge/plantuml/command/CommandNamespaceEmpty.java @@ -48,6 +48,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -64,9 +65,7 @@ public class CommandNamespaceEmpty extends SingleLineCommand2 { new RegexLeaf("namespace"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("NAME", CommandNamespace.NAMESPACE_REGEX), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // diff --git a/src/net/sourceforge/plantuml/command/CommandPackage.java b/src/net/sourceforge/plantuml/command/CommandPackage.java index d0d64c477..934bd4020 100644 --- a/src/net/sourceforge/plantuml/command/CommandPackage.java +++ b/src/net/sourceforge/plantuml/command/CommandPackage.java @@ -55,6 +55,7 @@ import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -80,9 +81,7 @@ public class CommandPackage extends SingleLineCommand2 { )), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/command/note/CommandFactoryNote.java b/src/net/sourceforge/plantuml/command/note/CommandFactoryNote.java index 65a763e9b..bc89bf64a 100644 --- a/src/net/sourceforge/plantuml/command/note/CommandFactoryNote.java +++ b/src/net/sourceforge/plantuml/command/note/CommandFactoryNote.java @@ -55,6 +55,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.utils.BlocLines; import net.sourceforge.plantuml.utils.LineLocation; @@ -70,9 +71,7 @@ public final class CommandFactoryNote implements SingleMultiFactoryCommand\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // ColorParser.exp1(), // RegexLeaf.end() // ); @@ -91,9 +90,7 @@ public final class CommandFactoryNote implements SingleMultiFactoryCommand\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // ColorParser.exp1(), // RegexLeaf.end() // ); diff --git a/src/net/sourceforge/plantuml/command/note/CommandFactoryNoteOnEntity.java b/src/net/sourceforge/plantuml/command/note/CommandFactoryNoteOnEntity.java index 363f8809e..f3d7f37ea 100644 --- a/src/net/sourceforge/plantuml/command/note/CommandFactoryNoteOnEntity.java +++ b/src/net/sourceforge/plantuml/command/note/CommandFactoryNoteOnEntity.java @@ -63,6 +63,7 @@ import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -92,9 +93,7 @@ public final class CommandFactoryNoteOnEntity implements SingleMultiFactoryComma new RegexLeaf("")), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // @@ -127,9 +126,7 @@ public final class CommandFactoryNoteOnEntity implements SingleMultiFactoryComma new RegexLeaf("")), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // @@ -153,9 +150,7 @@ public final class CommandFactoryNoteOnEntity implements SingleMultiFactoryComma new RegexLeaf("")), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // diff --git a/src/net/sourceforge/plantuml/command/note/CommandFactoryTipOnEntity.java b/src/net/sourceforge/plantuml/command/note/CommandFactoryTipOnEntity.java index bdfac6571..edfb84034 100644 --- a/src/net/sourceforge/plantuml/command/note/CommandFactoryTipOnEntity.java +++ b/src/net/sourceforge/plantuml/command/note/CommandFactoryTipOnEntity.java @@ -61,6 +61,7 @@ import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -89,9 +90,7 @@ public final class CommandFactoryTipOnEntity implements SingleMultiFactoryComman partialPattern, // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // @@ -112,9 +111,7 @@ public final class CommandFactoryTipOnEntity implements SingleMultiFactoryComman partialPattern, // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // diff --git a/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteAcrossCommand.java b/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteAcrossCommand.java index ccbbfb5ad..a93e0bafe 100644 --- a/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteAcrossCommand.java +++ b/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteAcrossCommand.java @@ -57,6 +57,7 @@ import net.sourceforge.plantuml.sequencediagram.Participant; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -70,13 +71,9 @@ public final class FactorySequenceNoteAcrossCommand implements SingleMultiFactor new RegexLeaf("VMERGE", "(/)?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO1"), // new RegexLeaf("ACROSS", "(accross|across)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO2"), // color().getRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // @@ -89,13 +86,9 @@ public final class FactorySequenceNoteAcrossCommand implements SingleMultiFactor new RegexLeaf("VMERGE", "(/)?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO1"), // new RegexLeaf("ACROSS", "(accross|across)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO2"), // color().getRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteCommand.java b/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteCommand.java index fb6a746fb..c5a0d4596 100644 --- a/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteCommand.java +++ b/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteCommand.java @@ -59,6 +59,7 @@ import net.sourceforge.plantuml.sequencediagram.Participant; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -66,7 +67,7 @@ import net.sourceforge.plantuml.utils.BlocLines; import net.sourceforge.plantuml.utils.LineLocation; public final class FactorySequenceNoteCommand implements SingleMultiFactoryCommand { - // ::remove folder when __HAXE__ + // ::remove folder when __HAXE__ private IRegex getRegexConcatMultiLine() { return RegexConcat.build(FactorySequenceNoteCommand.class.getName() + "multi", RegexLeaf.start(), // @@ -74,15 +75,11 @@ public final class FactorySequenceNoteCommand implements SingleMultiFactoryComma new RegexLeaf("VMERGE", "(/)?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO1"), // new RegexLeaf("POSITION", "(right|left|over)"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("PARTICIPANT", "(?:of[%s]+)?([%pLN_.@]+|[%g][^%g]+[%g])"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO2"), // color().getRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // @@ -95,15 +92,11 @@ public final class FactorySequenceNoteCommand implements SingleMultiFactoryComma new RegexLeaf("VMERGE", "(/)?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO1"), // new RegexLeaf("POSITION", "(right|left|over)"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("PARTICIPANT", "(?:of[%s])?([%pLN_.@]+|[%g][^%g]+[%g])"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO2"), // color().getRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteOnArrowCommand.java b/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteOnArrowCommand.java index f886d749f..556b146da 100644 --- a/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteOnArrowCommand.java +++ b/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteOnArrowCommand.java @@ -60,6 +60,7 @@ import net.sourceforge.plantuml.sequencediagram.NoteStyle; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -72,13 +73,9 @@ public final class FactorySequenceNoteOnArrowCommand implements SingleMultiFacto return RegexConcat.build(FactorySequenceNoteOnArrowCommand.class.getName() + "multi", RegexLeaf.start(), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceOneOrMore(), // + StereotypePattern.optional("STEREO1"), // new RegexLeaf("POSITION", "(right|left|bottom|top)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO2"), // ColorParser.exp1(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // @@ -89,13 +86,9 @@ public final class FactorySequenceNoteOnArrowCommand implements SingleMultiFacto return RegexConcat.build(FactorySequenceNoteOnArrowCommand.class.getName() + "single", RegexLeaf.start(), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceOneOrMore(), // + StereotypePattern.optional("STEREO1"), // new RegexLeaf("POSITION", "(right|left|bottom|top)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO2"), // ColorParser.exp1(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteOverSeveralCommand.java b/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteOverSeveralCommand.java index 52154e96e..a2ceee953 100644 --- a/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteOverSeveralCommand.java +++ b/src/net/sourceforge/plantuml/command/note/sequence/FactorySequenceNoteOverSeveralCommand.java @@ -58,6 +58,7 @@ import net.sourceforge.plantuml.sequencediagram.Participant; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -72,9 +73,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF new RegexLeaf("VMERGE", "(/)?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO1"), // new RegexLeaf("over"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("P1", "([%pLN_.@]+|[%g][^%g]+[%g])"), // @@ -82,9 +81,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF new RegexLeaf(","), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("P2", "([%pLN_.@]+|[%g][^%g]+[%g])"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO2"), // color().getRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // @@ -98,9 +95,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF new RegexLeaf("VMERGE", "(/)?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO1"), // new RegexLeaf("over"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("P1", "([%pLN_.@]+|[%g][^%g]+[%g])"), // @@ -108,9 +103,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF new RegexLeaf(","), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("P2", "([%pLN_.@]+|[%g][^%g]+[%g])"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO2"), // color().getRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/core/Diagram.java b/src/net/sourceforge/plantuml/core/Diagram.java index 368d0b926..18ce748ff 100644 --- a/src/net/sourceforge/plantuml/core/Diagram.java +++ b/src/net/sourceforge/plantuml/core/Diagram.java @@ -68,7 +68,7 @@ public interface Diagram { */ ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException; - void exportDiagramGraphic(UGraphic ug); + void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormat); /** * Number of images in this diagram (usually, 1) diff --git a/src/net/sourceforge/plantuml/core/DiagramType.java b/src/net/sourceforge/plantuml/core/DiagramType.java index 7a045e588..1f1e7f9ae 100644 --- a/src/net/sourceforge/plantuml/core/DiagramType.java +++ b/src/net/sourceforge/plantuml/core/DiagramType.java @@ -38,9 +38,9 @@ package net.sourceforge.plantuml.core; import net.sourceforge.plantuml.utils.StartUtils; public enum DiagramType { - // ::remove folder when __HAXE__ - UML, BPM, DITAA, DOT, PROJECT, JCCKIT, SALT, FLOW, CREOLE, MATH, LATEX, DEFINITION, GANTT, NW, - MINDMAP, WBS, WIRE, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, FILES, UNKNOWN; + // ::remove folder when __HAXE__ + UML, BPM, DITAA, DOT, PROJECT, JCCKIT, SALT, FLOW, CREOLE, MATH, LATEX, DEFINITION, GANTT, CHRONOLOGY, NW, MINDMAP, + WBS, WIRE, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, FILES, UNKNOWN; static public DiagramType getTypeFromArobaseStart(String s) { s = s.toLowerCase(); @@ -59,7 +59,8 @@ public enum DiagramType { if (StartUtils.startsWithSymbolAnd("startdot", s)) return DOT; - // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or __LGPL__ + // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or + // __LGPL__ if (StartUtils.startsWithSymbolAnd("startjcckit", s)) return JCCKIT; // ::done @@ -126,6 +127,9 @@ public enum DiagramType { if (StartUtils.startsWithSymbolAnd("startfiles", s)) return FILES; + if (StartUtils.startsWithSymbolAnd("startchronology", s)) + return CHRONOLOGY; + return UNKNOWN; } } diff --git a/src/net/sourceforge/plantuml/descdiagram/CommandCreateDomain.java b/src/net/sourceforge/plantuml/descdiagram/CommandCreateDomain.java index 10e4f354c..43864b44d 100644 --- a/src/net/sourceforge/plantuml/descdiagram/CommandCreateDomain.java +++ b/src/net/sourceforge/plantuml/descdiagram/CommandCreateDomain.java @@ -53,6 +53,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -73,11 +74,11 @@ public class CommandCreateDomain extends SingleLineCommand2 new RegexLeaf("DISPLAY", DISPLAY_WITH_GENERIC), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("as"), // - RegexLeaf.spaceOneOrMore(), new RegexLeaf("CODE", "([a-zA-Z0-9]+)"), RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("CODE", "([a-zA-Z0-9]+)"), // + StereotypePattern.optional("STEREO"), // // domain: lexical, causal, biddable // requirement: FR, NFR, quality - RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("GROUP", "(\\{)?"), RegexLeaf.end()); } diff --git a/src/net/sourceforge/plantuml/descdiagram/command/CommandArchimate.java b/src/net/sourceforge/plantuml/descdiagram/command/CommandArchimate.java index 7bc02b008..cfa09179c 100644 --- a/src/net/sourceforge/plantuml/descdiagram/command/CommandArchimate.java +++ b/src/net/sourceforge/plantuml/descdiagram/command/CommandArchimate.java @@ -56,6 +56,7 @@ import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.utils.LineLocation; public class CommandArchimate extends SingleLineCommand2 { @@ -74,44 +75,25 @@ public class CommandArchimate extends SingleLineCommand2 { new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), // new RegexConcat(// new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("STEREOTYPE2", "(?:\\<\\<([-\\w]+)\\>\\>)") // - )), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optionalArchimate("STEREOTYPE2"), // new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE2", CommandCreateElementFull.CODE)), // new RegexConcat(// new RegexLeaf("CODE3", CommandCreateElementFull.CODE), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("STEREOTYPE3", "(?:\\<\\<([-\\w]+)\\>\\>)") // - )), // - RegexLeaf.spaceOneOrMore(), // + StereotypePattern.optionalArchimate("STEREOTYPE3"), // new RegexLeaf("as"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("DISPLAY3", CommandCreateElementFull.DISPLAY)), // new RegexConcat(// new RegexLeaf("DISPLAY4", CommandCreateElementFull.DISPLAY_WITHOUT_QUOTE), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("STEREOTYPE4", "(?:\\<\\<([-\\w]+)\\>\\>)") // - )), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optionalArchimate("STEREOTYPE4"), // new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE4", CommandCreateElementFull.CODE)) // ), // - RegexLeaf.spaceZeroOrMore(), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(?:\\<\\<([-\\w]+)\\>\\>)") // - )), RegexLeaf.end()); + StereotypePattern.optionalArchimate("STEREOTYPE"), // + RegexLeaf.end()); } private static ColorParser color() { @@ -134,7 +116,7 @@ public class CommandArchimate extends SingleLineCommand2 { entity = diagram.reallyCreateLeaf(quark, Display.getWithNewlines(display), LeafType.DESCRIPTION, USymbols.ARCHIMATE); - final String icon = arg.getLazzy("STEREOTYPE", 0); + final String icon = StereotypePattern.removeChevronBrackets(arg.getLazzy("STEREOTYPE", 0)); entity.setDisplay(Display.getWithNewlines(display)); entity.setUSymbol(USymbols.ARCHIMATE); diff --git a/src/net/sourceforge/plantuml/descdiagram/command/CommandArchimateMultilines.java b/src/net/sourceforge/plantuml/descdiagram/command/CommandArchimateMultilines.java index 11cccd9bc..5aa5f5012 100644 --- a/src/net/sourceforge/plantuml/descdiagram/command/CommandArchimateMultilines.java +++ b/src/net/sourceforge/plantuml/descdiagram/command/CommandArchimateMultilines.java @@ -56,6 +56,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.utils.BlocLines; @@ -77,13 +78,7 @@ public class CommandArchimateMultilines extends CommandMultilines2\\>)") // - )), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optionalArchimate("STEREOTYPE"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // @@ -108,7 +103,7 @@ public class CommandArchimateMultilines extends CommandMultilines2\\>)")// - )), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE2"), // new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE2", CODE)), // new RegexConcat(// new RegexLeaf("CODE3", CODE), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("STEREOTYPE3", "(\\<\\<.+\\>\\>)") // - )), // - RegexLeaf.spaceOneOrMore(), // + StereotypePattern.optional("STEREOTYPE3"), // new RegexLeaf("as"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("DISPLAY3", DISPLAY)), // new RegexConcat(// new RegexLeaf("DISPLAY4", DISPLAY_WITHOUT_QUOTE), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("STEREOTYPE4", "(\\<\\<.+\\>\\>)") // - )), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE4"), // new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE4", CODE)) // ), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/descdiagram/command/CommandCreateElementMultilines.java b/src/net/sourceforge/plantuml/descdiagram/command/CommandCreateElementMultilines.java index 3dc3a4665..eeba727d1 100644 --- a/src/net/sourceforge/plantuml/descdiagram/command/CommandCreateElementMultilines.java +++ b/src/net/sourceforge/plantuml/descdiagram/command/CommandCreateElementMultilines.java @@ -59,6 +59,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -93,9 +94,7 @@ public class CommandCreateElementMultilines extends CommandMultilines2\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // @@ -110,9 +109,7 @@ public class CommandCreateElementMultilines extends CommandMultilines2\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // diff --git a/src/net/sourceforge/plantuml/descdiagram/command/CommandLinkElement.java b/src/net/sourceforge/plantuml/descdiagram/command/CommandLinkElement.java index b607964eb..bbc59b124 100644 --- a/src/net/sourceforge/plantuml/descdiagram/command/CommandLinkElement.java +++ b/src/net/sourceforge/plantuml/descdiagram/command/CommandLinkElement.java @@ -59,6 +59,7 @@ import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.skin.ActorStyle; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.utils.Direction; import net.sourceforge.plantuml.utils.LineLocation; @@ -104,9 +105,7 @@ public class CommandLinkElement extends SingleLineCommand2 { // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("LABEL_LINK", "(?::[%s]*(.+))?"), // RegexLeaf.end()); } diff --git a/src/net/sourceforge/plantuml/descdiagram/command/CommandPackageWithUSymbol.java b/src/net/sourceforge/plantuml/descdiagram/command/CommandPackageWithUSymbol.java index 92a2e931a..fbbfa15a9 100644 --- a/src/net/sourceforge/plantuml/descdiagram/command/CommandPackageWithUSymbol.java +++ b/src/net/sourceforge/plantuml/descdiagram/command/CommandPackageWithUSymbol.java @@ -57,6 +57,7 @@ import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -115,9 +116,7 @@ public class CommandPackageWithUSymbol extends SingleLineCommand2\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/ebnf/PSystemEbnf.java b/src/net/sourceforge/plantuml/ebnf/PSystemEbnf.java index 9604c7f74..ccf0e1649 100644 --- a/src/net/sourceforge/plantuml/ebnf/PSystemEbnf.java +++ b/src/net/sourceforge/plantuml/ebnf/PSystemEbnf.java @@ -97,11 +97,11 @@ public class PSystemEbnf extends TitledDiagram { @Override protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { if (expressions.size() == 0) { final Style style = ETile.getStyleSignature().getMergedStyle(getSkinParam().getCurrentStyleBuilder()); final FontConfiguration fc = style.getFontConfiguration(getSkinParam().getIHtmlColorSet()); diff --git a/src/net/sourceforge/plantuml/filesdiagram/FilesDiagram.java b/src/net/sourceforge/plantuml/filesdiagram/FilesDiagram.java index b5142b7c0..891ad8940 100644 --- a/src/net/sourceforge/plantuml/filesdiagram/FilesDiagram.java +++ b/src/net/sourceforge/plantuml/filesdiagram/FilesDiagram.java @@ -89,11 +89,11 @@ public class FilesDiagram extends UmlDiagram { protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return list; } diff --git a/src/net/sourceforge/plantuml/flowdiagram/FlowDiagram.java b/src/net/sourceforge/plantuml/flowdiagram/FlowDiagram.java index 7d4b21638..5b4b4b125 100644 --- a/src/net/sourceforge/plantuml/flowdiagram/FlowDiagram.java +++ b/src/net/sourceforge/plantuml/flowdiagram/FlowDiagram.java @@ -230,7 +230,7 @@ public class FlowDiagram extends UmlDiagram implements TextBlock { } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return this; } diff --git a/src/net/sourceforge/plantuml/gitlog/GitDiagram.java b/src/net/sourceforge/plantuml/gitlog/GitDiagram.java index b355612cf..f1ad5fd1e 100644 --- a/src/net/sourceforge/plantuml/gitlog/GitDiagram.java +++ b/src/net/sourceforge/plantuml/gitlog/GitDiagram.java @@ -68,7 +68,7 @@ public class GitDiagram extends UmlDiagram { protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } private void drawInternal(UGraphic ug) { @@ -84,7 +84,7 @@ public class GitDiagram extends UmlDiagram { } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { diff --git a/src/net/sourceforge/plantuml/help/Help.java b/src/net/sourceforge/plantuml/help/Help.java index 36962e0a5..cc7322dbb 100644 --- a/src/net/sourceforge/plantuml/help/Help.java +++ b/src/net/sourceforge/plantuml/help/Help.java @@ -96,7 +96,7 @@ public class Help extends UmlDiagram { } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/jsondiagram/JsonDiagram.java b/src/net/sourceforge/plantuml/jsondiagram/JsonDiagram.java index 7aabbed27..cdc6eb494 100644 --- a/src/net/sourceforge/plantuml/jsondiagram/JsonDiagram.java +++ b/src/net/sourceforge/plantuml/jsondiagram/JsonDiagram.java @@ -94,7 +94,7 @@ public class JsonDiagram extends TitledDiagram { protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } private void drawInternal(UGraphic ug) { @@ -113,7 +113,7 @@ public class JsonDiagram extends TitledDiagram { } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(final FileFormatOption fileFormatOption) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { @@ -121,7 +121,7 @@ public class JsonDiagram extends TitledDiagram { } public XDimension2D calculateDimension(StringBounder stringBounder) { - return TextBlockUtils.getMinMax(getTextBlock(), stringBounder, true).getDimension(); + return TextBlockUtils.getMinMax(getTextMainBlock(fileFormatOption), stringBounder, true).getDimension(); } }; } diff --git a/src/net/sourceforge/plantuml/klimt/sprite/ListSpriteDiagram.java b/src/net/sourceforge/plantuml/klimt/sprite/ListSpriteDiagram.java index b23c5610d..ec49bdf7d 100644 --- a/src/net/sourceforge/plantuml/klimt/sprite/ListSpriteDiagram.java +++ b/src/net/sourceforge/plantuml/klimt/sprite/ListSpriteDiagram.java @@ -79,11 +79,11 @@ public class ListSpriteDiagram extends UmlDiagram { protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { diff --git a/src/net/sourceforge/plantuml/klimt/sprite/StdlibDiagram.java b/src/net/sourceforge/plantuml/klimt/sprite/StdlibDiagram.java index f637002ea..74c0f7ec5 100644 --- a/src/net/sourceforge/plantuml/klimt/sprite/StdlibDiagram.java +++ b/src/net/sourceforge/plantuml/klimt/sprite/StdlibDiagram.java @@ -91,11 +91,11 @@ public class StdlibDiagram extends UmlDiagram { protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { diff --git a/src/net/sourceforge/plantuml/mindmap/MindMapDiagram.java b/src/net/sourceforge/plantuml/mindmap/MindMapDiagram.java index d1981b833..975e3d791 100644 --- a/src/net/sourceforge/plantuml/mindmap/MindMapDiagram.java +++ b/src/net/sourceforge/plantuml/mindmap/MindMapDiagram.java @@ -83,11 +83,11 @@ public class MindMapDiagram extends UmlDiagram { protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { diff --git a/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java b/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java index 6bc30d64e..6f9074546 100644 --- a/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java +++ b/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java @@ -331,11 +331,11 @@ public class NwDiagram extends UmlDiagram { protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { drawMe(ug); diff --git a/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateEntityObject.java b/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateEntityObject.java index 403e67b21..3c5d4ded5 100644 --- a/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateEntityObject.java +++ b/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateEntityObject.java @@ -52,6 +52,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -68,9 +69,7 @@ public class CommandCreateEntityObject extends SingleLineCommand2\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), RegexLeaf.end()); diff --git a/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateEntityObjectMultilines.java b/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateEntityObjectMultilines.java index ec7457a56..de7209791 100644 --- a/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateEntityObjectMultilines.java +++ b/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateEntityObjectMultilines.java @@ -55,6 +55,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.skin.VisibilityModifier; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.utils.BlocLines; @@ -70,9 +71,7 @@ public class CommandCreateEntityObjectMultilines extends CommandMultilines2\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // diff --git a/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateJson.java b/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateJson.java index 94f3c4c13..ad217dd09 100644 --- a/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateJson.java +++ b/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateJson.java @@ -59,6 +59,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.utils.BlocLines; @@ -74,9 +75,7 @@ public class CommandCreateJson extends CommandMultilines2 new RegexLeaf("TYPE", "json"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // diff --git a/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateJsonSingleLine.java b/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateJsonSingleLine.java index fbdc4aa76..b185f30aa 100644 --- a/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateJsonSingleLine.java +++ b/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateJsonSingleLine.java @@ -56,6 +56,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.utils.LineLocation; @@ -70,9 +71,7 @@ public class CommandCreateJsonSingleLine extends SingleLineCommand2\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), // diff --git a/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateMap.java b/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateMap.java index 8e2cbe564..939c14edf 100644 --- a/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateMap.java +++ b/src/net/sourceforge/plantuml/objectdiagram/command/CommandCreateMap.java @@ -62,6 +62,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.utils.BlocLines; @@ -77,9 +78,7 @@ public class CommandCreateMap extends CommandMultilines2 new RegexLeaf("TYPE", "map"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // diff --git a/src/net/sourceforge/plantuml/project/GanttDiagram.java b/src/net/sourceforge/plantuml/project/GanttDiagram.java index 6314bdc33..529e21ae8 100644 --- a/src/net/sourceforge/plantuml/project/GanttDiagram.java +++ b/src/net/sourceforge/plantuml/project/GanttDiagram.java @@ -51,7 +51,6 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import net.sourceforge.plantuml.FileFormat; import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.TitledDiagram; import net.sourceforge.plantuml.WithSprite; @@ -162,7 +161,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit } public DiagramDescription getDescription() { - return new DiagramDescription("(Project)"); + return new DiagramDescription("(Gantt)"); } public void setWeekNumberStrategy(DayOfWeek firstDayOfWeek, int minimalDaysInFirstWeek) { @@ -180,8 +179,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit @Override protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam()); - return createImageBuilder(fileFormatOption).drawable(getTextBlock(stringBounder)).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } public void setPrintScale(PrintScale printScale) { @@ -220,13 +218,8 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit } @Override - protected TextBlock getTextBlock() { - final FileFormatOption fileFormatOption = new FileFormatOption(FileFormat.PNG); + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam()); - return getTextBlock(stringBounder); - } - - private TextBlock getTextBlock(StringBounder stringBounder) { if (printStart == null) { initMinMax(); } else { @@ -450,13 +443,12 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit } else if (task instanceof TaskGroup) { final TaskGroup taskGroup = (TaskGroup) task; draw = new TaskDrawGroup(timeScale, y, taskGroup.getCode().getSimpleDisplay(), getStart(taskGroup), - getEnd(taskGroup), getSkinParam(), task, this, task.getStyleBuilder()); + getEnd(taskGroup), task, this, task.getStyleBuilder()); } else { final TaskImpl tmp = (TaskImpl) task; final String disp = hideResourceName ? tmp.getCode().getSimpleDisplay() : tmp.getPrettyDisplay(); if (tmp.isDiamond()) { - draw = new TaskDrawDiamond(timeScale, y, disp, getStart(tmp), getSkinParam(), task, this, - task.getStyleBuilder()); + draw = new TaskDrawDiamond(timeScale, y, disp, getStart(tmp), task, this, task.getStyleBuilder()); } else { final boolean oddStart = printStart != null && min.compareTo(getStart(tmp)) == 0; final boolean oddEnd = printStart != null && max.compareTo(getEnd(tmp)) == 0; diff --git a/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java b/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java index eb7d662d3..ceb183bcb 100644 --- a/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java +++ b/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java @@ -79,8 +79,8 @@ import net.sourceforge.plantuml.style.CommandStyleMultilinesCSS; public class GanttDiagramFactory extends PSystemCommandFactory { - static private final List subjects() { - return Arrays.asList(SubjectTask.ME, SubjectProject.ME, SubjectDayOfWeek.ME, SubjectDayAsDate.ME, + static private final List> subjects() { + return Arrays.asList(SubjectTask.ME, SubjectProject.ME, SubjectDayOfWeek.ME, SubjectDayAsDate.ME, SubjectDaysAsDates.ME, SubjectResource.ME, SubjectToday.ME, SubjectSeparator.ME); } @@ -120,28 +120,28 @@ public class GanttDiagramFactory extends PSystemCommandFactory { } private void addLanguageCommands(List cmd) { - for (Subject subject : subjects()) - for (SentenceSimple sentenceA : subject.getSentences()) { + for (Subject subject : subjects()) + for (SentenceSimple sentenceA : subject.getSentences()) { cmd.add(NaturalCommand.create(sentenceA)); - for (SentenceSimple sentenceB : subject.getSentences()) { + for (SentenceSimple sentenceB : subject.getSentences()) { final String signatureA = sentenceA.getSignature(); final String signatureB = sentenceB.getSignature(); if (signatureA.equals(signatureB) == false) - cmd.add(NaturalCommand.create(new SentenceAnd(sentenceA, sentenceB))); + cmd.add(NaturalCommand.create(new SentenceAnd(sentenceA, sentenceB))); } } - for (Subject subject : subjects()) - for (SentenceSimple sentenceA : subject.getSentences()) - for (SentenceSimple sentenceB : subject.getSentences()) - for (SentenceSimple sentenceC : subject.getSentences()) { + for (Subject subject : subjects()) + for (SentenceSimple sentenceA : subject.getSentences()) + for (SentenceSimple sentenceB : subject.getSentences()) + for (SentenceSimple sentenceC : subject.getSentences()) { final String signatureA = sentenceA.getSignature(); final String signatureB = sentenceB.getSignature(); final String signatureC = sentenceC.getSignature(); if (signatureA.equals(signatureB) == false && signatureA.equals(signatureC) == false && signatureC.equals(signatureB) == false) - cmd.add(NaturalCommand.create(new SentenceAndAnd(sentenceA, sentenceB, sentenceC))); + cmd.add(NaturalCommand.create(new SentenceAndAnd(sentenceA, sentenceB, sentenceC))); } } diff --git a/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java b/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java index 14cab9795..c140797ac 100644 --- a/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java +++ b/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java @@ -37,6 +37,7 @@ package net.sourceforge.plantuml.project; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Set; import net.sourceforge.plantuml.klimt.UStroke; @@ -70,7 +71,7 @@ public class TimeHeaderParameters implements GanttStyle { this.scale = scale; this.min = min; this.max = max; - this.colorSet = colorSet; + this.colorSet = Objects.requireNonNull(colorSet); this.ganttStyle = ganttStyle; this.locale = locale; this.openClose = openClose; diff --git a/src/net/sourceforge/plantuml/project/command/CommandColorTask.java b/src/net/sourceforge/plantuml/project/command/CommandColorTask.java index 57f5e58c0..6c5583384 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandColorTask.java +++ b/src/net/sourceforge/plantuml/project/command/CommandColorTask.java @@ -59,7 +59,8 @@ public class CommandColorTask extends SingleLineCommand2 { new RegexLeaf("CODE", "\\[([%pLN_.]+)\\]"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("COLORS", "#(\\w+)(?:/(#?\\w+))?"), // - RegexLeaf.spaceZeroOrMore(), RegexLeaf.end()); + RegexLeaf.spaceZeroOrMore(), // + RegexLeaf.end()); } @Override diff --git a/src/net/sourceforge/plantuml/project/command/CommandFootbox.java b/src/net/sourceforge/plantuml/project/command/CommandFootbox.java index 43697e905..36ce4504c 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandFootbox.java +++ b/src/net/sourceforge/plantuml/project/command/CommandFootbox.java @@ -45,7 +45,7 @@ import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.utils.LineLocation; public class CommandFootbox extends SingleLineCommand2 { - // ::remove folder when __HAXE__ + // ::remove folder when __HAXE__ public CommandFootbox() { super(getRegexConcat()); @@ -55,7 +55,8 @@ public class CommandFootbox extends SingleLineCommand2 { return RegexConcat.build(CommandFootbox.class.getName(), RegexLeaf.start(), // new RegexLeaf("TYPE", "(hide|show)?"), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("footbox"), RegexLeaf.end()); // + new RegexLeaf("footbox"), // + RegexLeaf.end()); } @Override diff --git a/src/net/sourceforge/plantuml/project/command/CommandGanttArrow.java b/src/net/sourceforge/plantuml/project/command/CommandGanttArrow.java index 1c1c55a30..0929fd2a8 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandGanttArrow.java +++ b/src/net/sourceforge/plantuml/project/command/CommandGanttArrow.java @@ -63,7 +63,8 @@ public class CommandGanttArrow extends SingleLineCommand2 { new RegexLeaf("\\>"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("CODE2", "([%pLN_.]+)"), // - RegexLeaf.spaceZeroOrMore(), RegexLeaf.end()); + RegexLeaf.spaceZeroOrMore(), // + RegexLeaf.end()); } @Override diff --git a/src/net/sourceforge/plantuml/project/command/CommandHideResourceFootbox.java b/src/net/sourceforge/plantuml/project/command/CommandHideResourceFootbox.java index acfa84310..08e48fa3c 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandHideResourceFootbox.java +++ b/src/net/sourceforge/plantuml/project/command/CommandHideResourceFootbox.java @@ -57,7 +57,7 @@ public class CommandHideResourceFootbox extends SingleLineCommand2 new RegexLeaf("ress?ources?"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("footbox"), // - RegexLeaf.end()); // + RegexLeaf.end()); } @Override diff --git a/src/net/sourceforge/plantuml/project/command/CommandHideResourceName.java b/src/net/sourceforge/plantuml/project/command/CommandHideResourceName.java index e343e3461..e386dee8c 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandHideResourceName.java +++ b/src/net/sourceforge/plantuml/project/command/CommandHideResourceName.java @@ -57,7 +57,7 @@ public class CommandHideResourceName extends SingleLineCommand2 { new RegexLeaf("ress?ources?"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("names?"), // - RegexLeaf.end()); // + RegexLeaf.end()); } @Override diff --git a/src/net/sourceforge/plantuml/project/command/CommandLabelOnColumn.java b/src/net/sourceforge/plantuml/project/command/CommandLabelOnColumn.java index ff2d12789..949f12e64 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandLabelOnColumn.java +++ b/src/net/sourceforge/plantuml/project/command/CommandLabelOnColumn.java @@ -70,7 +70,8 @@ public class CommandLabelOnColumn extends SingleLineCommand2 { new RegexLeaf("ALIGNED", "(left|right)"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("aligned") // - )), RegexLeaf.end()); // + )), // + RegexLeaf.end()); } @Override diff --git a/src/net/sourceforge/plantuml/project/command/CommandLanguage.java b/src/net/sourceforge/plantuml/project/command/CommandLanguage.java index cae28078d..a8532b63d 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandLanguage.java +++ b/src/net/sourceforge/plantuml/project/command/CommandLanguage.java @@ -55,7 +55,7 @@ public class CommandLanguage extends SingleLineCommand2 { new RegexLeaf("language"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("LANG", "(\\w+)"), // - RegexLeaf.end()); // + RegexLeaf.end()); } @Override diff --git a/src/net/sourceforge/plantuml/project/command/CommandPrintBetween.java b/src/net/sourceforge/plantuml/project/command/CommandPrintBetween.java index f13460e09..5c0d1a8a5 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandPrintBetween.java +++ b/src/net/sourceforge/plantuml/project/command/CommandPrintBetween.java @@ -66,7 +66,7 @@ public class CommandPrintBetween extends SingleLineCommand2 { new RegexLeaf("and"), // RegexLeaf.spaceOneOrMore(), // pattern.toRegex("END"), // - RegexLeaf.end()); // + RegexLeaf.end()); } @Override diff --git a/src/net/sourceforge/plantuml/project/command/CommandPrintScale.java b/src/net/sourceforge/plantuml/project/command/CommandPrintScale.java index c82a9c027..84b1a6edb 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandPrintScale.java +++ b/src/net/sourceforge/plantuml/project/command/CommandPrintScale.java @@ -77,7 +77,7 @@ public class CommandPrintScale extends SingleLineCommand2 { new RegexLeaf("zoom"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("ZOOM", "([.\\d]+)"))), // - RegexLeaf.end()); // + RegexLeaf.end()); } @Override diff --git a/src/net/sourceforge/plantuml/project/command/CommandTaskCompleteDefault.java b/src/net/sourceforge/plantuml/project/command/CommandTaskCompleteDefault.java index aeec499cd..794c91455 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandTaskCompleteDefault.java +++ b/src/net/sourceforge/plantuml/project/command/CommandTaskCompleteDefault.java @@ -64,7 +64,6 @@ public class CommandTaskCompleteDefault extends SingleLineCommand2 RegexLeaf.spaceOneOrMore(), // new RegexLeaf("VALUE", "(\\d+)"), // new RegexLeaf(".*"), // - RegexLeaf.spaceZeroOrMore(), // RegexLeaf.end()); } diff --git a/src/net/sourceforge/plantuml/project/command/NaturalCommand.java b/src/net/sourceforge/plantuml/project/command/NaturalCommand.java index 2da5d3792..88511e131 100644 --- a/src/net/sourceforge/plantuml/project/command/NaturalCommand.java +++ b/src/net/sourceforge/plantuml/project/command/NaturalCommand.java @@ -37,27 +37,27 @@ package net.sourceforge.plantuml.project.command; import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.SingleLineCommand2; -import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.project.lang.Sentence; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.utils.LineLocation; -public class NaturalCommand extends SingleLineCommand2 { +public class NaturalCommand extends SingleLineCommand2 { - private final Sentence sentence; + private final Sentence sentence; - public NaturalCommand(Sentence sentence) { + public NaturalCommand(Sentence sentence) { super(sentence.toRegex()); this.sentence = sentence; } @Override - final protected CommandExecutionResult executeArg(GanttDiagram system, LineLocation location, RegexResult arg) { + final protected CommandExecutionResult executeArg(D system, LineLocation location, RegexResult arg) { return sentence.execute(system, arg); } - public static NaturalCommand create(Sentence sentence) { - return new NaturalCommand(sentence); + public static NaturalCommand create(Sentence sentence) { + return new NaturalCommand(sentence); } diff --git a/src/net/sourceforge/plantuml/project/core/AbstractTask.java b/src/net/sourceforge/plantuml/project/core/AbstractTask.java index 549e2c11f..69d385016 100644 --- a/src/net/sourceforge/plantuml/project/core/AbstractTask.java +++ b/src/net/sourceforge/plantuml/project/core/AbstractTask.java @@ -35,6 +35,7 @@ */ package net.sourceforge.plantuml.project.core; +import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.style.StyleBuilder; public abstract class AbstractTask implements Task { @@ -44,6 +45,7 @@ public abstract class AbstractTask implements Task { private Task row; private String displayString; + private Stereotype stereotype; protected AbstractTask(StyleBuilder styleBuilder, TaskCode code) { this.styleBuilder = styleBuilder; @@ -80,5 +82,16 @@ public abstract class AbstractTask implements Task { public String getDisplayString() { return this.displayString; } + + @Override + public Stereotype getStereotype() { + return stereotype; + } + + @Override + public final void setStereotype(Stereotype stereotype) { + this.stereotype = stereotype; + } + } diff --git a/src/net/sourceforge/plantuml/project/core/Task.java b/src/net/sourceforge/plantuml/project/core/Task.java index 467274875..b6b2bc351 100644 --- a/src/net/sourceforge/plantuml/project/core/Task.java +++ b/src/net/sourceforge/plantuml/project/core/Task.java @@ -40,6 +40,7 @@ import net.sourceforge.plantuml.project.Load; import net.sourceforge.plantuml.project.lang.CenterBorderColor; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.DayOfWeek; +import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.url.Url; @@ -85,4 +86,8 @@ public interface Task extends Moment { public String getDisplayString(); + public Stereotype getStereotype(); + + public void setStereotype(Stereotype stereotype); + } diff --git a/src/net/sourceforge/plantuml/project/draw/AbstractTaskDraw.java b/src/net/sourceforge/plantuml/project/draw/AbstractTaskDraw.java index 70c21a718..7d501e98e 100644 --- a/src/net/sourceforge/plantuml/project/draw/AbstractTaskDraw.java +++ b/src/net/sourceforge/plantuml/project/draw/AbstractTaskDraw.java @@ -49,11 +49,11 @@ import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; -import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.StyleBuilder; +import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.style.StyleSignatureBasic; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.utils.Direction; @@ -85,8 +85,8 @@ public abstract class AbstractTaskDraw implements TaskDraw { this.note = note; } - public AbstractTaskDraw(TimeScale timeScale, Real y, String prettyDisplay, Day start, ISkinParam skinParam, - Task task, ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) { + public AbstractTaskDraw(TimeScale timeScale, Real y, String prettyDisplay, Day start, Task task, + ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) { this.y = y; this.styleBuilder = styleBuilder; this.toTaskDraw = toTaskDraw; @@ -96,7 +96,7 @@ public abstract class AbstractTaskDraw implements TaskDraw { this.task = task; } - abstract StyleSignatureBasic getStyleSignature(); + abstract StyleSignature getStyleSignature(); private StyleSignatureBasic getStyleSignatureUnstarted() { return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.task, SName.unstarted); diff --git a/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java b/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java index df3a3854b..260579d10 100644 --- a/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java +++ b/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java @@ -54,21 +54,21 @@ import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; -import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.StyleBuilder; +import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.style.StyleSignatureBasic; public class TaskDrawDiamond extends AbstractTaskDraw { - public TaskDrawDiamond(TimeScale timeScale, Real y, String prettyDisplay, Day start, ISkinParam skinParam, - Task task, ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) { - super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw, styleBuilder); + public TaskDrawDiamond(TimeScale timeScale, Real y, String prettyDisplay, Day start, Task task, + ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) { + super(timeScale, y, prettyDisplay, start, task, toTaskDraw, styleBuilder); } @Override - StyleSignatureBasic getStyleSignature() { + StyleSignature getStyleSignature() { return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.milestone); } diff --git a/src/net/sourceforge/plantuml/project/draw/TaskDrawGroup.java b/src/net/sourceforge/plantuml/project/draw/TaskDrawGroup.java index 88ff50d60..346182887 100644 --- a/src/net/sourceforge/plantuml/project/draw/TaskDrawGroup.java +++ b/src/net/sourceforge/plantuml/project/draw/TaskDrawGroup.java @@ -54,22 +54,19 @@ import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; -import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.StyleBuilder; +import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.style.StyleSignatureBasic; public class TaskDrawGroup extends AbstractTaskDraw { private final Day end; - private final ISkinParam skinParam; - - public TaskDrawGroup(TimeScale timeScale, Real y, String prettyDisplay, Day start, Day end, ISkinParam skinParam, - Task task, ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) { - super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw, styleBuilder); - this.skinParam = skinParam; + public TaskDrawGroup(TimeScale timeScale, Real y, String prettyDisplay, Day start, Day end, Task task, + ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) { + super(timeScale, y, prettyDisplay, start, task, toTaskDraw, styleBuilder); this.end = end; } @@ -122,7 +119,7 @@ public class TaskDrawGroup extends AbstractTaskDraw { } @Override - StyleSignatureBasic getStyleSignature() { + StyleSignature getStyleSignature() { return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.task); } diff --git a/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java b/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java index cf3cb4cab..7d8d9a1ae 100644 --- a/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java +++ b/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java @@ -65,11 +65,12 @@ import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.sequencediagram.graphic.Segment; import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; -import net.sourceforge.plantuml.style.ISkinParam; +import net.sourceforge.plantuml.style.ISkinSimple; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.StyleBuilder; +import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.style.StyleSignatureBasic; import net.sourceforge.plantuml.svek.image.Opale; @@ -80,13 +81,13 @@ public class TaskDrawRegular extends AbstractTaskDraw { private final boolean oddEnd; private final Collection paused; private final Collection constraints; - private final ISkinParam skinParam; + private final ISkinSimple skinSimple; public TaskDrawRegular(TimeScale timeScale, Real y, String prettyDisplay, Day start, Day end, boolean oddStart, - boolean oddEnd, ISkinParam skinParam, Task task, ToTaskDraw toTaskDraw, + boolean oddEnd, ISkinSimple skinSimple, Task task, ToTaskDraw toTaskDraw, Collection constraints, StyleBuilder styleBuilder) { - super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw, styleBuilder); - this.skinParam = skinParam; + super(timeScale, y, prettyDisplay, start, task, toTaskDraw, styleBuilder); + this.skinSimple = skinSimple; this.constraints = constraints; this.end = end; this.oddStart = oddStart; @@ -162,8 +163,9 @@ public class TaskDrawRegular extends AbstractTaskDraw { } @Override - StyleSignatureBasic getStyleSignature() { - return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.task); + StyleSignature getStyleSignature() { + return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.task) + .withTOBECHANGED(getTask().getStereotype()); } public void drawU(UGraphic ug) { @@ -202,7 +204,7 @@ public class TaskDrawRegular extends AbstractTaskDraw { final FontConfiguration fc = style.getFontConfiguration(getColorSet()); final HorizontalAlignment horizontalAlignment = style.value(PName.HorizontalAlignment).asHorizontalAlignment(); - final Sheet sheet = skinParam.sheet(fc, horizontalAlignment, CreoleMode.FULL).createSheet(note); + final Sheet sheet = skinSimple.sheet(fc, horizontalAlignment, CreoleMode.FULL).createSheet(note); final double padding = style.value(PName.Padding).asDouble(); final SheetBlock1 sheet1 = new SheetBlock1(sheet, LineBreakStrategy.NONE, padding); diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java index 65685fe36..a837c08f1 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java @@ -86,7 +86,8 @@ public class TimeHeaderSimple extends TimeHeader { private void drawSmallVlinesDay(UGraphic ug, TimeScale timeScale, double totalHeightWithoutFooter) { ug = ug.apply(getLineColor()); - final ULine vbar = ULine.vline(totalHeightWithoutFooter); + ug = ug.apply(UTranslate.dy(6)); + final ULine vbar = ULine.vline(totalHeightWithoutFooter + 2); for (Day i = getMin(); i.compareTo(getMax().increment()) <= 0; i = i.increment(printScale)) { final double x1 = timeScale.getStartingPosition(i); ug.apply(UTranslate.dx(x1)).draw(vbar); @@ -120,15 +121,17 @@ public class TimeHeaderSimple extends TimeHeader { @Override public void drawTimeHeader(UGraphic ug, double totalHeightWithoutFooter) { - // drawTextsBackground(ug.apply(UTranslate.dy(-3)), totalHeightWithoutFooter + 6); + // drawTextsBackground(ug.apply(UTranslate.dy(-3)), totalHeightWithoutFooter + + // 6); final double xmin = getTimeScale().getStartingPosition(getMin()); final double xmax = getTimeScale().getEndingPosition(getMax()); - drawSmallVlinesDay(ug, getTimeScale(), totalHeightWithoutFooter + 2); + drawSmallVlinesDay(ug, getTimeScale(), totalHeightWithoutFooter); printVerticalSeparators(ug, totalHeightWithoutFooter); drawSimpleDayCounter(ug, getTimeScale()); // ug = ug.apply(getLineColor()); // ug.draw(ULine.hline(xmax - xmin)); - // ug.apply(UTranslate.dy(getFullHeaderHeight(ug.getStringBounder()) - 3)).draw(ULine.hline(xmax - xmin)); + // ug.apply(UTranslate.dy(getFullHeaderHeight(ug.getStringBounder()) - + // 3)).draw(ULine.hline(xmax - xmin)); } @@ -137,7 +140,8 @@ public class TimeHeaderSimple extends TimeHeader { final double xmin = getTimeScale().getStartingPosition(getMin()); final double xmax = getTimeScale().getEndingPosition(getMax()); ug = ug.apply(UTranslate.dy(3)); - drawSmallVlinesDay(ug, getTimeScale(), getTimeFooterHeight(ug.getStringBounder()) - 3); + // drawSmallVlinesDay(ug, getTimeScale(), + // getTimeFooterHeight(ug.getStringBounder()) - 3); drawSimpleDayCounter(ug, getTimeScale()); // ug.apply(getLineColor()).draw(ULine.hline(xmax - xmin)); } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java index 47893ed51..1c569b4ff 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java @@ -35,7 +35,6 @@ */ package net.sourceforge.plantuml.project.draw; -import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.drawing.UGraphic; import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.klimt.shape.TextBlock; diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementAnything.java b/src/net/sourceforge/plantuml/project/lang/ComplementAnything.java index 787e7e55a..5a9bc3c45 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementAnything.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementAnything.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementAnything implements Something { +public class ComplementAnything implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf("ANYTHING" + suffix, "(.*?)"); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementBeforeOrAfterOrAtTaskStartOrEnd.java b/src/net/sourceforge/plantuml/project/lang/ComplementBeforeOrAfterOrAtTaskStartOrEnd.java index fc61a7aad..cd8a2b411 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementBeforeOrAfterOrAtTaskStartOrEnd.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementBeforeOrAfterOrAtTaskStartOrEnd.java @@ -45,7 +45,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementBeforeOrAfterOrAtTaskStartOrEnd implements Something { +public class ComplementBeforeOrAfterOrAtTaskStartOrEnd implements Something { private static final int POS_NB1 = 0; private static final int POS_WORKING1 = 1; diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementClose.java b/src/net/sourceforge/plantuml/project/lang/ComplementClose.java index a3ef45a6e..c2c2e449d 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementClose.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementClose.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementClose implements Something { +public class ComplementClose implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf("CLOSED" + suffix, "(closed?(?: for \\[([^\\[\\]]+?)\\])?)"); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementCompleted.java b/src/net/sourceforge/plantuml/project/lang/ComplementCompleted.java index 5931f8e37..0ffcf0b1e 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementCompleted.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementCompleted.java @@ -42,7 +42,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementCompleted implements Something { +public class ComplementCompleted implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf("COMPLEMENT" + suffix, "(\\d+).*completed?"); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementDate.java b/src/net/sourceforge/plantuml/project/lang/ComplementDate.java index 032af9d04..2b70fd246 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementDate.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementDate.java @@ -44,7 +44,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementDate implements Something { +public class ComplementDate implements Something { private final Type type; diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementDates.java b/src/net/sourceforge/plantuml/project/lang/ComplementDates.java index a48a91aed..253f3e0cf 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementDates.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementDates.java @@ -45,7 +45,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementDates implements Something { +public class ComplementDates implements Something { public IRegex toRegex(String suffix) { return new RegexOr(toRegexB(suffix), toRegexE(suffix)); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementDayOfWeek.java b/src/net/sourceforge/plantuml/project/lang/ComplementDayOfWeek.java index 0bf87b3fe..e0cb00362 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementDayOfWeek.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementDayOfWeek.java @@ -43,7 +43,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementDayOfWeek implements Something { +public class ComplementDayOfWeek implements Something { public IRegex toRegex(String suffix) { return new RegexConcat( // diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementEmpty.java b/src/net/sourceforge/plantuml/project/lang/ComplementEmpty.java index 52b5a3c96..d8ea753fe 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementEmpty.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementEmpty.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementEmpty implements Something { +public class ComplementEmpty implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf(""); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementFromTo.java b/src/net/sourceforge/plantuml/project/lang/ComplementFromTo.java index e20149962..ac0eec32b 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementFromTo.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementFromTo.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementFromTo implements Something { +public class ComplementFromTo implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf("COMPLEMENT" + suffix, "from[%s]+\\[([^\\[\\]]+)\\][%s]+to[%s]+\\[([^\\[\\]]+)\\]"); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementInColors.java b/src/net/sourceforge/plantuml/project/lang/ComplementInColors.java index 05fa7851e..a5e6cc3aa 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementInColors.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementInColors.java @@ -42,7 +42,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementInColors implements Something { +public class ComplementInColors implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf("COMPLEMENT" + suffix, "in[%s]+(#?\\w+)(?:/(#?\\w+))?"); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementInColors2.java b/src/net/sourceforge/plantuml/project/lang/ComplementInColors2.java index 1a31c1c37..d68fefc74 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementInColors2.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementInColors2.java @@ -42,7 +42,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementInColors2 implements Something { +public class ComplementInColors2 implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf("COMPLEMENT" + suffix, "colou?red[%s]+(?:in[%s]+)?(#?\\w+)(?:/(#?\\w+))?"); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementInColorsFromTo.java b/src/net/sourceforge/plantuml/project/lang/ComplementInColorsFromTo.java index 05d964cd6..ae9d67cdd 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementInColorsFromTo.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementInColorsFromTo.java @@ -42,7 +42,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementInColorsFromTo implements Something { +public class ComplementInColorsFromTo implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf("COMPLEMENT" + suffix, diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementNamed.java b/src/net/sourceforge/plantuml/project/lang/ComplementNamed.java index 901aef1ba..d8f05d7aa 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementNamed.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementNamed.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementNamed implements Something { +public class ComplementNamed implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf("COMPLEMENT" + suffix, "\\[([^\\[\\]]+)\\]"); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementOpen.java b/src/net/sourceforge/plantuml/project/lang/ComplementOpen.java index c2090468d..a72a48027 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementOpen.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementOpen.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementOpen implements Something { +public class ComplementOpen implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf("OPEN" + suffix, "(opene?d?(?: for \\[([^\\[\\]]+?)\\])?)"); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementSeveralDays.java b/src/net/sourceforge/plantuml/project/lang/ComplementSeveralDays.java index 03f1ebad2..b59548795 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementSeveralDays.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementSeveralDays.java @@ -43,7 +43,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementSeveralDays implements Something { +public class ComplementSeveralDays implements Something { public IRegex toRegex(String suffix) { return new RegexConcat( // diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementTask.java b/src/net/sourceforge/plantuml/project/lang/ComplementTask.java index aae8a1e63..79759fcb9 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementTask.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementTask.java @@ -42,7 +42,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementTask implements Something { +public class ComplementTask implements Something { public IRegex toRegex(String suffix) { return new RegexLeaf("COMPLEMENT" + suffix, "\\[([^\\[\\]]+?)\\]"); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementUrl.java b/src/net/sourceforge/plantuml/project/lang/ComplementUrl.java index c7499f38a..5d2c44c9d 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementUrl.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementUrl.java @@ -45,7 +45,7 @@ import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; -public class ComplementUrl implements Something { +public class ComplementUrl implements Something { public IRegex toRegex(String suffix) { return new RegexConcat( // diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementWithColorLink.java b/src/net/sourceforge/plantuml/project/lang/ComplementWithColorLink.java index 688e44b44..b03645955 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementWithColorLink.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementWithColorLink.java @@ -42,7 +42,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class ComplementWithColorLink implements Something { +public class ComplementWithColorLink implements Something { public IRegex toRegex(String suffix) { final String optionalStyle = "(?:(dotted|bold|dashed)[%s]+)?"; diff --git a/src/net/sourceforge/plantuml/project/lang/PairOfSomething.java b/src/net/sourceforge/plantuml/project/lang/PairOfSomething.java index ceb3e679b..9c2a02364 100644 --- a/src/net/sourceforge/plantuml/project/lang/PairOfSomething.java +++ b/src/net/sourceforge/plantuml/project/lang/PairOfSomething.java @@ -35,26 +35,26 @@ */ package net.sourceforge.plantuml.project.lang; +import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.project.Failable; -import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class PairOfSomething implements Something { +public class PairOfSomething implements Something { - private final Something complement1; - private final Something complement2; + private final Something complement1; + private final Something complement2; - public PairOfSomething(Something complement1, Something complement2) { + public PairOfSomething(Something complement1, Something complement2) { this.complement1 = complement1; this.complement2 = complement2; } - public Failable getMe(GanttDiagram system, RegexResult arg, String suffix) { - final Failable r1 = complement1.getMe(system, arg, "A" + suffix); - final Failable r2 = complement2.getMe(system, arg, "B" + suffix); + public Failable getMe(D diagram, RegexResult arg, String suffix) { + final Failable r1 = complement1.getMe(diagram, arg, "A" + suffix); + final Failable r2 = complement2.getMe(diagram, arg, "B" + suffix); if (r1.isFail()) { return r1; } diff --git a/src/net/sourceforge/plantuml/project/lang/Sentence.java b/src/net/sourceforge/plantuml/project/lang/Sentence.java index eaed4f5a5..769157d28 100644 --- a/src/net/sourceforge/plantuml/project/lang/Sentence.java +++ b/src/net/sourceforge/plantuml/project/lang/Sentence.java @@ -36,19 +36,19 @@ package net.sourceforge.plantuml.project.lang; import net.sourceforge.plantuml.command.CommandExecutionResult; -import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public interface Sentence { - +public interface Sentence { + public final RegexLeaf OPTIONAL_FINAL_DOT = new RegexLeaf("\\s*[.]?\\s*$"); - + public final RegexLeaf SENTENCE_SEPARATOR = new RegexLeaf("\\s*(,|\\sand\\s)\\s*"); public IRegex toRegex(); - public CommandExecutionResult execute(GanttDiagram project, RegexResult arg); + public CommandExecutionResult execute(D project, RegexResult arg); } diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java b/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java index 3929c6a7a..898a476fc 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java @@ -36,19 +36,19 @@ package net.sourceforge.plantuml.project.lang; import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.project.Failable; -import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class SentenceAnd implements Sentence { +public class SentenceAnd implements Sentence { - private final SentenceSimple sentence1; - private final SentenceSimple sentence2; + private final SentenceSimple sentence1; + private final SentenceSimple sentence2; - public SentenceAnd(SentenceSimple sentence1, SentenceSimple sentence2) { + public SentenceAnd(SentenceSimple sentence1, SentenceSimple sentence2) { this.sentence1 = sentence1; this.sentence2 = sentence2; } @@ -70,7 +70,7 @@ public class SentenceAnd implements Sentence { OPTIONAL_FINAL_DOT); } - public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) { + public final CommandExecutionResult execute(D project, RegexResult arg) { final Failable subject = sentence1.getSubject().getMe(project, arg); if (subject.isFail()) return CommandExecutionResult.error(subject.getError()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java b/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java index 27a9d4ca7..5e8ba2406 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java @@ -36,20 +36,20 @@ package net.sourceforge.plantuml.project.lang; import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.project.Failable; -import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class SentenceAndAnd implements Sentence { +public class SentenceAndAnd implements Sentence { - private final SentenceSimple sentence1; - private final SentenceSimple sentence2; - private final SentenceSimple sentence3; + private final SentenceSimple sentence1; + private final SentenceSimple sentence2; + private final SentenceSimple sentence3; - public SentenceAndAnd(SentenceSimple sentence1, SentenceSimple sentence2, SentenceSimple sentence3) { + public SentenceAndAnd(SentenceSimple sentence1, SentenceSimple sentence2, SentenceSimple sentence3) { this.sentence1 = sentence1; this.sentence2 = sentence2; this.sentence3 = sentence3; @@ -77,7 +77,7 @@ public class SentenceAndAnd implements Sentence { OPTIONAL_FINAL_DOT); } - public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) { + public final CommandExecutionResult execute(D project, RegexResult arg) { final Failable subject = sentence1.getSubject().getMe(project, arg); if (subject.isFail()) return CommandExecutionResult.error(subject.getError()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceDisplayOnSameRowAs.java b/src/net/sourceforge/plantuml/project/lang/SentenceDisplayOnSameRowAs.java index 4e4c955cb..9881a9a6b 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceDisplayOnSameRowAs.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceDisplayOnSameRowAs.java @@ -39,7 +39,7 @@ import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; -public class SentenceDisplayOnSameRowAs extends SentenceSimple { +public class SentenceDisplayOnSameRowAs extends SentenceSimple { public SentenceDisplayOnSameRowAs() { super(SubjectTask.ME, Verbs.displayOnSameRowAs, new ComplementNamed()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceEnds.java b/src/net/sourceforge/plantuml/project/lang/SentenceEnds.java index 1fad6f20e..8cccba70f 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceEnds.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceEnds.java @@ -42,7 +42,7 @@ import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.core.TaskAttribute; import net.sourceforge.plantuml.project.core.TaskInstant; -public class SentenceEnds extends SentenceSimple { +public class SentenceEnds extends SentenceSimple { public SentenceEnds() { super(SubjectTask.ME, Verbs.ends, new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java b/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java index f046ef8e2..7d408b59c 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.project.Load; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.core.TaskInstant; -public class SentenceHappens extends SentenceSimple { +public class SentenceHappens extends SentenceSimple { public SentenceHappens() { super(SubjectTask.ME, Verbs.happens, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java b/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java index afb8d886f..8dd8ceac8 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.project.Load; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.time.Day; -public class SentenceHappensDate extends SentenceSimple { +public class SentenceHappensDate extends SentenceSimple { public SentenceHappensDate() { super(SubjectTask.ME, Verbs.happens, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), ComplementDate.any()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceIsColored.java b/src/net/sourceforge/plantuml/project/lang/SentenceIsColored.java index 67b576d84..8787d7472 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceIsColored.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceIsColored.java @@ -39,7 +39,7 @@ import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; -public class SentenceIsColored extends SentenceSimple { +public class SentenceIsColored extends SentenceSimple { public SentenceIsColored() { super(SubjectTask.ME, Verbs.isColored, new ComplementInColors()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java b/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java index c07c2bd8a..502b2e370 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java @@ -39,7 +39,7 @@ import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; -public class SentenceIsColoredForCompletion extends SentenceSimple { +public class SentenceIsColoredForCompletion extends SentenceSimple { public SentenceIsColoredForCompletion() { super(SubjectTask.ME, Verbs.isColored, Words.exactly(Words.FOR, Words.COMPLETION), diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceIsDeleted.java b/src/net/sourceforge/plantuml/project/lang/SentenceIsDeleted.java index 470793882..6e9840f49 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceIsDeleted.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceIsDeleted.java @@ -39,7 +39,7 @@ import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; -public class SentenceIsDeleted extends SentenceSimple { +public class SentenceIsDeleted extends SentenceSimple { public SentenceIsDeleted() { super(SubjectTask.ME, Verbs.isDeleted, new ComplementEmpty()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java b/src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java index 78de0f2b3..9cd47e52c 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java @@ -39,7 +39,7 @@ import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; -public class SentenceIsDisplayedAs extends SentenceSimple { +public class SentenceIsDisplayedAs extends SentenceSimple { public SentenceIsDisplayedAs() { super(SubjectTask.ME, Verbs.isDisplayedAs, new ComplementAnything()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceIsForTask.java b/src/net/sourceforge/plantuml/project/lang/SentenceIsForTask.java index f69a156e7..2744814c7 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceIsForTask.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceIsForTask.java @@ -40,7 +40,7 @@ import net.sourceforge.plantuml.project.Completion; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; -public class SentenceIsForTask extends SentenceSimple { +public class SentenceIsForTask extends SentenceSimple { public SentenceIsForTask() { super(SubjectTask.ME, Verbs.is, new ComplementCompleted()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceLinksTo.java b/src/net/sourceforge/plantuml/project/lang/SentenceLinksTo.java index 68aca0d68..0901fd427 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceLinksTo.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceLinksTo.java @@ -40,7 +40,7 @@ import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.url.Url; -public class SentenceLinksTo extends SentenceSimple { +public class SentenceLinksTo extends SentenceSimple { public SentenceLinksTo() { super(SubjectTask.ME, Verbs.linksTo, new ComplementUrl()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceOccurs.java b/src/net/sourceforge/plantuml/project/lang/SentenceOccurs.java index b307a2dc1..04fe2c3e3 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceOccurs.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceOccurs.java @@ -42,7 +42,7 @@ import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.core.TaskAttribute; import net.sourceforge.plantuml.project.core.TaskInstant; -public class SentenceOccurs extends SentenceSimple { +public class SentenceOccurs extends SentenceSimple { public SentenceOccurs() { super(SubjectTask.ME, Verbs.occurs, new ComplementFromTo()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java b/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java index 8cf020b38..893a20967 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java @@ -40,7 +40,7 @@ import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.time.Day; -public class SentencePausesDate extends SentenceSimple { +public class SentencePausesDate extends SentenceSimple { public SentencePausesDate() { super(SubjectTask.ME, Verbs.pauses, Words.zeroOrMore(Words.THE, Words.ON, Words.AT, Words.FROM), diff --git a/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java b/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java index 46d074559..36ac07c9a 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java +++ b/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.time.Day; -public class SentencePausesDates extends SentenceSimple { +public class SentencePausesDates extends SentenceSimple { public SentencePausesDates() { super(SubjectTask.ME, Verbs.pauses, Words.zeroOrMore(Words.THE, Words.ON, Words.AT, Words.FROM), diff --git a/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java b/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java index 8edc3d2b5..da52bf859 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java +++ b/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java @@ -40,7 +40,7 @@ import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.time.DayOfWeek; -public class SentencePausesDayOfWeek extends SentenceSimple { +public class SentencePausesDayOfWeek extends SentenceSimple { public SentencePausesDayOfWeek() { super(SubjectTask.ME, Verbs.pauses, Words.zeroOrMore(Words.THE, Words.ON, Words.AT, Words.FROM), diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceRequire.java b/src/net/sourceforge/plantuml/project/lang/SentenceRequire.java index d22d11f1b..d866359c9 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceRequire.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceRequire.java @@ -40,7 +40,7 @@ import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.Load; import net.sourceforge.plantuml.project.core.Task; -public class SentenceRequire extends SentenceSimple { +public class SentenceRequire extends SentenceSimple { public SentenceRequire() { super(SubjectTask.ME, Verbs.requires, new ComplementSeveralDays()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java b/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java index d36769296..a82b8121e 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java @@ -36,25 +36,25 @@ package net.sourceforge.plantuml.project.lang; import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.project.Failable; -import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public abstract class SentenceSimple implements Sentence { +public abstract class SentenceSimple implements Sentence { - private final Subject subject; + private final Subject subject; private final IRegex verb; private final IRegex adverbialOrPropositon; - private final Something complement; + private final Something complement; - public SentenceSimple(Subject subject, IRegex verb, Something complement) { + public SentenceSimple(Subject subject, IRegex verb, Something complement) { this(subject, verb, new RegexLeaf(""), complement); } - public SentenceSimple(Subject subject, IRegex verb, IRegex adverbialOrPropositon, Something complement) { + public SentenceSimple(Subject subject, IRegex verb, IRegex adverbialOrPropositon, Something complement) { this.subject = subject; this.verb = verb; this.adverbialOrPropositon = adverbialOrPropositon; @@ -86,7 +86,7 @@ public abstract class SentenceSimple implements Sentence { OPTIONAL_FINAL_DOT); } - public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) { + public final CommandExecutionResult execute(D project, RegexResult arg) { final Failable currentSubject = subject.getMe(project, arg); if (currentSubject.isFail()) return CommandExecutionResult.error(currentSubject.getError()); @@ -99,7 +99,7 @@ public abstract class SentenceSimple implements Sentence { } - public abstract CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement); + public abstract CommandExecutionResult execute(D project, Object subject, Object complement); public IRegex getVerbRegex() { return verb; @@ -108,15 +108,13 @@ public abstract class SentenceSimple implements Sentence { protected final IRegex getAdverbialOrPropositon() { return adverbialOrPropositon; } - - protected final Subject getSubject() { + + protected final Subject getSubject() { return subject; } - protected final Something getComplement() { + protected final Something getComplement() { return complement; } - - } diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java index ea10010e9..57d26e398 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java @@ -40,7 +40,7 @@ import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.time.Day; -public class SentenceTaskEndsAbsolute extends SentenceSimple { +public class SentenceTaskEndsAbsolute extends SentenceSimple { public SentenceTaskEndsAbsolute() { super(SubjectTask.ME, Verbs.ends, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), ComplementDate.any()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java index 25524553f..0fbbd5676 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java @@ -40,7 +40,7 @@ import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.time.Day; -public class SentenceTaskEndsOnlyRelative extends SentenceSimple { +public class SentenceTaskEndsOnlyRelative extends SentenceSimple { public SentenceTaskEndsOnlyRelative() { super(SubjectTask.ME, Verbs.ends, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java index 6ce0543d3..95aeb442b 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java @@ -43,7 +43,7 @@ import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.core.TaskAttribute; import net.sourceforge.plantuml.project.core.TaskInstant; -public class SentenceTaskStarts extends SentenceSimple { +public class SentenceTaskStarts extends SentenceSimple { public SentenceTaskStarts() { super(SubjectTask.ME, Verbs.starts, new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java index 3eb5b6616..a37db325d 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java @@ -40,7 +40,7 @@ import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.time.Day; -public class SentenceTaskStartsAbsolute extends SentenceSimple { +public class SentenceTaskStartsAbsolute extends SentenceSimple { public SentenceTaskStartsAbsolute() { super(SubjectTask.ME, Verbs.starts, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), ComplementDate.any()); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java index 80b4ded71..223a321d4 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java @@ -40,7 +40,7 @@ import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.time.Day; -public class SentenceTaskStartsOnlyRelative extends SentenceSimple { +public class SentenceTaskStartsOnlyRelative extends SentenceSimple { public SentenceTaskStartsOnlyRelative() { super(SubjectTask.ME, Verbs.starts, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java index 2e3acc159..a02ff614a 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java @@ -43,11 +43,11 @@ import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.core.TaskAttribute; import net.sourceforge.plantuml.project.core.TaskInstant; -public class SentenceTaskStartsWithColor extends SentenceSimple { +public class SentenceTaskStartsWithColor extends SentenceSimple { public SentenceTaskStartsWithColor() { super(SubjectTask.ME, Verbs.starts, - new PairOfSomething(new ComplementBeforeOrAfterOrAtTaskStartOrEnd(), new ComplementWithColorLink())); + new PairOfSomething<>(new ComplementBeforeOrAfterOrAtTaskStartOrEnd(), new ComplementWithColorLink())); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/Something.java b/src/net/sourceforge/plantuml/project/lang/Something.java index 174518188..ac005a991 100644 --- a/src/net/sourceforge/plantuml/project/lang/Something.java +++ b/src/net/sourceforge/plantuml/project/lang/Something.java @@ -35,15 +35,15 @@ */ package net.sourceforge.plantuml.project.lang; +import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.project.Failable; -import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexResult; -public interface Something { +public interface Something { public IRegex toRegex(String suffix); - public Failable getMe(GanttDiagram project, RegexResult arg, String suffix); + public Failable getMe(D diagram, RegexResult arg, String suffix); } diff --git a/src/net/sourceforge/plantuml/project/lang/Subject.java b/src/net/sourceforge/plantuml/project/lang/Subject.java index 92c80670c..f53c0f906 100644 --- a/src/net/sourceforge/plantuml/project/lang/Subject.java +++ b/src/net/sourceforge/plantuml/project/lang/Subject.java @@ -37,17 +37,17 @@ package net.sourceforge.plantuml.project.lang; import java.util.Collection; +import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.project.Failable; -import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexResult; -public interface Subject { +public interface Subject { - public Collection getSentences(); + public Collection> getSentences(); public IRegex toRegex(); - public Failable getMe(GanttDiagram project, RegexResult arg); + public Failable getMe(D project, RegexResult arg); } diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java b/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java index 473218921..ddc48e6e1 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java @@ -49,9 +49,9 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; -public class SubjectDayAsDate implements Subject { +public class SubjectDayAsDate implements Subject { - public static final Subject ME = new SubjectDayAsDate(); + public static final Subject ME = new SubjectDayAsDate(); private SubjectDayAsDate() { } @@ -89,11 +89,11 @@ public class SubjectDayAsDate implements Subject { throw new IllegalStateException(); } - public Collection getSentences() { + public Collection> getSentences() { return Arrays.asList(new Close(), new Open(), new InColor()); } - class Close extends SentenceSimple { + class Close extends SentenceSimple { public Close() { super(SubjectDayAsDate.this, Verbs.isOrAre, new ComplementClose()); @@ -106,7 +106,7 @@ public class SubjectDayAsDate implements Subject { } } - class Open extends SentenceSimple { + class Open extends SentenceSimple { public Open() { super(SubjectDayAsDate.this, Verbs.isOrAre, new ComplementOpen()); } @@ -118,7 +118,7 @@ public class SubjectDayAsDate implements Subject { } } - class InColor extends SentenceSimple { + class InColor extends SentenceSimple { public InColor() { super(SubjectDayAsDate.this, Verbs.isOrAre, new ComplementInColors2()); diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectDayOfWeek.java b/src/net/sourceforge/plantuml/project/lang/SubjectDayOfWeek.java index a1c643774..9b4fffd05 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectDayOfWeek.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectDayOfWeek.java @@ -47,9 +47,9 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class SubjectDayOfWeek implements Subject { +public class SubjectDayOfWeek implements Subject { - public static final Subject ME = new SubjectDayOfWeek(); + public static final Subject ME = new SubjectDayOfWeek(); private SubjectDayOfWeek() { } @@ -63,11 +63,11 @@ public class SubjectDayOfWeek implements Subject { return Failable.ok(DayOfWeek.fromString(s)); } - public Collection getSentences() { + public Collection> getSentences() { return Arrays.asList(new AreClose(), new AreOpen(), new InColor()); } - class AreOpen extends SentenceSimple { + class AreOpen extends SentenceSimple { public AreOpen() { super(SubjectDayOfWeek.this, Verbs.are, new ComplementOpen()); } @@ -80,7 +80,7 @@ public class SubjectDayOfWeek implements Subject { } } - class AreClose extends SentenceSimple { + class AreClose extends SentenceSimple { public AreClose() { super(SubjectDayOfWeek.this, Verbs.are, new ComplementClose()); @@ -95,7 +95,7 @@ public class SubjectDayOfWeek implements Subject { } - class InColor extends SentenceSimple { + class InColor extends SentenceSimple { public InColor() { super(SubjectDayOfWeek.this, Verbs.isOrAre, new ComplementInColors2()); diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java b/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java index 99680e27b..6f8955fa7 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java @@ -50,9 +50,9 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; -public class SubjectDaysAsDates implements Subject { +public class SubjectDaysAsDates implements Subject { - public static final Subject ME = new SubjectDaysAsDates(); + public static final Subject ME = new SubjectDaysAsDates(); private SubjectDaysAsDates() { } @@ -136,11 +136,11 @@ public class SubjectDaysAsDates implements Subject { throw new IllegalStateException(); } - public Collection getSentences() { + public Collection> getSentences() { return Arrays.asList(new Close(), new Open(), new InColor(), new Named()); } - class Close extends SentenceSimple { + class Close extends SentenceSimple { public Close() { super(SubjectDaysAsDates.this, Verbs.isOrAre, new ComplementClose()); @@ -156,7 +156,7 @@ public class SubjectDaysAsDates implements Subject { } } - class Open extends SentenceSimple { + class Open extends SentenceSimple { public Open() { super(SubjectDaysAsDates.this, Verbs.isOrAre, new ComplementOpen()); @@ -173,7 +173,7 @@ public class SubjectDaysAsDates implements Subject { } - class InColor extends SentenceSimple { + class InColor extends SentenceSimple { public InColor() { super(SubjectDaysAsDates.this, Verbs.isOrAre, new ComplementInColors2()); @@ -191,7 +191,7 @@ public class SubjectDaysAsDates implements Subject { } - class Named extends SentenceSimple { + class Named extends SentenceSimple { public Named() { super(SubjectDaysAsDates.this, Verbs.isOrAreNamed, new ComplementNamed()); diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectLinks.java b/src/net/sourceforge/plantuml/project/lang/SubjectLinks.java index c76eaec28..164726cb6 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectLinks.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectLinks.java @@ -46,7 +46,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; // Removed -public class SubjectLinks implements Subject { +public class SubjectLinks implements Subject { private SubjectLinks() { } @@ -59,11 +59,11 @@ public class SubjectLinks implements Subject { return Failable.ok(project); } - public Collection getSentences() { + public Collection> getSentences() { return Arrays.asList(new InColor()); } - public class InColor extends SentenceSimple { + public class InColor extends SentenceSimple { public InColor() { super(SubjectLinks.this, Verbs.areColored, new ComplementInColors()); diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectProject.java b/src/net/sourceforge/plantuml/project/lang/SubjectProject.java index 4f72a2748..6bafeb2f2 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectProject.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectProject.java @@ -46,9 +46,9 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class SubjectProject implements Subject { +public class SubjectProject implements Subject { - public static final Subject ME = new SubjectProject(); + public static final Subject ME = new SubjectProject(); private SubjectProject() { } @@ -61,11 +61,11 @@ public class SubjectProject implements Subject { return Failable.ok(project); } - public Collection getSentences() { + public Collection> getSentences() { return Arrays.asList(new Starts()); } - class Starts extends SentenceSimple { + class Starts extends SentenceSimple { public Starts() { super(SubjectProject.this, Verbs.starts, Words.zeroOrMore(Words.ON, Words.FOR, Words.THE, Words.AT), diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectResource.java b/src/net/sourceforge/plantuml/project/lang/SubjectResource.java index d9d311e2d..ab9ab182a 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectResource.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectResource.java @@ -51,9 +51,9 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; -public class SubjectResource implements Subject { +public class SubjectResource implements Subject { - public static final Subject ME = new SubjectResource(); + public static final Subject ME = new SubjectResource(); private SubjectResource() { } @@ -71,7 +71,7 @@ public class SubjectResource implements Subject { return Failable.ok(result); } - public Collection getSentences() { + public Collection> getSentences() { return Arrays.asList(new IsOffDate(), new IsOffDates(), new IsOffDayOfWeek(), new IsOnDate(), new IsOnDates(), new IsOffBeforeDate(), new IsOffAfterDate(), new WorksOn()); } @@ -83,7 +83,7 @@ public class SubjectResource implements Subject { ); } - public class WorksOn extends SentenceSimple { + public class WorksOn extends SentenceSimple { public WorksOn() { super(SubjectResource.this, Verbs.worksOn, new ComplementTask()); @@ -99,7 +99,7 @@ public class SubjectResource implements Subject { } - public class IsOffBeforeDate extends SentenceSimple { + public class IsOffBeforeDate extends SentenceSimple { public IsOffBeforeDate() { super(SubjectResource.this, Verbs.isOff, @@ -116,7 +116,7 @@ public class SubjectResource implements Subject { } - public class IsOffAfterDate extends SentenceSimple { + public class IsOffAfterDate extends SentenceSimple { public IsOffAfterDate() { super(SubjectResource.this, Verbs.isOff, @@ -133,7 +133,7 @@ public class SubjectResource implements Subject { } - public class IsOffDate extends SentenceSimple { + public class IsOffDate extends SentenceSimple { public IsOffDate() { super(SubjectResource.this, Verbs.isOff, @@ -150,7 +150,7 @@ public class SubjectResource implements Subject { } - public class IsOffDates extends SentenceSimple { + public class IsOffDates extends SentenceSimple { public IsOffDates() { super(SubjectResource.this, Verbs.isOff, @@ -168,7 +168,7 @@ public class SubjectResource implements Subject { } - public class IsOffDayOfWeek extends SentenceSimple { + public class IsOffDayOfWeek extends SentenceSimple { public IsOffDayOfWeek() { super(SubjectResource.this, Verbs.isOff, @@ -184,7 +184,7 @@ public class SubjectResource implements Subject { } - public class IsOnDate extends SentenceSimple { + public class IsOnDate extends SentenceSimple { public IsOnDate() { super(SubjectResource.this, Verbs.isOn, @@ -201,7 +201,7 @@ public class SubjectResource implements Subject { } - public class IsOnDates extends SentenceSimple { + public class IsOnDates extends SentenceSimple { public IsOnDates() { super(SubjectResource.this, Verbs.isOn, diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java b/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java index 4ed3a05e8..473696163 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java @@ -47,9 +47,9 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class SubjectSeparator implements Subject { +public class SubjectSeparator implements Subject { - public static final Subject ME = new SubjectSeparator(); + public static final Subject ME = new SubjectSeparator(); private SubjectSeparator() { } @@ -62,11 +62,11 @@ public class SubjectSeparator implements Subject { return Failable.ok(project); } - public Collection getSentences() { + public Collection> getSentences() { return Arrays.asList(new JustBefore(), new JustAfter(), new Just()); } - class JustBefore extends SentenceSimple { + class JustBefore extends SentenceSimple { public JustBefore() { super(SubjectSeparator.this, Verbs.just, Words.exactly(Words.BEFORE), ComplementDate.any()); @@ -82,7 +82,7 @@ public class SubjectSeparator implements Subject { } - class JustAfter extends SentenceSimple { + class JustAfter extends SentenceSimple { public JustAfter() { super(SubjectSeparator.this, Verbs.just, Words.exactly(Words.AFTER), ComplementDate.any()); @@ -98,7 +98,7 @@ public class SubjectSeparator implements Subject { } - class Just extends SentenceSimple { + class Just extends SentenceSimple { public Just() { super(SubjectSeparator.this, Verbs.just, new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java index da31a4542..0a0ef31dd 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java @@ -48,10 +48,12 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; +import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; -public class SubjectTask implements Subject { +public class SubjectTask implements Subject { - public static final Subject ME = new SubjectTask(); + public static final Subject ME = new SubjectTask(); private SubjectTask() { } @@ -64,9 +66,16 @@ public class SubjectTask implements Subject { return Failable.error("Not sure what are you refering to?"); } else { final String subject = arg.get("SUBJECT", 0); - final String shortName = arg.get("SUBJECT", 1); + final String shortName = arg.get("SHORTNAME", 0); final String then = arg.get("THEN", 0); + final String stereotype = arg.get("STEREOTYPE", 0); + result = gantt.getOrCreateTask(subject, shortName, then != null); + + if (stereotype != null) + result.setStereotype(Stereotype.build(arg.get("STEREOTYPE", 0))); + + gantt.setIt(result); } @@ -89,7 +98,7 @@ public class SubjectTask implements Subject { return Failable.ok(result); } - public Collection getSentences() { + public Collection> getSentences() { return Arrays.asList(new SentenceRequire(), new SentenceTaskStarts(), new SentenceTaskStartsWithColor(), new SentenceTaskStartsOnlyRelative(), new SentenceTaskStartsAbsolute(), new SentenceHappens(), new SentenceHappensDate(), new SentenceEnds(), new SentenceTaskEndsOnlyRelative(), @@ -103,13 +112,17 @@ public class SubjectTask implements Subject { return new RegexOr( // new RegexLeaf("IT", "(it)"), // new RegexConcat(new RegexLeaf("THEN", "(then[%s]+)?"), // - new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\](?:[%s]+as[%s]+\\[([^\\[\\]]+?)\\])?"), // - new RegexOptional( // - new RegexConcat( // - Words.exactly(Words.ON), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("RESOURCE", "((?:\\{[^{}]+\\}[%s]*)+)") // - )))); + new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\]"), // + StereotypePattern.optional("STEREOTYPE"), // + new RegexOptional(new RegexConcat(// + Words.exactly(Words.AS), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("SHORTNAME", "\\[([^\\[\\]]+?)\\]"))), // + new RegexOptional(new RegexConcat( // + Words.exactly(Words.ON), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("RESOURCE", "((?:\\{[^{}]+\\}[%s]*)+)") // + )))); } } diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectToday.java b/src/net/sourceforge/plantuml/project/lang/SubjectToday.java index 3ee19a018..0f4854f16 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectToday.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectToday.java @@ -48,10 +48,10 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; -public class SubjectToday implements Subject { - // ::remove folder when __HAXE__ +public class SubjectToday implements Subject { + // ::remove folder when __HAXE__ - public static final Subject ME = new SubjectToday(); + public static final Subject ME = new SubjectToday(); private SubjectToday() { } @@ -66,11 +66,11 @@ public class SubjectToday implements Subject { return Failable.ok(new Today()); } - public Collection getSentences() { + public Collection> getSentences() { return Arrays.asList(new InColor(), new IsDate()); } - class InColor extends SentenceSimple { + class InColor extends SentenceSimple { public InColor() { super(SubjectToday.this, Verbs.isColored, new ComplementInColors()); @@ -87,7 +87,7 @@ public class SubjectToday implements Subject { } - class IsDate extends SentenceSimple { + class IsDate extends SentenceSimple { public IsDate() { super(SubjectToday.this, Verbs.is, ComplementDate.any()); diff --git a/src/net/sourceforge/plantuml/project/lang/Words.java b/src/net/sourceforge/plantuml/project/lang/Words.java index e3239c218..41bb31782 100644 --- a/src/net/sourceforge/plantuml/project/lang/Words.java +++ b/src/net/sourceforge/plantuml/project/lang/Words.java @@ -45,6 +45,7 @@ public class Words { public final static String AFTER = "after"; public final static String AND = "and"; + public final static String AS = "as"; public final static String AT = "at"; public final static String BEFORE = "before"; public final static String COMPLETION = "completion"; diff --git a/src/net/sourceforge/plantuml/project/time/Day.java b/src/net/sourceforge/plantuml/project/time/Day.java index b6eb3df98..f8d27cae6 100644 --- a/src/net/sourceforge/plantuml/project/time/Day.java +++ b/src/net/sourceforge/plantuml/project/time/Day.java @@ -36,6 +36,7 @@ package net.sourceforge.plantuml.project.time; import java.util.Calendar; +import java.util.Locale; import java.util.TimeZone; import net.sourceforge.plantuml.project.Value; @@ -48,7 +49,7 @@ public class Day implements Comparable, Value { private final int dayOfMonth; private final MonthYear monthYear; - private final long ms1; + private final long milliseconds; public static Day create(int year, String month, int dayOfMonth) { return new Day(year, Month.fromString(month), dayOfMonth); @@ -66,10 +67,14 @@ public class Day implements Comparable, Value { return create(System.currentTimeMillis()); } + public String toStringShort(Locale locale) { + return monthYear.shortName(locale) + " " + dayOfMonth; + } + public int getWeekOfYear(WeekNumberStrategy strategy) { synchronized (gmt) { gmt.clear(); - gmt.setTimeInMillis(ms1); + gmt.setTimeInMillis(milliseconds); gmt.setFirstDayOfWeek(strategy.getFirstDayOfWeekAsLegacyInt()); gmt.setMinimalDaysInFirstWeek(strategy.getMinimalDaysInFirstWeek()); return gmt.get(Calendar.WEEK_OF_YEAR); @@ -82,12 +87,12 @@ public class Day implements Comparable, Value { synchronized (gmt) { gmt.clear(); gmt.set(year, month.ordinal(), dayOfMonth); - this.ms1 = gmt.getTimeInMillis(); + this.milliseconds = gmt.getTimeInMillis(); } } private Day(long ms) { - this.ms1 = ms; + this.milliseconds = ms; synchronized (gmt) { gmt.clear(); gmt.setTimeInMillis(ms); @@ -113,11 +118,11 @@ public class Day implements Comparable, Value { } public final int getAbsoluteDayNum() { - return (int) (ms1 / MILLISECONDS_PER_DAY); + return (int) (milliseconds / MILLISECONDS_PER_DAY); } public final long getMillis() { - return ms1; + return milliseconds; } public int year() { @@ -195,4 +200,12 @@ public class Day implements Comparable, Value { return increment(); } + public Day roundDayDown() { + return new Day((milliseconds / MILLISECONDS_PER_DAY) * MILLISECONDS_PER_DAY); + } + + public Day roundDayUp() { + return new Day(((milliseconds + MILLISECONDS_PER_DAY - 1) / MILLISECONDS_PER_DAY) * MILLISECONDS_PER_DAY); + } + } diff --git a/src/net/sourceforge/plantuml/regexdiagram/PSystemRegex.java b/src/net/sourceforge/plantuml/regexdiagram/PSystemRegex.java index af874516c..e66975752 100644 --- a/src/net/sourceforge/plantuml/regexdiagram/PSystemRegex.java +++ b/src/net/sourceforge/plantuml/regexdiagram/PSystemRegex.java @@ -122,11 +122,11 @@ public class PSystemRegex extends TitledDiagram { @Override protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { // while (stack.size() > 1) // concatenation(); final ETile peekFirst = stack.peekFirst(); @@ -266,9 +266,10 @@ public class PSystemRegex extends TitledDiagram { if (arg1 instanceof ETileConcatenation) { arg1.push(arg2); stack.addFirst(arg1); - } else if (arg2 instanceof ETileConcatenation) { - arg2.push(arg1); - stack.addFirst(arg2); + // This does not work for (A[B])(C) +// } else if (arg2 instanceof ETileConcatenation) { +// arg2.push(arg1); +// stack.addFirst(arg2); } else { final ETile concat = new ETileConcatenation(); concat.push(arg1); diff --git a/src/net/sourceforge/plantuml/regexdiagram/RegexExpression.java b/src/net/sourceforge/plantuml/regexdiagram/RegexExpression.java index 77ab74334..584ed4e63 100644 --- a/src/net/sourceforge/plantuml/regexdiagram/RegexExpression.java +++ b/src/net/sourceforge/plantuml/regexdiagram/RegexExpression.java @@ -103,7 +103,7 @@ public class RegexExpression { return false; } - private static String readOpenParenthesis(CharInspector it) { + private static String readOpenParenthesis(CharInspector it) throws RegexParsingException { final char current0 = it.peek(0); it.jump(); final StringBuilder result = new StringBuilder(); @@ -118,6 +118,17 @@ public class RegexExpression { it.jump(); result.append("?!"); } + if (it.peek(0) == '?' && it.peek(1) == '<') { + while (true) { + if (it.peek(0) == 0) + throw new RegexParsingException("Unclosed named capturing group"); + if (it.peek(0) == '>') { + it.jump(); + return result.toString(); + } + it.jump(); + } + } return result.toString(); } diff --git a/src/net/sourceforge/plantuml/salt/PSystemSalt.java b/src/net/sourceforge/plantuml/salt/PSystemSalt.java index be3c0922a..303aa32bf 100644 --- a/src/net/sourceforge/plantuml/salt/PSystemSalt.java +++ b/src/net/sourceforge/plantuml/salt/PSystemSalt.java @@ -126,8 +126,7 @@ public class PSystemSalt extends TitledDiagram implements WithSprite { } @Override - protected TextBlock getTextBlock() { - final FileFormatOption fileFormatOption = new FileFormatOption(FileFormat.PNG); + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { final Element salt = createElement(manageSprite()); final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam()); final XDimension2D size = salt.getPreferredDimension(stringBounder, 0, 0); diff --git a/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagram.java b/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagram.java index d70277fb4..21bd66775 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagram.java +++ b/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagram.java @@ -296,13 +296,13 @@ public class SequenceDiagram extends UmlDiagram { } @Override - final public void exportDiagramGraphic(UGraphic ug) { - final FileMaker sequenceDiagramPngMaker = getSequenceDiagramPngMaker(0, new FileFormatOption(FileFormat.PNG)); + final public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { + final FileMaker sequenceDiagramPngMaker = getSequenceDiagramPngMaker(0, fileFormatOption); sequenceDiagramPngMaker.createOneGraphic(ug); } @Override - final protected TextBlock getTextBlock() { + final protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java index c41b98fbd..5b4aa1ebe 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java @@ -65,6 +65,7 @@ import net.sourceforge.plantuml.skin.ArrowDecoration; import net.sourceforge.plantuml.skin.ArrowHead; import net.sourceforge.plantuml.skin.ArrowPart; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -123,9 +124,7 @@ public class CommandArrow extends SingleLineCommand2 { new RegexLeaf("ACTIVATION", "(?:(\\+\\+|\\*\\*|!!|--|--\\+\\+|\\+\\+--)?)"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("LIFECOLOR", "(?:(#\\w+)?)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("MESSAGE", "(?::[%s]*(.*))?"), // diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandBoxStart.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandBoxStart.java index 9dc4752c6..10bd93bdd 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandBoxStart.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandBoxStart.java @@ -50,6 +50,7 @@ import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.utils.LineLocation; @@ -69,8 +70,7 @@ public class CommandBoxStart extends SingleLineCommand2 { new RegexConcat( // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("NAME2", "([^#]+)")))), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // + StereotypePattern.optional("STEREO"), // color().getRegex(), // RegexLeaf.end()); } diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA.java index 03c0cd3df..04236f68c 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA.java @@ -40,6 +40,7 @@ import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.UrlBuilder; public class CommandParticipantA extends CommandParticipant { @@ -60,13 +61,12 @@ public class CommandParticipantA extends CommandParticipant { RegexLeaf.spaceOneOrMore() // )), // new RegexLeaf("CODE", "([%pLN_.@]+)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // getOrderRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // ColorParser.exp1(), RegexLeaf.end()); } + } diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA2.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA2.java index 954bf7ac2..7014b0073 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA2.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA2.java @@ -39,6 +39,7 @@ import net.sourceforge.plantuml.klimt.color.ColorParser; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.UrlBuilder; public class CommandParticipantA2 extends CommandParticipant { @@ -56,9 +57,7 @@ public class CommandParticipantA2 extends CommandParticipant { new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("FULL", "[%g]([^%g]+)[%g]"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // getOrderRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA3.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA3.java index dcb2b2f0c..fe05fbc49 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA3.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA3.java @@ -39,6 +39,7 @@ import net.sourceforge.plantuml.klimt.color.ColorParser; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.UrlBuilder; public class CommandParticipantA3 extends CommandParticipant { @@ -56,9 +57,7 @@ public class CommandParticipantA3 extends CommandParticipant { new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE", "([%pLN_.@]+)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // getOrderRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA4.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA4.java index 6197f0265..c2ec8e1d0 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA4.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA4.java @@ -39,6 +39,7 @@ import net.sourceforge.plantuml.klimt.color.ColorParser; import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.UrlBuilder; public class CommandParticipantA4 extends CommandParticipant { @@ -52,9 +53,7 @@ public class CommandParticipantA4 extends CommandParticipant { getRegexType(), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE", "[%g]([^%g]+)[%g]"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // getOrderRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantMultilines.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantMultilines.java index b9d3a554e..6404fb347 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantMultilines.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantMultilines.java @@ -52,6 +52,7 @@ import net.sourceforge.plantuml.sequencediagram.Participant; import net.sourceforge.plantuml.sequencediagram.ParticipantType; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; @@ -74,9 +75,7 @@ public class CommandParticipantMultilines extends CommandMultilines2\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREO"), // CommandParticipant.getOrderRegex(), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/skin/UmlDiagramType.java b/src/net/sourceforge/plantuml/skin/UmlDiagramType.java index 3beaf0691..00bdbd29f 100644 --- a/src/net/sourceforge/plantuml/skin/UmlDiagramType.java +++ b/src/net/sourceforge/plantuml/skin/UmlDiagramType.java @@ -39,7 +39,7 @@ import net.sourceforge.plantuml.style.SName; public enum UmlDiagramType { SEQUENCE, STATE, CLASS, OBJECT, ACTIVITY, DESCRIPTION, COMPOSITE, FLOW, TIMING, BPM, NWDIAG, MINDMAP, WBS, WIRE, - HELP, GANTT, SALT, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, FILES; + HELP, GANTT, SALT, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, FILES, CHRONOLOGY; public SName getStyleName() { if (this == SEQUENCE) @@ -96,6 +96,9 @@ public enum UmlDiagramType { if (this == REGEX) return SName.regex; + if (this == CHRONOLOGY) + return SName.ganttDiagram; + return SName.activityDiagram; } } diff --git a/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackage2.java b/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackage2.java index a683fe5b7..b2d94a443 100644 --- a/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackage2.java +++ b/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackage2.java @@ -55,6 +55,7 @@ import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.statediagram.StateDiagram; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -83,9 +84,7 @@ public class CommandCreatePackage2 extends SingleLineCommand2 { new RegexLeaf("as"), RegexLeaf.spaceOneOrMore() // )), // new RegexLeaf("CODE2", "([%pLN_.]+)"))), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // UrlBuilder.OPTIONAL, // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // diff --git a/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState.java b/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState.java index 6a8e408aa..b8a502ab9 100644 --- a/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState.java +++ b/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState.java @@ -56,6 +56,7 @@ import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.statediagram.StateDiagram; import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -86,9 +87,7 @@ public class CommandCreatePackageState extends SingleLineCommand2 new RegexLeaf("CODE2", "([%pLN_.]+)"))), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/statediagram/command/CommandCreateState.java b/src/net/sourceforge/plantuml/statediagram/command/CommandCreateState.java index 1de76f5f1..abb561747 100644 --- a/src/net/sourceforge/plantuml/statediagram/command/CommandCreateState.java +++ b/src/net/sourceforge/plantuml/statediagram/command/CommandCreateState.java @@ -56,6 +56,7 @@ import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.statediagram.StateDiagram; import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlMode; @@ -85,9 +86,7 @@ public class CommandCreateState extends SingleLineCommand2 { new RegexLeaf("CODE4", "[%g]([^%g]+)[%g]")), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // UrlBuilder.OPTIONAL, // diff --git a/src/net/sourceforge/plantuml/stereo/Stereotype.java b/src/net/sourceforge/plantuml/stereo/Stereotype.java index 0268b9ae6..7cc43cd38 100644 --- a/src/net/sourceforge/plantuml/stereo/Stereotype.java +++ b/src/net/sourceforge/plantuml/stereo/Stereotype.java @@ -78,6 +78,8 @@ public class Stereotype implements CharSequence { } public static Stereotype build(String label) { + if (label == null) + return null; return build(label, true); } diff --git a/src/net/sourceforge/plantuml/stereo/StereotypePattern.java b/src/net/sourceforge/plantuml/stereo/StereotypePattern.java new file mode 100644 index 000000000..c86520408 --- /dev/null +++ b/src/net/sourceforge/plantuml/stereo/StereotypePattern.java @@ -0,0 +1,71 @@ +/* ======================================================================== + * 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.stereo; + +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexConcat; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexOptional; + +public class StereotypePattern { + + public static IRegex optional(String param) { + return new RegexConcat( // + RegexLeaf.spaceZeroOrMore(), // + new RegexOptional(mandatory(param)), // + RegexLeaf.spaceZeroOrMore() // + ); + } + + public static IRegex mandatory(String param) { + return new RegexLeaf(param, "(\\<\\<.+\\>\\>)"); + } + + public static IRegex optionalArchimate(String param) { + return new RegexConcat( // + RegexLeaf.spaceZeroOrMore(), // + new RegexOptional(new RegexLeaf(param, "(\\<\\<[-\\w]+\\>\\>)")), // + RegexLeaf.spaceZeroOrMore() // + ); + } + + public static String removeChevronBrackets(String stereo) { + if (stereo != null && stereo.startsWith("<<") && stereo.endsWith(">>")) + return stereo.substring(2, stereo.length() - 2); + return stereo; + } + +} diff --git a/src/net/sourceforge/plantuml/sudoku/PSystemSudoku.java b/src/net/sourceforge/plantuml/sudoku/PSystemSudoku.java index 90ce3c596..11c342031 100644 --- a/src/net/sourceforge/plantuml/sudoku/PSystemSudoku.java +++ b/src/net/sourceforge/plantuml/sudoku/PSystemSudoku.java @@ -70,7 +70,7 @@ public class PSystemSudoku extends AbstractPSystem { } @Override - public void exportDiagramGraphic(UGraphic ug) { + public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { final GraphicsSudoku sud = new GraphicsSudoku(sudoku); sud.drawInternal(ug); } diff --git a/src/net/sourceforge/plantuml/tim/Eater.java b/src/net/sourceforge/plantuml/tim/Eater.java index a4b74b118..c23fbf085 100644 --- a/src/net/sourceforge/plantuml/tim/Eater.java +++ b/src/net/sourceforge/plantuml/tim/Eater.java @@ -79,7 +79,7 @@ public abstract class Eater { } final public TValue eatExpression(TContext context, TMemory memory) throws EaterException, EaterExceptionLocated { - char ch = peekChar(); + final char ch = peekChar(); if (ch == '{' || ch == '[') { final String data = eatAllToEnd(); // System.err.println("data=" + data); diff --git a/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java b/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java index 0847489b3..03d10d127 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java +++ b/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java @@ -99,11 +99,11 @@ public class TimingDiagram extends UmlDiagram implements Clocks { protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandAnalog.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandAnalog.java index ebbaf7a68..2c16fc6c2 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/command/CommandAnalog.java +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandAnalog.java @@ -43,6 +43,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.timingdiagram.PlayerAnalog; import net.sourceforge.plantuml.timingdiagram.TimingDiagram; import net.sourceforge.plantuml.utils.LineLocation; @@ -62,9 +63,7 @@ public class CommandAnalog extends SingleLineCommand2 { new RegexLeaf("analog"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("FULL", "[%g]([^%g]+)[%g]"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceOneOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexOptional(// new RegexConcat( // new RegexLeaf("between"), // @@ -78,9 +77,7 @@ public class CommandAnalog extends SingleLineCommand2 { new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE", "([%pLN_.@]+)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE2"), // RegexLeaf.end()); } diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandBinary.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandBinary.java index 8feb151ab..e46b9d077 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/command/CommandBinary.java +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandBinary.java @@ -43,6 +43,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.timingdiagram.TimingDiagram; import net.sourceforge.plantuml.utils.LineLocation; @@ -61,15 +62,11 @@ public class CommandBinary extends SingleLineCommand2 { new RegexLeaf("binary"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("FULL", "[%g]([^%g]+)[%g]"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceOneOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE", "([%pLN_.@]+)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE2"), // RegexLeaf.end()); } diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandRobustConcise.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandRobustConcise.java index 432b0fde1..51716350c 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/command/CommandRobustConcise.java +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandRobustConcise.java @@ -43,6 +43,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.timingdiagram.TimingDiagram; import net.sourceforge.plantuml.timingdiagram.TimingStyle; import net.sourceforge.plantuml.utils.LineLocation; @@ -64,15 +65,11 @@ public class CommandRobustConcise extends SingleLineCommand2 { new RegexOptional( // new RegexConcat( // new RegexLeaf("FULL", "[%g]([^%g]+)[%g]"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("as"), // RegexLeaf.spaceOneOrMore())), // new RegexLeaf("CODE", "([%pLN_.@]+)"), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE2", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE2"), // RegexLeaf.end()); } diff --git a/src/net/sourceforge/plantuml/version/PSystemLicense.java b/src/net/sourceforge/plantuml/version/PSystemLicense.java index 50cebbdee..d3ecb24e8 100644 --- a/src/net/sourceforge/plantuml/version/PSystemLicense.java +++ b/src/net/sourceforge/plantuml/version/PSystemLicense.java @@ -76,7 +76,7 @@ public class PSystemLicense extends PlainDiagram implements UDrawable { } @Override - public void exportDiagramGraphic(UGraphic ug) { + public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) { final LicenseInfo licenseInfo = LicenseInfo.retrieveQuick(); getTextBlock(licenseInfo).drawU(ug); } diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index 942297437..1d1a930c7 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.13beta3"; + private static final String version = "1.2023.13beta4"; public static String versionString() { return version; diff --git a/src/net/sourceforge/plantuml/wbs/CommandWBSLink.java b/src/net/sourceforge/plantuml/wbs/CommandWBSLink.java index a8ca6d469..0a88bb07e 100644 --- a/src/net/sourceforge/plantuml/wbs/CommandWBSLink.java +++ b/src/net/sourceforge/plantuml/wbs/CommandWBSLink.java @@ -46,6 +46,7 @@ import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.stereo.Stereotype; +import net.sourceforge.plantuml.stereo.StereotypePattern; import net.sourceforge.plantuml.utils.LineLocation; public class CommandWBSLink extends SingleLineCommand2 { @@ -64,9 +65,7 @@ public class CommandWBSLink extends SingleLineCommand2 { new RegexLeaf("CODE2", "([%pLN_]+)"), // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // - RegexLeaf.spaceZeroOrMore(), // + StereotypePattern.optional("STEREOTYPE"), // new RegexLeaf("LABEL_LINK", "(?::[%s]*(.+))?"), // RegexLeaf.end()); } diff --git a/src/net/sourceforge/plantuml/wbs/WBSDiagram.java b/src/net/sourceforge/plantuml/wbs/WBSDiagram.java index 6d3e03663..192d9e3b4 100644 --- a/src/net/sourceforge/plantuml/wbs/WBSDiagram.java +++ b/src/net/sourceforge/plantuml/wbs/WBSDiagram.java @@ -92,11 +92,11 @@ public class WBSDiagram extends UmlDiagram { protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { diff --git a/src/net/sourceforge/plantuml/wire/WireDiagram.java b/src/net/sourceforge/plantuml/wire/WireDiagram.java index 12cf30cc3..7919be884 100644 --- a/src/net/sourceforge/plantuml/wire/WireDiagram.java +++ b/src/net/sourceforge/plantuml/wire/WireDiagram.java @@ -76,11 +76,11 @@ public class WireDiagram extends UmlDiagram { protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) throws IOException { - return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); + return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os); } @Override - protected TextBlock getTextBlock() { + protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { diff --git a/test/net/sourceforge/plantuml/PipeTest.java b/test/net/sourceforge/plantuml/PipeTest.java index a975bf26c..6db686723 100644 --- a/test/net/sourceforge/plantuml/PipeTest.java +++ b/test/net/sourceforge/plantuml/PipeTest.java @@ -127,7 +127,7 @@ class PipeTest { false, false)); l.add(TestCase.of("-syntax", "@startuml\na->b\n@enduml\n@startuml\na->b\nb->c\n@enduml\n", "SEQUENCE\n(2 participants)\nSEQUENCE\n(3 participants)\n", Verification.EXACT, false, false)); - l.add(TestCase.of("-syntax", "@startgantt\n[a] lasts 1 day\n@endgantt", "OTHER\n(Project)\n", + l.add(TestCase.of("-syntax", "@startgantt\n[a] lasts 1 day\n@endgantt", "OTHER\n(Gantt)\n", Verification.EXACT, false, false)); // invalid syntax diff --git a/test/nonreg/RenderViaApiTest.java b/test/nonreg/RenderViaApiTest.java new file mode 100644 index 000000000..295eb1a56 --- /dev/null +++ b/test/nonreg/RenderViaApiTest.java @@ -0,0 +1,56 @@ +package nonreg; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.util.Lists.newArrayList; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.io.PrintStream; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import net.sourceforge.plantuml.FileFormat; +import net.sourceforge.plantuml.FileFormatOption; +import net.sourceforge.plantuml.SourceStringReader; +import net.sourceforge.plantuml.core.DiagramDescription; + +/** + * Tests the Render + */ +class RenderViaApiTest { + + @ParameterizedTest(name = "[{index}] {1}") + @CsvSource(nullValues = "null", value = { + "'@startuml\n!$a={\"k\": \"exampleValue\"}\ntitle $a.k\na -> b\n@enduml\n' , exampleValue", + "'@startuml\n!$a=[1, 2, 3]\ntitle xx $a[2] yy\na -> a\n@enduml' , xx 3 yy", + "'@startuml\ntitle\n!foreach $i in [1, 2, 3]\nxx $i yy\n!endfor\nendtitle\na -> a\n@enduml' , xx 2 yy", + "'@startuml\ntitle\n!foreach $i in [\"a\", \"b\", \"c\"]\nxx $i yy\n!endfor\nendtitle\na -> a\n@enduml' , xx b yy", + }) + void RenderTest(String input, String expected) throws Exception { + assertRenderExpectedOutput(input, expected); + } + + // TODO: to Factorize on a specific test package... + + private String RenderViaApiTest(String diagram, FileFormat format) throws IOException, UnsupportedEncodingException { + final SourceStringReader ssr = new SourceStringReader(diagram, UTF_8); + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final DiagramDescription diagramDescription = ssr.outputImage(baos, 0, new FileFormatOption(format)); + final String rendered = new String(baos.toByteArray(), UTF_8); + // System.out.println(rendered); + return rendered; + } + + public void assertRenderExpectedOutput(String input, String expected) throws Exception { + final String rendered = RenderViaApiTest(input, FileFormat.PREPROC); + // OK with: + // final String rendered = RenderViaApiTest(input, FileFormat.UTXT); + assertThat(rendered).doesNotContain("syntax").contains(expected); + } +} diff --git a/test/nonreg/RenderViaPipeTest.java b/test/nonreg/RenderViaPipeTest.java new file mode 100644 index 000000000..9a76078b9 --- /dev/null +++ b/test/nonreg/RenderViaPipeTest.java @@ -0,0 +1,63 @@ +package nonreg; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.util.Lists.newArrayList; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import net.sourceforge.plantuml.ErrorStatus; +import net.sourceforge.plantuml.Option; +import net.sourceforge.plantuml.Pipe; + +/** + * Tests the Render + */ +class RenderViaPipeTest { + + @ParameterizedTest(name = "[{index}] {1}") + @CsvSource(nullValues = "null", value = { + "'@startuml\n!$a={\"k\": \"exampleValue\"}\ntitle $a.k\na -> b\n@enduml\n' , exampleValue", + "'@startuml\n!$a=[1, 2, 3]\ntitle xx $a[2] yy\na -> a\n' , xx 3 yy", + "'@startuml\ntitle\n!foreach $i in [1, 2, 3]\nxx $i yy\n!endfor\nendtitle\na -> a\n' , xx 2 yy", + "'@startuml\ntitle\n!foreach $i in [\"a\", \"b\", \"c\"]\nxx $i yy\n!endfor\nendtitle\na -> a\n' , xx b yy", + }) + void RenderTest(String input, String expected) throws Exception { + assertRenderExpectedOutput(input, expected); + } + + // TODO: to Factorize on a specific test package... + private static final String[] COMMON_OPTIONS = {"-preproc"}; + // OK with "-tutxt" + // private static final String[] COMMON_OPTIONS = {"-tutxt"}; + + private String[] optionArray(String... extraOptions) { + final List list = newArrayList(COMMON_OPTIONS); + Collections.addAll(list, extraOptions); + return list.toArray(new String[0]); + } + + private String renderViaPipe(String diagram, String... extraOptions) throws Exception { + final Option option = new Option(optionArray(extraOptions)); + final ByteArrayInputStream bais = new ByteArrayInputStream(diagram.getBytes(UTF_8)); + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final Pipe pipe = new Pipe(option, new PrintStream(baos), bais, option.getCharset()); + pipe.managePipe(ErrorStatus.init()); + final String rendered = new String(baos.toByteArray(), UTF_8); + // System.out.println(rendered); + return rendered; + } + + public void assertRenderExpectedOutput(String input, String expected) throws Exception { + final String rendered = renderViaPipe(input); + assertThat(rendered).doesNotContain("syntax").contains(expected); + } +} diff --git a/test/nonreg/simple/A0003_Test.java b/test/nonreg/simple/A0003_Test.java index 5d78367bd..99bbf5888 100644 --- a/test/nonreg/simple/A0003_Test.java +++ b/test/nonreg/simple/A0003_Test.java @@ -29,6 +29,6 @@ public class A0003_Test extends BasicTest { @Test void testSimple() throws IOException { - checkImage("(Project)"); + checkImage("(Gantt)"); } }