From e0bd6842489844fffae8bc1fe83652dee26b48c1 Mon Sep 17 00:00:00 2001 From: Nikolay Rozhkov Date: Fri, 5 Jan 2024 18:02:13 +0300 Subject: [PATCH] Removed duplicated docs, keep community folder name --- docs/contributing/contributing.md | 512 ------------------ docs/contributing/img/er.png | Bin 56576 -> 0 bytes docs/contributing/intro.md | 60 -- docs/contributing/new-diagram.md | 217 -------- .../contributing/questions-and-suggestions.md | 25 - docs/contributing/security.md | 29 - 6 files changed, 843 deletions(-) delete mode 100644 docs/contributing/contributing.md delete mode 100644 docs/contributing/img/er.png delete mode 100644 docs/contributing/intro.md delete mode 100644 docs/contributing/new-diagram.md delete mode 100644 docs/contributing/questions-and-suggestions.md delete mode 100644 docs/contributing/security.md diff --git a/docs/contributing/contributing.md b/docs/contributing/contributing.md deleted file mode 100644 index a61f5311b..000000000 --- a/docs/contributing/contributing.md +++ /dev/null @@ -1,512 +0,0 @@ -> **Warning** -> -> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. -> -> ## Please edit the corresponding file in [/packages/mermaid/src/docs/contributing/contributing.md](../../packages/mermaid/src/docs/contributing/contributing.md). - -# Mermaid Contributing Guide - -You decided to take part in the development? Welcome! - -We were trying to make our guidelines for you as explicit and detailed as possible. - -## Initial Setup - -Initial setup consists of 3 main steps: - -```mermaid -flowchart LR - source --> requirements --> setup - - source[Get the Source Code] - requirements[Install the Requirements] - setup[Install Packages] -``` - -### Get the Source Code - -In GitHub, you first [**fork a mermaid repository**](https://github.com/mermaid-js/mermaid/fork) when you are going to make changes and submit pull requests. - -Then you **clone** a copy to your local development machine (e.g. where you code) to make a copy with all the files to work with. - -> **💡 Tip** > [Here is a GitHub document that gives an overview of the process](https://docs.github.com/en/get-started/quickstart/fork-a-repo). - -```bash -git clone git@github.com/your-fork/mermaid -``` - -Once you have cloned the repository onto your development machine, change into the `mermaid` project folder (the top level directory of the mermaid project repository) - -```bash -cd mermaid -``` - -### Install Requirements - -We support **development within Docker** environment along with **host setup**. You may choose it up to your preferences. - -**Host** - -These are the tools we use for working with the code and documentation: - -- [volta](https://volta.sh/) to manage node versions. -- [Node.js](https://nodejs.org/en/). `volta install node` -- [pnpm](https://pnpm.io/) package manager. `volta install pnpm` -- [npx](https://docs.npmjs.com/cli/v8/commands/npx) the packaged executor in npm. This is needed [to install pnpm.](#install-packages) - -**Docker** - -[Install Docker](https://docs.docker.com/engine/install/). And that is pretty much all you need. - -Optionally, to run GUI (Cypress) within Docker you will also need an X11 server installed. -You might already have it installed, so check this by running: - -```bash -echo $DISPLAY -``` - -If the `$DISPLAY` variable is not empty, then an X11 server is running. Otherwise you may need to install one. - -### Install Packages - -**Host** - -Run `npx pnpm install`. You will need `npx` for this because `volta` doesn't support it yet. - -```bash -npx pnpm install # npx is required for first install -``` - -**Docker** - -For development using Docker there is a self-documented `run` bash script, which provides convenient aliases for `docker compose` commands. - -Make sure that `./run` script is executable: - -```bash -chmod +x run -``` - -> **💡 Tip** -> To get detailed help simply type `./run` or `./run help`. -> -> It also has short _Development quick start guide_ embedded. - -```bash -./run pnpm install # Install packages -``` - -### Verify Everything Works - -This step is optional, but it helps to make sure that everything in development branch was OK before you started making any changes. - -You can run the `test` script to verify that pnpm is working _and_ that the repository has been cloned correctly: - -**Host** - -```bash -pnpm test -``` - -**Docker** - -```bash -./run pnpm test -``` - -The `test` script and others are in the top-level `package.json` file. - -All tests should run successfully without any errors or failures. - -> **Note** -> You might see _lint_ or _formatting_ warnings. Those are ok during this step. - -## Workflow - -Contributing process is very simple and strightforward: - -```mermaid - flowchart LR - - branch --> changes --> submit - branch[Checkout a New Branch] - changes[Make Changes] - submit[Submit a PR] -``` - -Mermaid uses a [Git Flow](https://guides.github.com/introduction/flow/)–inspired approach to branching. - -Development is done in the `develop` branch. - -```mermaid ---- -config: - gitGraph: - mainBranchName: develop ---- -gitGraph LR: - commit - commit - branch "docs/2910_update-guidelines" order: 1 - commit - commit - commit - checkout develop - merge "docs/2910_update-guidelines" - commit -``` - -To prepare a new version we create a `release/vX.X.X` branch from `develop` for testing. Once the release happens we add a tag to the `release` branch and merge it with `master`. The live product and on-line documentation are what is in the `master` branch. - -## Checkout a New Branch - -> **💡 Tip** -> All new work should be based on the `develop` branch. - -Make sure you have the most up-to-date version of the `develop` branch. - -Check out the `develop` branch, then `fetch` or `pull` to update it: - -```bash -git checkout develop -git fetch # or `git pull` -``` - -Create a new branch for your work: - -```bash -git checkout -b docs/2910_update-contributing-guidelines -``` - -We use the following naming convention for branches: - -```txt -[feature | bug | chore | docs]/[issue number]_[short-description] -``` - -You can always check current [configuration of labelling and branch prefixes](https://github.com/mermaid-js/mermaid/blob/develop/.github/pr-labeler.yml) - -- The first part is the **type** of change: a `feature`, `bug`, `chore`, `docs` -- followed by a **slash** (`/`),which helps to group like types together in many git tools -- followed by the **issue number**, e.g. `2910` -- followed by an **underscore** (`_`) -- followed by a **short description** with dashes (`-`) or underscores (`_`) instead of spaces - -```mermaid -flowchart LR - feature --> slash - bug --> slash - chore --> slash - docs --> slash - slash --> 2945 --> underscore - slash --> 1123 --> underscore - underscore --> short_description_1 - underscore --> short_description_2 - - underscore["_"] - slash["/"] - - short_description_1["state-diagram-new-arrow-florbs"] - short_description_2["fix_random_ugly_red_text"] -``` - -If your work is specific to a single diagram type, it is a good idea to put the diagram type at the start of the description. This will help us keep release notes organized by a diagram type. - -> **Note** -> A new feature described in issue 2945 that adds a new arrow type called 'florbs' to state diagrams -> -> `feature/2945_state-diagram-new-arrow-florbs` - -> **💡 Tip** -> A bug described in issue 1123 that causes random ugly red text in multiple diagram types -> -> `bug/1123_fix_random_ugly_red_text` - -## Contributing Code - -Code it the heart of every software project. We strive to make it better. Who if not us? - -### Where is the Code Located? - -The core of Mermaid is located under `packages/mermaid/src`. - -### Running Mermaid Locally - -**Host** - -```bash -npx pnpm run dev -``` - -**Docker** - -```bash -./run dev -``` - -After starting the dev server open in your browser. - -Now you are ready to make your changes! - -### Make Changes - -Have a look at . There is a list of demos that can be used to see and test your changes. - -If you need a specific diagram, you can duplicate the `example.html` file in `/demos/dev` and add your own mermaid code to your copy. - -That will be served at . -After making code changes, the dev server will rebuild the mermaid library. You will need to reload the browser page yourself to see the changes. (PRs for auto reload are welcome!) - -Edit files in `packages/mermaid/src` as required. - -### Write Tests - -Tests ensure that each function, module, or part of code does what it says it will do. This is critically important when other changes are made to ensure that existing code is not broken (no regression). - -Just as important, the tests act as _specifications:_ they specify what the code does (or should do). -Whenever someone is new to a section of code, they should be able to read the tests to get a thorough understanding of what it does and why. - -If you are fixing a bug, you should add tests to ensure that your code has actually fixed the bug, to specify/describe what the code is doing, and to ensure the bug doesn't happen again. -(If there had been a test for the situation, the bug never would have happened in the first place.) -You may need to change existing tests if they were inaccurate. - -If you are adding a feature, you will definitely need to add tests. Depending on the size of your feature, you may need to add integration tests. - -#### Unit Tests - -Unit tests are tests that test a single function or module. They are the easiest to write and the fastest to run. - -Unit tests are mandatory all code except the renderers. (The renderers are tested with integration tests.) - -We use [Vitest](https://vitest.dev) to run unit tests. - -**Host** - -You can use the following command to run the unit tests: - -```sh -pnpm test -``` - -When writing new tests, it's easier to have the tests automatically run as you make changes. You can do this by running the following command: - -```sh -pnpm test:watch -``` - -**Docker** - -When using Docker prepend your command with `./run`: - -```sh -./run pnpm test -``` - -#### Integration/End-to-End (e2e) tests - -These test the rendering and visual appearance of the diagrams. -This ensures that the rendering of that feature in the e2e will be reviewed in the release process going forward. Less chance that it breaks! - -To start working with the e2e tests: - -**Host** - -- Run `pnpm dev` to start the dev server -- Start **Cypress** by running `pnpm cypress:open` - -**Docker** - -- Enable local connections for x11 server `xhost +local:` -- Run `./run pnpm dev` to start the dev server -- Start **Cypress** by running `./run pnpm cypress:open --project .` - -The rendering tests are very straightforward to create. There is a function `imgSnapshotTest`, which takes a diagram in text form and the mermaid options, and it renders that diagram in Cypress. - -When running in CI it will take a snapshot of the rendered diagram and compare it with the snapshot from last build and flag it for review if it differs. - -This is what a rendering test looks like: - -```js -it('should render forks and joins', () => { - imgSnapshotTest( - ` - stateDiagram - state fork_state <<fork>> - [*] --> fork_state - fork_state --> State2 - fork_state --> State3 - - state join_state <<join>> - State2 --> join_state - State3 --> join_state - join_state --> State4 - State4 --> [*] - `, - { logLevel: 0 } - ); - cy.get('svg'); -}); -``` - - - - - -### Update Documentation - -> **💡 Tip** -> Our documentation is managed in `packages/mermaid/src/docs`. Details on how to edit is in the [documentation section](#contributing-documentation) - -If the users have no way to know that things have changed, then you haven't really _fixed_ anything for the users; you've just added to making Mermaid feel broken. -Likewise, if users don't know that there is a new feature that you've implemented, it will forever remain unknown and unused. - -The documentation has to be updated to users know that things have changed and added! -If you are adding a new feature, add `(v+)` in the title or description. It will be replaced automatically with the current version number when the release happens. - -eg: `# Feature Name (v+)` - -We know it can sometimes be hard to code _and_ write user documentation. - -Create another issue specifically for the documentation.\ -You will need to help with the PR, but definitely ask for help if you feel stuck. -When it feels hard to write stuff out, explaining it to someone and having that person ask you clarifying questions can often be 80% of the work! - -When in doubt, write up and submit what you can. It can be clarified and refined later. (With documentation, something is better than nothing!) - -## Contributing Documentation - -If it is not in the documentation, it's like it never happened. Wouldn't that be sad? With all the effort that was put into the feature? - -### Where is the Documentation Located? - -> **Warning** -> DO NOT CHANGE FILES IN `/docs` -> -> The `docs` folder will be automatically generated when committing to `packages/mermaid/src/docs` and **should not** be edited manually. - -Documentation is located in the [`packages/mermaid/src/docs`](https://github.com/mermaid-js/mermaid/tree/develop/packages/mermaid/src/docs) folder. Just pick the right section and start typing. - -The contents of [mermaid.js.org](https://mermaid.js.org/) are based on the docs from the `master` branch. Updates committed to the `master` branch are reflected in the [Mermaid Docs](https://mermaid.js.org/) once published. - -```mermaid-example -flowchart LR - classDef default fill:#fff,color:black,stroke:black - - source["Edit /packages/mermaid/src/docs"] -- automatic processing--> published["View /docs which will be publised on Official Website"] -``` - -```mermaid -flowchart LR - classDef default fill:#fff,color:black,stroke:black - - source["Edit /packages/mermaid/src/docs"] -- automatic processing--> published["View /docs which will be publised on Official Website"] -``` - -### Running the Documentation Website Locally - -**[The mermaid documentation site](https://mermaid.js.org/) is powered by [Vitepress](https://vitepress.vuejs.org/).** - -Start development server for the documentation site - -**Host** - -```bash -pnpm --filter mermaid run docs:dev -``` - -or - -```bash -cd packages/mermaid -pnpm docs:dev -``` - -**Docker** - -```bash -./run docs:dev -``` - -Open in your browser. - -### Formatting - -The documentation is written in Markdown. To get acquainted with its syntax [see the GitHub Markdown help page](https://help.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax). - -You can use `note`, `tip`, `warning` and `danger` in triple backticks to add a note, tip, warning or danger box. - -> **‼️ Danger** -> Do not use vitepress specific markdown syntax `::: warning` as it will not be processed correctly. - -Here are a few examples: - -````markdown -```note -This is a note -``` - -```tip -This is a tip -``` - -```warning -This is a warning -``` - -```danger -This is a danger alert -``` -```` - -> **Note** -> This is a note - -> **💡 Tip** -> This is a tip - -> **Warning** -> This is a warning - -> **‼️ Danger** -> This is a danger alert - -### Navigation - -If you want to propose changes to how the documentation is _organized_, such as adding a new section or re-arranging or renaming a section, you must update the **sidebar navigation**, which is defined in [the vitepress config](../.vitepress/config.ts). The same goes to **topbar**. - -### Build Docs - -The content of `/docs` folder is built with Github Actions. - -> **Warning** -> So as to allow automatic compilation of documentation pages you have to enable Github Actions on your fork first - -## Submit your pull request - -> **Note** -> Do not forget to push your changes -> -> ```bash -> git push -u origin docs/2910_update-guidelines -> ``` - -We make all changes via Pull Requests (PRs). Open a new one. - -Right now we are not following any strict rules about naming PRs. Give it a representative title and short description. There is also a [pull request template](https://github.com/mermaid-js/mermaid/blob/develop/.github/pull_request_template.md) which will help you with it. - -In case in its description contains a [magic comment](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) your PR will be automatically attached to the issue: - -```markdown -Resolves # -``` - -## Congratulations - -You have successfully submitted your improvements! What is next? - -- PRs will be reviewed by active maintainers, who will provide feedback and request changes as needed. -- The maintainers will request a review from _knsv_, if necessary. -- Once the PR is approved, the maintainers will merge the PR into the `develop` branch. -- When a release is ready, the `release/x.x.x` branch will be created, extensively tested and knsv will be in charge of the release process. - -Thanks for you help! diff --git a/docs/contributing/img/er.png b/docs/contributing/img/er.png deleted file mode 100644 index 21c44c257a3e0ee3e782dd5b6696602f6d9f5172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56576 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 **Warning** -> -> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. -> -> ## Please edit the corresponding file in [/packages/mermaid/src/docs/contributing/intro.md](../../packages/mermaid/src/docs/contributing/intro.md). - -# Getting Started - -So you want to help? That's great! - -![Image of happy people jumping with excitement](https://media.giphy.com/media/BlVnrxJgTGsUw/giphy.gif) - -Here are a few things to get you started on the right path. - -## How can I help? - -```mermaid -mindmap - root)Contributing( - Development - Solving issues - Adding new diagrams - Handling pull requests - Updating tooling - Testing - Verification of fixed issues - Regression testing in connection with releases - Testing pull requests - Management - Coordinating the work - Classification and monitoring of incoming issues -``` - -## Join the Development - -> **💡 Tip** > **Check out our** [**detailed contribution guide**](./contributing.md). - -Where to start: - -- You could start getting some knowledge of the code base by working on [these "good first issues"](https://github.com/mermaid-js/mermaid/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3A%22Good+first+issue%21%22+). -- You could jump right in and help us fix any of [these bugs](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Type%3A+Bug+%2F+Error%22++label%3A%22Contributor+needed%22+)! -- You could help write and [improve the documentation](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Area%3A+Documentation%22). -- You could work on a new feature! [These](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Area%3A+Development%22+label%3A%22Type%3A+Enhancement%22+label%3A%22Status%3A+Approved%22+) are some ideas! -- You could confirm the bugs in [these issues](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Status%3A+Triage%22++label%3A%22Type%3A+Bug+%2F+Error%22). - -[Join our slack community if you want closer contact!](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) - -## A Question Or a Suggestion? - -> **💡 Tip** > **Have a look at** [**how to open an issue**](./questions-and-suggestions.md). - -If you have faced a vulnerability [report it to us](./security.md). - -## Last Words - -Don't get daunted if it is hard in the beginning. We have a great community with only encouraging words. So, if you get stuck, ask for help and hints in the Slack forum. If you want to show off something good, show it off there. - -[Join our Slack community if you want closer contact!](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) - -![Image of superhero wishing you good luck](https://media.giphy.com/media/l49JHz7kJvl6MCj3G/giphy.gif) diff --git a/docs/contributing/new-diagram.md b/docs/contributing/new-diagram.md deleted file mode 100644 index 3f9f5f98e..000000000 --- a/docs/contributing/new-diagram.md +++ /dev/null @@ -1,217 +0,0 @@ -> **Warning** -> -> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. -> -> ## Please edit the corresponding file in [/packages/mermaid/src/docs/contributing/new-diagram.md](../../packages/mermaid/src/docs/contributing/new-diagram.md). - -# Adding a New Diagram/Chart 📊 - -### Step 1: Grammar & Parsing - -#### Grammar - -This would be to define a JISON grammar for the new diagram type. That should start with a way to identify that the text in the mermaid tag is a diagram of that type. Create a new folder under diagrams for your new diagram type and a parser folder in it. This leads us to step 2. - -For instance: - -- the flowchart starts with the keyword _graph_ -- the sequence diagram starts with the keyword _sequenceDiagram_ - -#### Store data found during parsing - -There are some jison specific sub steps here where the parser stores the data encountered when parsing the diagram, this data is later used by the renderer. You can during the parsing call an object provided to the parser by the user of the parser. This object can be called during parsing for storing data. - -```jison -statement - : 'participant' actor { $$='actor'; } - | signal { $$='signal'; } - | note_statement { $$='note'; } - | 'title' message { yy.setTitle($2); } - ; -``` - -In the extract of the grammar above, it is defined that a call to the setTitle method in the data object will be done when parsing and the title keyword is encountered. - -> **Note** -> Make sure that the `parseError` function for the parser is defined and calling `mermaid.parseError`. This way a common way of detecting parse errors is provided for the end-user. - -For more info look at the example diagram type: - -The `yy` object has the following function: - -```javascript -exports.parseError = function (err, hash) { - mermaid.parseError(err, hash); -}; -``` - -when parsing the `yy` object is initialized as per below: - -```javascript -const parser = exampleParser.parser; -parser.yy = db; -``` - -### 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. - -### Step 4: The final piece - triggering the rendering - -At this point when mermaid is trying to render the diagram, it will detect it as being of the new type but there will be no match when trying to render the diagram. To fix this add a new case in the switch statement in main.js:init this should match the diagram type returned from step #2. The code in this new case statement should call the renderer for the diagram type with the data found by the parser as an argument. - -## Usage of the parser as a separate module - -### Setup - -```javascript -const graph = require('./graphDb'); -const flow = require('./parser/flow'); -flow.parser.yy = graph; -``` - -### Parsing - -```javascript -flow.parser.parse(text); -``` - -### Data extraction - -```javascript -graph.getDirection(); -graph.getVertices(); -graph.getEdges(); -``` - -The parser is also exposed in the mermaid api by calling: - -```javascript -const parser = mermaid.getParser(); -``` - -Note that the parse needs a graph object to store the data as per: - -```javascript -flow.parser.yy = graph; -``` - -Look at `graphDb.js` for more details on that object. - -## Layout - -If you are using a dagre based layout, please use flowchart-v2 as a template and by doing that you will be using dagre-wrapper instead of dagreD3 which we are migrating away from. - -### 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) - -As a design goal, the jison syntax should be similar between the diagrams. - -```jison - -* lexical grammar */ -%lex -%x acc_title -%x acc_descr -%x acc_descr_multiline - -%% -accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } -(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } -accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } -(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } -accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} -[\}] { this.popState(); } -[^\}]* return "acc_descr_multiline_value"; - -statement - : acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } - | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } - | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } - -``` - -The functions for setting title and description are provided by a common module. This is the import from 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. diff --git a/docs/contributing/questions-and-suggestions.md b/docs/contributing/questions-and-suggestions.md deleted file mode 100644 index ebe85b417..000000000 --- a/docs/contributing/questions-and-suggestions.md +++ /dev/null @@ -1,25 +0,0 @@ -> **Warning** -> -> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. -> -> ## Please edit the corresponding file in [/packages/mermaid/src/docs/contributing/questions-and-suggestions.md](../../packages/mermaid/src/docs/contributing/questions-and-suggestions.md). - -# Questions or Suggestions? - -## Search for Existing Issue - -First search to see if someone has already asked (and hopefully been answered) or suggested the same thing. - -- [Search in Discussions](https://github.com/orgs/mermaid-js/discussions) -- [Search in Issues (Open & Closed)](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue) - -If you find an open issue or discussion thread that is similar to your question but isn't answered, you can let us know that you are also interested in it. -Use the GitHub reactions to add a thumbs-up to the issue or discussion thread, or append to the issue if needed. - -This helps the team know the relative interest in something and helps them set priorities and assignments. - -## Add a new Issue - -You have not found anything that already addresses your request, or maybe you have come up with the new idea? Feel free to open a new issue or discussion. - -Log in to [GitHub.com](https://www.github.com), and use [GitHub issue tracker of the mermaid-js repository](https://github.com/mermaid-js/mermaid/issues). Press \[] issue, select the appropriate template and describe your problem. diff --git a/docs/contributing/security.md b/docs/contributing/security.md deleted file mode 100644 index a8ab8e707..000000000 --- a/docs/contributing/security.md +++ /dev/null @@ -1,29 +0,0 @@ -> **Warning** -> -> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. -> -> ## Please edit the corresponding file in [/packages/mermaid/src/docs/contributing/security.md](../../packages/mermaid/src/docs/contributing/security.md). - -# Security - -The Mermaid team takes the security of Mermaid and the applications that use Mermaid seriously. This page describes how to report any vulnerabilities you may find, and lists best practices to minimize the risk of introducing a vulnerability. - -## Reporting vulnerabilities - -To report a vulnerability, please e-mail with a description of the issue, the steps you took to create the issue, affected versions, and if known, mitigations for the issue. - -We aim to reply within three working days, probably much sooner. - -You should expect a close collaboration as we work to resolve the issue you have reported. Please reach out to again if you do not receive prompt attention and regular updates. - -You may also reach out to the team via our public Slack chat channels; however, please make sure to e-mail when reporting an issue, and avoid revealing information about vulnerabilities in public as that could that could put users at risk. - -## Best practices - -Keep current with the latest Mermaid releases. We regularly update Mermaid, and these updates may fix security defects discovered in previous versions. Check the Mermaid release notes for security-related updates. - -Keep your application’s dependencies up to date. Make sure you upgrade your package dependencies to keep the dependencies up to date. Avoid pinning to specific versions for your dependencies and, if you do, make sure you check periodically to see if your dependencies have had security updates, and update the pin accordingly. - -## Configuring DomPurify - -By default Mermaid uses a baseline [DOMPurify](https://github.com/cure53/DOMPurify) config. It is possible to override the options passed to DOMPurify by adding a `dompurifyConfig` key to the Mermaid options. This could potentially break the output of Mermaid so use this with caution.