From 98f37d64eaa91ba34473a1bda6440d3c269f50a3 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Fri, 2 Sep 2022 12:45:22 +0200 Subject: [PATCH 1/5] #3395 Fix for lopp stopping at first failure --- src/mermaid.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/mermaid.js b/src/mermaid.js index 3d20922530f..4399fc07006 100644 --- a/src/mermaid.js +++ b/src/mermaid.js @@ -35,9 +35,6 @@ const init = function () { } catch (e) { log.warn('Syntax Error rendering'); log.warn(e.str); - if (this.parseError) { - this.parseError(e); - } } }; @@ -93,8 +90,10 @@ const initThrowsErrors = function () { const idGenerator = new utils.initIdGenerator(conf.deterministicIds, conf.deterministicIDSeed); let txt; + const errors = []; for (let i = 0; i < nodes.length; i++) { + log.info('Rendering diagram: ' + nodes[i].id, i); // element is the current div with mermaid class const element = nodes[i]; @@ -134,10 +133,16 @@ const initThrowsErrors = function () { element ); } catch (error) { - log.warn('Catching Error (bootstrap)'); - throw { error, message: error.str }; + log.warn('Catching Error (bootstrap)', error); + if (typeof mermaid.parseError === 'function') { + mermaid.parseError({ error, str: error.str, hash: error.hash, message: error.str }); + } + errors.push({ error, str: error.str, hash: error.hash, message: error.str }); } } + if (errors.length > 0) { + throw errors[0]; + } }; const initialize = function (config) { From 5584fef1b0d53611348269cd568f69a37db9cb7d Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Fri, 2 Sep 2022 14:05:31 +0200 Subject: [PATCH 2/5] #3395 Renabling the error graph which is rendered on error --- cypress/platform/knsv.html | 41 +++++++++++++++++++++-- src/diagram-api/detectType.js | 3 ++ src/diagram-api/diagramAPI.js | 8 +++++ src/{ => diagrams/error}/errorRenderer.js | 13 +++---- src/diagrams/error/styles.js | 3 ++ src/mermaidAPI.js | 15 +++++++-- src/styles.js | 2 ++ 7 files changed, 74 insertions(+), 11 deletions(-) rename src/{ => diagrams/error}/errorRenderer.js (93%) create mode 100644 src/diagrams/error/styles.js diff --git a/cypress/platform/knsv.html b/cypress/platform/knsv.html index f568c9a5da6..75f8ff34652 100644 --- a/cypress/platform/knsv.html +++ b/cypress/platform/knsv.html @@ -35,8 +35,14 @@ - - +
+flowchart LR + a --- +
+
+flowchart LR + a2 --- +
flowchart LR classDef aPID stroke:#4e4403,fill:#fdde29,color:#4e4403,rx:5px,ry:5px; @@ -73,7 +79,31 @@
flowchart TD -id + + release-branch[Create Release Branch]:::relClass + develop-branch[Update Develop Branch]:::relClass + github-release-draft[GitHub Release Draft]:::relClass + trigger-pipeline[Trigger Jenkins pipeline]:::fixClass + github-release[GitHub Release]:::postClass + + build-ready --> release-branch + build-ready --> develop-branch + release-branch --> jenkins-release-build + jenkins-release-build --> github-release-draft + jenkins-release-build --> install-release + install-release --> verify-release + jenkins-release-build --> announce + github-release-draft --> github-release + verify-release --> verify-check + verify-check -- Yes --> github-release + verify-check -- No --> release-fix + release-fix --> release-branch-pr + verify-check -- No --> delete-artifacts + release-branch-pr --> trigger-pipeline + delete-artifacts --> trigger-pipeline + trigger-pipeline --> jenkins-release-build + +
flowchart LR @@ -356,6 +386,11 @@ document.getElementsByTagName('body')[0].appendChild(div); } + +mermaid.parseError = function (err, hash) { + console.error('In parse error:'); + console.error(err); +}; diff --git a/src/diagram-api/detectType.js b/src/diagram-api/detectType.js index a5f074e3e15..63dddffb85f 100644 --- a/src/diagram-api/detectType.js +++ b/src/diagram-api/detectType.js @@ -31,6 +31,9 @@ const detectType = function (text, cnf) { return 'c4'; } + if (text === 'error') { + return 'error'; + } if (text.match(/^\s*sequenceDiagram/)) { return 'sequence'; } diff --git a/src/diagram-api/diagramAPI.js b/src/diagram-api/diagramAPI.js index 62c8843682f..d47bb8c59b2 100644 --- a/src/diagram-api/diagramAPI.js +++ b/src/diagram-api/diagramAPI.js @@ -7,6 +7,7 @@ import classRendererV2 from '../diagrams/class/classRenderer-v2'; import classParser from '../diagrams/class/parser/classDiagram'; import erDb from '../diagrams/er/erDb'; import erRenderer from '../diagrams/er/erRenderer'; +import errorRenderer from '../diagrams/error/errorRenderer'; import erParser from '../diagrams/er/parser/erDiagram'; import flowDb from '../diagrams/flowchart/flowDb'; import flowRenderer from '../diagrams/flowchart/flowRenderer'; @@ -54,6 +55,13 @@ const diagrams = { classDb.clear(); }, }, + // Special diagram with error messages but setup as a regular diagram + error: { + db: {}, + renderer: errorRenderer, + parser: { parser: { yy: {} }, parse: () => {} }, + init: () => {}, + }, classDiagram: { db: classDb, renderer: classRendererV2, diff --git a/src/errorRenderer.js b/src/diagrams/error/errorRenderer.js similarity index 93% rename from src/errorRenderer.js rename to src/diagrams/error/errorRenderer.js index 28a9579ad00..82f71fcde41 100644 --- a/src/errorRenderer.js +++ b/src/diagrams/error/errorRenderer.js @@ -1,6 +1,6 @@ /** Created by knut on 14-12-11. */ import { select } from 'd3'; -import { log } from './logger'; +import { log } from '../../logger'; const conf = {}; @@ -20,10 +20,11 @@ export const setConf = function (cnf) { /** * Draws a an info picture in the tag with id: id based on the graph definition in text. * + * @param _txt * @param {string} id The text for the error * @param {string} ver The version */ -export const draw = (id, ver) => { +export const draw = (_txt, id, ver) => { try { log.debug('Renering svg for syntax error\n'); @@ -75,22 +76,22 @@ export const draw = (id, ver) => { g.append('text') // text label for the x axis .attr('class', 'error-text') - .attr('x', 1240) + .attr('x', 1440) .attr('y', 250) .attr('font-size', '150px') .style('text-anchor', 'middle') .text('Syntax error in graph'); g.append('text') // text label for the x axis .attr('class', 'error-text') - .attr('x', 1050) + .attr('x', 1250) .attr('y', 400) .attr('font-size', '100px') .style('text-anchor', 'middle') .text('mermaid version ' + ver); svg.attr('height', 100); - svg.attr('width', 400); - svg.attr('viewBox', '768 0 512 512'); + svg.attr('width', 500); + svg.attr('viewBox', '768 0 912 512'); } catch (e) { log.error('Error while rendering info diagram'); log.error(e.message); diff --git a/src/diagrams/error/styles.js b/src/diagrams/error/styles.js new file mode 100644 index 00000000000..0b0729813df --- /dev/null +++ b/src/diagrams/error/styles.js @@ -0,0 +1,3 @@ +const getStyles = () => ``; + +export default getStyles; diff --git a/src/mermaidAPI.js b/src/mermaidAPI.js index 2d25d1f58d6..016fbde1cf3 100644 --- a/src/mermaidAPI.js +++ b/src/mermaidAPI.js @@ -31,7 +31,7 @@ import stateRenderer from './diagrams/state/stateRenderer'; import stateRendererV2 from './diagrams/state/stateRenderer-v2'; import journeyRenderer from './diagrams/user-journey/journeyRenderer'; import Diagram from './Diagram'; -import errorRenderer from './errorRenderer'; +import errorRenderer from './diagrams/error/errorRenderer'; import { attachFunctions } from './interactionDb'; import { log, setLogLevel } from './logger'; import getStyles from './styles'; @@ -259,7 +259,14 @@ const render = function (id, _txt, cb, container) { txt = encodeEntities(txt); // Important that we do not create the diagram until after the directives have been included - const diag = new Diagram(txt); + let diag; + let parseEncounteredException; + try { + diag = new Diagram(txt); + } catch (error) { + diag = new Diagram('error'); + parseEncounteredException = error; + } // Get the tmp element containing the the svg const element = root.select('#d' + id).node(); const graphType = diag.type; @@ -404,6 +411,10 @@ const render = function (id, _txt, cb, container) { select(tmpElementSelector).node().remove(); } + if (parseEncounteredException) { + throw parseEncounteredException; + } + return svgCode; }; diff --git a/src/styles.js b/src/styles.js index 15e804ef981..db8e3efe52e 100644 --- a/src/styles.js +++ b/src/styles.js @@ -1,5 +1,6 @@ import classDiagram from './diagrams/class/styles'; import er from './diagrams/er/styles'; +import error from './diagrams/error/styles'; import flowchart from './diagrams/flowchart/styles'; import gantt from './diagrams/gantt/styles'; import gitGraph from './diagrams/git/styles'; @@ -26,6 +27,7 @@ const themes = { info, pie, er, + error, journey, requirement, c4, From 0f56c9a85dbb098870f7e08fd94344278d240660 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Fri, 9 Sep 2022 13:37:37 +0200 Subject: [PATCH 3/5] Fix for issue #3428, load the configured diagrams even when initialize has not been called. --- package.json | 4 ++-- src/mermaidAPI.js | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1efc62c51b7..4cf174f3b2a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mermaid", - "version": "9.1.6", + "version": "9.1.7", "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", "main": "dist/mermaid.min.js", "module": "dist/mermaid.esm.min.mjs", @@ -122,4 +122,4 @@ "**/*.css", "**/*.scss" ] -} \ No newline at end of file +} diff --git a/src/mermaidAPI.js b/src/mermaidAPI.js index 016fbde1cf3..fab424d2678 100644 --- a/src/mermaidAPI.js +++ b/src/mermaidAPI.js @@ -146,6 +146,10 @@ export const decodeEntities = function (text) { * @returns {any} */ const render = function (id, _txt, cb, container) { + if (!hasLoadedDiagrams) { + addDiagrams(); + hasLoadedDiagrams = true; + } configApi.reset(); let txt = _txt.replace(/\r\n?/g, '\n'); // parser problems on CRLF ignore all CR and leave LF;; const graphInit = utils.detectInit(txt); From 50da58afe012089ace25d037faf775561238c65c Mon Sep 17 00:00:00 2001 From: ashishj Date: Tue, 13 Sep 2022 19:18:12 +0200 Subject: [PATCH 4/5] Fix for broken rendering test --- src/diagrams/git/gitGraphRenderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diagrams/git/gitGraphRenderer.js b/src/diagrams/git/gitGraphRenderer.js index 6eb542ce8bd..88404a7c2cc 100644 --- a/src/diagrams/git/gitGraphRenderer.js +++ b/src/diagrams/git/gitGraphRenderer.js @@ -92,7 +92,7 @@ const drawCommits = (svg, commits, modifyGraph) => { if (modifyGraph) { let typeClass; let commitSymbolType = - typeof commit.customType !== 'undefined' ? commit.customType : commit.type; + typeof commit.customType !== 'undefined' && commit.customType !=='' ? commit.customType : commit.type; switch (commitSymbolType) { case commitType.NORMAL: typeClass = 'commit-normal'; From 0c0468123fa1ca08baf69716eeca0b8872075b5e Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Tue, 13 Sep 2022 19:55:34 +0200 Subject: [PATCH 5/5] Release 9.1.7 --- docs/index.html | 2 +- src/diagrams/git/gitGraphRenderer.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/index.html b/docs/index.html index 02c01d95434..b2adfb33568 100644 --- a/docs/index.html +++ b/docs/index.html @@ -18,7 +18,7 @@ - +