From f0b3e6900c3adc7b6c52d1482304815c28975b36 Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Sun, 26 Nov 2023 18:57:11 +0100 Subject: [PATCH] feat: improve gantt language --- .../plantuml/project/GanttDiagram.java | 24 ++++- ...wBasicImpl.java => ResourceDrawBasic.java} | 4 +- .../plantuml/project/lang/Adverbial.java | 44 +++++++++ .../project/lang/ComplementDates.java | 8 +- .../plantuml/project/lang/ComplementTask.java | 58 +++++++++++ .../plantuml/project/lang/Sentence.java | 5 + .../plantuml/project/lang/SentenceAnd.java | 36 +++---- .../plantuml/project/lang/SentenceAndAnd.java | 53 +++++------ .../project/lang/SentenceHappens.java | 3 +- .../project/lang/SentenceHappensDate.java | 2 +- .../lang/SentenceIsColoredForCompletion.java | 3 +- .../project/lang/SentencePausesDate.java | 3 +- .../project/lang/SentencePausesDates.java | 11 +-- .../project/lang/SentencePausesDayOfWeek.java | 3 +- .../plantuml/project/lang/SentenceSimple.java | 58 +++++++---- .../lang/SentenceTaskEndsAbsolute.java | 3 +- .../lang/SentenceTaskEndsOnlyRelative.java | 3 +- .../project/lang/SentenceTaskStarts.java | 2 +- .../lang/SentenceTaskStartsAbsolute.java | 2 +- .../lang/SentenceTaskStartsOnlyRelative.java | 3 +- .../lang/SentenceTaskStartsWithColor.java | 2 +- .../plantuml/project/lang/SubjectProject.java | 3 +- .../project/lang/SubjectResource.java | 73 ++++++++++---- .../project/lang/SubjectSeparator.java | 4 +- .../plantuml/project/lang/SubjectTask.java | 54 ++++++----- .../plantuml/project/lang/Verbs.java | 95 ++----------------- .../plantuml/project/lang/Words.java | 77 +++++++++++++++ .../regex/RegexRepeatedZeroOrMore.java | 58 +++++++++++ 28 files changed, 475 insertions(+), 219 deletions(-) rename src/net/sourceforge/plantuml/project/draw/{ResourceDrawBasicImpl.java => ResourceDrawBasic.java} (96%) create mode 100644 src/net/sourceforge/plantuml/project/lang/Adverbial.java create mode 100644 src/net/sourceforge/plantuml/project/lang/ComplementTask.java create mode 100644 src/net/sourceforge/plantuml/project/lang/Words.java create mode 100644 src/net/sourceforge/plantuml/regex/RegexRepeatedZeroOrMore.java diff --git a/src/net/sourceforge/plantuml/project/GanttDiagram.java b/src/net/sourceforge/plantuml/project/GanttDiagram.java index b3207c3df..10a540edc 100644 --- a/src/net/sourceforge/plantuml/project/GanttDiagram.java +++ b/src/net/sourceforge/plantuml/project/GanttDiagram.java @@ -86,7 +86,7 @@ import net.sourceforge.plantuml.project.core.TaskInstant; import net.sourceforge.plantuml.project.core.TaskSeparator; import net.sourceforge.plantuml.project.draw.FingerPrint; import net.sourceforge.plantuml.project.draw.ResourceDraw; -import net.sourceforge.plantuml.project.draw.ResourceDrawVersion2; +import net.sourceforge.plantuml.project.draw.ResourceDrawBasic; import net.sourceforge.plantuml.project.draw.TaskDraw; import net.sourceforge.plantuml.project.draw.TaskDrawDiamond; import net.sourceforge.plantuml.project.draw.TaskDrawGroup; @@ -153,6 +153,9 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit private int defaultCompletion = 100; + private Task it; + private Resource they; + public CommandExecutionResult changeLanguage(String lang) { this.locale = new Locale(lang); return CommandExecutionResult.ok(); @@ -487,7 +490,8 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit private ResourceDraw buildResourceDraw(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, Day max) { - return new ResourceDrawVersion2(gantt, res, timeScale, y, min, max); + return new ResourceDrawBasic(gantt, res, timeScale, y, min, max); + // return new ResourceDrawVersion2(gantt, res, timeScale, y, min, max); } private Collection getConstraints(Task task) { @@ -906,4 +910,20 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit 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/project/draw/ResourceDrawBasicImpl.java b/src/net/sourceforge/plantuml/project/draw/ResourceDrawBasic.java similarity index 96% rename from src/net/sourceforge/plantuml/project/draw/ResourceDrawBasicImpl.java rename to src/net/sourceforge/plantuml/project/draw/ResourceDrawBasic.java index 7be2906d0..5ba180cda 100644 --- a/src/net/sourceforge/plantuml/project/draw/ResourceDrawBasicImpl.java +++ b/src/net/sourceforge/plantuml/project/draw/ResourceDrawBasic.java @@ -52,7 +52,7 @@ import net.sourceforge.plantuml.project.core.Resource; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; -public class ResourceDrawBasicImpl implements ResourceDraw { +public class ResourceDrawBasic implements ResourceDraw { private final Resource res; private final TimeScale timeScale; @@ -61,7 +61,7 @@ public class ResourceDrawBasicImpl implements ResourceDraw { private final Day max; private final GanttDiagram gantt; - public ResourceDrawBasicImpl(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, Day max) { + public ResourceDrawBasic(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, Day max) { this.res = res; this.timeScale = timeScale; this.y = y; diff --git a/src/net/sourceforge/plantuml/project/lang/Adverbial.java b/src/net/sourceforge/plantuml/project/lang/Adverbial.java new file mode 100644 index 000000000..2c8ad3a02 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/Adverbial.java @@ -0,0 +1,44 @@ +/* ======================================================================== + * 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.project.lang; + +import net.sourceforge.plantuml.regex.IRegex; + +public interface Adverbial { + + public IRegex toRegex(); + +} diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementDates.java b/src/net/sourceforge/plantuml/project/lang/ComplementDates.java index 4bcbb31f1..eece3d85f 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementDates.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementDates.java @@ -58,8 +58,8 @@ public class ComplementDates implements Something { new RegexLeaf("BMONTH1" + suffix, "([\\d]{1,2})"), // new RegexLeaf("\\D"), // new RegexLeaf("BDAY1" + suffix, "([\\d]{1,2})"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("to"), // + Words.exactly(Words.TO), // + Words.zeroOrMore(Words.THE), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("BYEAR2" + suffix, "([\\d]{4})"), // new RegexLeaf("\\D"), // @@ -73,8 +73,8 @@ public class ComplementDates implements Something { return new RegexConcat( // new RegexLeaf("[dD]\\+"), // new RegexLeaf("ECOUNT1" + suffix, "([\\d]+)"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("to"), // + Words.exactly(Words.TO), // + Words.zeroOrMore(Words.THE), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("[dD]\\+"), // new RegexLeaf("ECOUNT2" + suffix, "([\\d]+)") // diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementTask.java b/src/net/sourceforge/plantuml/project/lang/ComplementTask.java new file mode 100644 index 000000000..aae8a1e63 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/ComplementTask.java @@ -0,0 +1,58 @@ +/* ======================================================================== + * 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.project.lang; + +import net.sourceforge.plantuml.project.Failable; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.project.core.Task; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexResult; + +public class ComplementTask implements Something { + + public IRegex toRegex(String suffix) { + return new RegexLeaf("COMPLEMENT" + suffix, "\\[([^\\[\\]]+?)\\]"); + } + + public Failable getMe(GanttDiagram gantt, RegexResult arg, String suffix) { + final String code = arg.get("COMPLEMENT" + suffix, 0); + final Task task = gantt.getExistingTask(code); + if (task == null) + return Failable.error("No such task " + code); + return Failable.ok(task); + } +} diff --git a/src/net/sourceforge/plantuml/project/lang/Sentence.java b/src/net/sourceforge/plantuml/project/lang/Sentence.java index 3110735fd..eaed4f5a5 100644 --- a/src/net/sourceforge/plantuml/project/lang/Sentence.java +++ b/src/net/sourceforge/plantuml/project/lang/Sentence.java @@ -38,9 +38,14 @@ package net.sourceforge.plantuml.project.lang; import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexResult; 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(); diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java b/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java index c2f9bd82b..3929c6a7a 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceAnd.java @@ -56,37 +56,37 @@ public class SentenceAnd implements Sentence { public IRegex toRegex() { return new RegexConcat(// RegexLeaf.start(), // - sentence1.subjectii.toRegex(), // + sentence1.getSubject().toRegex(), // RegexLeaf.spaceOneOrMore(), // sentence1.getVerbRegex(), // + sentence1.getAdverbialOrPropositon(), // RegexLeaf.spaceOneOrMore(), // - sentence1.complementii.toRegex("1"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("and"), // - RegexLeaf.spaceOneOrMore(), // + sentence1.getComplement().toRegex("1"), // + SENTENCE_SEPARATOR, // sentence2.getVerbRegex(), // + sentence2.getAdverbialOrPropositon(), // RegexLeaf.spaceOneOrMore(), // - sentence2.complementii.toRegex("2"), // - RegexLeaf.end()); + sentence2.getComplement().toRegex("2"), // + OPTIONAL_FINAL_DOT); } public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) { - final Failable subject = sentence1.subjectii.getMe(project, arg); - if (subject.isFail()) { + final Failable subject = sentence1.getSubject().getMe(project, arg); + if (subject.isFail()) return CommandExecutionResult.error(subject.getError()); - } - final Failable complement1 = sentence1.complementii.getMe(project, arg, "1"); - if (complement1.isFail()) { + + final Failable complement1 = sentence1.getComplement().getMe(project, arg, "1"); + if (complement1.isFail()) return CommandExecutionResult.error(complement1.getError()); - } + final CommandExecutionResult result1 = sentence1.execute(project, subject.get(), complement1.get()); - if (result1.isOk() == false) { + if (result1.isOk() == false) return result1; - } - final Failable complement2 = sentence2.complementii.getMe(project, arg, "2"); - if (complement2.isFail()) { + + final Failable complement2 = sentence2.getComplement().getMe(project, arg, "2"); + if (complement2.isFail()) return CommandExecutionResult.error(complement2.getError()); - } + return sentence2.execute(project, subject.get(), complement2.get()); } diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java b/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java index 3385842fc..27a9d4ca7 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java @@ -58,51 +58,50 @@ public class SentenceAndAnd implements Sentence { public IRegex toRegex() { return new RegexConcat(// RegexLeaf.start(), // - sentence1.subjectii.toRegex(), // + sentence1.getSubject().toRegex(), // RegexLeaf.spaceOneOrMore(), // sentence1.getVerbRegex(), // + sentence1.getAdverbialOrPropositon(), // RegexLeaf.spaceOneOrMore(), // - sentence1.complementii.toRegex("1"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("and"), // - RegexLeaf.spaceOneOrMore(), // + sentence1.getComplement().toRegex("1"), // + SENTENCE_SEPARATOR, // sentence2.getVerbRegex(), // + sentence2.getAdverbialOrPropositon(), // RegexLeaf.spaceOneOrMore(), // - sentence2.complementii.toRegex("2"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("and"), // - RegexLeaf.spaceOneOrMore(), // + sentence2.getComplement().toRegex("2"), // + SENTENCE_SEPARATOR, // sentence3.getVerbRegex(), // + sentence3.getAdverbialOrPropositon(), // RegexLeaf.spaceOneOrMore(), // - sentence3.complementii.toRegex("3"), // - RegexLeaf.end()); + sentence3.getComplement().toRegex("3"), // + OPTIONAL_FINAL_DOT); } public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) { - final Failable subject = sentence1.subjectii.getMe(project, arg); - if (subject.isFail()) { + final Failable subject = sentence1.getSubject().getMe(project, arg); + if (subject.isFail()) return CommandExecutionResult.error(subject.getError()); - } - final Failable complement1 = sentence1.complementii.getMe(project, arg, "1"); - if (complement1.isFail()) { + + final Failable complement1 = sentence1.getComplement().getMe(project, arg, "1"); + if (complement1.isFail()) return CommandExecutionResult.error(complement1.getError()); - } + final CommandExecutionResult result1 = sentence1.execute(project, subject.get(), complement1.get()); - if (result1.isOk() == false) { + if (result1.isOk() == false) return result1; - } - final Failable complement2 = sentence2.complementii.getMe(project, arg, "2"); - if (complement2.isFail()) { + + final Failable complement2 = sentence2.getComplement().getMe(project, arg, "2"); + if (complement2.isFail()) return CommandExecutionResult.error(complement2.getError()); - } + final CommandExecutionResult result2 = sentence2.execute(project, subject.get(), complement2.get()); - if (result2.isOk() == false) { + if (result2.isOk() == false) return result2; - } - final Failable complement3 = sentence3.complementii.getMe(project, arg, "3"); - if (complement3.isFail()) { + + final Failable complement3 = sentence3.getComplement().getMe(project, arg, "3"); + if (complement3.isFail()) return CommandExecutionResult.error(complement3.getError()); - } + final CommandExecutionResult result3 = sentence3.execute(project, subject.get(), complement3.get()); return result3; diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java b/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java index 4c41586f3..f046ef8e2 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceHappens.java @@ -44,7 +44,8 @@ import net.sourceforge.plantuml.project.core.TaskInstant; public class SentenceHappens extends SentenceSimple { public SentenceHappens() { - super(SubjectTask.ME, Verbs.happens, new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); + super(SubjectTask.ME, Verbs.happens, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), + new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java b/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java index 456935ae1..afb8d886f 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceHappensDate.java @@ -44,7 +44,7 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceHappensDate extends SentenceSimple { public SentenceHappensDate() { - super(SubjectTask.ME, Verbs.happens, ComplementDate.any()); + super(SubjectTask.ME, Verbs.happens, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java b/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java index 8aa022a2b..c07c2bd8a 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java @@ -42,7 +42,8 @@ import net.sourceforge.plantuml.project.core.Task; public class SentenceIsColoredForCompletion extends SentenceSimple { public SentenceIsColoredForCompletion() { - super(SubjectTask.ME, Verbs.isColoredForCompletion, new ComplementInColorsFromTo()); + super(SubjectTask.ME, Verbs.isColored, Words.exactly(Words.FOR, Words.COMPLETION), + new ComplementInColorsFromTo()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java b/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java index 97ceea3a1..8cf020b38 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SentencePausesDate.java @@ -43,7 +43,8 @@ import net.sourceforge.plantuml.project.time.Day; public class SentencePausesDate extends SentenceSimple { public SentencePausesDate() { - super(SubjectTask.ME, Verbs.pauses, ComplementDate.any()); + super(SubjectTask.ME, Verbs.pauses, Words.zeroOrMore(Words.THE, Words.ON, Words.AT, Words.FROM), + ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java b/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java index 9fdf7dc5e..46d074559 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java +++ b/src/net/sourceforge/plantuml/project/lang/SentencePausesDates.java @@ -44,20 +44,17 @@ import net.sourceforge.plantuml.project.time.Day; public class SentencePausesDates extends SentenceSimple { public SentencePausesDates() { - super(SubjectTask.ME, Verbs.pauses, new ComplementDates()); + super(SubjectTask.ME, Verbs.pauses, Words.zeroOrMore(Words.THE, Words.ON, Words.AT, Words.FROM), + new ComplementDates()); } @Override public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { final Task task = (Task) subject; final DaysAsDates pauses = (DaysAsDates) complement; -// final Day startingDate = project.getStartingDate(); -// if (startingDate == null) { -// return CommandExecutionResult.error("No starting date for the project"); -// } - for (Day day : pauses) { + for (Day day : pauses) task.addPause(day); - } + return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java b/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java index 05526f414..8edc3d2b5 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java +++ b/src/net/sourceforge/plantuml/project/lang/SentencePausesDayOfWeek.java @@ -43,7 +43,8 @@ import net.sourceforge.plantuml.project.time.DayOfWeek; public class SentencePausesDayOfWeek extends SentenceSimple { public SentencePausesDayOfWeek() { - super(SubjectTask.ME, Verbs.pauses, new ComplementDayOfWeek()); + super(SubjectTask.ME, Verbs.pauses, Words.zeroOrMore(Words.THE, Words.ON, Words.AT, Words.FROM), + new ComplementDayOfWeek()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java b/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java index 745dc4b39..d36769296 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceSimple.java @@ -45,49 +45,57 @@ import net.sourceforge.plantuml.regex.RegexResult; public abstract class SentenceSimple implements Sentence { - protected final Subject subjectii; + private final Subject subject; private final IRegex verb; - protected final Something complementii; + private final IRegex adverbialOrPropositon; + private final Something complement; public SentenceSimple(Subject subject, IRegex verb, Something complement) { - this.subjectii = subject; + this(subject, verb, new RegexLeaf(""), complement); + } + + public SentenceSimple(Subject subject, IRegex verb, IRegex adverbialOrPropositon, Something complement) { + this.subject = subject; this.verb = verb; - this.complementii = complement; + this.adverbialOrPropositon = adverbialOrPropositon; + this.complement = complement; } public String getSignature() { - return subjectii.getClass() + "/" + verb.getPattern() + "/" + complementii.getClass(); + return subject.getClass() + "/" + verb.getPattern() + "/" + complement.getClass(); } public final IRegex toRegex() { - if (complementii instanceof ComplementEmpty) + if (complement instanceof ComplementEmpty) return new RegexConcat(// RegexLeaf.start(), // - subjectii.toRegex(), // + subject.toRegex(), // RegexLeaf.spaceOneOrMore(), // verb, // - RegexLeaf.end()); + adverbialOrPropositon, // + OPTIONAL_FINAL_DOT); return new RegexConcat(// RegexLeaf.start(), // - subjectii.toRegex(), // + subject.toRegex(), // RegexLeaf.spaceOneOrMore(), // verb, // + adverbialOrPropositon, // RegexLeaf.spaceOneOrMore(), // - complementii.toRegex("0"), // - RegexLeaf.end()); + complement.toRegex("0"), // + OPTIONAL_FINAL_DOT); } public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) { - final Failable subject = subjectii.getMe(project, arg); - if (subject.isFail()) - return CommandExecutionResult.error(subject.getError()); + final Failable currentSubject = subject.getMe(project, arg); + if (currentSubject.isFail()) + return CommandExecutionResult.error(currentSubject.getError()); - final Failable complement = complementii.getMe(project, arg, "0"); - if (complement.isFail()) - return CommandExecutionResult.error(complement.getError()); + final Failable currentComplement = complement.getMe(project, arg, "0"); + if (currentComplement.isFail()) + return CommandExecutionResult.error(currentComplement.getError()); - return execute(project, subject.get(), complement.get()); + return execute(project, currentSubject.get(), currentComplement.get()); } @@ -97,4 +105,18 @@ public abstract class SentenceSimple implements Sentence { return verb; } + protected final IRegex getAdverbialOrPropositon() { + return adverbialOrPropositon; + } + + protected final Subject getSubject() { + return subject; + } + + 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 a01539449..ea10010e9 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsAbsolute.java @@ -43,9 +43,10 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceTaskEndsAbsolute extends SentenceSimple { public SentenceTaskEndsAbsolute() { - super(SubjectTask.ME, Verbs.ends2, ComplementDate.any()); + super(SubjectTask.ME, Verbs.ends, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), ComplementDate.any()); } + @Override public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { final Task task = (Task) subject; diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java index 95ed3fe3b..25524553f 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskEndsOnlyRelative.java @@ -43,7 +43,8 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceTaskEndsOnlyRelative extends SentenceSimple { public SentenceTaskEndsOnlyRelative() { - super(SubjectTask.ME, Verbs.ends2, ComplementDate.onlyRelative()); + super(SubjectTask.ME, Verbs.ends, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), + ComplementDate.onlyRelative()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java index 8737f4020..6ce0543d3 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStarts.java @@ -46,7 +46,7 @@ import net.sourceforge.plantuml.project.core.TaskInstant; public class SentenceTaskStarts extends SentenceSimple { public SentenceTaskStarts() { - super(SubjectTask.ME, Verbs.starts2, new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); + super(SubjectTask.ME, Verbs.starts, new ComplementBeforeOrAfterOrAtTaskStartOrEnd()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java index 492259ec7..3eb5b6616 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsAbsolute.java @@ -43,7 +43,7 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceTaskStartsAbsolute extends SentenceSimple { public SentenceTaskStartsAbsolute() { - super(SubjectTask.ME, Verbs.starts3, ComplementDate.any()); + super(SubjectTask.ME, Verbs.starts, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java index bf9d07fae..80b4ded71 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsOnlyRelative.java @@ -43,7 +43,8 @@ import net.sourceforge.plantuml.project.time.Day; public class SentenceTaskStartsOnlyRelative extends SentenceSimple { public SentenceTaskStartsOnlyRelative() { - super(SubjectTask.ME, Verbs.starts3, ComplementDate.onlyRelative()); + super(SubjectTask.ME, Verbs.starts, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), + ComplementDate.onlyRelative()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java index 9029d0a8a..2e3acc159 100644 --- a/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java +++ b/src/net/sourceforge/plantuml/project/lang/SentenceTaskStartsWithColor.java @@ -46,7 +46,7 @@ import net.sourceforge.plantuml.project.core.TaskInstant; public class SentenceTaskStartsWithColor extends SentenceSimple { public SentenceTaskStartsWithColor() { - super(SubjectTask.ME, Verbs.starts2, + super(SubjectTask.ME, Verbs.starts, new PairOfSomething(new ComplementBeforeOrAfterOrAtTaskStartOrEnd(), new ComplementWithColorLink())); } diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectProject.java b/src/net/sourceforge/plantuml/project/lang/SubjectProject.java index 50a42619f..4f72a2748 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectProject.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectProject.java @@ -68,7 +68,8 @@ public class SubjectProject implements Subject { class Starts extends SentenceSimple { public Starts() { - super(SubjectProject.this, Verbs.starts, ComplementDate.onlyAbsolute()); + super(SubjectProject.this, Verbs.starts, Words.zeroOrMore(Words.ON, Words.FOR, Words.THE, Words.AT), + ComplementDate.onlyAbsolute()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectResource.java b/src/net/sourceforge/plantuml/project/lang/SubjectResource.java index 89e14f57b..d9d311e2d 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectResource.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectResource.java @@ -43,11 +43,12 @@ import net.sourceforge.plantuml.project.DaysAsDates; import net.sourceforge.plantuml.project.Failable; import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.project.core.Resource; +import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.DayOfWeek; 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 SubjectResource implements Subject { @@ -57,30 +58,56 @@ public class SubjectResource implements Subject { private SubjectResource() { } - public Failable getMe(GanttDiagram project, RegexResult arg) { - final String s = arg.get("RESOURCE", 0); - return Failable.ok(project.getResource(s)); + public Failable getMe(GanttDiagram gantt, RegexResult arg) { + if (arg.get("THEY", 0) != null) { + final Resource they = gantt.getThey(); + if (they == null) + return Failable.error("Not sure who are you refering to?"); + return Failable.ok(they); + } + final String resource = arg.get("RESOURCE", 0); + final Resource result = gantt.getResource(resource); + gantt.setThey(result); + return Failable.ok(result); } public Collection getSentences() { return Arrays.asList(new IsOffDate(), new IsOffDates(), new IsOffDayOfWeek(), new IsOnDate(), new IsOnDates(), - new IsOffBeforeDate(), new IsOffAfterDate()); + new IsOffBeforeDate(), new IsOffAfterDate(), new WorksOn()); } public IRegex toRegex() { - return new RegexConcat( // + return new RegexOr( // + new RegexLeaf("THEY", "(she|he|they)"), // new RegexLeaf("RESOURCE", "\\{([^{}]+)\\}") // ); } + public class WorksOn extends SentenceSimple { + + public WorksOn() { + super(SubjectResource.this, Verbs.worksOn, new ComplementTask()); + } + + @Override + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { + final Resource resource = (Resource) subject; + final Task task = (Task) complement; + task.addResource(resource, 100); + return CommandExecutionResult.ok(); + } + + } + public class IsOffBeforeDate extends SentenceSimple { public IsOffBeforeDate() { - super(SubjectResource.this, Verbs.isOffBefore, ComplementDate.any()); + super(SubjectResource.this, Verbs.isOff, + Words.concat(Words.exactly(Words.BEFORE), Words.zeroOrMore(Words.THE)), ComplementDate.any()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; final Day when = (Day) complement; resource.setOffBeforeDate(when); @@ -92,11 +119,12 @@ public class SubjectResource implements Subject { public class IsOffAfterDate extends SentenceSimple { public IsOffAfterDate() { - super(SubjectResource.this, Verbs.isOffAfter, ComplementDate.any()); + super(SubjectResource.this, Verbs.isOff, + Words.concat(Words.exactly(Words.AFTER), Words.zeroOrMore(Words.THE)), ComplementDate.any()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; final Day when = (Day) complement; resource.setOffAfterDate(when); @@ -108,11 +136,12 @@ public class SubjectResource implements Subject { public class IsOffDate extends SentenceSimple { public IsOffDate() { - super(SubjectResource.this, Verbs.isOff, ComplementDate.any()); + super(SubjectResource.this, Verbs.isOff, + Words.zeroOrMore(Words.FROM, Words.ON, Words.FOR, Words.THE, Words.AT), ComplementDate.any()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; final Day when = (Day) complement; resource.addCloseDay(when); @@ -124,11 +153,12 @@ public class SubjectResource implements Subject { public class IsOffDates extends SentenceSimple { public IsOffDates() { - super(SubjectResource.this, Verbs.isOff, new ComplementDates()); + super(SubjectResource.this, Verbs.isOff, + Words.zeroOrMore(Words.FROM, Words.ON, Words.FOR, Words.THE, Words.AT), new ComplementDates()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; for (Day when : (DaysAsDates) complement) { resource.addCloseDay(when); @@ -141,11 +171,12 @@ public class SubjectResource implements Subject { public class IsOffDayOfWeek extends SentenceSimple { public IsOffDayOfWeek() { - super(SubjectResource.this, Verbs.isOff, new ComplementDayOfWeek()); + super(SubjectResource.this, Verbs.isOff, + Words.zeroOrMore(Words.FROM, Words.ON, Words.FOR, Words.THE, Words.AT), new ComplementDayOfWeek()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; resource.addCloseDay(((DayOfWeek) complement)); return CommandExecutionResult.ok(); @@ -156,11 +187,12 @@ public class SubjectResource implements Subject { public class IsOnDate extends SentenceSimple { public IsOnDate() { - super(SubjectResource.this, Verbs.isOn, ComplementDate.any()); + super(SubjectResource.this, Verbs.isOn, + Words.zeroOrMore(Words.FROM, Words.ON, Words.FOR, Words.THE, Words.AT), ComplementDate.any()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; final Day when = (Day) complement; resource.addForceOnDay(when); @@ -172,11 +204,12 @@ public class SubjectResource implements Subject { public class IsOnDates extends SentenceSimple { public IsOnDates() { - super(SubjectResource.this, Verbs.isOn, new ComplementDates()); + super(SubjectResource.this, Verbs.isOn, + Words.zeroOrMore(Words.FROM, Words.ON, Words.FOR, Words.THE, Words.AT), new ComplementDates()); } @Override - public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + public CommandExecutionResult execute(GanttDiagram gantt, Object subject, Object complement) { final Resource resource = (Resource) subject; for (Day when : (DaysAsDates) complement) { resource.addForceOnDay(when); diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java b/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java index 261e640d4..4ed3a05e8 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectSeparator.java @@ -69,7 +69,7 @@ public class SubjectSeparator implements Subject { class JustBefore extends SentenceSimple { public JustBefore() { - super(SubjectSeparator.this, Verbs.justBefore, ComplementDate.any()); + super(SubjectSeparator.this, Verbs.just, Words.exactly(Words.BEFORE), ComplementDate.any()); } @Override @@ -85,7 +85,7 @@ public class SubjectSeparator implements Subject { class JustAfter extends SentenceSimple { public JustAfter() { - super(SubjectSeparator.this, Verbs.justAfter, ComplementDate.any()); + super(SubjectSeparator.this, Verbs.just, Words.exactly(Words.AFTER), ComplementDate.any()); } @Override diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java index c04d64b16..279f4ecf8 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java @@ -46,6 +46,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.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexResult; public class SubjectTask implements Subject { @@ -55,23 +56,32 @@ public class SubjectTask implements Subject { private SubjectTask() { } - public Failable getMe(GanttDiagram project, RegexResult arg) { - final String s = arg.get("SUBJECT", 0); - final String shortName = arg.get("SUBJECT", 1); - final String then = arg.get("THEN", 0); - final String resource = arg.get("RESOURCE", 0); - final Task result = project.getOrCreateTask(s, shortName, then != null); - if (result == null) { - throw new IllegalStateException(); + public Failable getMe(GanttDiagram gantt, RegexResult arg) { + final Task result; + if (arg.get("IT", 0) != null) { + result = gantt.getIt(); + if (result == null) + 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 then = arg.get("THEN", 0); + result = gantt.getOrCreateTask(subject, shortName, then != null); + gantt.setIt(result); } + + if (result == null) + throw new IllegalStateException(); + + final String resource = arg.get("RESOURCE", 0); if (resource != null) { for (final StringTokenizer st = new StringTokenizer(resource, "{}"); st.hasMoreTokens();) { final String part = st.nextToken().trim(); if (part.length() > 0) { - final boolean ok = project.affectResource(result, part); - if (ok == false) { + final boolean ok = gantt.affectResource(result, part); + if (ok == false) return Failable.error("Bad argument for resource"); - } + } } @@ -90,17 +100,17 @@ public class SubjectTask implements Subject { } public IRegex toRegex() { - return new RegexConcat( // - new RegexLeaf("THEN", "(then[%s]+)?"), // - new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\](?:[%s]+as[%s]+\\[([^\\[\\]]+?)\\])?"), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("on"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("RESOURCE", "((?:\\{[^{}]+\\}[%s]*)+)") // - )) // - ); + return new RegexOr( // + new RegexLeaf("IT", "(it)"), // + new RegexConcat(new RegexLeaf("THEN", "(then[%s]+)?"), // + new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\](?:[%s]+as[%s]+\\[([^\\[\\]]+?)\\])?"), // + new RegexOptional( // + new RegexConcat( // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("on"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("RESOURCE", "((?:\\{[^{}]+\\}[%s]*)+)") // + )))); } } diff --git a/src/net/sourceforge/plantuml/project/lang/Verbs.java b/src/net/sourceforge/plantuml/project/lang/Verbs.java index b534124ad..5b7ed01e5 100644 --- a/src/net/sourceforge/plantuml/project/lang/Verbs.java +++ b/src/net/sourceforge/plantuml/project/lang/Verbs.java @@ -36,103 +36,28 @@ package net.sourceforge.plantuml.project.lang; 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; public class Verbs { public static IRegex are = new RegexLeaf("are"); - public static IRegex areColored = new RegexLeaf("are[%s]+colou?red"); - public static IRegex displayOnSameRowAs = new RegexLeaf("displays?[%s]+on[%s]+same[%s]+row[%s]+as"); - public static IRegex ends = new RegexLeaf("ends"); - - public static IRegex ends2 = new RegexLeaf("ends[%s]*(the[%s]*|on[%s]*|at[%s]*)*"); - - public static IRegex happens = new RegexLeaf("happens?[%s]*(at[%s]*|the[%s]*|on[%s]*)*"); - - public static IRegex pauses = new RegexLeaf("pauses?[%s]*(at[%s]*|the[%s]*|on[%s]*|from[%s]*)*"); - - public static IRegex isDeleted = new RegexLeaf("is[%s]+deleted"); - + public static IRegex happens = new RegexLeaf("happens"); public static IRegex is = new RegexLeaf("is"); - public static IRegex isColored = new RegexLeaf("is[%s]+colou?red"); - - public static IRegex isColoredForCompletion = new RegexLeaf("is[%s]+colou?red[%s]+for[%s]+completion"); - - public static IRegex isOff = new RegexConcat(new RegexLeaf("is"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("off"), // - RegexLeaf.spaceOneOrMore(), // - new RegexOr(// - new RegexLeaf("from"), // - new RegexLeaf("on"), // - new RegexLeaf("for"), // - new RegexLeaf("the"), // - new RegexLeaf("at") // - )); - - public static IRegex isOffBefore = new RegexConcat(new RegexLeaf("is"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("off"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("before") // - ); - - public static IRegex isOffAfter = new RegexConcat(new RegexLeaf("is"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("off"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("after") // - ); - - public static IRegex isOn = new RegexConcat(new RegexLeaf("is"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("on"), // - RegexLeaf.spaceOneOrMore(), // - new RegexOr(// - new RegexLeaf("from"), // - new RegexLeaf("on"), // - new RegexLeaf("for"), // - new RegexLeaf("the"), // - new RegexLeaf("at") // - ) // - ); - + public static IRegex isDeleted = new RegexLeaf("is[%s]+deleted"); + public static IRegex isOff = new RegexLeaf("is[%s]+off"); + public static IRegex isOn = new RegexLeaf("is[%s]+on"); public static IRegex isOrAre = new RegexLeaf("(is|are)"); - public static IRegex isOrAreNamed = new RegexLeaf("(is|are)[%s]+named"); - - public static IRegex requires = new RegexLeaf("(lasts|requires?)"); - - public static IRegex linksTo = new RegexLeaf("links to"); - - public static IRegex occurs = new RegexLeaf("occurs?"); - - public static IRegex starts3 = new RegexLeaf("starts[%s]*(the[%s]*|on[%s]*|at[%s]*)*"); - - public static IRegex starts2 = new RegexLeaf("starts"); - - public static IRegex starts = new RegexConcat(new RegexLeaf("start"), // - new RegexOptional(new RegexLeaf("s")), // - RegexLeaf.spaceZeroOrMore(), // - new RegexOptional(new RegexOr(// - new RegexLeaf("on"), // - new RegexLeaf("for"), // - new RegexLeaf("the"), // - new RegexLeaf("at") // - )) // - ); - public static IRegex just = new RegexLeaf("just"); - - public static IRegex justBefore = new RegexLeaf("just[%s]*before"); - - public static IRegex justAfter = new RegexLeaf("just[%s]*after"); + public static IRegex linksTo = new RegexLeaf("links[%s]+to"); + public static IRegex occurs = new RegexLeaf("occurs"); + public static IRegex pauses = new RegexLeaf("pauses"); + public static IRegex requires = new RegexLeaf("(lasts|requires)"); + public static IRegex starts = new RegexLeaf("starts"); + public static IRegex worksOn = new RegexLeaf("works[%s]+on"); } diff --git a/src/net/sourceforge/plantuml/project/lang/Words.java b/src/net/sourceforge/plantuml/project/lang/Words.java new file mode 100644 index 000000000..9d30ddd85 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/Words.java @@ -0,0 +1,77 @@ +/* ======================================================================== + * 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.project.lang; + +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.RegexRepeatedZeroOrMore; + +public class Words { + + public final static String AFTER = "after"; + public final static String AT = "at"; + public final static String BEFORE = "before"; + public final static String COMPLETION = "completion"; + public final static String FOR = "for"; + public final static String FROM = "from"; + public final static String ON = "on"; + public final static String THE = "the"; + public final static String TO = "to"; + + public static IRegex zeroOrMore(String... words) { + final IRegex tmp[] = new IRegex[words.length]; + for (int i = 0; i < words.length; i++) + tmp[i] = new RegexLeaf(words[i]); + + final RegexOr or = new RegexOr(tmp); + return new RegexRepeatedZeroOrMore(new RegexConcat(RegexLeaf.spaceOneOrMore(), or)); + } + + public static IRegex exactly(String... words) { + final IRegex tmp[] = new IRegex[words.length]; + for (int i = 0; i < words.length; i++) + tmp[i] = new RegexConcat(RegexLeaf.spaceOneOrMore(), new RegexLeaf(words[i])); + + return new RegexConcat(tmp); + } + + public static IRegex concat(IRegex... expressions) { + return new RegexConcat(expressions); + } + +} diff --git a/src/net/sourceforge/plantuml/regex/RegexRepeatedZeroOrMore.java b/src/net/sourceforge/plantuml/regex/RegexRepeatedZeroOrMore.java new file mode 100644 index 000000000..ab0febc5e --- /dev/null +++ b/src/net/sourceforge/plantuml/regex/RegexRepeatedZeroOrMore.java @@ -0,0 +1,58 @@ +/* ======================================================================== + * 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.regex; + +import net.sourceforge.plantuml.text.StringLocated; + +public class RegexRepeatedZeroOrMore extends RegexComposed implements IRegex { + + public RegexRepeatedZeroOrMore(IRegex partial) { + super(partial); + } + + @Override + protected String getFullSlow() { + final StringBuilder sb = new StringBuilder("(?:"); + sb.append(partials().get(0).getPattern()); + sb.append(")*"); + return sb.toString(); + } + + public boolean match(StringLocated full) { + throw new UnsupportedOperationException(); + } + +}