Skip to content
This repository was archived by the owner on Mar 28, 2026. It is now read-only.

Commit f103a7a

Browse files
Removes duplicate PlantUML/Mermaid encoders, adds support for Mermaid compression, makes SVG the default formats.
1 parent 3d22317 commit f103a7a

13 files changed

Lines changed: 92 additions & 131 deletions

File tree

structurizr-dsl/src/test/java/com/structurizr/dsl/DslTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,13 +1031,13 @@ void test_imageViews_ViaFiles() throws Exception {
10311031

10321032
ImageView plantumlView = (ImageView)workspace.getViews().getViewWithKey("plantuml");
10331033
assertEquals("diagram.puml", plantumlView.getTitle());
1034-
assertEquals("http://localhost:7777/png/SoWkIImgAStDuNBAJrBGjLDmpCbCJbMmKiX8pSd9vt98pKi1IW80", plantumlView.getContent());
1035-
assertEquals("image/png", plantumlView.getContentType());
1034+
assertEquals("http://localhost:7777/svg/SoWkIImgAStDuNBAJrBGjLDmpCbCJbMmKiX8pSd9vt98pKi1IW80", plantumlView.getContent());
1035+
assertEquals("image/svg+xml", plantumlView.getContentType());
10361036

10371037
ImageView mermaidView = (ImageView)workspace.getViews().getViewWithKey("mermaid");
10381038
assertEquals("diagram.mmd", mermaidView.getTitle());
1039-
assertEquals("http://localhost:8888/img/Zmxvd2NoYXJ0IFRECiAgICBTdGFydCAtLT4gU3RvcA==?type=png", mermaidView.getContent());
1040-
assertEquals("image/png", mermaidView.getContentType());
1039+
assertEquals("http://localhost:8888/svg/Zmxvd2NoYXJ0IFRECiAgICBTdGFydCAtLT4gU3RvcA==", mermaidView.getContent());
1040+
assertEquals("image/svg+xml", mermaidView.getContentType());
10411041

10421042
ImageView krokiView = (ImageView)workspace.getViews().getViewWithKey("kroki");
10431043
assertEquals("diagram.dot", krokiView.getTitle());

structurizr-dsl/src/test/java/com/structurizr/dsl/ImageViewContentParserTests.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ void setUp() {
2020
@Test
2121
void test_parsePlantUML_ThrowsAnException_WhenUsingAFileNameInRestrictedMode() {
2222
try {
23+
ImageViewDslContext context = new ImageViewDslContext(imageView);
24+
context.setWorkspace(workspace);
2325
parser = new ImageViewContentParser(true);
24-
parser.parsePlantUML(new ImageViewDslContext(imageView), null, tokens("plantuml", "image.puml"));
26+
parser.parsePlantUML(context, null, tokens("plantuml", "image.puml"));
2527
fail();
2628
} catch (Exception e) {
2729
assertEquals("PlantUML source must be specified as a URL when running in restricted mode", e.getMessage());
@@ -31,8 +33,10 @@ void test_parsePlantUML_ThrowsAnException_WhenUsingAFileNameInRestrictedMode() {
3133
@Test
3234
void test_parseMermaid_ThrowsAnException_WhenUsingAFileNameInRestrictedMode() {
3335
try {
36+
ImageViewDslContext context = new ImageViewDslContext(imageView);
37+
context.setWorkspace(workspace);
3438
parser = new ImageViewContentParser(true);
35-
parser.parseMermaid(new ImageViewDslContext(imageView), null, tokens("mermaid", "image.puml"));
39+
parser.parseMermaid(context, null, tokens("mermaid", "image.puml"));
3640
fail();
3741
} catch (Exception e) {
3842
assertEquals("Mermaid source must be specified as a URL when running in restricted mode", e.getMessage());

structurizr-dsl/src/test/resources/dsl/image-views/workspace-via-file.dsl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ workspace {
44
properties {
55
"plantuml.url" "http://localhost:7777"
66
"mermaid.url" "http://localhost:8888"
7+
"mermaid.compress" "false"
78
"kroki.url" "http://localhost:9999"
89
}
910

structurizr-dsl/src/test/resources/dsl/image-views/workspace-via-url.dsl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ workspace {
66
"plantuml.format" "svg"
77
"mermaid.url" "http://localhost:8888"
88
"mermaid.format" "svg"
9+
"mermaid.compress" "false"
910
"kroki.url" "http://localhost:9999"
1011
"kroki.format" "svg"
1112
}

structurizr-export/src/main/java/com/structurizr/export/mermaid/MermaidEncoder.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

structurizr-export/src/main/java/com/structurizr/export/plantuml/PlantUMLEncoder.java

Lines changed: 0 additions & 73 deletions
This file was deleted.
Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,45 @@
11
package com.structurizr.importer.diagrams.mermaid;
22

3+
import java.io.ByteArrayOutputStream;
34
import java.nio.charset.StandardCharsets;
45
import java.util.Base64;
6+
import java.util.zip.Deflater;
7+
import java.util.zip.DeflaterOutputStream;
58

69
/**
710
* Encodes a Mermaid diagram definition to base64 format, for use with image URLs, etc.
811
*/
9-
public class MermaidEncoder {
12+
public final class MermaidEncoder {
13+
14+
private static final String TEMPLATE = "{ \"code\":\"%s\", \"mermaid\":{\"theme\":\"default\"}}";
1015

1116
public String encode(String mermaidDefinition) {
17+
return this.encode(mermaidDefinition, false);
18+
}
19+
20+
public String encode(String mermaidDefinition, boolean compress) {
21+
if (compress) {
22+
try {
23+
String content = String.format(TEMPLATE, mermaidDefinition.replaceAll("\n", "\\\\n").replaceAll("\"", "\\\\\""));
24+
byte[] compressedDefinition = compress(content);
25+
return "pako:" + Base64.getUrlEncoder().encodeToString(compressedDefinition);
26+
} catch(Exception e) {
27+
e.printStackTrace();
28+
}
29+
}
30+
1231
return Base64.getUrlEncoder().encodeToString(mermaidDefinition.getBytes(StandardCharsets.UTF_8));
1332
}
1433

34+
private byte[] compress(String content) throws Exception {
35+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
36+
Deflater deflater = new Deflater();
37+
38+
DeflaterOutputStream dos = new DeflaterOutputStream(baos, deflater, true);
39+
dos.write(content.getBytes(StandardCharsets.UTF_8));
40+
dos.finish();
41+
42+
return baos.toByteArray();
43+
}
44+
1545
}

structurizr-import/src/main/java/com/structurizr/importer/diagrams/mermaid/MermaidImporter.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010

1111
public class MermaidImporter extends AbstractDiagramImporter {
1212

13-
private static final String MERMAID_URL_PROPERTY = "mermaid.url";
14-
private static final String MERMAID_FORMAT_PROPERTY = "mermaid.format";
13+
public static final String MERMAID_URL_PROPERTY = "mermaid.url";
14+
public static final String MERMAID_FORMAT_PROPERTY = "mermaid.format";
15+
public static final String MERMAID_COMPRESS_PROPERTY = "mermaid.compress";
1516

1617
public void importDiagram(ImageView view, File file) throws Exception {
1718
String content = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
@@ -28,14 +29,19 @@ public void importDiagram(ImageView view, String content) {
2829

2930
String format = getViewOrViewSetProperty(view, MERMAID_FORMAT_PROPERTY);
3031
if (StringUtils.isNullOrEmpty(format)) {
31-
format = PNG_FORMAT;
32+
format = SVG_FORMAT;
3233
}
3334

3435
if (!format.equals(PNG_FORMAT) && !format.equals(SVG_FORMAT)) {
3536
throw new IllegalArgumentException(String.format("Expected a format of %s or %s", PNG_FORMAT, SVG_FORMAT));
3637
}
3738

38-
String encodedMermaid = new MermaidEncoder().encode(content);
39+
String compress = getViewOrViewSetProperty(view, MERMAID_COMPRESS_PROPERTY);
40+
if (StringUtils.isNullOrEmpty(compress)) {
41+
compress = "true";
42+
}
43+
44+
String encodedMermaid = new MermaidEncoder().encode(content, compress.equalsIgnoreCase("true"));
3945
String url;
4046
if (format.equals(PNG_FORMAT)) {
4147
url = String.format("%s/img/%s?type=png", mermaidServer, encodedMermaid);

structurizr-import/src/main/java/com/structurizr/importer/diagrams/plantuml/PlantUMLEncoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
* A Java implementation of http://plantuml.com/code-javascript-synchronous
1010
* that uses Java's built-in Deflate algorithm.
1111
*/
12-
class PlantUMLEncoder {
12+
public final class PlantUMLEncoder {
1313

14-
String encode(String plantUMLDefinition) throws Exception {
14+
public String encode(String plantUMLDefinition) throws Exception {
1515
ByteArrayOutputStream baos = new ByteArrayOutputStream();
1616
Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION, true);
1717

structurizr-import/src/main/java/com/structurizr/importer/diagrams/plantuml/PlantUMLImporter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
public class PlantUMLImporter extends AbstractDiagramImporter {
1212

13-
private static final String PLANTUML_URL_PROPERTY = "plantuml.url";
14-
private static final String PLANTUML_FORMAT_PROPERTY = "plantuml.format";
13+
public static final String PLANTUML_URL_PROPERTY = "plantuml.url";
14+
public static final String PLANTUML_FORMAT_PROPERTY = "plantuml.format";
1515
private static final String TITLE_STRING = "title ";
1616
private static final String NEWLINE = "\n";
1717

@@ -30,7 +30,7 @@ public void importDiagram(ImageView view, String content) throws Exception {
3030

3131
String format = getViewOrViewSetProperty(view, PLANTUML_FORMAT_PROPERTY);
3232
if (StringUtils.isNullOrEmpty(format)) {
33-
format = PNG_FORMAT;
33+
format = SVG_FORMAT;
3434
}
3535

3636
if (!format.equals(PNG_FORMAT) && !format.equals(SVG_FORMAT)) {

0 commit comments

Comments
 (0)