Updated docs with Mermaid docs

This commit is contained in:
Bartek Kryza 2023-09-13 18:54:23 +02:00
parent 70e7088823
commit abd85534bc
No known key found for this signature in database
GPG Key ID: 6CDA4566635E93B1
15 changed files with 137 additions and 35 deletions

View File

@ -1,9 +1,11 @@
# CHANGELOG # CHANGELOG
* Added MermaidJS diagram generators (#27)
### 0.3.9 ### 0.3.9
* Added `from_to` and `to` location constraints to sequence diagrams (#154) * Added `from_to` and `to` location constraints to sequence diagrams (#154)
* Fixed 'else if' statement generation in sequence diagrams (#81) * Fixed 'else if' statement generation in sequence diagrams (#81)
* Implemented removal of redundant dependency relationhips (#28) * Implemented removal of redundant dependency relationships (#28)
* Add option to disable generation of dependency relation to template * Add option to disable generation of dependency relation to template
arguments (#141) arguments (#141)
* Added configuration file validation (#57) * Added configuration file validation (#57)

View File

@ -13,7 +13,8 @@ YAML configuration files. The main idea behind the
project is to easily maintain up-to-date diagrams within a code-base or document project is to easily maintain up-to-date diagrams within a code-base or document
legacy code. The configuration file or files for `clang-uml` define the legacy code. The configuration file or files for `clang-uml` define the
types and contents of each generated diagram. types and contents of each generated diagram.
The diagrams can be generated in [PlantUML](https://plantuml.com) and JSON formats. The diagrams can be generated in [PlantUML](https://plantuml.com),
[MermaidJS](https://mermaid.js.org/) and JSON formats.
`clang-uml` currently supports C++ up to version 17 with partial support for C++ 20. `clang-uml` currently supports C++ up to version 17 with partial support for C++ 20.
@ -35,8 +36,8 @@ Main features supported so far include:
* Template specialization and instantiation based on deduced context - [_example_](docs/test_cases/t00062.md) * Template specialization and instantiation based on deduced context - [_example_](docs/test_cases/t00062.md)
* Relationship inference from C++ containers and smart pointers - [_example_](docs/test_cases/t00007.md) * Relationship inference from C++ containers and smart pointers - [_example_](docs/test_cases/t00007.md)
* Diagram content filtering based on namespaces, elements and relationships - [_example_](docs/test_cases/t00040.md) * Diagram content filtering based on namespaces, elements and relationships - [_example_](docs/test_cases/t00040.md)
* Optional package generation from namespaces - [_example_](docs/test_cases/t00036.md) * Optional package generation from namespaces (only PlantUML) - [_example_](docs/test_cases/t00036.md)
* Optional package generation from subdirectories - [_example_](docs/test_cases/t00065.md) * Optional package generation from subdirectories (only PlantUML) - [_example_](docs/test_cases/t00065.md)
* Interactive links to online code to classes, methods and class fields in SVG diagrams - [_example_](https://raw.githubusercontent.com/bkryza/clang-uml/master/docs/test_cases/t00002_class.svg) * Interactive links to online code to classes, methods and class fields in SVG diagrams - [_example_](https://raw.githubusercontent.com/bkryza/clang-uml/master/docs/test_cases/t00002_class.svg)
* Support for plain C99/C11 code (struct and units relationships) - [_example_](docs/test_cases/t00057.md) * Support for plain C99/C11 code (struct and units relationships) - [_example_](docs/test_cases/t00057.md)
* C++20 concept constraints - [_example_](docs/test_cases/t00059.md) * C++20 concept constraints - [_example_](docs/test_cases/t00059.md)
@ -370,17 +371,17 @@ results in the following diagram (via PlantUML) based on include directives in t
### Default mappings ### Default mappings
| UML | PlantUML | | UML | PlantUML | MermaidJS |
| ---- | --- | | ---- | --- |------------------------------------------------|
| Inheritance | ![extension](docs/img/puml_inheritance.png) | | Inheritance | ![extension](docs/img/puml_inheritance.png) | ![extension](docs/img/mermaid_inheritance.png) |
| Association | ![association](docs/img/puml_association.png) | | Association | ![association](docs/img/puml_association.png) | ![association](docs/img/mermaid_association.png) |
| Dependency | ![dependency](docs/img/puml_dependency.png) | | Dependency | ![dependency](docs/img/puml_dependency.png) | ![dependency](docs/img/mermaid_dependency.png) |
| Aggregation | ![aggregation](docs/img/puml_aggregation.png) | | Aggregation | ![aggregation](docs/img/puml_aggregation.png) | ![aggregation](docs/img/mermaid_aggregation.png) |
| Composition | ![composition](docs/img/puml_composition.png) | | Composition | ![composition](docs/img/puml_composition.png) | ![composition](docs/img/mermaid_composition.png) |
| Template specialization/instantiation | ![specialization](docs/img/puml_instantiation.png) | | Template specialization/instantiation | ![specialization](docs/img/puml_instantiation.png) | ![specialization](docs/img/mermaid_instantiation.png) |
| Nesting (inner class/enum) | ![nesting](docs/img/puml_nested.png) | | Nesting (inner class/enum) | ![nesting](docs/img/puml_nested.png) | ![nesting](docs/img/mermaid_nested.png) |
| Include (local) | ![association](docs/img/puml_association.png) | | Include (local) | ![association](docs/img/puml_association.png) | ![association](docs/img/mermaid_association.png) |
| Include (system) | ![dependency](docs/img/puml_dependency.png) | | Include (system) | ![dependency](docs/img/puml_dependency.png) | ![dependency](docs/img/mermaid_dependency.png) |
### Diagram content filtering ### Diagram content filtering
@ -433,6 +434,7 @@ This project relies on the following great tools:
* [Clang LibTooling](https://clang.llvm.org/docs/LibTooling.html) - a C++ library for creating tools based on Clang * [Clang LibTooling](https://clang.llvm.org/docs/LibTooling.html) - a C++ library for creating tools based on Clang
* [PlantUML](https://plantuml.com/) - language and diagram for generating UML diagrams * [PlantUML](https://plantuml.com/) - language and diagram for generating UML diagrams
* [MermaidJS](https://mermaid.js.org/) - JavaScript based diagramming and charting tool
* [Catch2](https://github.com/catchorg/Catch2) - C++ unit test framework * [Catch2](https://github.com/catchorg/Catch2) - C++ unit test framework
* [glob](https://github.com/p-ranav/glob) - Unix style path expansion for C++ * [glob](https://github.com/p-ranav/glob) - Unix style path expansion for C++
* [indicators](https://github.com/p-ranav/indicators) - Activity indicators for modern C++ * [indicators](https://github.com/p-ranav/indicators) - Activity indicators for modern C++

View File

@ -134,12 +134,14 @@ Diagram generators convert the `clang-uml`'s internal UML model into actual
diagram in one of the supported formats: diagram in one of the supported formats:
- PlantUML - PlantUML
- MermaidJS
- JSON - JSON
Each diagram generator extends a common interface appropriate for the Each diagram generator extends a common interface appropriate for the
selected output format, i.e.: selected output format, i.e.:
- [PlantUML](classclanguml_1_1common_1_1generators_1_1plantuml_1_1generator.html) - [PlantUML](classclanguml_1_1common_1_1generators_1_1plantuml_1_1generator.html)
- [MermaidJS](classclanguml_1_1common_1_1generators_1_1mermaid_1_1generator.html)
- [JSON](classclanguml_1_1common_1_1generators_1_1json_1_1generator.html) - [JSON](classclanguml_1_1common_1_1generators_1_1json_1_1generator.html)
and renders the output to a file. For each diagram type there is a separate and renders the output to a file. For each diagram type there is a separate

View File

@ -4,7 +4,7 @@
* [Overall configuration file structure](#overall-configuration-file-structure) * [Overall configuration file structure](#overall-configuration-file-structure)
* [Translation unit glob patterns](#translation-unit-glob-patterns) * [Translation unit glob patterns](#translation-unit-glob-patterns)
* [PlantUML custom directives](#plantuml-custom-directives) * [Custom directives](#custom-directives)
* [Adding debug information in the generated diagrams](#adding-debug-information-in-the-generated-diagrams) * [Adding debug information in the generated diagrams](#adding-debug-information-in-the-generated-diagrams)
* [Resolving include path and compiler flags issues](#resolving-include-path-and-compiler-flags-issues) * [Resolving include path and compiler flags issues](#resolving-include-path-and-compiler-flags-issues)
* [Use '--query-driver' command line option](#use---query-driver-command-line-option) * [Use '--query-driver' command line option](#use---query-driver-command-line-option)
@ -63,9 +63,10 @@ For small projects, the `glob` property can be omitted, which will result in `cl
from `compile_commands.json` for the diagram. However for large projects, constraining the number of translation units from `compile_commands.json` for the diagram. However for large projects, constraining the number of translation units
for each diagram to absolute minimum will significantly decrease the diagram generation times. for each diagram to absolute minimum will significantly decrease the diagram generation times.
## PlantUML custom directives ## Custom directives
In case it's necessary to add some custom PlantUML declarations before or after the generated diagram content, In case it's necessary to add some custom PlantUML or MermaidJS declarations
it can be achieved simply using the `plantuml` configuration properties, for instance: before or after the generated diagram content, it can be achieved simply using
the `plantuml` or `mermaid` configuration properties, for instance for PlantUML:
```yaml ```yaml
plantuml: plantuml:
@ -75,23 +76,37 @@ it can be achieved simply using the `plantuml` configuration properties, for ins
- note left of {{ alias("ns1::ns2::MyClass") }} This is my class. - note left of {{ alias("ns1::ns2::MyClass") }} This is my class.
``` ```
These directive are useful for instance for adding notes to elements in the diagrams or customizing diagram layout or for MermaidJS:
or style.
Please note that when referring to diagram elements in the PlantUML directives, they must be added using Jinja ```yaml
templates `alias` command as in the example above. mermaid:
before:
- direction LR
after:
- note for {{ alias("ns1::ns2::MyClass") }} "This is my class."
```
More options can be found in the official PlantUML [documentation](https://plantuml.com/). These directive are useful for instance for adding notes to elements in the
diagrams or customizing diagram layout or style.
Please note that when referring to diagram elements in the PlantUML directives,
they must be added using Jinja templates `alias` command as in the example above.
More options can be found in the official docs for each respective generator:
* [PlantUML](https://plantuml.com/)
* [MermaidJS](https://mermaid.js.org/intro/)
## Adding debug information in the generated diagrams ## Adding debug information in the generated diagrams
Sometimes it is useful for debugging issues with the diagrams to have information on the exact source location, Sometimes it is useful for debugging issues with the diagrams to have information
from which given declaration or call expression was derived. By adding option: on the exact source location, from which given declaration or call expression was
derived. By adding option:
```yaml ```yaml
debug_mode: true debug_mode: true
``` ```
the generated PlantUML diagram will contain comments before each line containing the source location of the the generated PlantUML diagram will contain comments before each line containing
the source location of the
specific diagram element. specific diagram element.
## Resolving include path and compiler flags issues ## Resolving include path and compiler flags issues

View File

@ -54,7 +54,10 @@
* `plantuml` - verbatim PlantUML directives which should be added to a diagram * `plantuml` - verbatim PlantUML directives which should be added to a diagram
* `before` - list of directives which will be added before the generated diagram * `before` - list of directives which will be added before the generated diagram
* `after` - list of directives which will be added after the generated diagram * `after` - list of directives which will be added after the generated diagram
* `mermaid` - verbatim MermaidJS directives which should be added to a diagram
* `before` - list of directives which will be added before the generated diagram
* `after` - list of directives which will be added after the generated diagram
*
## Example complete config ## Example complete config
```yaml ```yaml
@ -138,6 +141,10 @@ diagrams:
# Add this line to the beginning of the resulting puml file # Add this line to the beginning of the resulting puml file
before: before:
- 'title clang-uml class diagram model' - 'title clang-uml class diagram model'
mermaid:
# Add this line at the end of a Mermaid diagram
end:
- 'direction LR'
``` ```
## Determining config file location ## Determining config file location

View File

@ -3,17 +3,19 @@
<!-- toc --> <!-- toc -->
* [PlantUML](#plantuml) * [PlantUML](#plantuml)
* [MermaidJS](#mermaidjs)
* [JSON](#json) * [JSON](#json)
<!-- tocstop --> <!-- tocstop -->
Currently, there are 2 types of diagram generators: `plantuml` and `json`. Currently, there are 3 types of diagram generators: `plantuml`, `mermaid`
and `json`.
To specify, which generators should be used on the command line use option `-g`. To specify, which generators should be used on the command line use option `-g`.
For instance to generate both types of diagrams run `clang-uml` as follows: For instance to generate both types of diagrams run `clang-uml` as follows:
```bash ```bash
clang-uml -g plantuml -g json clang-uml -g plantuml -g mermaid -g json
``` ```
By default, only `plantuml` diagrams are generated. By default, only `plantuml` diagrams are generated.
@ -92,6 +94,70 @@ __
The footer at the end is added by default, but can be disabled with The footer at the end is added by default, but can be disabled with
`--no-metadata` command line option. `--no-metadata` command line option.
## MermaidJS
This generator, creates UML diagrams in textual MermaidJS format, which can then
be used directly in some Markdown renderers (e.g. GitHub) or converted to
various image formats using [mermaid-cli](https://github.com/mermaid-js/mermaid-cli).
In case there is a need for adding custom MermaidJS directives to generated
diagrams, they can be included directly in the diagram configuration. For
example:
```yaml
mermaid:
before:
- direction LR
after:
- 'note for {{ alias("inheritable_diagram_options") }} "Options common to all diagram types."'
- 'note for {{ alias("config") }} "General options not used by diagrams."'
```
will add before the diagram contents (right after diagram type,
e.g. `classDiagram`) diagram direction hint, and after each diagram contents
2 notes attached to elements.
An example MermaidJS diagram is presented below:
```
classDiagram
class C_0001371951663534295727["A"]
class C_0001371951663534295727 {
+A() : [default] void
+A(int i) : void
+A(A &&) : [default] void
+A(const A &) : void
+A<T>(T t) : void
+~A() : [default] void
+operator=(A && other) : A &
+operator=(A & other) : A &
+operator++() : A &
+auto_method() : int
+basic_method() : void
+const_method() : [const] void
+create_from_int(int i) : A$
+default_int(int i = 12) : int
+default_string(int i, std::string s = "abc") : std::string
+double_int(const int i) : int
-private_method() : void
#protected_method() : void
+size() : [const,constexpr] std::size_t
+static_method() : int$
+sum(const double a, const double b) : int
-a_ : int
+auto_member : const unsigned long
-b_ : int
-c_ : int
#compare : std::function&lt;bool &lpar;const int&rpar;&gt;
-private_member : int
#protected_member : int
+public_member : int
+static_const_int : const int
+static_int : int
}
click C_0001371951663534295727 href "https://github.com/bkryza/clang-uml/blob/70e70888231938ba5310a8e0e28b9351beba21ef/tests/t00003/t00003.cc#L7" "A"
```
## JSON ## JSON
Generates a JSON representation of the intermediate `clang-uml` model, which Generates a JSON representation of the intermediate `clang-uml` model, which

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
docs/img/mermaid_nested.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 B

View File

@ -6,12 +6,14 @@
<!-- tocstop --> <!-- tocstop -->
`clang-uml` in combination with PlantUML's link generation in diagrams allows to generate interactive diagrams, `clang-uml` in combination with PlantUML's link generation in diagrams allows to
where clicking on any class, method or call expression can direct the user directly to the source code or some other generate interactive diagrams, where clicking on any class, method or call
expression can direct the user directly to the source code or some other
diagram or document available online. diagram or document available online.
For instance to generate links to GitHub repository directly for most of diagram elements simple add this to your For instance to generate links to GitHub repository directly for most diagram
`.clang-uml` file: elements simple add this to your `.clang-uml` file:
```yaml ```yaml
generate_links: generate_links:
link: 'https://github.com/myorg/myrepo/blob/{{ git.commit }}/{{ element.source.path }}#L{{ element.source.line }}' link: 'https://github.com/myorg/myrepo/blob/{{ git.commit }}/{{ element.source.path }}#L{{ element.source.line }}'

View File

@ -44,8 +44,14 @@ To add an initial class diagram to your project, follow these steps:
``` ```
4. Generate SVG images from the PlantUML diagrams: 4. Generate SVG images from the PlantUML diagrams:
```bash ```bash
plantuml -tsvg puml/*.puml plantuml -tsvg diagrams/*.puml
``` ```
or generate also MermaidJS diagram (requires [mermaid-cli](https://github.com/mermaid-js/mermaid-cli)):
```
clang-uml --progress -n some_class_diagram -g mermaid
mmdc -i diagrams/some_class_diagram.mmd -o diagrams/some_class_diagram.svg
```
5. Add another diagram: 5. Add another diagram:
```bash ```bash
clang-uml --add-sequence-diagram another_diagram clang-uml --add-sequence-diagram another_diagram