mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-14 12:59:46 +02:00
#723 Add stadium shape for flowchart nodes
This commit is contained in:
13
dist/index.html
vendored
13
dist/index.html
vendored
@@ -300,6 +300,19 @@ click B testClick "click test"
|
|||||||
classDef someclass fill:#f96;
|
classDef someclass fill:#f96;
|
||||||
class A someclass;
|
class A someclass;
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mermaid">
|
||||||
|
graph TD
|
||||||
|
A([stadium shape test])
|
||||||
|
A -->|Get money| B([Go shopping])
|
||||||
|
B --> C([Let me think...<br />Do I want something for work,<br />something to spend every free second with,<br />or something to get around?])
|
||||||
|
C -->|One| D([Laptop])
|
||||||
|
C -->|Two| E([iPhone])
|
||||||
|
C -->|Three| F([Car<br/>wroom wroom])
|
||||||
|
click A "index.html#link-clicked" "link test"
|
||||||
|
click B testClick "click test"
|
||||||
|
classDef someclass fill:#f96;
|
||||||
|
class A someclass;
|
||||||
|
</div>
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
|
@@ -78,6 +78,17 @@ graph LR
|
|||||||
id1(This is the text in the box)
|
id1(This is the text in the box)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### A stadium-shaped node
|
||||||
|
|
||||||
|
```
|
||||||
|
graph LR
|
||||||
|
id1([This is the text in the box])
|
||||||
|
```
|
||||||
|
```mermaid
|
||||||
|
graph LR
|
||||||
|
id1([This is the text in the box])
|
||||||
|
```
|
||||||
|
|
||||||
### A node in the form of a circle
|
### A node in the form of a circle
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@@ -135,9 +135,29 @@ function rect_right_inv_arrow(parent, bbox, node) {
|
|||||||
return shapeSvg;
|
return shapeSvg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function stadium(parent, bbox, node) {
|
||||||
|
const h = bbox.height;
|
||||||
|
const w = bbox.width + h / 4;
|
||||||
|
|
||||||
|
const shapeSvg = parent
|
||||||
|
.insert('rect', ':first-child')
|
||||||
|
.attr('rx', h / 2)
|
||||||
|
.attr('ry', h / 2)
|
||||||
|
.attr('x', -w / 2)
|
||||||
|
.attr('y', -h / 2)
|
||||||
|
.attr('width', w)
|
||||||
|
.attr('height', h);
|
||||||
|
|
||||||
|
node.intersect = function(point) {
|
||||||
|
return dagreD3.intersect.rect(node, point);
|
||||||
|
};
|
||||||
|
return shapeSvg;
|
||||||
|
}
|
||||||
|
|
||||||
export function addToRender(render) {
|
export function addToRender(render) {
|
||||||
render.shapes().question = question;
|
render.shapes().question = question;
|
||||||
render.shapes().hexagon = hexagon;
|
render.shapes().hexagon = hexagon;
|
||||||
|
render.shapes().stadium = stadium;
|
||||||
|
|
||||||
// Add custom shape for box with inverted arrow on left side
|
// Add custom shape for box with inverted arrow on left side
|
||||||
render.shapes().rect_left_inv_arrow = rect_left_inv_arrow;
|
render.shapes().rect_left_inv_arrow = rect_left_inv_arrow;
|
||||||
|
@@ -1,6 +1,29 @@
|
|||||||
import { addToRender } from './flowChartShapes';
|
import { addToRender } from './flowChartShapes';
|
||||||
|
|
||||||
describe('flowchart shapes', function() {
|
describe('flowchart shapes', function() {
|
||||||
|
// rect-based shapes
|
||||||
|
[
|
||||||
|
['stadium', useWidth, useHeight]
|
||||||
|
].forEach(function([shapeType, getW, getH]) {
|
||||||
|
it(`should add a ${shapeType} shape that renders a properly positioned rect element`, function() {
|
||||||
|
const mockRender = MockRender();
|
||||||
|
const mockSvg = MockSvg();
|
||||||
|
addToRender(mockRender);
|
||||||
|
|
||||||
|
[[100, 100], [123, 45], [71, 300]].forEach(function([width, height]) {
|
||||||
|
const shape = mockRender.shapes()[shapeType](mockSvg, { width, height }, {});
|
||||||
|
const w = width + height / 4;
|
||||||
|
const h = height;
|
||||||
|
const dx = -getW(w, h) / 2;
|
||||||
|
const dy = -getH(w, h) / 2;
|
||||||
|
expect(shape.__tag).toEqual('rect');
|
||||||
|
expect(shape.__attrs).toHaveProperty('x', dx);
|
||||||
|
expect(shape.__attrs).toHaveProperty('y', dy);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// polygon-based shapes
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
'question',
|
'question',
|
||||||
|
@@ -154,6 +154,9 @@ export const addVertices = function(vert, g, svgId) {
|
|||||||
case 'ellipse':
|
case 'ellipse':
|
||||||
_shape = 'ellipse';
|
_shape = 'ellipse';
|
||||||
break;
|
break;
|
||||||
|
case 'stadium':
|
||||||
|
_shape = 'stadium';
|
||||||
|
break;
|
||||||
case 'group':
|
case 'group':
|
||||||
_shape = 'rect';
|
_shape = 'rect';
|
||||||
break;
|
break;
|
||||||
|
@@ -22,6 +22,7 @@ describe('the flowchart renderer', function() {
|
|||||||
['odd_right', 'rect_left_inv_arrow'],
|
['odd_right', 'rect_left_inv_arrow'],
|
||||||
['circle', 'circle'],
|
['circle', 'circle'],
|
||||||
['ellipse', 'ellipse'],
|
['ellipse', 'ellipse'],
|
||||||
|
['stadium', 'stadium'],
|
||||||
['group', 'rect']
|
['group', 'rect']
|
||||||
].forEach(function([type, expectedShape, expectedRadios = 0]) {
|
].forEach(function([type, expectedShape, expectedRadios = 0]) {
|
||||||
it(`should add the correct shaped node to the graph for vertex type ${type}`, function() {
|
it(`should add the correct shaped node to the graph for vertex type ${type}`, function() {
|
||||||
|
@@ -82,6 +82,8 @@
|
|||||||
\s*\=\=\s* return '==';
|
\s*\=\=\s* return '==';
|
||||||
"(-" return '(-';
|
"(-" return '(-';
|
||||||
"-)" return '-)';
|
"-)" return '-)';
|
||||||
|
"([" return 'STADIUMSTART';
|
||||||
|
"])" return 'STADIUMEND';
|
||||||
\- return 'MINUS';
|
\- return 'MINUS';
|
||||||
"." return 'DOT';
|
"." return 'DOT';
|
||||||
[\_] return 'UNDERSCORE';
|
[\_] return 'UNDERSCORE';
|
||||||
@@ -96,8 +98,8 @@
|
|||||||
[A-Za-z]+ return 'ALPHA';
|
[A-Za-z]+ return 'ALPHA';
|
||||||
"\\]" return 'TRAPEND';
|
"\\]" return 'TRAPEND';
|
||||||
"[/" return 'TRAPSTART';
|
"[/" return 'TRAPSTART';
|
||||||
"/]" return 'INVTRAPEND';
|
"/]" return 'INVTRAPEND';
|
||||||
"[\\" return 'INVTRAPSTART';
|
"[\\" return 'INVTRAPSTART';
|
||||||
[!"#$%&'*+,-.`?\\_/] return 'PUNCTUATION';
|
[!"#$%&'*+,-.`?\\_/] return 'PUNCTUATION';
|
||||||
[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|
|
[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|
|
||||||
[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|
|
[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|
|
||||||
@@ -305,6 +307,10 @@ vertex: idString SQS text SQE
|
|||||||
{$$ = $1;yy.addVertex($1,$3,'ellipse');}
|
{$$ = $1;yy.addVertex($1,$3,'ellipse');}
|
||||||
| idString '(-' text '-)' spaceList
|
| idString '(-' text '-)' spaceList
|
||||||
{$$ = $1;yy.addVertex($1,$3,'ellipse');}
|
{$$ = $1;yy.addVertex($1,$3,'ellipse');}
|
||||||
|
| idString STADIUMSTART text STADIUMEND
|
||||||
|
{$$ = $1;yy.addVertex($1,$3,'stadium');}
|
||||||
|
| idString STADIUMSTART text STADIUMEND spaceList
|
||||||
|
{$$ = $1;yy.addVertex($1,$3,'stadium');}
|
||||||
| idString PS text PE
|
| idString PS text PE
|
||||||
{$$ = $1;yy.addVertex($1,$3,'round');}
|
{$$ = $1;yy.addVertex($1,$3,'round');}
|
||||||
| idString PS text PE spaceList
|
| idString PS text PE spaceList
|
||||||
@@ -563,5 +569,5 @@ alphaNumToken : PUNCTUATION | UNICODE_TEXT | NUM| ALPHA | COLON | COMMA | PLUS
|
|||||||
|
|
||||||
idStringToken : ALPHA|UNDERSCORE |UNICODE_TEXT | NUM| COLON | COMMA | PLUS | MINUS | DOWN |EQUALS | MULT | BRKT | DOT | PUNCTUATION;
|
idStringToken : ALPHA|UNDERSCORE |UNICODE_TEXT | NUM| COLON | COMMA | PLUS | MINUS | DOWN |EQUALS | MULT | BRKT | DOT | PUNCTUATION;
|
||||||
|
|
||||||
graphCodeTokens: TRAPSTART | TRAPEND | INVTRAPSTART | INVTRAPEND | PIPE | PS | PE | SQS | SQE | DIAMOND_START | DIAMOND_STOP | TAGSTART | TAGEND | ARROW_CROSS | ARROW_POINT | ARROW_CIRCLE | ARROW_OPEN | QUOTE | SEMI ;
|
graphCodeTokens: STADIUMSTART | STADIUMEND | TRAPSTART | TRAPEND | INVTRAPSTART | INVTRAPEND | PIPE | PS | PE | SQS | SQE | DIAMOND_START | DIAMOND_STOP | TAGSTART | TAGEND | ARROW_CROSS | ARROW_POINT | ARROW_CIRCLE | ARROW_OPEN | QUOTE | SEMI;
|
||||||
%%
|
%%
|
||||||
|
Reference in New Issue
Block a user