From cb675300b1cad095555c2ebfded81bf3f3f018dc Mon Sep 17 00:00:00 2001 From: chris moran Date: Thu, 23 Jul 2020 05:57:15 -0400 Subject: [PATCH] Directive support added to journey Fixed an issue in journey svgDraw.drawText expected an attribute (textMargin) but did not receive one and raised an error: attribute x: Expected length, "NaN". Added parseDirective to journeyDb --- cypress/integration/rendering/theme.spec.js | 4 +- src/diagrams/user-journey/journeyDb.js | 7 ++++ src/diagrams/user-journey/journeyRenderer.js | 3 +- .../user-journey/parser/journey.jison | 39 ++++++++++++++++++- src/styles.js | 1 + 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/cypress/integration/rendering/theme.spec.js b/cypress/integration/rendering/theme.spec.js index 72a73c35d..4e92c100d 100644 --- a/cypress/integration/rendering/theme.spec.js +++ b/cypress/integration/rendering/theme.spec.js @@ -224,6 +224,7 @@ erDiagram it('should render a user journey diagram', () => { imgSnapshotTest( ` + %%{init: { 'logLevel': 0, 'theme': '${theme}'} }%% journey title My working day section Go to work @@ -232,8 +233,7 @@ erDiagram Do work: 1: Me, Cat section Go home Go downstairs: 5: Me - Sit down: 5: Me `, - {theme} + Sit down: 5: Me ` ); cy.get('svg'); }); diff --git a/src/diagrams/user-journey/journeyDb.js b/src/diagrams/user-journey/journeyDb.js index ec7c23bab..6de0c5fad 100644 --- a/src/diagrams/user-journey/journeyDb.js +++ b/src/diagrams/user-journey/journeyDb.js @@ -1,3 +1,5 @@ +import mermaidAPI from '../../mermaidAPI'; + let title = ''; let currentSection = ''; @@ -5,6 +7,10 @@ const sections = []; const tasks = []; const rawTasks = []; +export const parseDirective = function(statement, context, type) { + mermaidAPI.parseDirective(statement, context, type); +}; + export const clear = function() { sections.length = 0; tasks.length = 0; @@ -111,6 +117,7 @@ const getActors = function() { }; export default { + parseDirective, clear, setTitle, getTitle, diff --git a/src/diagrams/user-journey/journeyRenderer.js b/src/diagrams/user-journey/journeyRenderer.js index 7ec69a228..e871a4693 100644 --- a/src/diagrams/user-journey/journeyRenderer.js +++ b/src/diagrams/user-journey/journeyRenderer.js @@ -70,7 +70,8 @@ function drawActorLegend(diagram) { x: 40, y: yPos + 7, fill: '#666', - text: person + text: person, + textMargin: conf.boxTextMargin | 5 }; svgDraw.drawText(diagram, labelData); diff --git a/src/diagrams/user-journey/parser/journey.jison b/src/diagrams/user-journey/parser/journey.jison index 0de6045aa..b312e5a56 100644 --- a/src/diagrams/user-journey/parser/journey.jison +++ b/src/diagrams/user-journey/parser/journey.jison @@ -5,12 +5,24 @@ */ %lex %options case-insensitive + +// Directive states +%x OPEN_DIRECTIVE +%x TYPE_DIRECTIVE +%x ARG_DIRECTIVE + %% +\%\%\{ { this.begin('OPEN_DIRECTIVE'); return 'open_directive'; } +((?:(?!\}\%\%)[^:.])*) { this.begin('TYPE_DIRECTIVE'); return 'type_directive'; } +":" { this.popState(); this.begin('ARG_DIRECTIVE'); return ':'; } +\}\%\% { this.popState(); this.popState(); return 'close_directive'; } +((?:(?!\}\%\%).|\n)*) return 'arg_directive'; +\%%(?!\{)[^\n]* /* skip comments */ +[^\}]\%\%[^\n]* /* skip comments */ [\n]+ return 'NL'; \s+ /* skip whitespace */ \#[^\n]* /* skip comments */ -\%%[^\n]* /* skip comments */ "journey" return 'journey'; "title"\s[^#\n;]+ return 'title'; @@ -31,6 +43,7 @@ start : journey document 'EOF' { return $2; } + | directive start ; document @@ -45,8 +58,32 @@ line | EOF { $$=[];} ; +directive + : openDirective typeDirective closeDirective 'NL' + | openDirective typeDirective ':' argDirective closeDirective 'NL' + ; + statement : title {yy.setTitle($1.substr(6));$$=$1.substr(6);} | section {yy.addSection($1.substr(8));$$=$1.substr(8);} | taskName taskData {yy.addTask($1, $2);$$='task';} + | directive ; + +openDirective + : open_directive { yy.parseDirective('%%{', 'open_directive'); } + ; + +typeDirective + : type_directive { yy.parseDirective($1, 'type_directive'); } + ; + +argDirective + : arg_directive { $1 = $1.trim().replace(/'/g, '"'); yy.parseDirective($1, 'arg_directive'); } + ; + +closeDirective + : close_directive { yy.parseDirective('}%%', 'close_directive', 'sequence'); } + ; + + diff --git a/src/styles.js b/src/styles.js index 06769dde6..20e5e84a8 100644 --- a/src/styles.js +++ b/src/styles.js @@ -16,6 +16,7 @@ const themes = { gantt, classDiagram, 'classDiagram-v2': classDiagram, + class: classDiagram, stateDiagram, state: stateDiagram, git,