diff --git a/cypress/platform/knsv.html b/cypress/platform/knsv.html index 558de5f9d..33a1151d0 100644 --- a/cypress/platform/knsv.html +++ b/cypress/platform/knsv.html @@ -55,11 +55,11 @@ flowchart TD class T TestSub linkStyle 0,1 color:orange, stroke: orange; -
+
graph TD C -->|fa:fa-car Car| F[fa:fa-car Car]
-
+
flowchart TD C -->|fa:fa-car Car| F[fa:fa-car Car]
@@ -94,6 +94,13 @@ graph TD C -----> E4 C ======> E5
+
+sequenceDiagram + participant John + participant Alice + Alice->>John: Hello John, how are you? + John-->>Alice: Great! +
@@ -110,7 +117,7 @@ graph TD flowchart: { curve: 'cardinal', htmlLabels: true }, htmlLabels: true, // gantt: { axisFormat: '%m/%d/%Y' }, - sequence: { actorFontFamily: 'courier',actorMargin: 50, showSequenceNumbers: true }, + sequence: { showSequenceNumbers: true }, // sequenceDiagram: { actorMargin: 300 } // deprecated // fontFamily: '"arial", sans-serif', fontFamily: 'courier', diff --git a/src/defaultConfig.js b/src/defaultConfig.js index c43b2ffc9..d08ee459b 100644 --- a/src/defaultConfig.js +++ b/src/defaultConfig.js @@ -918,6 +918,7 @@ const config = { useMaxWidth: true }, gitGraph: { + diagramPadding: 8, nodeSpacing: 150, nodeFillColor: 'yellow', nodeStrokeWidth: 2, diff --git a/src/diagrams/git/gitGraphRenderer.js b/src/diagrams/git/gitGraphRenderer.js index 17b339e83..b7a737b68 100644 --- a/src/diagrams/git/gitGraphRenderer.js +++ b/src/diagrams/git/gitGraphRenderer.js @@ -1,10 +1,9 @@ import { curveBasis, line, select } from 'd3'; - +import { interpolateToCurve, getStylesFromArray, configureSvgSize } from '../../utils'; // import db from './gitGraphAst'; import * as db from './mockDb'; import gitGraphParser from './parser/gitGraph'; import { logger } from '../../logger'; -import { interpolateToCurve } from '../../utils'; import { getConfig } from '../../config'; /* eslint-disable */ @@ -37,251 +36,18 @@ function svgCreateDefs(svg) { .html(''); } -function svgDrawLine(svg, points, colorIdx, interpolate) { - const config = getConfig().gitGraph; - const curve = interpolateToCurve(interpolate, curveBasis); - const color = config.branchColors[colorIdx % config.branchColors.length]; - const lineGen = line() - .x(function(d) { - return Math.round(d.x); +const drawBranches = (svg, branches) => { + const g = svg.append('g') + let pos = 0; + branches.forEach((branch, index) => { + const line = g.append('line'); + line.attr('x1', 0); + line.attr('y1', pos); + line.attr('x2', 500); + line.attr('y2', pos); + line.attr('class', 'branch branch'+index) + pos += 50; }) - .y(function(d) { - return Math.round(d.y); - }) - .curve(curve); - - svg - .append('svg:path') - .attr('d', lineGen(points)) - .style('stroke', color) - .style('stroke-width', config.lineStrokeWidth) - .style('fill', 'none'); -} - -// Pass in the element and its pre-transform coords -function getElementCoords(element, coords) { - coords = coords || element.node().getBBox(); - const ctm = element.node().getCTM(); - const xn = ctm.e + coords.x * ctm.a; - const yn = ctm.f + coords.y * ctm.d; - return { - left: xn, - top: yn, - width: coords.width, - height: coords.height - }; -} - -function svgDrawLineForCommits(svg, fromId, toId, direction, color) { - const config = getConfig().gitGraph; - logger.debug('svgDrawLineForCommits: ', fromId, toId); - const fromBbox = getElementCoords(svg.select('#node-' + fromId + ' circle')); - const toBbox = getElementCoords(svg.select('#node-' + toId + ' circle')); - switch (direction) { - case 'LR': - // (toBbox) - // +-------- - // + (fromBbox) - if (fromBbox.left - toBbox.left > config.nodeSpacing) { - const lineStart = { - x: fromBbox.left - config.nodeSpacing, - y: toBbox.top + toBbox.height / 2 - }; - const lineEnd = { x: toBbox.left + toBbox.width, y: toBbox.top + toBbox.height / 2 }; - svgDrawLine(svg, [lineStart, lineEnd], color, 'linear'); - svgDrawLine( - svg, - [ - { x: fromBbox.left, y: fromBbox.top + fromBbox.height / 2 }, - { x: fromBbox.left - config.nodeSpacing / 2, y: fromBbox.top + fromBbox.height / 2 }, - { x: fromBbox.left - config.nodeSpacing / 2, y: lineStart.y }, - lineStart - ], - color - ); - } else { - svgDrawLine( - svg, - [ - { - x: fromBbox.left, - y: fromBbox.top + fromBbox.height / 2 - }, - { - x: fromBbox.left - config.nodeSpacing / 2, - y: fromBbox.top + fromBbox.height / 2 - }, - { - x: fromBbox.left - config.nodeSpacing / 2, - y: toBbox.top + toBbox.height / 2 - }, - { - x: toBbox.left + toBbox.width, - y: toBbox.top + toBbox.height / 2 - } - ], - color - ); - } - break; - case 'BT': - // + (fromBbox) - // | - // | - // + (toBbox) - if (toBbox.top - fromBbox.top > config.nodeSpacing) { - const lineStart = { - x: toBbox.left + toBbox.width / 2, - y: fromBbox.top + fromBbox.height + config.nodeSpacing - }; - const lineEnd = { x: toBbox.left + toBbox.width / 2, y: toBbox.top }; - svgDrawLine(svg, [lineStart, lineEnd], color, 'linear'); - svgDrawLine( - svg, - [ - { x: fromBbox.left + fromBbox.width / 2, y: fromBbox.top + fromBbox.height }, - { - x: fromBbox.left + fromBbox.width / 2, - y: fromBbox.top + fromBbox.height + config.nodeSpacing / 2 - }, - { x: toBbox.left + toBbox.width / 2, y: lineStart.y - config.nodeSpacing / 2 }, - lineStart - ], - color - ); - } else { - svgDrawLine( - svg, - [ - { - x: fromBbox.left + fromBbox.width / 2, - y: fromBbox.top + fromBbox.height - }, - { - x: fromBbox.left + fromBbox.width / 2, - y: fromBbox.top + config.nodeSpacing / 2 - }, - { - x: toBbox.left + toBbox.width / 2, - y: toBbox.top - config.nodeSpacing / 2 - }, - { - x: toBbox.left + toBbox.width / 2, - y: toBbox.top - } - ], - color - ); - } - break; - } -} - -function cloneNode(svg, selector) { - return svg - .select(selector) - .node() - .cloneNode(true); -} - -// function renderCommitHistory(svg, commitid, branches, direction) { -// const config = getConfig().gitGraph; -// let commit; -// const numCommits = Object.keys(allCommitsDict).length; -// if (typeof commitid === 'string') { -// do { -// commit = allCommitsDict[commitid]; -// logger.debug('in renderCommitHistory', commit.id, commit.seq); -// if (svg.select('#node-' + commitid).size() > 0) { -// return; -// } -// svg -// .append(function() { -// return cloneNode(svg, '#def-commit'); -// }) -// .attr('class', 'commit') -// .attr('id', function() { -// return 'node-' + commit.id; -// }) -// .attr('transform', function() { -// switch (direction) { -// case 'LR': -// return ( -// 'translate(' + -// (commit.seq * config.nodeSpacing + config.leftMargin) + -// ', ' + -// branchNum * config.branchOffset + -// ')' -// ); -// case 'BT': -// return ( -// 'translate(' + -// (branchNum * config.branchOffset + config.leftMargin) + -// ', ' + -// (numCommits - commit.seq) * config.nodeSpacing + -// ')' -// ); -// } -// }) -// .attr('fill', config.nodeFillColor) -// .attr('stroke', config.nodeStrokeColor) -// .attr('stroke-width', config.nodeStrokeWidth); - -// let branch; -// for (let branchName in branches) { -// if (branches[branchName].commit === commit) { -// branch = branches[branchName]; -// break; -// } -// } -// if (branch) { -// logger.debug('found branch ', branch.name); -// svg -// .select('#node-' + commit.id + ' p') -// .append('xhtml:span') -// .attr('class', 'branch-label') -// .text(branch.name + ', '); -// } -// svg -// .select('#node-' + commit.id + ' p') -// .append('xhtml:span') -// .attr('class', 'commit-id') -// .text(commit.id); -// if (commit.message !== '' && direction === 'BT') { -// svg -// .select('#node-' + commit.id + ' p') -// .append('xhtml:span') -// .attr('class', 'commit-msg') -// .text(', ' + commit.message); -// } -// commitid = commit.parent; -// } while (commitid && allCommitsDict[commitid]); -// } - -// if (Array.isArray(commitid)) { -// logger.debug('found merge commmit', commitid); -// renderCommitHistory(svg, commitid[0], branches, direction); -// branchNum++; -// renderCommitHistory(svg, commitid[1], branches, direction); -// branchNum--; -// } -// } - -function renderLines(svg, commit, direction, branchColor) { - branchColor = branchColor || 0; - while (commit.seq > 0 && !commit.lineDrawn) { - if (typeof commit.parent === 'string') { - svgDrawLineForCommits(svg, commit.id, commit.parent, direction, branchColor); - commit.lineDrawn = true; - commit = allCommitsDict[commit.parent]; - } else if (Array.isArray(commit.parent)) { - svgDrawLineForCommits(svg, commit.id, commit.parent[0], direction, branchColor); - svgDrawLineForCommits(svg, commit.id, commit.parent[1], direction, branchColor + 1); - renderLines(svg, allCommitsDict[commit.parent[1]], direction, branchColor + 1); - commit.lineDrawn = true; - commit = allCommitsDict[commit.parent[0]]; - } - } } export const draw = function(txt, id, ver) { @@ -297,28 +63,25 @@ export const draw = function(txt, id, ver) { // parser.parse(txt + '\n'); // config = Object.assign(config, apiConfig, db.getOptions()); - logger.debug('effective options', config); const direction = db.getDirection(); allCommitsDict = db.getCommits(); const branches = db.getBranchesAsObjArray(); + logger.debug('effective options', config, branches); - const svg = select(`[id="${id}"]`); - svgCreateDefs(svg); - branchNum = 1; - for (let branch in branches) { - const v = branches[branch]; - // renderCommitHistory(svg, v.commit.id, branches, direction); - renderLines(svg, v.commit, direction); - branchNum++; - } - svg.attr('height', function() { - if (direction === 'BT') return Object.keys(allCommitsDict).length * config.nodeSpacing; - return (branches.length + 1) * config.branchOffset; - }); - // } catch (e) { - // logger.error('Error while rendering gitgraph'); - // logger.error(e.message); - // } + const diagram = select(`[id="${id}"]`); + svgCreateDefs(diagram); + + drawBranches(diagram, branches); + + const padding = config.diagramPadding; + const svgBounds = diagram.node().getBBox(); + const width = svgBounds.width + padding * 2; + const height = svgBounds.height + padding * 2; + + configureSvgSize(diagram, height, width, config.useMaxWidth); + const vBox = `${svgBounds.x - padding} ${svgBounds.y - padding} ${width} ${height}`; + logger.debug(`viewBox ${vBox}`); + diagram.attr('viewBox', vBox); }; export default { diff --git a/src/diagrams/git/styles.js b/src/diagrams/git/styles.js index a76f61bb5..622e336fc 100644 --- a/src/diagrams/git/styles.js +++ b/src/diagrams/git/styles.js @@ -1,4 +1,4 @@ -const getStyles = () => +const getStyles = options => ` .commit-id, .commit-msg, @@ -8,6 +8,17 @@ const getStyles = () => font-family: 'trebuchet ms', verdana, arial; font-family: var(--mermaid-font-family); } + .branch { + stroke-width: 10; + } + .branch0 { stroke: ${options.fillType0}; } + .branch1 { stroke: ${options.fillType1}; } + .branch2 { stroke: ${options.fillType2}; } + .branch3 { stroke: ${options.fillType3}; } + .branch4 { stroke: ${options.fillType4}; } + .branch5 { stroke: ${options.fillType5}; } + .branch6 { stroke: ${options.fillType6}; } + .branch7 { stroke: ${options.fillType7}; } `; export default getStyles;