diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index 847a8bf242..14d911b176 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -65,7 +65,7 @@
block-beta - blockArrowId<["Label"]>(right) + blockArrowId<["`Label`"]>(right) blockArrowId2<["Label"]>(left) blockArrowId3<["Label"]>(up) blockArrowId4<["Label"]>(down) diff --git a/packages/mermaid/src/diagrams/block/blockDB.ts b/packages/mermaid/src/diagrams/block/blockDB.ts index 30f7e15748..5e5e82a270 100644 --- a/packages/mermaid/src/diagrams/block/blockDB.ts +++ b/packages/mermaid/src/diagrams/block/blockDB.ts @@ -1,5 +1,5 @@ import type { DiagramDB } from '../../diagram-api/types.js'; -import type { BlockConfig, BlockType, Block, Link, ClassDef } from './blockTypes.js'; +import type { BlockConfig, BlockType, Block, ClassDef } from './blockTypes.js'; import * as configApi from '../../config.js'; import { clear as commonClear } from '../common/commonDb.js'; import { log } from '../../logger.js'; @@ -240,11 +240,6 @@ const setHierarchy = (block: Block[]): void => { blocks = rootBlock.children; }; -const addLink = (link: Link): Link => { - links.push(link); - return link; -}; - const getColumns = (blockid: string): number => { const block = blockDatabase[blockid]; if (!block) { @@ -264,13 +259,6 @@ const getColumns = (blockid: string): number => { * @returns */ const getBlocksFlat = () => { - // const result: Block[] = []; - // // log.debug('abc88 getBlocksFlat', blockDatabase); - // const keys = Object.keys(blockDatabase); - // for (const key of keys) { - // result.push(blockDatabase[key]); - // } - // return result; return [...Object.values(blockDatabase)]; }; /** @@ -292,11 +280,8 @@ const setBlock = (block: Block) => { blockDatabase[block.id] = block; }; -const getLinks = () => links; - const getLogger = () => console; -// type IGetClasses = () => Record; /** * Return all of the style classes */ @@ -306,15 +291,13 @@ export const getClasses = function () { const db = { getConfig: () => configApi.getConfig().block, - addLink: addLink, typeStr2Type: typeStr2Type, edgeTypeStr2Type: edgeTypeStr2Type, edgeStrToEdgeData, - getLogger, // TODO: remove + getLogger, getBlocksFlat, getBlocks, getEdges, - getLinks, setHierarchy, getBlock, setBlock, diff --git a/packages/mermaid/src/diagrams/block/blockRenderer.ts b/packages/mermaid/src/diagrams/block/blockRenderer.ts index da7e56e547..219c628544 100644 --- a/packages/mermaid/src/diagrams/block/blockRenderer.ts +++ b/packages/mermaid/src/diagrams/block/blockRenderer.ts @@ -2,19 +2,17 @@ import type { Diagram } from '../../Diagram.js'; import * as configApi from '../../config.js'; import { calculateBlockSizes, insertBlocks, insertEdges } from './renderHelpers.js'; import { layout } from './layout.js'; -import { setupGraphViewbox } from '../../setupGraphViewbox.js'; +import type { MermaidConfig, BaseDiagramConfig } from '../../config.type.js'; import insertMarkers from '../../dagre-wrapper/markers.js'; import { select as d3select, scaleOrdinal as d3scaleOrdinal, schemeTableau10 as d3schemeTableau10, } from 'd3'; +import type { ContainerElement } from 'd3'; import { log } from '../../logger.js'; - import type { BlockDB } from './blockDB.js'; import type { Block } from './blockTypes.js'; - -// import { diagram as BlockDiagram } from './blockDiagram.js'; import { configureSvgSize } from '../../setupGraphViewbox.js'; /** @@ -34,7 +32,7 @@ export const draw = async function ( _version: string, diagObj: Diagram ): Promise { - const { securityLevel, flowchart: conf } = configApi.getConfig(); + const { securityLevel, block: conf } = configApi.getConfig(); const db = diagObj.db as BlockDB; let sandboxElement: any; if (securityLevel === 'sandbox') { @@ -65,7 +63,6 @@ export const draw = async function ( const nodes = svg.insert('g').attr('class', 'block'); await calculateBlockSizes(nodes, bl, db); const bounds = layout(db); - // log.debug('Here be blocks', bl); await insertBlocks(nodes, bl, db); await insertEdges(nodes, edges, blArr, db, id); @@ -80,32 +77,14 @@ export const draw = async function ( const magicFactor = Math.max(1, Math.round(0.125 * (bounds2.width / bounds2.height))); const height = bounds2.height + magicFactor + 10; const width = bounds2.width + 10; - const useMaxWidth = false; - configureSvgSize(svg, height, width, useMaxWidth); + const { useMaxWidth } = conf as Exclude ; + configureSvgSize(svg, height, width, !!useMaxWidth); log.debug('Here Bounds', bounds, bounds2); svg.attr( 'viewBox', `${bounds2.x - 5} ${bounds2.y - 5} ${bounds2.width + 10} ${bounds2.height + 10}` ); } - // svg.attr('viewBox', `${-200} ${-200} ${400} ${400}`); - - // Prepare data for construction based on diagObj.db - // This must be a mutable object with `nodes` and `links` properties: - // - // @ts-ignore TODO: db type - // const graph = diagObj.db.getGraph(); - - // const nodeWidth = 10; - - // Create rectangles for nodes - // const db:BlockDB = diagObj.db; - - interface LayedBlock extends Block { - children?: LayedBlock[]; - x?: number; - y?: number; - } // Get color scheme for the graph const colorScheme = d3scaleOrdinal(d3schemeTableau10); diff --git a/packages/mermaid/src/diagrams/block/blockTypes.ts b/packages/mermaid/src/diagrams/block/blockTypes.ts index 9524ef9d7d..16ae920abe 100644 --- a/packages/mermaid/src/diagrams/block/blockTypes.ts +++ b/packages/mermaid/src/diagrams/block/blockTypes.ts @@ -56,12 +56,7 @@ export interface Block { styleClass?: string; styles?: string[]; stylesStr?: string; - w?: number; -} - -export interface Link { - source: Block; - target: Block; + widthInColumns?: number; } export interface ClassDef { diff --git a/packages/mermaid/src/diagrams/block/layout.ts b/packages/mermaid/src/diagrams/block/layout.ts index 629d87083b..fa162a6da5 100644 --- a/packages/mermaid/src/diagrams/block/layout.ts +++ b/packages/mermaid/src/diagrams/block/layout.ts @@ -1,7 +1,8 @@ import type { BlockDB } from './blockDB.js'; import type { Block } from './blockTypes.js'; import { log } from '../../logger.js'; -const padding = 8; +import { getConfig } from '../../diagram-api/diagramAPI.js'; +const padding = getConfig()?.block?.padding || 8; interface BlockPosition { px: number; @@ -59,7 +60,7 @@ const getMaxChildSize = (block: Block) => { continue; } if (width > maxWidth) { - maxWidth = width / (block.w || 1); + maxWidth = width / (block.widthInColumns || 1); } if (height > maxHeight) { maxHeight = height; @@ -68,7 +69,7 @@ const getMaxChildSize = (block: Block) => { return { width: maxWidth, height: maxHeight }; }; -function setBlockSizes(block: Block, db: BlockDB, sieblingWidth = 0, sieblingHeight = 0) { +function setBlockSizes(block: Block, db: BlockDB, siblingWidth = 0, siblingHeight = 0) { log.debug( 'setBlockSizes abc95 (start)', block.id, @@ -76,18 +77,16 @@ function setBlockSizes(block: Block, db: BlockDB, sieblingWidth = 0, sieblingHei 'block width =', block?.size, 'sieblingWidth', - sieblingWidth + siblingWidth ); if (!block?.size?.width) { block.size = { - width: sieblingWidth, - height: sieblingHeight, + width: siblingWidth, + height: siblingHeight, x: 0, y: 0, }; } - const totalWidth = 0; - const totalHeight = 0; let maxWidth = 0; let maxHeight = 0; @@ -105,34 +104,21 @@ function setBlockSizes(block: Block, db: BlockDB, sieblingWidth = 0, sieblingHei for (const child of block.children) { if (child.size) { log.debug( - 'abc95 Setting size of children of', - block.id, - 'id=', - child.id, - maxWidth, - maxHeight, - child.size + `abc95 Setting size of children of ${block.id} id=${child.id} ${maxWidth} ${maxHeight} ${child.size}` ); - child.size.width = maxWidth * (child.w || 1) + padding * ((child.w || 1) - 1); + child.size.width = + maxWidth * (child.widthInColumns || 1) + padding * ((child.widthInColumns || 1) - 1); child.size.height = maxHeight; child.size.x = 0; child.size.y = 0; + log.debug( - 'abc95 updating size of ', - block.id, - ' children child:', - child.id, - 'maxWidth:', - maxWidth, - 'maxHeight:', - maxHeight + `abc95 updating size of ${block.id} children child:${child.id} maxWidth:${maxWidth} maxHeight:${maxHeight}` ); } } for (const child of block.children) { - // log.debug('abc95 fin 2 Setting size', child.id, maxWidth, maxHeight, child.size); setBlockSizes(child, db, maxWidth, maxHeight); - // log.debug('abc95 fin 3 Setting size', child.id, maxWidth, maxHeight, child.size); } const columns = block.columns || -1; @@ -144,28 +130,21 @@ function setBlockSizes(block: Block, db: BlockDB, sieblingWidth = 0, sieblingHei xSize = columns; } - const w = block.w || 1; + const w = block.widthInColumns || 1; const ySize = Math.ceil(numItems / xSize); let width = xSize * (maxWidth + padding) + padding; let height = ySize * (maxHeight + padding) + padding; // If maxWidth - if (width < sieblingWidth) { + if (width < siblingWidth) { log.debug( - 'Detected to small siebling: abc95', - block.id, - 'sieblingWidth', - sieblingWidth, - 'sieblingHeight', - sieblingHeight, - 'width', - width + `Detected to small siebling: abc95 ${block.id} sieblingWidth ${siblingWidth} sieblingHeight ${siblingHeight} width ${width}` ); - width = sieblingWidth; - height = sieblingHeight; - const childWidth = (sieblingWidth - xSize * padding - padding) / xSize; - const childHeight = (sieblingHeight - ySize * padding - padding) / ySize; + width = siblingWidth; + height = siblingHeight; + const childWidth = (siblingWidth - xSize * padding - padding) / xSize; + const childHeight = (siblingHeight - ySize * padding - padding) / ySize; log.debug('Size indata abc88', block.id, 'childWidth', childWidth, 'maxWidth', maxWidth); log.debug('Size indata abc88', block.id, 'childHeight', childHeight, 'maxHeight', maxHeight); log.debug('Size indata abc88 xSize', xSize, 'paddiong', padding); @@ -182,17 +161,9 @@ function setBlockSizes(block: Block, db: BlockDB, sieblingWidth = 0, sieblingHei } log.debug( - 'abc95 (finale calc)', - block.id, - 'xSize', - xSize, - 'ySize', - ySize, - 'columns', - columns, - block.children.length, - 'width=', - Math.max(width, block.size?.width || 0) + `abc95 (finale calc) ${block.id} xSize ${xSize} ySize ${ySize} columns ${columns}${ + block.children.length + } width=${Math.max(width, block.size?.width || 0)}` ); if (width < (block?.size?.width || 0)) { width = block?.size?.width || 0; @@ -229,14 +200,7 @@ function setBlockSizes(block: Block, db: BlockDB, sieblingWidth = 0, sieblingHei function layoutBlocks(block: Block, db: BlockDB) { log.debug( - 'abc85 layout blocks (=>layoutBlocks)', - block.id, - 'x:', - block?.size?.x, - 'y:', - block?.size?.y, - 'width:', - block?.size?.width + `abc85 layout blocks (=>layoutBlocks) ${block.id} x: ${block?.size?.x} y: ${block?.size?.y} width: ${block?.size?.width}` ); const columns = block.columns || -1; log.debug('layoutBlocks columns abc95', block.id, '=>', columns, block); @@ -268,56 +232,22 @@ function layoutBlocks(block: Block, db: BlockDB) { log.debug('New row in layout for block', block.id, ' and child ', child.id, rowPos); } log.debug( - 'abc89 layout blocks (child) id:', - child.id, - 'Pos:', - columnPos, - ' (px, py)', - px, - py, - ' (', - parent?.size?.x, - ',', - parent?.size?.y, - ')', - 'parent:', - parent.id, - 'width:', - width, - padding + `abc89 layout blocks (child) id: ${child.id} Pos: ${columnPos} (px, py) ${px},${py} (${parent?.size?.x},${parent?.size?.y}) parent: ${parent.id} width: ${width}${padding}` ); if (parent.size) { - // child.size.x = - // block.size.x - - // block.size.width / 2 + - // px * (child?.w || 1) * (width + padding) + - // width / 2 + - // padding; const halfWidth = width / 2; child.size.x = startingPosX + padding + halfWidth; log.debug( - 'abc91 layout blocks (calc) px, py', - 'id:', - child.id, - 'startingPosX', - startingPosX, - 'new startingPosX', - child.size.x + halfWidth, - 'padding', - padding, - 'width=', - width, - 'halfWidth', - halfWidth, - '=>', - 'x:', - child.size.x, - 'y:', - child.size.y, - child.w, - '(width * (child?.w || 1)) / 2', - (width * (child?.w || 1)) / 2 + `abc91 layout blocks (calc) px, pyid:${ + child.id + } startingPos=X${startingPosX} new startingPosX${ + child.size.x + } ${halfWidth} padding=${padding} width=${width} halfWidth=${halfWidth} => x:${ + child.size.x + } y:${child.size.y} ${child.widthInColumns} (width * (child?.w || 1)) / 2 ${ + (width * (child?.widthInColumns || 1)) / 2 + }` ); startingPosX = child.size.x + halfWidth; @@ -326,21 +256,11 @@ function layoutBlocks(block: Block, db: BlockDB) { parent.size.y - parent.size.height / 2 + py * (height + padding) + height / 2 + padding; log.debug( - 'abc88 layout blocks (calc) px, py', - 'id:', - child.id, - 'startingPosX', - startingPosX, - padding, - halfWidth, - '=>', - 'x:', - child.size.x, - 'y:', - child.size.y, - child.w, - '(width * (child?.w || 1)) / 2', - (width * (child?.w || 1)) / 2 + `abc88 layout blocks (calc) px, pyid:${ + child.id + }startingPosX${startingPosX}${padding}${halfWidth}=>x:${child.size.x}y:${child.size.y}${ + child.widthInColumns + }(width * (child?.w || 1)) / 2${(width * (child?.widthInColumns || 1)) / 2}` ); } @@ -348,19 +268,12 @@ function layoutBlocks(block: Block, db: BlockDB) { if (child.children) { layoutBlocks(child, db); } - columnPos += child?.w || 1; + columnPos += child?.widthInColumns || 1; log.debug('abc88 columnsPos', child, columnPos); } } log.debug( - 'layout blocks (<==layoutBlocks)', - block.id, - 'x:', - block?.size?.x, - 'y:', - block?.size?.y, - 'width:', - block?.size?.width + `layout blocks (<==layoutBlocks) ${block.id} x: ${block?.size?.x} y: ${block?.size?.y} width: ${block?.size?.width}` ); } diff --git a/packages/mermaid/src/diagrams/block/parser/block.jison b/packages/mermaid/src/diagrams/block/parser/block.jison index 751f8381be..b90aabceef 100644 --- a/packages/mermaid/src/diagrams/block/parser/block.jison +++ b/packages/mermaid/src/diagrams/block/parser/block.jison @@ -79,12 +79,7 @@ accDescr\s*":"\s* { this.pushState accDescr\s*"{"\s* { this.pushState("acc_descr_multiline");} [\}] { this.popState(); } [^\}]* return "acc_descr_multiline_value"; -"subgraph" return 'subgraph'; -"end"\b\s* return 'end'; -.*direction\s+TB[^\n]* return 'direction_tb'; -.*direction\s+BT[^\n]* return 'direction_bt'; -.*direction\s+RL[^\n]* return 'direction_rl'; -.*direction\s+LR[^\n]* return 'direction_lr'; + // Node end of shape "(((" { this.popState();yy.getLogger().debug('Lex: (('); return "NODE_DEND"; } diff --git a/packages/mermaid/src/diagrams/block/parser/block.spec.ts b/packages/mermaid/src/diagrams/block/parser/block.spec.ts index aec14cc08d..65338375aa 100644 --- a/packages/mermaid/src/diagrams/block/parser/block.spec.ts +++ b/packages/mermaid/src/diagrams/block/parser/block.spec.ts @@ -353,7 +353,7 @@ describe('Block diagram', function () { expect(blocks.length).toBe(2); const one = blocks[0]; const two = blocks[1]; - expect(two.w).toBe(2); + expect(two.widthInColumns).toBe(2); }); it('empty blocks', async () => { const str = `block-beta diff --git a/packages/mermaid/src/diagrams/block/renderHelpers.ts b/packages/mermaid/src/diagrams/block/renderHelpers.ts index 2215e9e3ec..db617a6d40 100644 --- a/packages/mermaid/src/diagrams/block/renderHelpers.ts +++ b/packages/mermaid/src/diagrams/block/renderHelpers.ts @@ -130,7 +130,11 @@ function getNodeFromBlock(block: Block, db: BlockDB, positioned = false) { return node; } type IOperation = (elem: any, block: any, db: any) => Promise ; -async function calculateBlockSize(elem: any, block: any, db: any) { +async function calculateBlockSize( + elem: d3.Selection , + block: any, + db: any +) { const node = getNodeFromBlock(block, db, false); if (node.type === 'group') { return; @@ -147,9 +151,6 @@ async function calculateBlockSize(elem: any, block: any, db: any) { export async function insertBlockPositioned(elem: any, block: Block, db: any) { const node = getNodeFromBlock(block, db, true); - // if (node.type === 'composite') { - // return; - // } // Add the element to the DOM to size it const obj = db.getBlock(node.id); if (obj.type !== 'space') { @@ -160,7 +161,7 @@ export async function insertBlockPositioned(elem: any, block: Block, db: any) { } export async function performOperations( - elem: ContainerElement, + elem: d3.Selection , blocks: Block[], db: BlockDB, operation: IOperation @@ -173,16 +174,20 @@ export async function performOperations( } } -export async function calculateBlockSizes(elem: ContainerElement, blocks: Block[], db: BlockDB) { +export async function calculateBlockSizes(elem: any, blocks: Block[], db: BlockDB) { await performOperations(elem, blocks, db, calculateBlockSize); } -export async function insertBlocks(elem: ContainerElement, blocks: Block[], db: BlockDB) { +export async function insertBlocks( + elem: d3.Selection , + blocks: Block[], + db: BlockDB +) { await performOperations(elem, blocks, db, insertBlockPositioned); } export async function insertEdges( - elem: ContainerElement, + elem: any, edges: Block[], blocks: Block[], db: BlockDB, @@ -214,9 +219,7 @@ export async function insertEdges( // elem, e, edge, clusterDb, diagramType, graph; if (edge.start && edge.end) { const startBlock = db.getBlock(edge.start); - const startBlock2 = g.node(edge.start); const endBlock = db.getBlock(edge.end); - const endBlock2 = g.node(edge.end); if (startBlock?.size && endBlock?.size) { const start = startBlock.size;