diff --git a/cypress/integration/rendering/block.spec.ts b/cypress/integration/rendering/block.spec.ts index 7856f534d..51d78444f 100644 --- a/cypress/integration/rendering/block.spec.ts +++ b/cypress/integration/rendering/block.spec.ts @@ -313,7 +313,7 @@ describe('Block diagram', () => { ); }); - it('BL23: sizing - it should be possieble to make a composite block wider', () => { + it('BL23: sizing - it should be possible to make a composite block wider', () => { imgSnapshotTest( `block-beta block:2 @@ -325,13 +325,61 @@ describe('Block diagram', () => { ); }); - it('BL23: sizing - it should be possieble to make a composite block wider', () => { + it('BL24: block in the middle with space on each side', () => { imgSnapshotTest( `block-beta - block:2 - A - end - B + columns 3 + space + middle["In the middle"] + space + `, + {} + ); + }); + it('BL25: space and an edge', () => { + imgSnapshotTest( + `block-beta + columns 5 + A space B + A --x B + `, + {} + ); + }); + it('BL26: block sizes for regular blocks', () => { + imgSnapshotTest( + `block-beta + columns 3 + a["A wide one"] b:2 c:2 d + `, + {} + ); + }); + it('BL27: composite block with a set width - f should use the available space', () => { + imgSnapshotTest( + `block-beta + columns 3 + a:3 + block:e:3 + f + end + g + `, + {} + ); + }); + it('BL23: composite block with a set width - f and g should split the available space', () => { + imgSnapshotTest( + `block-beta + columns 3 + a:3 + block:e:3 + f + g + end + h + i + j `, {} ); diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index b2af1f5f9..67776fe1b 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -65,10 +65,9 @@
block-beta - columns 3 - block1["Block 1"] - blockArrow<[" "]>(right) - block2["Block 2"] +columns 1 + B["A wide one in the middle"] + style B fill:#f9F,stroke:#333,stroke-width:4px
block-beta @@ -96,7 +95,7 @@ block-beta end g-
+block-beta columns 3 a:3 diff --git a/packages/mermaid/src/diagrams/block/blockDB.ts b/packages/mermaid/src/diagrams/block/blockDB.ts index 7e7bd7528..34d2b5d10 100644 --- a/packages/mermaid/src/diagrams/block/blockDB.ts +++ b/packages/mermaid/src/diagrams/block/blockDB.ts @@ -136,8 +136,11 @@ const populateBlockDatabase = (_blockList: Block[], parent: Block): void => { continue; } if (block.type === 'applyStyles') { - addStyle2Node(block.id, block?.styles); - continue; + console.log('applyStyles', block.stylesStr); + if (block?.stylesStr) { + addStyle2Node(block.id, block?.stylesStr); + continue; + } } if (block.type === 'column-setting') { parent.columns = block.columns || -1; @@ -289,7 +292,7 @@ export const generateId = () => { type ISetHierarchy = (block: Block[]) => void; const setHierarchy = (block: Block[]): void => { - log.debug('The document from parsing', JSON.stringify(block, null, 2)); + console.log('The document from parsing', JSON.stringify(block, null, 2)); rootBlock.children = block; populateBlockDatabase(block, rootBlock); // log.debug('abc95 The document after popuplation', JSON.stringify(rootBlock, null, 2)); diff --git a/packages/mermaid/src/diagrams/block/blockTypes.ts b/packages/mermaid/src/diagrams/block/blockTypes.ts index d2fd8d122..7bbba93b8 100644 --- a/packages/mermaid/src/diagrams/block/blockTypes.ts +++ b/packages/mermaid/src/diagrams/block/blockTypes.ts @@ -59,6 +59,7 @@ export interface Block { css?: string; styleClass?: string; styles?: string[]; + stylesStr?: string; w?: number; } diff --git a/packages/mermaid/src/diagrams/block/parser/block.jison b/packages/mermaid/src/diagrams/block/parser/block.jison index 066b7be0f..751f8381b 100644 --- a/packages/mermaid/src/diagrams/block/parser/block.jison +++ b/packages/mermaid/src/diagrams/block/parser/block.jison @@ -288,7 +288,7 @@ cssClassStatement styleStatement : style STYLE_ENTITY_IDS STYLE_DEFINITION_DATA { - $$={ type: 'applyStyles', id: $2.trim(), styles: $3.trim() }; + $$={ type: 'applyStyles', id: $2.trim(), stylesStr: $3.trim() }; } ; diff --git a/packages/mermaid/src/diagrams/block/parser/block.spec.ts b/packages/mermaid/src/diagrams/block/parser/block.spec.ts index 367edb842..3028a6c3c 100644 --- a/packages/mermaid/src/diagrams/block/parser/block.spec.ts +++ b/packages/mermaid/src/diagrams/block/parser/block.spec.ts @@ -4,6 +4,7 @@ import db from '../blockDB.js'; import { cleanupComments } from '../../../diagram-api/comments.js'; import { prepareTextForParsing } from '../blockUtils.js'; import { setConfig } from '../../../config.js'; +import getStyles from '../../../../dist/diagrams/pie/styles'; describe('Block diagram', function () { describe('when parsing an block diagram graph it should handle > ', function () { @@ -88,12 +89,34 @@ describe('Block diagram', function () { expect(blocks[1].label).toBe('id2'); expect(blocks[1].type).toBe('na'); }); - it('a diagram with multiple nodes with edges', async () => { + it('a diagram with multiple nodes with edges abc123', async () => { const str = `block-beta id1["first"] --> id2["second"] `; block.parse(str); + const blocks = db.getBlocks(); + const edges = db.getEdges(); + expect(blocks.length).toBe(2); + expect(edges.length).toBe(1); + expect(edges[0].start).toBe('id1'); + expect(edges[0].end).toBe('id2'); + expect(edges[0].arrowTypeEnd).toBe('arrow_point'); + }); + it('a diagram with multiple nodes with edges abc123', async () => { + const str = `block-beta + id1["first"] -- "a label" --> id2["second"] + `; + + block.parse(str); + const blocks = db.getBlocks(); + const edges = db.getEdges(); + expect(blocks.length).toBe(2); + expect(edges.length).toBe(1); + expect(edges[0].start).toBe('id1'); + expect(edges[0].end).toBe('id2'); + expect(edges[0].arrowTypeEnd).toBe('arrow_point'); + expect(edges[0].label).toBe('a label'); }); it('a diagram with column statements', async () => { const str = `block-beta @@ -103,7 +126,8 @@ describe('Block diagram', function () { block.parse(str); expect(db.getColumns('root')).toBe(2); - // Todo: DB check that the we have one block and that the root block has one column + const blocks = db.getBlocks(); + expect(blocks.length).toBe(1); }); it('a diagram withput column statements', async () => { const str = `block-beta @@ -112,7 +136,8 @@ describe('Block diagram', function () { block.parse(str); expect(db.getColumns('root')).toBe(-1); - // Todo: DB check that the we have one block and that the root block has one column + const blocks = db.getBlocks(); + expect(blocks.length).toBe(1); }); it('a diagram with auto column statements', async () => { const str = `block-beta @@ -122,7 +147,8 @@ describe('Block diagram', function () { block.parse(str); expect(db.getColumns('root')).toBe(-1); - // Todo: DB check that the we have one block and that the root block has one column + const blocks = db.getBlocks(); + expect(blocks.length).toBe(1); }); it('blocks next to each other', async () => { @@ -134,7 +160,9 @@ describe('Block diagram', function () { block.parse(str); - // Todo: DB check that the we have two blocks and that the root block has two columns + const blocks = db.getBlocks(); + expect(db.getColumns('root')).toBe(2); + expect(blocks.length).toBe(2); }); it('blocks on top of each other', async () => { @@ -146,7 +174,9 @@ describe('Block diagram', function () { block.parse(str); - // Todo: DB check that the we have two blocks and that the root block has one column + const blocks = db.getBlocks(); + expect(db.getColumns('root')).toBe(1); + expect(blocks.length).toBe(2); }); it('compound blocks 2', async () => { @@ -287,12 +317,13 @@ describe('Block diagram', function () { expect(block2.type).toBe('square'); expect(blockArrow.type).toBe('block_arrow'); console.log('blockArrow', blockArrow); + expect(blockArrow.directions).toContain('right'); }); - it.skip('Arrow blocks with multiple points', async () => { + it('Arrow blocks with multiple points', async () => { const str = `block-beta columns 1 A - blockArrow(1,3) + blockArrow<[" "]>(up, down) block columns 3 B @@ -301,6 +332,16 @@ describe('Block diagram', function () { end`; block.parse(str); + + const blocks = db.getBlocks(); + expect(blocks.length).toBe(3); + + const blockArrow = blocks[1]; + expect(blockArrow.type).toBe('block_arrow'); + console.log('blockArrow', blockArrow); + expect(blockArrow.directions).toContain('up'); + expect(blockArrow.directions).toContain('down'); + expect(blockArrow.directions).not.toContain('right'); }); it('blocks with different widths', async () => { const str = `block-beta @@ -315,7 +356,7 @@ describe('Block diagram', function () { expect(blocks.length).toBe(2); const one = blocks[0]; const two = blocks[1]; - console.log('Obe and Two', one, two); + console.log('One and Two', one, two); expect(two.w).toBe(2); }); it('empty blocks', async () => { @@ -323,46 +364,52 @@ describe('Block diagram', function () { columns 3 space middle["In the middle"] + space `; block.parse(str); + + const blocks = db.getBlocks(); + expect(blocks.length).toBe(3); + const sp1 = blocks[0]; + const middle = blocks[1]; + const sp2 = blocks[2]; + expect(sp1.type).toBe('space'); + expect(sp2.type).toBe('space'); + expect(middle.label).toBe('In the middle'); }); - it.skip('classDef statements applied to a block', async () => { + it('classDef statements applied to a block', async () => { const str = `block-beta classDef black color:#ffffff, fill:#000000; - mc["Memcache"]:::black + mc["Memcache"] + class mc black `; block.parse(str); + const blocks = db.getBlocks(); + expect(blocks.length).toBe(1); + const mc = blocks[0]; + expect(mc.classes).toContain('black'); + const classes = db.getClasses(); + console.log(classes); + const black = classes.black; + expect(black.id).toBe('black'); + expect(black.styles[0]).toEqual('color:#ffffff'); }); - it.skip('classDef statements applied to a block with a width', async () => { + it('style statements applied to a block', async () => { const str = `block-beta - classDef black color:#ffffff, fill:#000000; - columns 2 - mc["Memcache"]:2::black +columns 1 + B["A wide one in the middle"] + style B fill:#f9F,stroke:#333,stroke-width:4px `; - const apa = 'apan hopar i träden'; - block.parse(str); - }); - - it.skip('classDef statements', async () => { - const str = `block-beta - classDef black color:#ffffff, fill:#000000; - - block DataServices["Data Services"] - columns H - block Relational - mssql["Microsoft SQL
Server"] - end - block Tabular - columns 3 - gds["Google Data Store"]:1 - mc["Memcache"]:2:::black - end - end`; block.parse(str); + const blocks = db.getBlocks(); + expect(blocks.length).toBe(1); + const B = blocks[0]; + console.log(B); + expect(B.styles).toContain('fill:#f9F'); }); }); }); diff --git a/packages/mermaid/src/diagrams/block/renderHelpers.ts b/packages/mermaid/src/diagrams/block/renderHelpers.ts index 757bbadb9..34f249315 100644 --- a/packages/mermaid/src/diagrams/block/renderHelpers.ts +++ b/packages/mermaid/src/diagrams/block/renderHelpers.ts @@ -98,7 +98,7 @@ function getNodeFromBlock(block: Block, db: BlockDB, positioned = false) { _shape = 'rect'; } - const styles = getStylesFromArray(vertex?.styles || ''); + const styles = getStylesFromArray(vertex?.styles || []); // const styles = getStylesFromArray([]); // Use vertex id as text in the box if no text is provided by the graph definition @@ -117,13 +117,6 @@ function getNodeFromBlock(block: Block, db: BlockDB, positioned = false) { style: styles.style, // + 'fill:#9f9;stroke:#333;stroke-width:4px;', id: vertex.id, directions: vertex.directions, - // link: vertex.link, - // linkTarget: vertex.linkTarget, - // tooltip: diagObj.db.getTooltip(vertex.id) || '', - // domId: diagObj.db.lookUpDomId(vertex.id), - // haveCallback: vertex.haveCallback, - // width: vertex.type === 'group' ? 500 : undefined, - // dir: vertex.dir, width: bounds.width, height: bounds.height, x: bounds.x, diff --git a/packages/mermaid/src/utils.ts b/packages/mermaid/src/utils.ts index e48b49fcd..6ea93aaa2 100644 --- a/packages/mermaid/src/utils.ts +++ b/packages/mermaid/src/utils.ts @@ -492,6 +492,7 @@ export function getStylesFromArray(arr: string[]): { style: string; labelStyle: } } } + console.log(arr, style, labelStyle); return { style: style, labelStyle: labelStyle }; }