diff --git a/src/net/sourceforge/plantuml/command/CommandSkinParamJaws.java b/src/net/sourceforge/plantuml/command/CommandSkinParamJaws.java new file mode 100644 index 00000000000..6116c7ef443 --- /dev/null +++ b/src/net/sourceforge/plantuml/command/CommandSkinParamJaws.java @@ -0,0 +1,95 @@ +/* ======================================================================== + * 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.command; + +import net.sourceforge.plantuml.TitledDiagram; +import net.sourceforge.plantuml.jaws.Jaws; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexConcat; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexRepeatedOneOrMore; +import net.sourceforge.plantuml.regex.RegexResult; +import net.sourceforge.plantuml.utils.BlocLines; +import net.sourceforge.plantuml.utils.LineLocation; + +public class CommandSkinParamJaws extends SingleLineCommand2 { + + public static final CommandSkinParamJaws ME = new CommandSkinParamJaws(); + + private CommandSkinParamJaws() { + super(getRegexConcat()); + } + + static IRegex getRegexConcat() { + return RegexConcat.build(CommandSkinParamJaws.class.getName(), RegexLeaf.start(), // + new RegexRepeatedOneOrMore("FULL", // + new RegexConcat( // + new RegexLeaf("TYPE", "(skinparam|skinparamlocked)"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("NAME", + "([\\w.]*(?:\\<\\<[^{}" + Jaws.BLOCK_E1_NEWLINE + "]*\\>\\>)?[\\w.]*)"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("VALUE", "\\{([^{}]*" + Jaws.BLOCK_E1_NEWLINE + "[^{}]*)\\}[^{}]*"))), // + RegexLeaf.end()); // + } + + @Override + protected CommandExecutionResult executeArg(TitledDiagram diagram, LineLocation location, RegexResult arg, + ParserPass currentPass) { + final String full = arg.get("FULL", 0); + System.err.println("full=" + full); +// final String type = arg.get("TYPE", 0); +// final String name = arg.get("NAME", 0); +// final String lines = arg.get("VALUE", 0); +// BlocLines current = BlocLines.create(); +// for (String line : lines.split("" + Jaws.BLOCK_E1_NEWLINE)) { +// if (current.size() == 0) +// current = current.addString(type + " " + name + " " + line); +// else +// current = current.addString(line); +// if (line.trim().equals("}")) { +// System.err.println("name=" + name); +// System.err.println("current" + current); +// +// final SkinLoader skinLoader = new SkinLoader(diagram); +// return skinLoader.execute(current, name); +// } +// } + return CommandExecutionResult.ok(); + + } + +} diff --git a/src/net/sourceforge/plantuml/command/CommandSkinParamJawsOld.java b/src/net/sourceforge/plantuml/command/CommandSkinParamJawsOld.java new file mode 100644 index 00000000000..32b1d0b62fd --- /dev/null +++ b/src/net/sourceforge/plantuml/command/CommandSkinParamJawsOld.java @@ -0,0 +1,89 @@ +/* ======================================================================== + * 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.command; + +import net.sourceforge.plantuml.TitledDiagram; +import net.sourceforge.plantuml.jaws.Jaws; +import net.sourceforge.plantuml.regex.IRegex; +import net.sourceforge.plantuml.regex.RegexConcat; +import net.sourceforge.plantuml.regex.RegexLeaf; +import net.sourceforge.plantuml.regex.RegexResult; +import net.sourceforge.plantuml.utils.BlocLines; +import net.sourceforge.plantuml.utils.LineLocation; + +public class CommandSkinParamJawsOld extends SingleLineCommand2 { + + public static final CommandSkinParamJawsOld ME = new CommandSkinParamJawsOld(); + + private CommandSkinParamJawsOld() { + super(getRegexConcat()); + } + + static IRegex getRegexConcat() { + return RegexConcat.build(CommandSkinParamJawsOld.class.getName(), RegexLeaf.start(), // + new RegexLeaf("TYPE", "(skinparam|skinparamlocked)"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("NAME", "([\\w.]*(?:\\<\\<[^" + Jaws.BLOCK_E1_NEWLINE + "]*\\>\\>)?[\\w.]*)"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("VALUE", "\\{(.*" + Jaws.BLOCK_E1_NEWLINE + ".*)\\}.*"), // + RegexLeaf.end()); // + } + + @Override + protected CommandExecutionResult executeArg(TitledDiagram diagram, LineLocation location, RegexResult arg, + ParserPass currentPass) { + final String type = arg.get("TYPE", 0); + final String name = arg.get("NAME", 0); + final String lines = arg.get("VALUE", 0); + BlocLines current = BlocLines.create(); + for (String line : lines.split("" + Jaws.BLOCK_E1_NEWLINE)) { + if (current.size() == 0) + current = current.addString(type + " " + name + " " + line); + else + current = current.addString(line); + if (line.trim().equals("}")) { + System.err.println("name=" + name); + System.err.println("current" + current); + + final SkinLoader skinLoader = new SkinLoader(diagram); + return skinLoader.execute(current, name); + } + } + return CommandExecutionResult.ok(); + + } + +} diff --git a/src/net/sourceforge/plantuml/jaws/Jaws.java b/src/net/sourceforge/plantuml/jaws/Jaws.java index a379fb4662a..c59970ce09d 100644 --- a/src/net/sourceforge/plantuml/jaws/Jaws.java +++ b/src/net/sourceforge/plantuml/jaws/Jaws.java @@ -42,6 +42,10 @@ public class Jaws { + public static final char BLOCK_E1_NEWLINE = '\uE100'; + public static final char BLOCK_E1_START_TEXTBLOCK = '\uE101'; + public static final char BLOCK_E1_END_TEXTBLOCK = '\uE102'; + private final List input; public Jaws(List input) { diff --git a/src/net/sourceforge/plantuml/regex/RegexRepeatedOneOrMore.java b/src/net/sourceforge/plantuml/regex/RegexRepeatedOneOrMore.java new file mode 100644 index 00000000000..3009f5e4313 --- /dev/null +++ b/src/net/sourceforge/plantuml/regex/RegexRepeatedOneOrMore.java @@ -0,0 +1,82 @@ +/* ======================================================================== + * 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 java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import net.sourceforge.plantuml.text.StringLocated; + +public class RegexRepeatedOneOrMore extends RegexComposed implements IRegex { + + private final String name; + + public RegexRepeatedOneOrMore(String name, IRegex partial) { + super(partial); + this.name = name; + } + + @Override + protected String getFullSlow() { + final StringBuilder sb = new StringBuilder("("); + sb.append(partials().get(0).getPattern()); + sb.append(")+"); + return sb.toString(); + } + + protected int getStartCount() { + return 1; + } + + final public Map createPartialMatch(Iterator it) { + final Map result = new HashMap(); + final String fullGroup = name == null ? null : it.next(); + result.putAll(super.createPartialMatch(it)); + if (name != null) { + final RegexPartialMatch m = new RegexPartialMatch(name); + m.add(fullGroup); + result.put(name, m); + } + return result; + } + + + public boolean match(StringLocated full) { + throw new UnsupportedOperationException(); + } + +}