mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-01-28 07:03:17 +08:00
Merge pull request #2018 from mermaid-js/2017_std_req_diagrams
#2017 Standardization of requirement diagrams
This commit is contained in:
commit
8a893e12f5
@ -12,18 +12,19 @@
|
||||
/* background: rgb(221, 208, 208); */
|
||||
/* background:#333; */
|
||||
font-family: 'Arial';
|
||||
/* font-size: 18px !important; */
|
||||
}
|
||||
h1 { color: grey;}
|
||||
.mermaid2 {
|
||||
display: none;
|
||||
}
|
||||
.mermaid svg {
|
||||
font-size: 12px !important;
|
||||
/* font-size: 18px !important; */
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>info below</h1>
|
||||
<div>info below</div>
|
||||
<div class="flex">
|
||||
<div class="mermaid2" style="width: 100%; height: 400px;">
|
||||
%%{init: { "logLevel": 1, "er": {"fontSize":18 }} }%%
|
||||
@ -53,22 +54,51 @@ flowchart TD
|
||||
classDef TestSub fill:green;
|
||||
class T TestSub
|
||||
linkStyle 0,1 color:orange, stroke: orange;
|
||||
</div>
|
||||
<div class="mermaid" style="width: 100%; height: 20%;">
|
||||
graph TD
|
||||
C --text fyra fem -->F[text ett två tre]
|
||||
</div>
|
||||
<div class="mermaid" style="width: 50%; height: 20%;">
|
||||
%%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%%
|
||||
flowchart LR
|
||||
subgraph A
|
||||
a --> b
|
||||
end
|
||||
subgraph B
|
||||
i -->f
|
||||
end
|
||||
A --> B </div>
|
||||
|
||||
<div class="mermaid" style="width: 100%; height: 20%;">
|
||||
requirementDiagram
|
||||
requirement test_req {
|
||||
id: 1
|
||||
text: the test text.
|
||||
risk: high
|
||||
verifymethod: test
|
||||
}
|
||||
|
||||
functionalRequirement test_req2 {
|
||||
id: 1.1
|
||||
text: the second test text.
|
||||
risk: low
|
||||
verifymethod: inspection
|
||||
}
|
||||
|
||||
performanceRequirement test_req3 {
|
||||
id: 1.2
|
||||
text: the third test text.
|
||||
risk: medium
|
||||
verifymethod: demonstration
|
||||
}
|
||||
|
||||
element test_entity {
|
||||
type: simulation
|
||||
}
|
||||
|
||||
element test_entity2 {
|
||||
type: word doc
|
||||
docRef: reqs/test_entity
|
||||
}
|
||||
|
||||
|
||||
test_entity - satisfies -> test_req2
|
||||
test_req - traces -> test_req2
|
||||
test_req - contains -> test_req3
|
||||
test_req <- copies - test_entity2
|
||||
</div>
|
||||
<div class="mermaid2" style="width: 50%; height: 20%;">
|
||||
flowchart TD
|
||||
C -->|fa:fa-car Car| F[fa:fa-car Car]
|
||||
</div>
|
||||
<div class="mermaid" style="width: 50%; height: 20%;">
|
||||
flowchart LR
|
||||
classDef dark fill:#000,stroke:#000,stroke-width:4px,color:#fff
|
||||
Lorem --> Ipsum --> Dolor
|
||||
@ -124,9 +154,8 @@ style N stroke:#0000ff,fill:#ccccff,color:#0000ff
|
||||
// console.error('Mermaid error: ', err);
|
||||
};
|
||||
mermaid.initialize({
|
||||
// theme: 'forest',
|
||||
// themeVariables:{primaryColor: '#ff0000'},
|
||||
// arrowMarkerAbsolute: true,
|
||||
theme: 'neutral',
|
||||
arrowMarkerAbsolute: true,
|
||||
// themeCSS: '.edgePath .path {stroke: red;} .arrowheadPath {fill: red;}',
|
||||
logLevel: 0,
|
||||
flowchart: { nodeSpacing: 10, curve: 'cardinal', htmlLabels: true },
|
||||
@ -134,10 +163,12 @@ style N stroke:#0000ff,fill:#ccccff,color:#0000ff
|
||||
// gantt: { axisFormat: '%m/%d/%Y' },
|
||||
sequence: { actorFontFamily: 'courier',actorMargin: 50, showSequenceNumbers: false },
|
||||
// sequenceDiagram: { actorMargin: 300 } // deprecated
|
||||
fontFamily: '"arial", sans-serif',
|
||||
fontFamily: 'courier',
|
||||
// fontFamily: '"times", sans-serif',
|
||||
// fontFamily: 'courier',
|
||||
fontSize: 18,
|
||||
curve: 'cardinal',
|
||||
securityLevel: 'loose',
|
||||
// themeVariables: {relationLabelColor: 'red'}
|
||||
});
|
||||
function callback(){alert('It worked');}
|
||||
</script>
|
||||
|
@ -84,7 +84,8 @@
|
||||
%% /* language grammar */
|
||||
|
||||
start
|
||||
: directive start
|
||||
: directive NEWLINE start
|
||||
| directive start
|
||||
| RD NEWLINE diagram EOF;
|
||||
|
||||
directive
|
||||
@ -108,36 +109,37 @@ diagram
|
||||
| requirementDef diagram
|
||||
| elementDef diagram
|
||||
| relationshipDef diagram
|
||||
| directive diagram
|
||||
| NEWLINE diagram;
|
||||
|
||||
requirementDef
|
||||
: requirementType requirementName STRUCT_START NEWLINE requirementBody
|
||||
: requirementType requirementName STRUCT_START NEWLINE requirementBody
|
||||
{ yy.addRequirement($2, $1) };
|
||||
|
||||
requirementBody
|
||||
: ID COLONSEP id NEWLINE requirementBody
|
||||
: ID COLONSEP id NEWLINE requirementBody
|
||||
{ yy.setNewReqId($3); }
|
||||
| TEXT COLONSEP text NEWLINE requirementBody
|
||||
| TEXT COLONSEP text NEWLINE requirementBody
|
||||
{ yy.setNewReqText($3); }
|
||||
| RISK COLONSEP riskLevel NEWLINE requirementBody
|
||||
| RISK COLONSEP riskLevel NEWLINE requirementBody
|
||||
{ yy.setNewReqRisk($3); }
|
||||
| VERIFYMTHD COLONSEP verifyType NEWLINE requirementBody
|
||||
| VERIFYMTHD COLONSEP verifyType NEWLINE requirementBody
|
||||
{ yy.setNewReqVerifyMethod($3); }
|
||||
| NEWLINE requirementBody
|
||||
| STRUCT_STOP;
|
||||
|
||||
requirementType
|
||||
: REQUIREMENT
|
||||
: REQUIREMENT
|
||||
{ $$=yy.RequirementType.REQUIREMENT;}
|
||||
| FUNCTIONAL_REQUIREMENT
|
||||
| FUNCTIONAL_REQUIREMENT
|
||||
{ $$=yy.RequirementType.FUNCTIONAL_REQUIREMENT;}
|
||||
| INTERFACE_REQUIREMENT
|
||||
| INTERFACE_REQUIREMENT
|
||||
{ $$=yy.RequirementType.INTERFACE_REQUIREMENT;}
|
||||
| PERFORMANCE_REQUIREMENT
|
||||
| PERFORMANCE_REQUIREMENT
|
||||
{ $$=yy.RequirementType.PERFORMANCE_REQUIREMENT;}
|
||||
| PHYSICAL_REQUIREMENT
|
||||
| PHYSICAL_REQUIREMENT
|
||||
{ $$=yy.RequirementType.PHYSICAL_REQUIREMENT;}
|
||||
| DESIGN_CONSTRAINT
|
||||
| DESIGN_CONSTRAINT
|
||||
{ $$=yy.RequirementType.DESIGN_CONSTRAINT;};
|
||||
|
||||
riskLevel
|
||||
@ -146,29 +148,29 @@ riskLevel
|
||||
| HIGH_RISK { $$=yy.RiskLevel.HIGH_RISK;};
|
||||
|
||||
verifyType
|
||||
: VERIFY_ANALYSIS
|
||||
: VERIFY_ANALYSIS
|
||||
{ $$=yy.VerifyType.VERIFY_ANALYSIS;}
|
||||
| VERIFY_DEMONSTRATION
|
||||
| VERIFY_DEMONSTRATION
|
||||
{ $$=yy.VerifyType.VERIFY_DEMONSTRATION;}
|
||||
| VERIFY_INSPECTION
|
||||
| VERIFY_INSPECTION
|
||||
{ $$=yy.VerifyType.VERIFY_INSPECTION;}
|
||||
| VERIFY_TEST
|
||||
| VERIFY_TEST
|
||||
{ $$=yy.VerifyType.VERIFY_TEST;};
|
||||
|
||||
elementDef
|
||||
: ELEMENT elementName STRUCT_START NEWLINE elementBody
|
||||
: ELEMENT elementName STRUCT_START NEWLINE elementBody
|
||||
{ yy.addElement($2) };
|
||||
|
||||
elementBody
|
||||
: TYPE COLONSEP type NEWLINE elementBody
|
||||
: TYPE COLONSEP type NEWLINE elementBody
|
||||
{ yy.setNewElementType($3); }
|
||||
| DOCREF COLONSEP ref NEWLINE elementBody
|
||||
| DOCREF COLONSEP ref NEWLINE elementBody
|
||||
{ yy.setNewElementDocRef($3); }
|
||||
| NEWLINE elementBody
|
||||
| STRUCT_STOP;
|
||||
|
||||
relationshipDef
|
||||
: id END_ARROW_L relationship LINE id
|
||||
: id END_ARROW_L relationship LINE id
|
||||
{ yy.addRelationship($3, $5, $1) }
|
||||
| id LINE relationship END_ARROW_R id
|
||||
{ yy.addRelationship($3, $1, $5) };
|
||||
|
@ -20,8 +20,8 @@ const insertLineEndings = (parentNode, conf) => {
|
||||
.attr('cx', conf.line_height / 2)
|
||||
.attr('cy', conf.line_height / 2)
|
||||
.attr('r', conf.line_height / 2)
|
||||
.attr('stroke', conf.rect_border_color)
|
||||
.attr('stroke-width', 1)
|
||||
// .attr('stroke', conf.rect_border_color)
|
||||
// .attr('stroke-width', 1)
|
||||
.attr('fill', 'none');
|
||||
|
||||
containsNode
|
||||
@ -30,7 +30,7 @@ const insertLineEndings = (parentNode, conf) => {
|
||||
.attr('x2', conf.line_height)
|
||||
.attr('y1', conf.line_height / 2)
|
||||
.attr('y2', conf.line_height / 2)
|
||||
.attr('stroke', conf.rect_border_color)
|
||||
// .attr('stroke', conf.rect_border_color)
|
||||
.attr('stroke-width', 1);
|
||||
|
||||
containsNode
|
||||
@ -39,7 +39,7 @@ const insertLineEndings = (parentNode, conf) => {
|
||||
.attr('y2', conf.line_height)
|
||||
.attr('x1', conf.line_height / 2)
|
||||
.attr('x2', conf.line_height / 2)
|
||||
.attr('stroke', conf.rect_border_color)
|
||||
// .attr('stroke', conf.rect_border_color)
|
||||
.attr('stroke-width', 1);
|
||||
|
||||
parentNode
|
||||
@ -54,13 +54,13 @@ const insertLineEndings = (parentNode, conf) => {
|
||||
.append('path')
|
||||
.attr(
|
||||
'd',
|
||||
`M0,0
|
||||
L${conf.line_height},${conf.line_height / 2}
|
||||
M${conf.line_height},${conf.line_height / 2}
|
||||
`M0,0
|
||||
L${conf.line_height},${conf.line_height / 2}
|
||||
M${conf.line_height},${conf.line_height / 2}
|
||||
L0,${conf.line_height}`
|
||||
)
|
||||
.attr('stroke-width', 1)
|
||||
.attr('stroke', conf.rect_border_color);
|
||||
.attr('stroke-width', 1);
|
||||
// .attr('stroke', conf.rect_border_color);
|
||||
};
|
||||
|
||||
export default {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { line, select } from 'd3';
|
||||
import dagre from 'dagre';
|
||||
import graphlib from 'graphlib';
|
||||
import * as configApi from '../../config';
|
||||
// import * as configApi from '../../config';
|
||||
import { log } from '../../logger';
|
||||
import { configureSvgSize } from '../../utils';
|
||||
import common from '../common/common';
|
||||
@ -26,10 +26,6 @@ const newRectNode = (parentNode, id) => {
|
||||
return parentNode
|
||||
.insert('rect', '#' + id)
|
||||
.attr('class', 'req reqBox')
|
||||
.attr('fill', conf.rect_fill)
|
||||
.attr('fill-opacity', '100%')
|
||||
.attr('stroke', conf.rect_border_color)
|
||||
.attr('stroke-size', conf.rect_border_size)
|
||||
.attr('x', 0)
|
||||
.attr('y', 0)
|
||||
.attr('width', conf.rect_min_width + 'px')
|
||||
@ -45,12 +41,11 @@ const newTitleNode = (parentNode, id, txts) => {
|
||||
.attr('id', id)
|
||||
.attr('x', x)
|
||||
.attr('y', conf.rect_padding)
|
||||
.attr('dominant-baseline', 'hanging')
|
||||
.attr(
|
||||
'style',
|
||||
'font-family: ' + configApi.getConfig().fontFamily + '; font-size: ' + conf.fontSize + 'px'
|
||||
);
|
||||
|
||||
.attr('dominant-baseline', 'hanging');
|
||||
// .attr(
|
||||
// 'style',
|
||||
// 'font-family: ' + configApi.getConfig().fontFamily + '; font-size: ' + conf.fontSize + 'px'
|
||||
// )
|
||||
let i = 0;
|
||||
txts.forEach(textStr => {
|
||||
if (i == 0) {
|
||||
@ -77,11 +72,11 @@ const newTitleNode = (parentNode, id, txts) => {
|
||||
|
||||
parentNode
|
||||
.append('line')
|
||||
.attr('class', 'req-title-line')
|
||||
.attr('x1', '0')
|
||||
.attr('x2', conf.rect_min_width)
|
||||
.attr('y1', totalY)
|
||||
.attr('y2', totalY)
|
||||
.attr('style', `stroke: ${conf.rect_border_color}; stroke-width: 1`);
|
||||
.attr('y2', totalY);
|
||||
|
||||
return {
|
||||
titleNode: title,
|
||||
@ -96,11 +91,11 @@ const newBodyNode = (parentNode, id, txts, yStart) => {
|
||||
.attr('id', id)
|
||||
.attr('x', conf.rect_padding)
|
||||
.attr('y', yStart)
|
||||
.attr('dominant-baseline', 'hanging')
|
||||
.attr(
|
||||
'style',
|
||||
'font-family: ' + configApi.getConfig().fontFamily + '; font-size: ' + conf.fontSize + 'px'
|
||||
);
|
||||
.attr('dominant-baseline', 'hanging');
|
||||
// .attr(
|
||||
// 'style',
|
||||
// 'font-family: ' + configApi.getConfig().fontFamily + '; font-size: ' + conf.fontSize + 'px'
|
||||
// );
|
||||
|
||||
let currentRow = 0;
|
||||
const charLimit = 30;
|
||||
@ -145,13 +140,13 @@ const addEdgeLabel = (parentNode, svgPath, conf, txt) => {
|
||||
|
||||
const labelNode = parentNode
|
||||
.append('text')
|
||||
.attr('class', 'er relationshipLabel')
|
||||
.attr('class', 'req relationshipLabel')
|
||||
.attr('id', labelId)
|
||||
.attr('x', labelPoint.x)
|
||||
.attr('y', labelPoint.y)
|
||||
.attr('text-anchor', 'middle')
|
||||
.attr('dominant-baseline', 'middle')
|
||||
.attr('style', 'font-family: ' + conf.fontFamily + '; font-size: ' + conf.fontSize + 'px')
|
||||
// .attr('style', 'font-family: ' + conf.fontFamily + '; font-size: ' + conf.fontSize + 'px')
|
||||
.text(txt);
|
||||
|
||||
// Figure out how big the opaque 'container' rectangle needs to be
|
||||
@ -187,7 +182,6 @@ const drawRelationshipFromLayout = function(svg, rel, g, insert) {
|
||||
.insert('path', '#' + insert)
|
||||
.attr('class', 'er relationshipLine')
|
||||
.attr('d', lineFunction(edge.points))
|
||||
.attr('stroke', conf.rect_border_color)
|
||||
.attr('fill', 'none');
|
||||
|
||||
if (rel.type == requirementDb.Relationships.CONTAINS) {
|
||||
|
@ -1,3 +1,42 @@
|
||||
const getStyles = () => ``;
|
||||
const getStyles = options => `
|
||||
|
||||
marker {
|
||||
fill: ${options.relationColor};
|
||||
stroke: ${options.relationColor};
|
||||
}
|
||||
|
||||
marker.cross {
|
||||
stroke: ${options.lineColor};
|
||||
}
|
||||
|
||||
svg {
|
||||
font-family: ${options.fontFamily};
|
||||
font-size: ${options.fontSize};
|
||||
}
|
||||
|
||||
.reqBox {
|
||||
fill: ${options.requirementBackground};
|
||||
fill-opacity: 100%;
|
||||
stroke: ${options.requirementBorderColor};
|
||||
stroke-size: ${options.requirementBorderSize};
|
||||
}
|
||||
.reqLabelBox {
|
||||
fill: ${options.relationLabelBackground};
|
||||
fill-opacity: 100%;
|
||||
}
|
||||
|
||||
.req-title-line {
|
||||
stroke: ${options.requirementBorderColor};
|
||||
stroke-width: 1;
|
||||
}
|
||||
.relationshipLine {
|
||||
stroke: ${options.relationColor};
|
||||
stroke-width: 1;
|
||||
}
|
||||
.relationshipLabel {
|
||||
fill: ${options.relationLabelColor};
|
||||
}
|
||||
|
||||
`;
|
||||
// fill', conf.rect_fill)
|
||||
export default getStyles;
|
||||
|
@ -81,8 +81,6 @@ const getStyles = (type, userStyles, options) => {
|
||||
${themes[type](options)}
|
||||
|
||||
${userStyles}
|
||||
|
||||
${type} { fill: apa;}
|
||||
`;
|
||||
};
|
||||
|
||||
|
@ -125,6 +125,17 @@ class Theme {
|
||||
this.fillType5 = this.fillType5 || adjust(this.secondaryColor, { h: -64 });
|
||||
this.fillType6 = this.fillType6 || adjust(this.primaryColor, { h: 128 });
|
||||
this.fillType7 = this.fillType7 || adjust(this.secondaryColor, { h: 128 });
|
||||
|
||||
/* requirement-diagram */
|
||||
this.requirementBackground = this.requirementBackground || this.primaryColor;
|
||||
this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor;
|
||||
this.requirementBorderSize = this.requirementBorderSize || this.primaryBorderColor;
|
||||
this.requirementTextColor = this.requirementTextColor || this.primaryTextColor;
|
||||
this.relationColor = this.relationColor || this.lineColor;
|
||||
this.relationLabelBackground =
|
||||
this.relationLabelBackground ||
|
||||
(this.darkMode ? darken(this.secondaryColor, 30) : this.secondaryColor);
|
||||
this.relationLabelColor = this.relationLabelColor || this.actorTextColor;
|
||||
}
|
||||
calculate(overrides) {
|
||||
if (typeof overrides !== 'object') {
|
||||
|
@ -140,6 +140,17 @@ class Theme {
|
||||
this.fillType7 = adjust(this.secondaryColor, { h: 128 });
|
||||
/* class */
|
||||
this.classText = this.primaryTextColor;
|
||||
|
||||
/* requirement-diagram */
|
||||
this.requirementBackground = this.requirementBackground || this.primaryColor;
|
||||
this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor;
|
||||
this.requirementBorderSize = this.requirementBorderSize || this.primaryBorderColor;
|
||||
this.requirementTextColor = this.requirementTextColor || this.primaryTextColor;
|
||||
this.relationColor = this.relationColor || this.lineColor;
|
||||
this.relationLabelBackground =
|
||||
this.relationLabelBackground ||
|
||||
(this.darkMode ? darken(this.secondaryColor, 30) : this.secondaryColor);
|
||||
this.relationLabelColor = this.relationLabelColor || this.actorTextColor;
|
||||
}
|
||||
calculate(overrides) {
|
||||
if (typeof overrides !== 'object') {
|
||||
|
@ -150,6 +150,15 @@ class Theme {
|
||||
this.fillType5 = adjust(this.secondaryColor, { h: -64 });
|
||||
this.fillType6 = adjust(this.primaryColor, { h: 128 });
|
||||
this.fillType7 = adjust(this.secondaryColor, { h: 128 });
|
||||
|
||||
/* requirement-diagram */
|
||||
this.requirementBackground = this.requirementBackground || this.primaryColor;
|
||||
this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor;
|
||||
this.requirementBorderSize = this.requirementBorderSize || this.primaryBorderColor;
|
||||
this.requirementTextColor = this.requirementTextColor || this.primaryTextColor;
|
||||
this.relationColor = this.relationColor || this.lineColor;
|
||||
this.relationLabelBackground = this.relationLabelBackground || this.labelBackground;
|
||||
this.relationLabelColor = this.relationLabelColor || this.actorTextColor;
|
||||
}
|
||||
calculate(overrides) {
|
||||
if (typeof overrides !== 'object') {
|
||||
|
@ -120,6 +120,15 @@ class Theme {
|
||||
this.fillType5 = adjust(this.secondaryColor, { h: -64 });
|
||||
this.fillType6 = adjust(this.primaryColor, { h: 128 });
|
||||
this.fillType7 = adjust(this.secondaryColor, { h: 128 });
|
||||
|
||||
/* requirement-diagram */
|
||||
this.requirementBackground = this.requirementBackground || this.primaryColor;
|
||||
this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor;
|
||||
this.requirementBorderSize = this.requirementBorderSize || this.primaryBorderColor;
|
||||
this.requirementTextColor = this.requirementTextColor || this.primaryTextColor;
|
||||
this.relationColor = this.relationColor || this.lineColor;
|
||||
this.relationLabelBackground = this.relationLabelBackground || this.edgeLabelBackground;
|
||||
this.relationLabelColor = this.relationLabelColor || this.actorTextColor;
|
||||
}
|
||||
calculate(overrides) {
|
||||
if (typeof overrides !== 'object') {
|
||||
|
@ -157,6 +157,14 @@ class Theme {
|
||||
this.fillType5 = adjust(this.secondaryColor, { h: -64 });
|
||||
this.fillType6 = adjust(this.primaryColor, { h: 128 });
|
||||
this.fillType7 = adjust(this.secondaryColor, { h: 128 });
|
||||
/* requirement-diagram */
|
||||
this.requirementBackground = this.requirementBackground || this.primaryColor;
|
||||
this.requirementBorderColor = this.requirementBorderColor || this.primaryBorderColor;
|
||||
this.requirementBorderSize = this.requirementBorderSize || this.primaryBorderColor;
|
||||
this.requirementTextColor = this.requirementTextColor || this.primaryTextColor;
|
||||
this.relationColor = this.relationColor || this.lineColor;
|
||||
this.relationLabelBackground = this.relationLabelBackground || this.edgeLabelBackground;
|
||||
this.relationLabelColor = this.relationLabelColor || this.actorTextColor;
|
||||
}
|
||||
calculate(overrides) {
|
||||
if (typeof overrides !== 'object') {
|
||||
|
Loading…
x
Reference in New Issue
Block a user