diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index 4fed7a962..eaa5382ac 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -64,33 +64,21 @@
 block-beta
-columns 3
-  space Browser space
-  space:3
-
+columns 2
+  db(("This is the text "))
+  block
     A
-    B
-    C
+  end
 
-    space:3
-    space
-    db{{"This is the text in the box"}}
 
-      classDef green fill:#9f6,stroke:#333,stroke-width:2px;
-      style B fill:#f9F,stroke:#333,stroke-width:4px
-      class A green
 
-      Browser --> A
-      Browser --> B
-      Browser --> C
-      A --> db
-      B --> db
-      C--> db
+    
+
+block-beta
 
-      block
-        D
-        E
-      end
+  A1:3
+  A2:1
+  A3
     
 block-beta
diff --git a/packages/mermaid/src/diagrams/block/blockDB.ts b/packages/mermaid/src/diagrams/block/blockDB.ts
index e575f0680..787084697 100644
--- a/packages/mermaid/src/diagrams/block/blockDB.ts
+++ b/packages/mermaid/src/diagrams/block/blockDB.ts
@@ -173,7 +173,6 @@ const populateBlockDatabase = (_blockList: Block[], parent: Block): void => {
       if (block.children) {
         populateBlockDatabase(block.children, block);
       }
-
       if (block.type === 'space') {
         const w = block.width || 1;
         for (let j = 0; j < w; j++) {
@@ -186,6 +185,14 @@ const populateBlockDatabase = (_blockList: Block[], parent: Block): void => {
         if (newBlock) {
           children.push(block);
         }
+        // const w = block.w || 1;
+        // for (let j = 1; j < w; j++) {
+        //   const newBlock = clone(block);
+        //   newBlock.type = 'space';
+        //   newBlock.id = newBlock.id + '-' + j;
+        //   blockDatabase[newBlock.id] = newBlock;
+        //   children.push(newBlock);
+        // }
       }
     }
   }
diff --git a/packages/mermaid/src/diagrams/block/layout.ts b/packages/mermaid/src/diagrams/block/layout.ts
index 1b110fc64..cf62bd164 100644
--- a/packages/mermaid/src/diagrams/block/layout.ts
+++ b/packages/mermaid/src/diagrams/block/layout.ts
@@ -16,7 +16,7 @@ export function calculateBlockPosition(columns: number, position: number): Block
 
   // Ensure that position is a non-negative integer
   if (position < 0 || !Number.isInteger(position)) {
-    throw new Error('Position must be a non-negative integer.');
+    throw new Error('Position must be a non-negative integer.' + position);
   }
 
   if (columns < 0) {
@@ -40,7 +40,6 @@ const getMaxChildSize = (block: Block) => {
   // find max width of children
   for (const child of block.children) {
     const { width, height, x, y } = child.size || { width: 0, height: 0, x: 0, y: 0 };
-    log.debug('abc88', child.id, width, height, x, y);
     if (width > maxWidth) {
       maxWidth = width;
     }
@@ -51,7 +50,12 @@ const getMaxChildSize = (block: Block) => {
   return { width: maxWidth, height: maxHeight };
 };
 
-function setBlockSizes(block: Block, db: BlockDB, sieblingWidth: number = 0) {
+function setBlockSizes(
+  block: Block,
+  db: BlockDB,
+  sieblingWidth: number = 0,
+  sieblingHeight: number = 0
+) {
   log.debug('calculateSize abc88 (start)', block.id, block?.size?.x, block?.size?.width);
   const totalWidth = 0;
   const totalHeight = 0;
@@ -70,27 +74,28 @@ function setBlockSizes(block: Block, db: BlockDB, sieblingWidth: number = 0) {
     // set width of block to max width of children
     for (const child of block.children) {
       if (child.size) {
-        child.size.width = maxWidth;
+        child.size.width = maxWidth * child.w + padding * (child.w - 1);
         child.size.height = maxHeight;
         child.size.x = 0;
         child.size.y = 0;
       }
     }
     for (const child of block.children) {
-      setBlockSizes(child, db, maxWidth);
+      setBlockSizes(child, db, maxWidth, maxHeight);
     }
 
     const columns = block.columns || -1;
     const numItems = block.children.length;
 
     // The width and height in number blocks
-    let xSize = block.children?.length;
+    let xSize = block.children.length;
     if (columns > 0 && columns < numItems) {
       xSize = columns;
     }
     const ySize = Math.ceil(numItems / xSize);
 
     let width = xSize * (maxWidth + padding) + padding;
+    let height = ySize * (maxHeight + padding) + padding;
     // If maxWidth
     if (width < sieblingWidth) {
       console.log(
@@ -98,19 +103,24 @@ function setBlockSizes(block: Block, db: BlockDB, sieblingWidth: number = 0) {
         block.id,
         'sieblingWidth',
         sieblingWidth,
+        'sieblingHeight',
+        sieblingHeight,
         'width',
         width
       );
       width = sieblingWidth;
+      height = sieblingHeight;
       const childWidth = (sieblingWidth - xSize * padding - padding) / xSize;
+      const childHeight = (sieblingHeight - 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);
 
-      // // set width of block to max width of children
+      // set width of block to max width of children
       for (const child of block.children) {
         if (child.size) {
           child.size.width = childWidth;
-          child.size.height = maxHeight;
+          child.size.height = childHeight;
           child.size.x = 0;
           child.size.y = 0;
         }
@@ -131,26 +141,35 @@ function setBlockSizes(block: Block, db: BlockDB, sieblingWidth: number = 0) {
 
     block.size = {
       width,
-      height: ySize * (maxHeight + padding) + padding,
+      height,
       x: 0,
       y: 0,
     };
   }
 
-  log.debug('calculateSize abc88 (done)', block.id, block?.size?.x, block?.size?.width);
+  log.debug(
+    'setBlockSizes abc88 (done)',
+    block.id,
+    block?.size?.x,
+    block?.size?.width,
+    block?.size?.y,
+    block?.size?.height
+  );
 }
 
 function layoutBlocks(block: Block, db: BlockDB) {
   log.debug(
-    'layout blocks (=>layoutBlocks)',
+    'abc88 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', block.id, '=>', columns);
+  log.debug('layoutBlocks columns abc88', block.id, '=>', columns);
   if (
     block.children && // find max width of children
     block.children.length > 0
@@ -158,26 +177,12 @@ function layoutBlocks(block: Block, db: BlockDB) {
     const width = block?.children[0]?.size?.width || 0;
     const widthOfChildren = block.children.length * width + (block.children.length - 1) * padding;
 
-    log.debug('widthOfChildren', widthOfChildren, 'posX');
+    log.debug('widthOfChildren 88', widthOfChildren, 'posX');
 
     // let first = true;
-    let columnPos = -1;
+    let columnPos = 0;
     for (const child of block.children) {
-      columnPos++;
-
-      // log.debug(
-      //   'layout blocks (child)',
-      //   child.id,
-      //   'x:',
-      //   child?.size?.x,
-      //   'width:',
-      //   child?.size?.width,
-      //   'posX:',
-      //   posX,
-      //   block?.size?.x,
-      //   widthOfChildren / 2,
-      //   widthOfChildren / 2
-      // );
+      // columnPos++;
 
       if (!child.size) {
         continue;
@@ -185,7 +190,12 @@ function layoutBlocks(block: Block, db: BlockDB) {
       const { width, height } = child.size;
       const { px, py } = calculateBlockPosition(columns, columnPos);
       log.debug(
-        'layout blocks (child) px, py (',
+        'abc88 layout blocks (child) id:',
+        child.id,
+        ' (px, py)',
+        px,
+        py,
+        ' (',
         block?.size?.x,
         ',',
         block?.size?.y,
@@ -205,7 +215,7 @@ function layoutBlocks(block: Block, db: BlockDB) {
           block.size.y - block.size.height / 2 + py * (height + padding) + height / 2 + padding;
 
         log.debug(
-          'layout blocks (calc) px, py',
+          'abc88 layout blocks (calc) px, py',
           'id:',
           child.id,
           '=>',
@@ -220,6 +230,8 @@ function layoutBlocks(block: Block, db: BlockDB) {
       if (child.children) {
         layoutBlocks(child, db);
       }
+      columnPos += parseInt(child?.w || 1);
+      console.log('abc88', child, columnPos);
     }
   }
   log.debug(
@@ -227,6 +239,8 @@ function layoutBlocks(block: Block, db: BlockDB) {
     block.id,
     'x:',
     block?.size?.x,
+    'y:',
+    block?.size?.y,
     'width:',
     block?.size?.width
   );
@@ -267,7 +281,7 @@ export function layout(db: BlockDB) {
     return;
   }
 
-  setBlockSizes(root, db, 0);
+  setBlockSizes(root, db, 0, 0);
   layoutBlocks(root, db);
   // Position blocks relative to parents
   // positionBlock(root, root, db);
diff --git a/packages/mermaid/src/diagrams/block/parser/block.jison b/packages/mermaid/src/diagrams/block/parser/block.jison
index 3f91a7d96..46e72e0ea 100644
--- a/packages/mermaid/src/diagrams/block/parser/block.jison
+++ b/packages/mermaid/src/diagrams/block/parser/block.jison
@@ -128,7 +128,7 @@ accDescr\s*"{"\s*                                { this.pushState("acc_descr_mul
 
 "<["                   { this.pushState('BLOCK_ARROW');yy.getLogger().debug('LEX ARR START');return 'BLOCK_ARROW_START'; }
 
-[^\(\[\n\-\)\{\}\s\<\>]+     { yy.getLogger().info('Lex: NODE_ID', yytext);return 'NODE_ID'; }
+[^\(\[\n\-\)\{\}\s\<\>:]+     { yy.getLogger().info('Lex: NODE_ID', yytext);return 'NODE_ID'; }
 <>                { yy.getLogger().info('Lex: EOF', yytext);return 'EOF'; }
 
 // Handling of strings in node
@@ -163,6 +163,7 @@ accDescr\s*"{"\s*                                { this.pushState("acc_descr_mul
 \s*[xo<]?\-\-+[-xo>]\s*                 { this.popState(); yy.getLogger().info('Lex: LINK', '#'+yytext+'#'); return 'LINK'; }
 \s*[xo<]?\=\=+[=xo>]\s*                 { this.popState(); yy.getLogger().info('Lex: LINK', yytext); return 'LINK'; }
 \s*[xo<]?\-?\.+\-[xo>]?\s*              { this.popState(); yy.getLogger().info('Lex: LINK', yytext); return 'LINK'; }
+':'\d+                   { yy.getLogger().info('Lex: COLON', yytext); yytext=yytext.slice(1);return 'SIZE'; }
 
 /lex
 
@@ -233,7 +234,8 @@ nodeStatement
       {id: $3.id, label: $3.label, type: yy.typeStr2Type($3.typeStr), directions: $3.directions}
       ];
     }
-  | node { yy.getLogger().info('Rule: nodeStatement (node) ', $1); $$ = {id: $1.id, label: $1.label, type: yy.typeStr2Type($1.typeStr), directions: $1.directions}; }
+  | node SIZE { yy.getLogger().info('Rule: nodeStatement (abc88 node size) ', $1, $2); $$ = {id: $1.id, label: $1.label, type: yy.typeStr2Type($1.typeStr), directions: $1.directions, w: $2}; }
+  | node { yy.getLogger().info('Rule: nodeStatement (node) ', $1); $$ = {id: $1.id, label: $1.label, type: yy.typeStr2Type($1.typeStr), directions: $1.directions, w:1}; }
   ;