kandi background
Explore Kits

plantuml | Generate UML diagram from textual description | Animation library

 by   plantuml Java Version: v1.2022.4 License: Non-SPDX

 by   plantuml Java Version: v1.2022.4 License: Non-SPDX

Download this library from

kandi X-RAY | plantuml Summary

plantuml is a Java library typically used in User Interface, Animation applications. plantuml has no bugs, it has no vulnerabilities and it has high support. However plantuml build file is not available and it has a Non-SPDX License. You can download it from GitHub.
[![GitHub Sponsors](https://img.shields.io/github/sponsors/plantuml?logo=github)](https://github.com/sponsors/plantuml/) [![GitHub Org’s stars](https://img.shields.io/github/stars/plantuml)](https://github.com/plantuml/plantuml/stargazers/) [![GitHub watchers](https://img.shields.io/github/watchers/plantuml/plantuml)](https://github.com/plantuml/plantuml/watchers/) [![GitHub contributors](https://img.shields.io/github/contributors-anon/plantuml/plantuml?color=blue)](https://github.com/plantuml/plantuml/graphs/contributors) [![GitHub forks](https://img.shields.io/github/forks/plantuml/plantuml)](https://github.com/plantuml/plantuml/network/) [![GitHub all releases](https://img.shields.io/sourceforge/dt/plantuml?color=blue)](https://github.com/plantuml/plantuml/releases). [![Release (latest by date)](https://img.shields.io/github/v/release/plantuml/plantuml)](https://github.com/plantuml/plantuml/releases/latest) [![Release Date](https://img.shields.io/github/release-date/plantuml/plantuml?color=blue)](https://github.com/plantuml/plantuml/releases/latest) [![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/plantuml/plantuml/latest)](https://github.com/plantuml/plantuml/commits/). [![Pre-release (latest by date)](https://img.shields.io/github/v/release/plantuml/plantuml?color=chocolate&include_prereleases)](https://github.com/plantuml/plantuml/releases/tag/snapshot) [![Pre-release Date](https://img.shields.io/github/release-date-pre/plantuml/plantuml?color=chocolate)](https://github.com/plantuml/plantuml/releases/tag/snapshot) [![GitHub last commit](https://img.shields.io/github/last-commit/plantuml/plantuml?color=chocolate)](https://github.com/plantuml/plantuml/commits/) [![CI](https://github.com/plantuml/plantuml/actions/workflows/ci.yml/badge.svg?color=chocolate)](https://github.com/plantuml/plantuml/actions/workflows/ci.yml). Generate UML diagram from textual description. [PlantUML is not affected by the log4j vulnerability.](https://github.com/plantuml/plantuml/issues/826).
Support
Support
Quality
Quality
Security
Security
License
License
Reuse
Reuse

kandi-support Support

  • plantuml has a highly active ecosystem.
  • It has 5640 star(s) with 594 fork(s). There are 140 watchers for this library.
  • There were 4 major release(s) in the last 6 months.
  • There are 459 open issues and 193 have been closed. On average issues are closed in 146 days. There are 14 open pull requests and 0 closed requests.
  • It has a positive sentiment in the developer community.
  • The latest version of plantuml is v1.2022.4
plantuml Support
Best in #Animation
Average in #Animation
plantuml Support
Best in #Animation
Average in #Animation

quality kandi Quality

  • plantuml has 0 bugs and 0 code smells.
plantuml Quality
Best in #Animation
Average in #Animation
plantuml Quality
Best in #Animation
Average in #Animation

securitySecurity

  • plantuml has no vulnerabilities reported, and its dependent libraries have no vulnerabilities reported.
  • plantuml code analysis shows 0 unresolved vulnerabilities.
  • There are 0 security hotspots that need review.
plantuml Security
Best in #Animation
Average in #Animation
plantuml Security
Best in #Animation
Average in #Animation

license License

  • plantuml has a Non-SPDX License.
  • Non-SPDX licenses can be open source with a non SPDX compliant license, or non open source licenses, and you need to review them closely before use.
plantuml License
Best in #Animation
Average in #Animation
plantuml License
Best in #Animation
Average in #Animation

buildReuse

  • plantuml releases are available to install and integrate.
  • plantuml has no build file. You will be need to create the build yourself to build the component from source.
  • plantuml saves you 216886 person hours of effort in developing the same functionality from scratch.
  • It has 219576 lines of code, 19730 functions and 2883 files.
  • It has medium code complexity. Code complexity directly impacts maintainability of the code.
plantuml Reuse
Best in #Animation
Average in #Animation
plantuml Reuse
Best in #Animation
Average in #Animation
Top functions reviewed by kandi - BETA

kandi has reviewed plantuml and discovered the below as its top functions. This is intended to give you an instant insight into plantuml implemented functionality, and help decide if they suit your requirements.

  • Solves the given puzzle .
  • Adds clustering objects .
  • Build the version list .
  • Predict the position of a VP8 frame .
  • Create a component .
  • Gather edges from a cell to a given cell
  • Begin a path .
  • Predict the UV .
  • Parse a string into an expression
  • Exit event .

plantuml Key Features

[Sequence diagram](http://plantuml.com/sequence-diagram),

[Use case diagram](http://plantuml.com/use-case-diagram),

[Class diagram](http://plantuml.com/class-diagram),

[Object diagram](http://plantuml.com/object-diagram),

[Activity diagram](http://plantuml.com/activity-diagram-beta) (here is [the legacy syntax](http://plantuml.com/activity-diagram-legacy)),

[Component diagram](http://plantuml.com/component-diagram),

[Deployment diagram](http://plantuml.com/deployment-diagram),

[State diagram](http://plantuml.com/state-diagram),

[Timing diagram](http://plantuml.com/timing-diagram).

ANTLR Grammar to get a Sentence as Single Token

copy iconCopydownload iconDownload
@startuml
Alice -> Alice: This is a signal to self.\nIt also demonstrates\nmultiline \ntext
@enduml
action:
    left=ident 
    arrow 
    right=ident 
    LABEL
    ;

LABEL: ‘:’ ~[\r\n]*;
-----------------------
@startuml
Alice -> Alice: This is a signal to self.\nIt also demonstrates\nmultiline \ntext
@enduml
action:
    left=ident 
    arrow 
    right=ident 
    LABEL
    ;

LABEL: ‘:’ ~[\r\n]*;

plantuml: Right to left arrows, grouped components

copy iconCopydownload iconDownload
@startuml
left to right direction

rectangle    Foo1
rectangle    Foo2
rectangle    Foo3

node Bar1
node Bar2
node Bar3

storage Baz1
storage Baz2
storage Baz3

Foo1 --> Bar2
Foo2 --> Bar1
Bar1 --> Baz3
Bar2 --> Baz1
Foo3 -[hidden]-> Bar3
Bar3 -[hidden]-> Baz2
@enduml
hide Foo1
-----------------------
@startuml
left to right direction

rectangle    Foo1
rectangle    Foo2
rectangle    Foo3

node Bar1
node Bar2
node Bar3

storage Baz1
storage Baz2
storage Baz3

Foo1 --> Bar2
Foo2 --> Bar1
Bar1 --> Baz3
Bar2 --> Baz1
Foo3 -[hidden]-> Bar3
Bar3 -[hidden]-> Baz2
@enduml
hide Foo1

How to differentiate usage and inheritance in a layered architecture?

copy iconCopydownload iconDownload
@ArchTest
ArchRule adapter_should_not_inherit_from_port = noClasses()
    .that().resideInAPackage("….adapter")
    .should().beAssignableTo(JavaClass.Predicates.resideInAPackage("….port"));

@ArchTest
ArchRule service_should_not_access_port = noClasses()
    .that().resideInAPackage("….service")
    .should().accessClassesThat().resideInAPackage("….port");

Syntax Error inside map, but works on the online webservice

copy iconCopydownload iconDownload
public class PlantUMLDemo {
    
    public static void main (String[] args) throws IOException {
        String source = "@startuml\r\n"
            + "left to right direction\r\n"
            + "' Horizontal lines: -->, <--, <-->\r\n"
            + "' Vertical lines: ->, <-, <->\r\n"
            + "map Transport.Personnel{\r\n"
            + "ID => 38\r\n"
            + "}\r\n"
            + "map Airplane1{\r\n"
            + "ID => 39\r\n"
            + "}\r\n"
            + "map Airplane2{\r\n"
            + "ID => 40\r\n"
            + "}\r\n"
            + "map Lathe1{\r\n"
            + "ID => 41\r\n"
            + "}\r\n"
            + "map Lathe2{\r\n"
            + "ID => 42\r\n"
            + "}\r\n"
            + "map Production.from.Mold1{\r\n"
            + "ID => 43\r\n"
            + "}\r\n"
            + "map Production.from.Mold2{\r\n"
            + "ID => 44\r\n"
            + "}\r\n"
            + "map Assembly.Line1{\r\n"
            + "ID => 45\r\n"
            + "}\r\n"
            + "map Assembly.Line2{\r\n"
            + "ID => 46\r\n"
            + "}\r\n"
            + "map Assembly.Line3{\r\n"
            + "ID => 47\r\n"
            + "}\r\n"
            + "@enduml";
        byte[] bytes = source.getBytes(StandardCharsets.UTF_8);
        String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8);
        System.out.println(utf8EncodedString);
        SourceStringReader reader = new SourceStringReader(utf8EncodedString);
        final ByteArrayOutputStream os = new ByteArrayOutputStream();
        // Write the first image to "os"
        reader.generateImage(os, new FileFormatOption(FileFormat.SVG));
        os.close();
        // The XML is stored into svg
        final String svg = new String(os.toByteArray(), Charset.forName("UTF-8"));
        System.out.println(svg);
//      return svg;
    }
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="290px" preserveAspectRatio="none" style="width:539px;height:290px;background:#FFFFFF;" version="1.1" viewBox="0 0 539 290" width="539px" zoomAndPan="magnify"><defs><filter height="300%" id="fxvmrbp5q73dl" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="127" x="7" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="113" x="14" y="21.457">Transport.Personnel</text><line style="stroke:#A80036;stroke-width:1.0;" x1="7" x2="134" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="12" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="32" y="38.4746">38</text><line style="stroke:#A80036;stroke-width:1.0;" x1="27" x2="27" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="66" x="37.5" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="52" x="44.5" y="99.457">Airplane1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="37.5" x2="103.5" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="42.5" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="62.5" y="116.4746">39</text><line style="stroke:#A80036;stroke-width:1.0;" x1="57.5" x2="57.5" y1="104.0938" y2="120.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="66" x="37.5" y="163"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="52" x="44.5" y="177.457">Airplane2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="37.5" x2="103.5" y1="182.0938" y2="182.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="42.5" y="194.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="62.5" y="194.4746">40</text><line style="stroke:#A80036;stroke-width:1.0;" x1="57.5" x2="57.5" y1="182.0938" y2="198.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="52" x="44.5" y="241"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="38" x="51.5" y="255.457">Lathe1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="44.5" x2="96.5" y1="260.0938" y2="260.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="49.5" y="272.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="69.5" y="272.4746">41</text><line style="stroke:#A80036;stroke-width:1.0;" x1="64.5" x2="64.5" y1="260.0938" y2="276.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="52" x="252.5" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="38" x="259.5" y="21.457">Lathe2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="252.5" x2="304.5" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="257.5" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="277.5" y="38.4746">42</text><line style="stroke:#A80036;stroke-width:1.0;" x1="272.5" x2="272.5" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="137" x="210" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="123" x="217" y="99.457">Production.from.Mold1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="210" x2="347" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="215" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="235" y="116.4746">43</text><line style="stroke:#A80036;stroke-width:1.0;" x1="230" x2="230" y1="104.0938" y2="120.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="137" x="210" y="163"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="123" x="217" y="177.457">Production.from.Mold2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="210" x2="347" y1="182.0938" y2="182.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="215" y="194.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="235" y="194.4746">44</text><line style="stroke:#A80036;stroke-width:1.0;" x1="230" x2="230" y1="182.0938" y2="198.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="227.5" y="241"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="234.5" y="255.457">Assembly.Line1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="227.5" x2="329.5" y1="260.0938" y2="260.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="232.5" y="272.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="252.5" y="272.4746">45</text><line style="stroke:#A80036;stroke-width:1.0;" x1="247.5" x2="247.5" y1="260.0938" y2="276.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="423" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="430" y="21.457">Assembly.Line2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="423" x2="525" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="428" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="448" y="38.4746">46</text><line style="stroke:#A80036;stroke-width:1.0;" x1="443" x2="443" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="423" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="430" y="99.457">Assembly.Line3</text><line style="stroke:#A80036;stroke-width:1.0;" x1="423" x2="525" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="428" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="448" y="116.4746">47</text><line style="stroke:#A80036;stroke-width:1.0;" x1="443" x2="443" y1="104.0938" y2="120.6719"/><!--MD5=[ff82272a54b0608060e06faff60c0c6f]
link Transport.Personnel to Airplane1--><!--MD5=[c202e95eecfc418b5501e2a8947e8feb]
link Airplane1 to Airplane2--><!--MD5=[636ba822349036c737d84d06f0729b92]
link Airplane2 to Lathe1--><!--MD5=[b9280dfb35d92cd40bcce7a3234b7f39]
link Transport.Personnel to Lathe2--><!--MD5=[771b27f758c2865dd959173aec72d1ef]
link Lathe2 to Production.from.Mold1--><!--MD5=[77de6294656f35161f6e03883c63e876]
link Production.from.Mold1 to Production.from.Mold2--><!--MD5=[73d5fa06c8330ee70fe1a2a0b8f7f067]
link Production.from.Mold2 to Assembly.Line1--><!--MD5=[8053d5220acde5e9c8d637bbcdec0086]
link Lathe2 to Assembly.Line2--><!--MD5=[b61908b6fd80267801bee0bc115ff909]
link Assembly.Line2 to Assembly.Line3--><!--MD5=[83bc2a7ae5b567adf58816b4879445c0]
@startuml
left to right direction
' Horizontal lines: - ->, <- -, <- ->
' Vertical lines: ->, <-, <->
map Transport.Personnel{
ID => 38
}
map Airplane1{
ID => 39
}
map Airplane2{
ID => 40
}
map Lathe1{
ID => 41
}
map Lathe2{
ID => 42
}
map Production.from.Mold1{
ID => 43
}
map Production.from.Mold2{
ID => 44
}
map Assembly.Line1{
ID => 45
}
map Assembly.Line2{
ID => 46
}
map Assembly.Line3{
ID => 47
}
@enduml

@startuml
left to right direction
map Transport.Personnel{
ID => 38
}
map Airplane1{
ID => 39
}
map Airplane2{
ID => 40
}
map Lathe1{
ID => 41
}
map Lathe2{
ID => 42
}
map Production.from.Mold1{
ID => 43
}
map Production.from.Mold2{
ID => 44
}
map Assembly.Line1{
ID => 45
}
map Assembly.Line2{
ID => 46
}
map Assembly.Line3{
ID => 47
}
@enduml

PlantUML version 1.2021.9(Sun Jul 25 05:13:56 CDT 2021)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: Cp1252
Language: en
Country: US
--></g></svg>
-----------------------
public class PlantUMLDemo {
    
    public static void main (String[] args) throws IOException {
        String source = "@startuml\r\n"
            + "left to right direction\r\n"
            + "' Horizontal lines: -->, <--, <-->\r\n"
            + "' Vertical lines: ->, <-, <->\r\n"
            + "map Transport.Personnel{\r\n"
            + "ID => 38\r\n"
            + "}\r\n"
            + "map Airplane1{\r\n"
            + "ID => 39\r\n"
            + "}\r\n"
            + "map Airplane2{\r\n"
            + "ID => 40\r\n"
            + "}\r\n"
            + "map Lathe1{\r\n"
            + "ID => 41\r\n"
            + "}\r\n"
            + "map Lathe2{\r\n"
            + "ID => 42\r\n"
            + "}\r\n"
            + "map Production.from.Mold1{\r\n"
            + "ID => 43\r\n"
            + "}\r\n"
            + "map Production.from.Mold2{\r\n"
            + "ID => 44\r\n"
            + "}\r\n"
            + "map Assembly.Line1{\r\n"
            + "ID => 45\r\n"
            + "}\r\n"
            + "map Assembly.Line2{\r\n"
            + "ID => 46\r\n"
            + "}\r\n"
            + "map Assembly.Line3{\r\n"
            + "ID => 47\r\n"
            + "}\r\n"
            + "@enduml";
        byte[] bytes = source.getBytes(StandardCharsets.UTF_8);
        String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8);
        System.out.println(utf8EncodedString);
        SourceStringReader reader = new SourceStringReader(utf8EncodedString);
        final ByteArrayOutputStream os = new ByteArrayOutputStream();
        // Write the first image to "os"
        reader.generateImage(os, new FileFormatOption(FileFormat.SVG));
        os.close();
        // The XML is stored into svg
        final String svg = new String(os.toByteArray(), Charset.forName("UTF-8"));
        System.out.println(svg);
//      return svg;
    }
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="290px" preserveAspectRatio="none" style="width:539px;height:290px;background:#FFFFFF;" version="1.1" viewBox="0 0 539 290" width="539px" zoomAndPan="magnify"><defs><filter height="300%" id="fxvmrbp5q73dl" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="127" x="7" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="113" x="14" y="21.457">Transport.Personnel</text><line style="stroke:#A80036;stroke-width:1.0;" x1="7" x2="134" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="12" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="32" y="38.4746">38</text><line style="stroke:#A80036;stroke-width:1.0;" x1="27" x2="27" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="66" x="37.5" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="52" x="44.5" y="99.457">Airplane1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="37.5" x2="103.5" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="42.5" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="62.5" y="116.4746">39</text><line style="stroke:#A80036;stroke-width:1.0;" x1="57.5" x2="57.5" y1="104.0938" y2="120.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="66" x="37.5" y="163"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="52" x="44.5" y="177.457">Airplane2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="37.5" x2="103.5" y1="182.0938" y2="182.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="42.5" y="194.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="62.5" y="194.4746">40</text><line style="stroke:#A80036;stroke-width:1.0;" x1="57.5" x2="57.5" y1="182.0938" y2="198.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="52" x="44.5" y="241"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="38" x="51.5" y="255.457">Lathe1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="44.5" x2="96.5" y1="260.0938" y2="260.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="49.5" y="272.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="69.5" y="272.4746">41</text><line style="stroke:#A80036;stroke-width:1.0;" x1="64.5" x2="64.5" y1="260.0938" y2="276.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="52" x="252.5" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="38" x="259.5" y="21.457">Lathe2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="252.5" x2="304.5" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="257.5" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="277.5" y="38.4746">42</text><line style="stroke:#A80036;stroke-width:1.0;" x1="272.5" x2="272.5" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="137" x="210" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="123" x="217" y="99.457">Production.from.Mold1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="210" x2="347" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="215" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="235" y="116.4746">43</text><line style="stroke:#A80036;stroke-width:1.0;" x1="230" x2="230" y1="104.0938" y2="120.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="137" x="210" y="163"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="123" x="217" y="177.457">Production.from.Mold2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="210" x2="347" y1="182.0938" y2="182.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="215" y="194.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="235" y="194.4746">44</text><line style="stroke:#A80036;stroke-width:1.0;" x1="230" x2="230" y1="182.0938" y2="198.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="227.5" y="241"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="234.5" y="255.457">Assembly.Line1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="227.5" x2="329.5" y1="260.0938" y2="260.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="232.5" y="272.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="252.5" y="272.4746">45</text><line style="stroke:#A80036;stroke-width:1.0;" x1="247.5" x2="247.5" y1="260.0938" y2="276.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="423" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="430" y="21.457">Assembly.Line2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="423" x2="525" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="428" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="448" y="38.4746">46</text><line style="stroke:#A80036;stroke-width:1.0;" x1="443" x2="443" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="423" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="430" y="99.457">Assembly.Line3</text><line style="stroke:#A80036;stroke-width:1.0;" x1="423" x2="525" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="428" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="448" y="116.4746">47</text><line style="stroke:#A80036;stroke-width:1.0;" x1="443" x2="443" y1="104.0938" y2="120.6719"/><!--MD5=[ff82272a54b0608060e06faff60c0c6f]
link Transport.Personnel to Airplane1--><!--MD5=[c202e95eecfc418b5501e2a8947e8feb]
link Airplane1 to Airplane2--><!--MD5=[636ba822349036c737d84d06f0729b92]
link Airplane2 to Lathe1--><!--MD5=[b9280dfb35d92cd40bcce7a3234b7f39]
link Transport.Personnel to Lathe2--><!--MD5=[771b27f758c2865dd959173aec72d1ef]
link Lathe2 to Production.from.Mold1--><!--MD5=[77de6294656f35161f6e03883c63e876]
link Production.from.Mold1 to Production.from.Mold2--><!--MD5=[73d5fa06c8330ee70fe1a2a0b8f7f067]
link Production.from.Mold2 to Assembly.Line1--><!--MD5=[8053d5220acde5e9c8d637bbcdec0086]
link Lathe2 to Assembly.Line2--><!--MD5=[b61908b6fd80267801bee0bc115ff909]
link Assembly.Line2 to Assembly.Line3--><!--MD5=[83bc2a7ae5b567adf58816b4879445c0]
@startuml
left to right direction
' Horizontal lines: - ->, <- -, <- ->
' Vertical lines: ->, <-, <->
map Transport.Personnel{
ID => 38
}
map Airplane1{
ID => 39
}
map Airplane2{
ID => 40
}
map Lathe1{
ID => 41
}
map Lathe2{
ID => 42
}
map Production.from.Mold1{
ID => 43
}
map Production.from.Mold2{
ID => 44
}
map Assembly.Line1{
ID => 45
}
map Assembly.Line2{
ID => 46
}
map Assembly.Line3{
ID => 47
}
@enduml

@startuml
left to right direction
map Transport.Personnel{
ID => 38
}
map Airplane1{
ID => 39
}
map Airplane2{
ID => 40
}
map Lathe1{
ID => 41
}
map Lathe2{
ID => 42
}
map Production.from.Mold1{
ID => 43
}
map Production.from.Mold2{
ID => 44
}
map Assembly.Line1{
ID => 45
}
map Assembly.Line2{
ID => 46
}
map Assembly.Line3{
ID => 47
}
@enduml

PlantUML version 1.2021.9(Sun Jul 25 05:13:56 CDT 2021)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: Cp1252
Language: en
Country: US
--></g></svg>

PlantUML Getting Syntax Error (Flutter/Dart)

copy iconCopydownload iconDownload
"covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeR
ange"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateR
angeDialog"
@startuml
set namespaceSeparator ::

class "covid19stats::chartsData.dart::ChartsData" {
  +ChartData* total
  +ChartData* recovered
  +ChartData* deaths
  +ChartData* vaccine
}

"covid19stats::chartsData.dart::ChartsData" o-- "covid19stats::chartsData.dart::ChartData"

class "covid19stats::chartsData.dart::ChartData" {
  +bool* daily
  +bool* available
  +List<String*>* labels
  +List<int*>* values
  +List<Color*>* gradientColors
}

class "covid19stats::counter.dart::Counter" {
  +Animation<int*>* animation
  +TextStyle* textStyle
  +Widget* build()
}

"covid19stats::counter.dart::Counter" o-- "flutter::src::animation::animation.dart::Animation<int>"
"covid19stats::counter.dart::Counter" o-- "flutter::src::painting::text_style.dart::TextStyle"
"flutter::src::widgets::transitions.dart::AnimatedWidget" <|-- "covid19stats::counter.dart::Counter"

class "covid19stats::countryData.dart::CountryData" {
  +int* totalTests
  +int* testsPerMln
  +int* totalCases
  +double* casesPerMln
  +int* newCases
  +int* totalRecovered
  +int* newRecovered
  +int* activeCases
  +int* totalDeaths
  +double* deathsPerMln
  +int* criticalCases
  +int* newDeaths
  +String* link
  +int* vacTotal
  +int* vacDaily
  +int* vactotalPerHundred
  +int* vacdailyPerMillion
}

class "covid19stats::countryDataVac.dart::CountryDataVac" {
  +int* vacTotal
  +int* vacDaily
  +int* vactotalPerHundred
  +int* vacdailyPerMillion
  +String* date
  +Map<String*, dynamic>* toJson()
}

class "covid19stats::dateRangeDialog.dart::DateRangeDialog" {
  +DateTimeRange* availableRange
  +DateTimeRange* currentRange
  +_DateRangeDialogState* createState()
}

"covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeRange"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateRangeDialog"

class "covid19stats::dateRangeDialog.dart::_DateRangeDialogState" {
  +TextEditingController* fromController
  +TextEditingController* toController
  +DateFormat* dateFormat
  +DateTimeRange* selectedRange
  +int* selectedOption
  +DateTimeRange* preset7
  +DateTimeRange* preset28
  +void initState()
  +Widget* build()
  +void checkForPresets()
}

"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "intl::intl.dart::DateFormat"
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::material::date.dart::DateTimeRange"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::dateRangeDialog.dart::_DateRangeDialogState"

class "covid19stats::main.dart::MyApp" {
  +Widget* build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "covid19stats::main.dart::MyApp"

class "covid19stats::main.dart::MyHomePage" {
  +_MyHomePageState* createState()
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::main.dart::MyHomePage"

class "covid19stats::main.dart::_MyHomePageState" {
  -GlobalKey<State<StatefulWidget*>*>* _refreshIndicatorKey
  -GlobalKey<ScaffoldState*>* _scaffoldKey
  +Map<String*, CountryData*>* countryData
  +Map<String*, CountryDataVac*>* countryDataVac
  +Map<String*, ChartsData*>* chartsData
  +Map<String*, ChartsData*>* chartsDataVac
  +String* country
  +bool* justStarted
  +int* springAnimationDuration
  -AnimationController* _controller
  +ThemeData* datePickerTheme
  +DateTimeRange* selectedDateRange
  +Settings* settings
  +void initState()
  -void _triggerLiquidPullRefresh()
  +Future<void>* refreshData()
  +void dispose()
  +Widget* build()
  +dynamic navigateToSelection()
  +Future<void>* showDateDialog()
  +Future<void>* showSettingsDialog()
  +void checkRangeSetting()
  +Widget* createGraph()
}

"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State<StatefulWidget>>"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<ScaffoldState>"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::animation::animation_controller.dart::AnimationController"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::theme_data.dart::ThemeData"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::date.dart::DateTimeRange"
"covid19stats::main.dart::_MyHomePageState" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::main.dart::_MyHomePageState"
"flutter::src::widgets::ticker_provider.dart::TickerProviderStateMixin" <|-- "covid19stats::main.dart::_MyHomePageState"

class "covid19stats::parser.dart::Parser" {
  {static} +CountryData* parseRow()
  {static} +CountryDataVac* parseRowVac()
  {static} +int* parseInteger()
  {static} +double* parseDouble()
  {static} +String* getInnerString()
  {static} +String* normalizeName()
  {static} +Map<String*, CountryData*>* getCountryData()
  {static} +String* capitalize()
  {static} +Map<String*, CountryDataVac*>* getCountryDataVac()
  {static} +List<String*>* getCategories()
  {static} +List<int*>* getDataPoints()
  {static} +List<String*>* getVacDates()
  {static} +List<int*>* getVacDataPoints()
  {static} +ChartsData* getChartsData()
}

class "covid19stats::selectCountry.dart::SelectionScreen" {
  +List<dynamic>* countries
  +String* selectedCountry
  +_SelectionScreenState* createState()
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::selectCountry.dart::SelectionScreen"

class "covid19stats::selectCountry.dart::_SelectionScreenState" {
  +ScrollController* scrollController
  +GlobalKey<State<StatefulWidget*>*>* key
  +Map<String*, String*>* countryFlags
  -TextEditingController* _controller
  +FocusNode* textFieldFocusNode
  +bool* searchFieldVisible
  +List<dynamic>* filteredCountries
  +bool* newSearch
  +void initState()
  +void dispose()
  +void toggleSearchField()
  +Widget* build()
  +Widget* getListTile()
}

"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::scroll_controller.dart::ScrollController"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State<StatefulWidget>>"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::focus_manager.dart::FocusNode"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::selectCountry.dart::_SelectionScreenState"

class "covid19stats::settingsDialog.dart::Settings" {
  +bool* defaultDailyView
  +bool* alwaysLoadCharts
  +int* rangeSetting
  +bool* loaded
  +Future<void>* load()
  +Future<bool*>* save()
  +Settings* clone()
  +dynamic []()
}

class "covid19stats::settingsDialog.dart::SettingsDialog" {
  +Settings* settings
  +_SettingsDialogState* createState()
}

"covid19stats::settingsDialog.dart::SettingsDialog" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::settingsDialog.dart::SettingsDialog"

class "covid19stats::settingsDialog.dart::_SettingsDialogState" {
  +Settings* newSettings
  +void initState()
  +Widget* build()
  +Row* getSwitchRow()
}

"covid19stats::settingsDialog.dart::_SettingsDialogState" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::settingsDialog.dart::_SettingsDialogState"

class "covid19stats::vaccineCountry.dart::VaccineCountry" {
  +String* country
  +List<Timeline*>* timeline
  +Map<String*, dynamic>* toJson()
}

class "covid19stats::vaccineCountry.dart::Timeline" {
  +int* total
  +int* daily
  +int* totalPerHundred
  +int* dailyPerMillion
  +String* date
  +Map<String*, dynamic>* toJson()
}

class "covid19stats::vaccineData.dart::VaccineData" {
  +int* total
  +int* daily
  +double* totalPerHundred
  +double* dailyPerMillion
  +String* link
}
@enduml
-----------------------
"covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeR
ange"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateR
angeDialog"
@startuml
set namespaceSeparator ::

class "covid19stats::chartsData.dart::ChartsData" {
  +ChartData* total
  +ChartData* recovered
  +ChartData* deaths
  +ChartData* vaccine
}

"covid19stats::chartsData.dart::ChartsData" o-- "covid19stats::chartsData.dart::ChartData"

class "covid19stats::chartsData.dart::ChartData" {
  +bool* daily
  +bool* available
  +List<String*>* labels
  +List<int*>* values
  +List<Color*>* gradientColors
}

class "covid19stats::counter.dart::Counter" {
  +Animation<int*>* animation
  +TextStyle* textStyle
  +Widget* build()
}

"covid19stats::counter.dart::Counter" o-- "flutter::src::animation::animation.dart::Animation<int>"
"covid19stats::counter.dart::Counter" o-- "flutter::src::painting::text_style.dart::TextStyle"
"flutter::src::widgets::transitions.dart::AnimatedWidget" <|-- "covid19stats::counter.dart::Counter"

class "covid19stats::countryData.dart::CountryData" {
  +int* totalTests
  +int* testsPerMln
  +int* totalCases
  +double* casesPerMln
  +int* newCases
  +int* totalRecovered
  +int* newRecovered
  +int* activeCases
  +int* totalDeaths
  +double* deathsPerMln
  +int* criticalCases
  +int* newDeaths
  +String* link
  +int* vacTotal
  +int* vacDaily
  +int* vactotalPerHundred
  +int* vacdailyPerMillion
}

class "covid19stats::countryDataVac.dart::CountryDataVac" {
  +int* vacTotal
  +int* vacDaily
  +int* vactotalPerHundred
  +int* vacdailyPerMillion
  +String* date
  +Map<String*, dynamic>* toJson()
}

class "covid19stats::dateRangeDialog.dart::DateRangeDialog" {
  +DateTimeRange* availableRange
  +DateTimeRange* currentRange
  +_DateRangeDialogState* createState()
}

"covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeRange"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateRangeDialog"

class "covid19stats::dateRangeDialog.dart::_DateRangeDialogState" {
  +TextEditingController* fromController
  +TextEditingController* toController
  +DateFormat* dateFormat
  +DateTimeRange* selectedRange
  +int* selectedOption
  +DateTimeRange* preset7
  +DateTimeRange* preset28
  +void initState()
  +Widget* build()
  +void checkForPresets()
}

"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "intl::intl.dart::DateFormat"
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::material::date.dart::DateTimeRange"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::dateRangeDialog.dart::_DateRangeDialogState"

class "covid19stats::main.dart::MyApp" {
  +Widget* build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "covid19stats::main.dart::MyApp"

class "covid19stats::main.dart::MyHomePage" {
  +_MyHomePageState* createState()
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::main.dart::MyHomePage"

class "covid19stats::main.dart::_MyHomePageState" {
  -GlobalKey<State<StatefulWidget*>*>* _refreshIndicatorKey
  -GlobalKey<ScaffoldState*>* _scaffoldKey
  +Map<String*, CountryData*>* countryData
  +Map<String*, CountryDataVac*>* countryDataVac
  +Map<String*, ChartsData*>* chartsData
  +Map<String*, ChartsData*>* chartsDataVac
  +String* country
  +bool* justStarted
  +int* springAnimationDuration
  -AnimationController* _controller
  +ThemeData* datePickerTheme
  +DateTimeRange* selectedDateRange
  +Settings* settings
  +void initState()
  -void _triggerLiquidPullRefresh()
  +Future<void>* refreshData()
  +void dispose()
  +Widget* build()
  +dynamic navigateToSelection()
  +Future<void>* showDateDialog()
  +Future<void>* showSettingsDialog()
  +void checkRangeSetting()
  +Widget* createGraph()
}

"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State<StatefulWidget>>"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<ScaffoldState>"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::animation::animation_controller.dart::AnimationController"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::theme_data.dart::ThemeData"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::date.dart::DateTimeRange"
"covid19stats::main.dart::_MyHomePageState" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::main.dart::_MyHomePageState"
"flutter::src::widgets::ticker_provider.dart::TickerProviderStateMixin" <|-- "covid19stats::main.dart::_MyHomePageState"

class "covid19stats::parser.dart::Parser" {
  {static} +CountryData* parseRow()
  {static} +CountryDataVac* parseRowVac()
  {static} +int* parseInteger()
  {static} +double* parseDouble()
  {static} +String* getInnerString()
  {static} +String* normalizeName()
  {static} +Map<String*, CountryData*>* getCountryData()
  {static} +String* capitalize()
  {static} +Map<String*, CountryDataVac*>* getCountryDataVac()
  {static} +List<String*>* getCategories()
  {static} +List<int*>* getDataPoints()
  {static} +List<String*>* getVacDates()
  {static} +List<int*>* getVacDataPoints()
  {static} +ChartsData* getChartsData()
}

class "covid19stats::selectCountry.dart::SelectionScreen" {
  +List<dynamic>* countries
  +String* selectedCountry
  +_SelectionScreenState* createState()
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::selectCountry.dart::SelectionScreen"

class "covid19stats::selectCountry.dart::_SelectionScreenState" {
  +ScrollController* scrollController
  +GlobalKey<State<StatefulWidget*>*>* key
  +Map<String*, String*>* countryFlags
  -TextEditingController* _controller
  +FocusNode* textFieldFocusNode
  +bool* searchFieldVisible
  +List<dynamic>* filteredCountries
  +bool* newSearch
  +void initState()
  +void dispose()
  +void toggleSearchField()
  +Widget* build()
  +Widget* getListTile()
}

"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::scroll_controller.dart::ScrollController"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State<StatefulWidget>>"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::focus_manager.dart::FocusNode"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::selectCountry.dart::_SelectionScreenState"

class "covid19stats::settingsDialog.dart::Settings" {
  +bool* defaultDailyView
  +bool* alwaysLoadCharts
  +int* rangeSetting
  +bool* loaded
  +Future<void>* load()
  +Future<bool*>* save()
  +Settings* clone()
  +dynamic []()
}

class "covid19stats::settingsDialog.dart::SettingsDialog" {
  +Settings* settings
  +_SettingsDialogState* createState()
}

"covid19stats::settingsDialog.dart::SettingsDialog" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::settingsDialog.dart::SettingsDialog"

class "covid19stats::settingsDialog.dart::_SettingsDialogState" {
  +Settings* newSettings
  +void initState()
  +Widget* build()
  +Row* getSwitchRow()
}

"covid19stats::settingsDialog.dart::_SettingsDialogState" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::settingsDialog.dart::_SettingsDialogState"

class "covid19stats::vaccineCountry.dart::VaccineCountry" {
  +String* country
  +List<Timeline*>* timeline
  +Map<String*, dynamic>* toJson()
}

class "covid19stats::vaccineCountry.dart::Timeline" {
  +int* total
  +int* daily
  +int* totalPerHundred
  +int* dailyPerMillion
  +String* date
  +Map<String*, dynamic>* toJson()
}

class "covid19stats::vaccineData.dart::VaccineData" {
  +int* total
  +int* daily
  +double* totalPerHundred
  +double* dailyPerMillion
  +String* link
}
@enduml

How can I exclude packages with Plant UML yaml

copy iconCopydownload iconDownload
package "Common Layer" {
 [SomethingCommon] <<..common.something..>>
 [Something] <<com.xxx.yyy.common.somepkgs>>
}
[somethingElse] --> [Common]
[somethingElse] --> [SomethingCommon]
[somethingElse] --> [Something]
-----------------------
package "Common Layer" {
 [SomethingCommon] <<..common.something..>>
 [Something] <<com.xxx.yyy.common.somepkgs>>
}
[somethingElse] --> [Common]
[somethingElse] --> [SomethingCommon]
[somethingElse] --> [Something]
-----------------------
package "Common Layer" {
 [SomethingCommon] <<..common.something..>>
 [Something] <<com.xxx.yyy.common.somepkgs>>
}
[somethingElse] --> [Common]
[somethingElse] --> [SomethingCommon]
[somethingElse] --> [Something]

How to create PlantUML diagram using Java API without using PlantUML diagram code?

copy iconCopydownload iconDownload
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.SourceStringReader;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.sequencediagram.Message;
import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory;
import net.sourceforge.plantuml.skin.ArrowConfiguration;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import static com.google.common.base.Preconditions.checkState;

public class PlantUMLDemoMain {
    public static void main(String[] args) throws Exception {
        generateFromStringSource(new File("from-string.png"));
        generateFromApi(new File("from-api.png"));
    }

    private static void generateFromApi(File file) throws IOException {
        // 1. setup:
        SequenceDiagramFactory f = new SequenceDiagramFactory();
        SequenceDiagram diagram = f.createEmptyDiagram();

        // 2. Build the diagram:
        // "Bob -> Alice : hello"
        // See net.sourceforge.plantuml.sequencediagram.command.CommandArrow#executeArg
        Display bobD = Display.getWithNewlines("Bob");
        Participant bobP = diagram.getOrCreateParticipant("Bob", bobD);

        Display aliceD = Display.getWithNewlines("Alice");
        Participant aliceP = diagram.getOrCreateParticipant("Alice", aliceD);

        Display label = Display.getWithNewlines("hello");
        ArrowConfiguration config = ArrowConfiguration.withDirectionNormal();

        Message msg = new Message(bobP, aliceP, label, config, diagram.getNextMessageNumber());

        checkState(null == diagram.addMessage(msg));

        // 3. Output the diagram
        // See net.sourceforge.plantuml.SourceStringReader#generateImage
        diagram.makeDiagramReady();
        checkState(1 == diagram.getNbImages());
        try (OutputStream os = new FileOutputStream(file)) {
            ImageData imageData = diagram.exportDiagram(os, 0, new FileFormatOption(FileFormat.PNG));
            System.out.println("generateFromApi: " + diagram.getDescription().getDescription());
        }
    }

    private static void generateFromStringSource(File file) throws IOException {
        String source = "@startuml\n";
        source += "Bob -> Alice : hello\n";
        source += "@enduml\n";

        SourceStringReader reader = new SourceStringReader(source);
        // Write the first image to "png"
        String desc = reader.generateImage(file);
        // Return a null string if no generation
        System.out.println("generateFromStringSource: " + desc);
    }
}
libraryDependencies += "net.sourceforge.plantuml" % "plantuml" % "8059"
libraryDependencies += "com.google.guava" % "guava" % "31.0.1-jre"
-----------------------
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.SourceStringReader;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.sequencediagram.Message;
import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory;
import net.sourceforge.plantuml.skin.ArrowConfiguration;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import static com.google.common.base.Preconditions.checkState;

public class PlantUMLDemoMain {
    public static void main(String[] args) throws Exception {
        generateFromStringSource(new File("from-string.png"));
        generateFromApi(new File("from-api.png"));
    }

    private static void generateFromApi(File file) throws IOException {
        // 1. setup:
        SequenceDiagramFactory f = new SequenceDiagramFactory();
        SequenceDiagram diagram = f.createEmptyDiagram();

        // 2. Build the diagram:
        // "Bob -> Alice : hello"
        // See net.sourceforge.plantuml.sequencediagram.command.CommandArrow#executeArg
        Display bobD = Display.getWithNewlines("Bob");
        Participant bobP = diagram.getOrCreateParticipant("Bob", bobD);

        Display aliceD = Display.getWithNewlines("Alice");
        Participant aliceP = diagram.getOrCreateParticipant("Alice", aliceD);

        Display label = Display.getWithNewlines("hello");
        ArrowConfiguration config = ArrowConfiguration.withDirectionNormal();

        Message msg = new Message(bobP, aliceP, label, config, diagram.getNextMessageNumber());

        checkState(null == diagram.addMessage(msg));

        // 3. Output the diagram
        // See net.sourceforge.plantuml.SourceStringReader#generateImage
        diagram.makeDiagramReady();
        checkState(1 == diagram.getNbImages());
        try (OutputStream os = new FileOutputStream(file)) {
            ImageData imageData = diagram.exportDiagram(os, 0, new FileFormatOption(FileFormat.PNG));
            System.out.println("generateFromApi: " + diagram.getDescription().getDescription());
        }
    }

    private static void generateFromStringSource(File file) throws IOException {
        String source = "@startuml\n";
        source += "Bob -> Alice : hello\n";
        source += "@enduml\n";

        SourceStringReader reader = new SourceStringReader(source);
        // Write the first image to "png"
        String desc = reader.generateImage(file);
        // Return a null string if no generation
        System.out.println("generateFromStringSource: " + desc);
    }
}
libraryDependencies += "net.sourceforge.plantuml" % "plantuml" % "8059"
libraryDependencies += "com.google.guava" % "guava" % "31.0.1-jre"

PlantUML java automation

copy iconCopydownload iconDownload
<plugin>
  <artifactId>plantuml-generator-maven-plugin</artifactId>
  <groupId>de.elnarion.maven</groupId>
  <version>1.1.2</version>
  <executions>
    <execution>
        <id>generate-simple-diagram</id>
        <goals>
            <goal>generate</goal>
        </goals>
        <phase>generate-test-sources</phase>
        <configuration>
            <outputFilename>testdiagram1.txt</outputFilename>
            <scanPackages>
                <scanPackage>
                some.package.to.process
                </scanPackage>
            </scanPackages>
        </configuration>
    </execution>
  </executions>
</plugin>

Doxygen: \include test.dox in mainpage.dox adds as a text

copy iconCopydownload iconDownload
\mainpage
# Introduction
\include{doc} introduction.dox
# Architecture
\include{doc} architecture.dox
This is an architecture description

This is an introduction about this package description
INPUT=mainpage.dox
EXTENSION_MAPPING = dox=md
QUIET=YES
EXAMPLE_PATH=.
-----------------------
\mainpage
# Introduction
\include{doc} introduction.dox
# Architecture
\include{doc} architecture.dox
This is an architecture description

This is an introduction about this package description
INPUT=mainpage.dox
EXTENSION_MAPPING = dox=md
QUIET=YES
EXAMPLE_PATH=.
-----------------------
\mainpage
# Introduction
\include{doc} introduction.dox
# Architecture
\include{doc} architecture.dox
This is an architecture description

This is an introduction about this package description
INPUT=mainpage.dox
EXTENSION_MAPPING = dox=md
QUIET=YES
EXAMPLE_PATH=.
-----------------------
\mainpage
# Introduction
\include{doc} introduction.dox
# Architecture
\include{doc} architecture.dox
This is an architecture description

This is an introduction about this package description
INPUT=mainpage.dox
EXTENSION_MAPPING = dox=md
QUIET=YES
EXAMPLE_PATH=.

Allow multi-line strings in XML/Javascript tooltip

copy iconCopydownload iconDownload
<svg onload="init(evt)"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="453px" preserveAspectRatio="none" style="width:484px;height:453px;background:#FFFFFF;" version="1.1" viewBox="0 0 484 453" width="484px" zoomAndPan="magnify">
    <defs>
        <filter height="300%" id="f15vc1a2o1fe31" width="300%" x="-1" y="-1">
            <feGaussianBlur result="blurOut" stdDeviation="2.0"/>
            <feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/>
            <feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/>
            <feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/>
        </filter>
    </defs>
    <style>
    .tooltip{
      font-family: Arial;
      font-size: 13px;
      fill:black;
    }
    .tooltip_bg{
      fill: yellow;
      opacity: 1;
    }
  </style>
    <script type="text/ecmascript">
        <![CDATA[
    function init(evt){
      if ( window.svgDocument == null ){
        svgDocument = evt.target.ownerDocument;
      }
      tooltip = svgDocument.getElementById('tooltip');
      tooltip_bg = svgDocument.getElementById('tooltip_bg');
    }
    function ShowTooltip(evt, mouseovertext){
      var el = evt.target;
      var bbox = el.getBBox();
      tooltip.setAttributeNS(null,"x",bbox.x + bbox.width +11);
      tooltip.setAttributeNS(null,"y",bbox.y + bbox.height+27);
      const lines = mouseovertext.split('\n');
      if (lines.length === 1)
         tooltip.textContent = mouseovertext;
      else {
         tooltip.textContent = '';
         lines.map((s, p) => { const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan'); tspan.textContent = s; tspan.setAttributeNS(null, 'x', bbox.x + bbox.width +11); tspan.setAttributeNS(null, 'dy', (p === 0 ? 0 : 15).toString()); return tspan; }).forEach(tspan => tooltip.appendChild(tspan));
      }
      tooltip.setAttributeNS(null,"visibility","visible");
      const tooltipBBox = tooltip.getBBox();
      tooltip_bg.setAttributeNS(null,"height",tooltipBBox.height+8);
      tooltip_bg.setAttributeNS(null,"width",tooltipBBox.width+8);
      tooltip_bg.setAttributeNS(null,"x",bbox.x + bbox.width +8);
      tooltip_bg.setAttributeNS(null,"y",bbox.y + bbox.height+11);
      tooltip_bg.setAttributeNS(null,"visibility","visibile");
    }
    function HideTooltip(evt){
      tooltip.setAttributeNS(null,"visibility","hidden");
      tooltip_bg.setAttributeNS(null,"visibility","hidden");
    }
  ]]>
    </script>
    <g>
        <rect fill="#FFFFFF" filter="url(#f15vc1a2o1fe31)" height="64.7031" style="stroke:#A80036;stroke-width:1.0;" width="10" x="208.5" y="118.3125"/>
        <rect fill="#FFFFFF" filter="url(#f15vc1a2o1fe31)" height="64.7031" style="stroke:#A80036;stroke-width:1.0;" width="10" x="408.5" y="292.0703"/>
        <line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="90" x2="90" y1="41.6094" y2="409.125"/>
        <line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="213" x2="213" y1="41.6094" y2="409.125"/>
        <line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="413" x2="413" y1="41.6094" y2="409.125"/>
        <rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="106" x="35" y="5"/>
        <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="92" x="42" y="26.5332">testExportSVG</text>
        <rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="106" x="35" y="408.125"/>
        <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="92" x="42" y="429.6582">testExportSVG</text>
        <rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="113" x="155" y="5"/>
        <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="162" y="26.5332">Web API Step 1</text>
        <rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="113" x="155" y="408.125"/>
        <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="162" y="429.6582">Web API Step 1</text>
        <rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="113" x="355" y="5"/>
        <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="362" y="26.5332">Web API Step 2</text>
        <rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="113" x="355" y="408.125"/>
        <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="362" y="429.6582">Web API Step 2</text>
        <rect fill="#FFFFFF" filter="url(#f15vc1a2o1fe31)" height="64.7031" style="stroke:#A80036;stroke-width:1.0;" width="10" x="208.5" y="118.3125"/>
        <rect fill="#FFFFFF" filter="url(#f15vc1a2o1fe31)" height="64.7031" style="stroke:#A80036;stroke-width:1.0;" width="10" x="408.5" y="292.0703"/>
        <rect fill="#EEEEEE" filter="url(#f15vc1a2o1fe31)" height="3" style="stroke:#EEEEEE;stroke-width:1.0;" width="477" x="0" y="72.7852"/>
        <line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="477" y1="72.7852" y2="72.7852"/>
        <line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="477" y1="75.7852" y2="75.7852"/>
        <rect fill="#EEEEEE" filter="url(#f15vc1a2o1fe31)" height="24.3516" style="stroke:#000000;stroke-width:2.0;" width="207" x="135" y="61.6094"/>
        <text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="193" x="141" y="79.1045">step 1: Account.Account Credit</text>
        <polygon fill="#A80036" points="196.5,114.3125,206.5,118.3125,196.5,122.3125,200.5,118.3125" style="stroke:#A80036;stroke-width:1.0;"/>
        <line style="stroke:#A80036;stroke-width:1.0;" x1="90" x2="202.5" y1="118.3125" y2="118.3125"/>
        <text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="7" x="97" y="113.4561">1</text>
        <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="79" x="108" y="113.4561">xecmPayload</text>
        <rect fill="#FBFB77" filter="url(#f15vc1a2o1fe31)" height="24" style="stroke:#A80036;stroke-width:1.0;" width="80" x="5" y="131.3125"/>
        <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="72" x="9" y="148.8076">
            <a onmousemove="ShowTooltip(evt, 'input = data;')" onmouseout="HideTooltip(evt)">
static data 1</a>
        </text>
        <polygon fill="#A80036" points="101,179.0156,91,183.0156,101,187.0156,97,183.0156" style="stroke:#A80036;stroke-width:1.0;"/>
        <line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:2.0,2.0;" x1="95" x2="212.5" y1="183.0156" y2="183.0156"/>
        <text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="7" x="107" y="178.1592">2</text>
        <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="29" x="118" y="178.1592">[200]</text>
        <rect fill="#FBFB77" filter="url(#f15vc1a2o1fe31)" height="24" style="stroke:#A80036;stroke-width:1.0;" width="101" x="39" y="196.0156"/>
        <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="93" x="43" y="213.5107">
            <a onmousemove="ShowTooltip(evt, 'otherVar ← other/path;\nsaveV ← /xml/path;')" onmouseout="HideTooltip(evt)">
validation data 1</a>
            <a onmousemove="ShowTooltip(evt, 'otherVar ← other/path;\nsaveV ← /xml/path;')" onmouseout="HideTooltip(evt)">
validation data 1</a>

        </text>
        <rect fill="#EEEEEE" filter="url(#f15vc1a2o1fe31)" height="3" style="stroke:#EEEEEE;stroke-width:1.0;" width="477" x="0" y="246.543"/>
        <line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="477" y1="246.543" y2="246.543"/>
        <line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="477" y1="249.543" y2="249.543"/>
        <rect fill="#EEEEEE" filter="url(#f15vc1a2o1fe31)" height="24.3516" style="stroke:#000000;stroke-width:2.0;" width="296" x="90.5" y="235.3672"/>
        <text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="282" x="96.5" y="252.8623">step 2: Abstraction.loan_bundles_abstraction</text>
        <polygon fill="#A80036" points="396.5,288.0703,406.5,292.0703,396.5,296.0703,400.5,292.0703" style="stroke:#A80036;stroke-width:1.0;"/>
        <line style="stroke:#A80036;stroke-width:1.0;" x1="213.5" x2="402.5" y1="292.0703" y2="292.0703"/>
        <text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="7" x="220.5" y="287.2139">3</text>
        <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="165" x="231.5" y="287.2139">create_loan_sanitywatercost</text>
        <rect fill="#FBFB77" filter="url(#f15vc1a2o1fe31)" height="24" style="stroke:#A80036;stroke-width:1.0;" width="80" x="128" y="305.0703"/>
        <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="72" x="132" y="322.5654">
            <a onmousemove="ShowTooltip(evt, 'some = data')" onmouseout="HideTooltip(evt)">
static data 2</a>
        </text>
        <polygon fill="#A80036" points="224.5,352.7734,214.5,356.7734,224.5,360.7734,220.5,356.7734" style="stroke:#A80036;stroke-width:1.0;"/>
        <line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:2.0,2.0;" x1="218.5" x2="412.5" y1="356.7734" y2="356.7734"/>
        <text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="7" x="230.5" y="351.917">4</text>
        <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="29" x="241.5" y="351.917">[204]</text>
        <rect fill="#FBFB77" filter="url(#f15vc1a2o1fe31)" height="24" style="stroke:#A80036;stroke-width:1.0;" width="101" x="163" y="369.7734"/>
        <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="93" x="167" y="387.2686">
            <a onmousemove="ShowTooltip(evt, 'saveJson ← json.path;\n')" onmouseout="HideTooltip(evt)">
validation data 2</a>
        </text>
        <!--MD5=[4d7fcf74e484c9aebaed7917263f6fd7]
@startuml 
autonumber 
==step 1: Account.Account Credit== 
"testExportSVG"->"Web API Step 1": xecmPayload 
rnote left "testExportSVG"
static data 1
endrnote 
activate "Web API Step 1"
"testExportSVG" <- - "Web API Step 1": [200] 
rnote over "testExportSVG"
validation data 1
endrnote 
deactivate "Web API Step 1"
==step 2: Abstraction.loan_bundles_abstraction== 
"Web API Step 1"->"Web API Step 2": create_loan_sanitywatercost 
rnote left "Web API Step 1"
static data 2
endrnote 
activate "Web API Step 2"
"Web API Step 1" <- - "Web API Step 2": [204] 
rnote over "Web API Step 1"
validation data 2
endrnote 
deactivate "Web API Step 2"
@enduml

PlantUML version 1.2021.8(Sat Jun 26 01:20:59 PDT 2021)
(GPL source distribution)
Java Runtime: Java(TM) SE Runtime Environment
JVM: Java HotSpot(TM) 64-Bit Server VM
Default Encoding: UTF-8
Language: en
Country: US
-->
    </g>
    <rect class="tooltip_bg" id="tooltip_bg" x="0" y="0" ry="2" width="55" height="21" visibility="hidden"/>
    <text class="tooltip" id="tooltip" x="0" y="0" visibility="hidden">Tooltip</text>
</svg>

Community Discussions

Trending Discussions on plantuml
  • How to configure AsciidocFX with Path to PlantUML
  • ANTLR Grammar to get a Sentence as Single Token
  • plantuml: Right to left arrows, grouped components
  • How to differentiate usage and inheritance in a layered architecture?
  • Syntax Error inside map, but works on the online webservice
  • PlantUML Getting Syntax Error (Flutter/Dart)
  • How can I exclude packages with Plant UML yaml
  • What causes this ArchUnit exception?
  • How to create PlantUML diagram using Java API without using PlantUML diagram code?
  • How to connect two Actions directly in PlantUML?
Trending Discussions on plantuml

QUESTION

How to configure AsciidocFX with Path to PlantUML

Asked 2022-Apr-09 at 15:40

I am using AsciidocFX version 1.7.4 to edit Asciidoc documents. When working on PlantUML diagrams and creating a syntax error, which is caused by using syntax that is not supported in older versions, I see the following message

PlantUML 1.2021.2
This version of PlantUML is 398 days old, so you should consider upgrading...

I have the following version installed on my system:

PlantUML version 1.2022.3 (Tue Mar 29 09:10:57 PDT 2022)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM

Obviously, AsciidocFX finds a different version. How can I configure AsciidocFX to use my latest locally install version? I went through the Settings dialogs as well as looked in the ~/.AsciidocFX-1.7.4 folder but could not find any clue.

ANSWER

Answered 2022-Apr-09 at 15:40

planumtl consist of a single plantuml.jar file. You should find a plantuml-1.2021.2.jar file in your installation folder, under lib, delete it and replace it with your own version.

Source https://stackoverflow.com/questions/71809312

Community Discussions, Code Snippets contain sources that include Stack Exchange Network

Vulnerabilities

No vulnerabilities reported

Install plantuml

You can download it from GitHub.
You can use plantuml like any standard Java library. Please include the the jar files in your classpath. You can also use any IDE and you can run and debug the plantuml component as you would do with any other Java program. Best practice is to use a build tool that supports dependency management such as Maven or Gradle. For Maven installation, please refer maven.apache.org. For Gradle installation, please refer gradle.org .

Support

For any new features, suggestions and bugs create an issue on GitHub. If you have any questions check and ask questions on community page Stack Overflow .

DOWNLOAD this Library from

Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from
over 430 million Knowledge Items
Find more libraries
Reuse Solution Kits and Libraries Curated by Popular Use Cases

Save this library and start creating your kit

Explore Related Topics

Share this Page

share link
Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from
over 430 million Knowledge Items
Find more libraries
Reuse Solution Kits and Libraries Curated by Popular Use Cases

Save this library and start creating your kit

  • © 2022 Open Weaver Inc.