mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-01-21 06:53:17 +08:00
114 lines
4.9 KiB
Markdown
114 lines
4.9 KiB
Markdown
> **Warning**
|
|
>
|
|
> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT.
|
|
>
|
|
> ## Please edit the corresponding file in [/packages/mermaid/src/docs/community/new-diagram.md](../../packages/mermaid/src/docs/community/new-diagram.md).
|
|
|
|
# Adding a New Diagram/Chart 📊
|
|
|
|
### Examples
|
|
|
|
Please refer to the following PRs on how to use Langium to add a new diagram grammar.
|
|
|
|
- <https://github.com/mermaid-js/mermaid/pull/4839>
|
|
- <https://github.com/mermaid-js/mermaid/pull/4751>
|
|
|
|
> **Warning**
|
|
> The below steps are a work in progress and will be updated soon.
|
|
|
|
### Step 1: Grammar & Parsing
|
|
|
|
### Step 2: Rendering
|
|
|
|
Write a renderer that given the data found during parsing renders the diagram. To look at an example look at sequenceRenderer.js rather than the flowchart renderer as this is a more generic example.
|
|
|
|
Place the renderer in the diagram folder.
|
|
|
|
### Step 3: Detection of the new diagram type
|
|
|
|
The second thing to do is to add the capability to detect the new diagram to type to the detectType in `diagram-api/detectType.ts`. The detection should return a key for the new diagram type.
|
|
[This key will be used to as the aria roledescription](#aria-roledescription), so it should be a word that clearly describes the diagram type.
|
|
For example, if your new diagram uses a UML deployment diagram, a good key would be "UMLDeploymentDiagram" because assistive technologies such as a screen reader
|
|
would voice that as "U-M-L Deployment diagram." Another good key would be "deploymentDiagram" because that would be voiced as "Deployment Diagram." A bad key would be "deployment" because that would not sufficiently describe the diagram.
|
|
|
|
Note that the diagram type key does not have to be the same as the diagram keyword chosen for the [grammar](#grammar), but it is helpful if they are the same.
|
|
|
|
### Common parts of a diagram
|
|
|
|
There are a few features that are common between the different types of diagrams. We try to standardize the diagrams that work as similar as possible for the end user. The commonalities are:
|
|
|
|
- Directives, a way of modifying the diagram configuration from within the diagram code.
|
|
- Accessibility, a way for an author to provide additional information like titles and descriptions to people accessing a text with diagrams using a screen reader.
|
|
- Themes, there is a common way to modify the styling of diagrams in Mermaid.
|
|
- Comments should follow mermaid standards
|
|
|
|
Here are some pointers on how to handle these different areas.
|
|
|
|
## Accessibility
|
|
|
|
Mermaid automatically adds the following accessibility information for the diagram SVG HTML element:
|
|
|
|
- aria-roledescription
|
|
- accessible title
|
|
- accessible description
|
|
|
|
### aria-roledescription
|
|
|
|
The aria-roledescription is automatically set to [the diagram type](#step-3--detection-of-the-new-diagram-type) and inserted into the SVG element.
|
|
|
|
See [the definition of aria-roledescription](https://www.w3.org/TR/wai-aria-1.1/#aria-roledescription) in [the Accessible Rich Internet Applications W3 standard.](https://www.w3.org/WAI/standards-guidelines/aria/)
|
|
|
|
### accessible title and description
|
|
|
|
The syntax for accessible titles and descriptions is described in [the Accessibility documentation section.](../config/accessibility.md)
|
|
|
|
The functions for setting title and description are provided by a common module. This is the import in flowDb.js:
|
|
|
|
```
|
|
import {
|
|
setAccTitle,
|
|
getAccTitle,
|
|
getAccDescription,
|
|
setAccDescription,
|
|
clear as commonClear,
|
|
} from '../../commonDb';
|
|
```
|
|
|
|
The accessibility title and description are inserted into the SVG element in the `render` function in mermaidAPI.
|
|
|
|
## Theming
|
|
|
|
Mermaid supports themes and has an integrated theming engine. You can read more about how the themes can be used [in the docs](../config/theming.md).
|
|
|
|
When adding themes to a diagram it comes down to a few important locations in the code.
|
|
|
|
The entry point for the styling engine is in **src/styles.js**. The getStyles function will be called by Mermaid when the styles are being applied to the diagram.
|
|
|
|
This function will in turn call a function _your diagram should provide_ returning the css for the new diagram. The diagram specific, also which is commonly also called getStyles and located in the folder for your diagram under src/diagrams and should be named styles.js. The getStyles function will be called with the theme options as an argument like in the following example:
|
|
|
|
```js
|
|
const getStyles = (options) =>
|
|
`
|
|
.line {
|
|
stroke-width: 1;
|
|
stroke: ${options.lineColor};
|
|
stroke-dasharray: 2;
|
|
}
|
|
// ...
|
|
`;
|
|
```
|
|
|
|
Note that you need to provide your function to the main getStyles by adding it into the themes object in **src/styles.js** like in the xyzDiagram in the provided example:
|
|
|
|
```js
|
|
const themes = {
|
|
flowchart,
|
|
'flowchart-v2': flowchart,
|
|
sequence,
|
|
xyzDiagram,
|
|
//...
|
|
};
|
|
```
|
|
|
|
The actual options and values for the colors are defined in **src/theme/theme-\[xyz].js**. If you provide the options your diagram needs in the existing theme files then the theming will work smoothly without hiccups.
|