Skip to content

Commit

Permalink
Merge pull request #3834 from mermaid-js/3778_adding_more_mindmap_shapes
Browse files Browse the repository at this point in the history
#3778 Adding a hexgon shape
  • Loading branch information
pbrolin47 committed Nov 21, 2022
2 parents 32db430 + c781545 commit 0d27b1a
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 5 deletions.
12 changes: 12 additions & 0 deletions docs/syntax/mindmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,18 @@ mindmap
id)I am a cloud(
```

### Hexagon

```mermaid-example
mindmap
id{{I am a hexagon}}
```

```mermaid
mindmap
id{{I am a hexagon}}
```

### Default

```mermaid-example
Expand Down
12 changes: 12 additions & 0 deletions packages/mermaid-mindmap/src/mindmap.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,18 @@ root
expect(mm.children.length).toEqual(0);
expect(mm.type).toEqual(mindmap.yy.nodeType.BANG);
});

it('MMP-12-a mutiple types (hexagon)', function () {
let str = `mindmap
root{{the root}}
`;

mindmap.parse(str);
const mm = mindmap.yy.getMindmap();
expect(mm.type).toEqual(mindmap.yy.nodeType.HEXAGON);
expect(mm.descr).toEqual('the root');
expect(mm.children.length).toEqual(0);
});
});
describe('decorations', function () {
it('MMP-13 should be possible to set an icon for the node', function () {
Expand Down
8 changes: 8 additions & 0 deletions packages/mermaid-mindmap/src/mindmapDb.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ export const addNode = (level, id, descr, type) => {
case nodeType.RECT:
node.padding = 2 * conf.mindmap.padding;
break;
case nodeType.HEXAGON:
node.padding = 2 * conf.mindmap.padding;
break;
default:
node.padding = conf.mindmap.padding;
}
Expand Down Expand Up @@ -79,6 +82,7 @@ export const nodeType = {
CIRCLE: 3,
CLOUD: 4,
BANG: 5,
HEXAGON: 6,
};

export const getType = (startStr, endStr) => {
Expand All @@ -94,6 +98,8 @@ export const getType = (startStr, endStr) => {
return nodeType.CLOUD;
case '))':
return nodeType.BANG;
case '{{':
return nodeType.HEXAGON;
default:
return nodeType.DEFAULT;
}
Expand Down Expand Up @@ -127,6 +133,8 @@ export const type2Str = (type) => {
return 'cloud';
case nodeType.BANG:
return 'bang';
case nodeType.HEXAGON:
return 'hexgon';
default:
return 'no-border';
}
Expand Down
8 changes: 5 additions & 3 deletions packages/mermaid-mindmap/src/parser/mindmap.jison
Original file line number Diff line number Diff line change
Expand Up @@ -33,23 +33,25 @@
"))" { yy.getLogger().trace('Explosion Bang'); this.begin('NODE');return 'NODE_DSTART'; }
")" { yy.getLogger().trace('Cloud Bang'); this.begin('NODE');return 'NODE_DSTART'; }
"((" { this.begin('NODE');return 'NODE_DSTART'; }
"{{" { this.begin('NODE');return 'NODE_DSTART'; }
"(" { this.begin('NODE');return 'NODE_DSTART'; }
"[" { this.begin('NODE');return 'NODE_DSTART'; }
[\s]+ return 'SPACELIST' /* skip all whitespace */ ;
// !(-\() return 'NODE_ID';
[^\(\[\n\-\)]+ return 'NODE_ID';
[^\(\[\n\-\)\{\}]+ return 'NODE_ID';
<<EOF>> return 'EOF';
<NODE>["] { yy.getLogger().trace('Starting NSTR');this.begin("NSTR");}
<NSTR>[^"]+ { yy.getLogger().trace('description:', yytext); return "NODE_DESCR";}
<NSTR>["] {this.popState();}
<NODE>[\)]\) {this.popState();yy.getLogger().trace('node end ))');return "NODE_DEND";}
<NODE>[\)] {this.popState();yy.getLogger().trace('node end )');return "NODE_DEND";}
<NODE>[\]] {this.popState();yy.getLogger().trace('node end ...',yytext);return "NODE_DEND";}
<NODE>"}}" {this.popState();yy.getLogger().trace('node end ((');return "NODE_DEND";}
<NODE>"(-" {this.popState();yy.getLogger().trace('node end (-');return "NODE_DEND";}
<NODE>"-)" {this.popState();yy.getLogger().trace('node end (-');return "NODE_DEND";}
<NODE>"((" {this.popState();yy.getLogger().trace('node end ((');return "NODE_DEND";}
<NODE>"(" {this.popState();yy.getLogger().trace('node end ((');return "NODE_DEND";}
<NODE>[^\)\]\(]+ { yy.getLogger().trace('Long description:', yytext); return 'NODE_DESCR';}
<NODE>"(" {this.popState();yy.getLogger().trace('node end ((');return "NODE_DEND";}
<NODE>[^\)\]\(\}]+ { yy.getLogger().trace('Long description:', yytext); return 'NODE_DESCR';}
<NODE>.+(?!\(\() { yy.getLogger().trace('Long description:', yytext); return 'NODE_DESCR';}
// [\[] return 'NODE_START';
// .+ return 'TXT' ;
Expand Down
4 changes: 2 additions & 2 deletions packages/mermaid-mindmap/src/styles.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const genSections = (options) => {
sections += `
.section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${
i - 1
} path {
} polygon, .section-${i - 1} path {
fill: ${options['cScale' + i]};
}
.section-${i - 1} text {
Expand Down Expand Up @@ -55,7 +55,7 @@ const getStyles = (options) =>
stroke-width: 3;
}
${genSections(options)}
.section-root rect, .section-root path, .section-root circle {
.section-root rect, .section-root path, .section-root circle, .section-root polygon {
fill: ${options.git0};
}
.section-root text {
Expand Down
42 changes: 42 additions & 0 deletions packages/mermaid-mindmap/src/svgDraw.js
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,45 @@ const circleBkg = function (elem, node) {
.attr('class', 'node-bkg node-' + db.type2Str(node.type))
.attr('r', node.width / 2);
};

/**
*
* @param parent
* @param w
* @param h
* @param points
* @param node
*/
function insertPolygonShape(parent, w, h, points, node) {
return parent
.insert('polygon', ':first-child')
.attr(
'points',
points
.map(function (d) {
return d.x + ',' + d.y;
})
.join(' ')
)
.attr('transform', 'translate(' + (node.width - w) / 2 + ', ' + h + ')');
}

const hexagonBkg = function (elem, node) {
const h = node.height;
const f = 4;
const m = h / f;
const w = node.width - node.padding + 2 * m;
const points = [
{ x: m, y: 0 },
{ x: w - m, y: 0 },
{ x: w, y: -h / 2 },
{ x: w - m, y: -h },
{ x: m, y: -h },
{ x: 0, y: -h / 2 },
];
const shapeSvg = insertPolygonShape(elem, w, h, points, node);
};

const roundedRectBkg = function (elem, node) {
elem
.append('rect')
Expand Down Expand Up @@ -252,6 +291,9 @@ export const drawNode = function (elem, node, fullSection, conf) {
case db.nodeType.BANG:
bangBkg(bkgElem, node, section, conf);
break;
case db.nodeType.HEXAGON:
hexagonBkg(bkgElem, node, section, conf);
break;
}

// Position the node to its coordinate
Expand Down
7 changes: 7 additions & 0 deletions packages/mermaid/src/docs/syntax/mindmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,13 @@ mindmap
id)I am a cloud(
```

### Hexagon

```mermaid-example
mindmap
id{{I am a hexagon}}
```

### Default

```mermaid-example
Expand Down

0 comments on commit 0d27b1a

Please sign in to comment.