From 4b58055b9f7d432b19c3a82ce223a88c07f78303 Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Mon, 28 Aug 2023 19:14:15 +0200 Subject: [PATCH] mod: Handle @start/@end syntax error better https://github.com/plantuml/plantuml/pull/1522 --- src/net/sourceforge/plantuml/Pipe.java | 10 ++++++++-- test/net/sourceforge/plantuml/PipeTest.java | 7 +++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/net/sourceforge/plantuml/Pipe.java b/src/net/sourceforge/plantuml/Pipe.java index 3e4b84ac1..21aa7dfef 100644 --- a/src/net/sourceforge/plantuml/Pipe.java +++ b/src/net/sourceforge/plantuml/Pipe.java @@ -47,13 +47,14 @@ import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.core.DiagramDescription; import net.sourceforge.plantuml.error.PSystemError; import net.sourceforge.plantuml.preproc.Defines; import net.sourceforge.plantuml.security.SFile; -import net.sourceforge.plantuml.url.CMapData; public class Pipe { // ::remove file when __CORE__ @@ -190,7 +191,12 @@ public class Pipe { if (state == State.START_MARK_NOT_FOUND && line.startsWith("@start")) { sb.setLength(0); // discard any previous input state = State.START_MARK_FOUND; - expectedEnd = "@end" + line.substring(6).split("^[A-Za-z]")[0]; + final Matcher m = Pattern.compile("@start([A-Za-z]*)").matcher(line); + if (m.matches()) + expectedEnd = "@end" + m.group(1); + else + expectedEnd = "@end"; + } else if (state == State.START_MARK_FOUND && line.startsWith(expectedEnd)) { state = State.COMPLETE; } diff --git a/test/net/sourceforge/plantuml/PipeTest.java b/test/net/sourceforge/plantuml/PipeTest.java index 671928c78..a975bf26c 100644 --- a/test/net/sourceforge/plantuml/PipeTest.java +++ b/test/net/sourceforge/plantuml/PipeTest.java @@ -251,8 +251,7 @@ class PipeTest { "@startuml\nab\ncde\n@enduml\n")); l.add(InputExpected.of("@startwhatever\nab\rcde\n@endwhatever", "@startwhatever\nab\ncde\n@endwhatever\n")); l.add(InputExpected.of("@start\nab\rcde\n@end", "@start\nab\ncde\n@end\n")); - // TODO: fix `readSingleDiagram` to allow @startX/@endX, the corresponding test is here: - // l.add(InputExpected.of("@startX\nab\rcde\n@endX", "@startX\nab\ncde\n@endX\n")); + l.add(InputExpected.of("@startX\nab\rcde\n@endX", "@startX\nab\ncde\n@endX\n")); l.add(InputExpected.of("@startXY\nab\rcde\n@endXY", "@startXY\nab\ncde\n@endXY\n")); l.add(InputExpected.of("@startXYZ\nab\rcde\n@endXYZ", "@startXYZ\nab\ncde\n@endXYZ\n")); l.add(InputExpected.of("@start1\nab\rcde\n@end1", "@start1\nab\ncde\n@end1\n")); @@ -286,8 +285,8 @@ class PipeTest { "@startuml\nab\ncde\n@enduml\n")); l.add(InputExpected.of("@startwhatever\nab\rcde\n@endwhatever", "@startwhatever\nab\ncde\n@endwhatever\n")); l.add(InputExpected.of("@start\nab\rcde\n@end", "@start\nab\ncde\n@end\n")); - // TODO: fix `readSingleDiagram` to allow @startX/@endX, the corresponding test is here: - // l.add(InputExpected.of("@startX\nab\rcde\n@endX", "@startX\nab\ncde\n@endX\n")); + + l.add(InputExpected.of("@startX\nab\rcde\n@endX", "@startX\nab\ncde\n@endX\n")); l.add(InputExpected.of("@startXY\nab\rcde\n@endXY", "@startXY\nab\ncde\n@endXY\n")); l.add(InputExpected.of("@startXYZ\nab\rcde\n@endXYZ", "@startXYZ\nab\ncde\n@endXYZ\n")); l.add(InputExpected.of("@start1\nab\rcde\n@end1", "@start1\nab\ncde\n@end1\n"));