Skip to content

Commit e2b7f7f

Browse files
committed
add support for stereotype annotations for class diagrams
1 parent fad6676 commit e2b7f7f

File tree

3 files changed

+126
-0
lines changed

3 files changed

+126
-0
lines changed

cypress/integration/rendering/classDiagram-v3.spec.js

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,4 +1028,88 @@ class C13["With Città foreign language"]
10281028
{ logLevel: 1, htmlLabels: true }
10291029
);
10301030
});
1031+
it('should render a full class diagram using interface annotation', () => {
1032+
imgSnapshotTest(
1033+
`
1034+
classDiagram
1035+
Class01 <|-- AveryLongClass : Cool
1036+
&lt;&lt;interface&gt;&gt; Class01
1037+
Class03 "0" *-- "0..n" Class04
1038+
Class05 "1" o-- "many" Class06
1039+
Class07 .. Class08
1040+
Class09 "many" --> "1" C2 : Where am i?
1041+
Class09 "0" --* "1..n" C3
1042+
Class09 --|> Class07
1043+
Class07 : equals()
1044+
Class07 : Object[] elementData
1045+
Class01 : #size()
1046+
Class01 : -int chimp
1047+
Class01 : +int gorilla
1048+
Class08 <--> C2: Cool label
1049+
class Class10 {
1050+
&lt;&lt;service&gt;&gt;
1051+
int id
1052+
size()
1053+
}
1054+
1055+
`,
1056+
{ logLevel: 1, htmlLabels: true }
1057+
);
1058+
});
1059+
it('should render a full class diagram using abstract annotation', () => {
1060+
imgSnapshotTest(
1061+
`
1062+
classDiagram
1063+
Class01 <|-- AveryLongClass : Cool
1064+
&lt;&lt;abstract&gt;&gt; Class01
1065+
Class03 "0" *-- "0..n" Class04
1066+
Class05 "1" o-- "many" Class06
1067+
Class07 .. Class08
1068+
Class09 "many" --> "1" C2 : Where am i?
1069+
Class09 "0" --* "1..n" C3
1070+
Class09 --|> Class07
1071+
Class07 : equals()
1072+
Class07 : Object[] elementData
1073+
Class01 : #size()
1074+
Class01 : -int chimp
1075+
Class01 : +int gorilla
1076+
Class08 <--> C2: Cool label
1077+
class Class10 {
1078+
&lt;&lt;service&gt;&gt;
1079+
int id
1080+
size()
1081+
}
1082+
1083+
`,
1084+
{ logLevel: 1, htmlLabels: true }
1085+
);
1086+
});
1087+
it('should render a full class diagram using enumeration annotation', () => {
1088+
imgSnapshotTest(
1089+
`
1090+
classDiagram
1091+
Class01 <|-- AveryLongClass : Cool
1092+
&lt;&lt;enumeration&gt;&gt; Class01
1093+
Class03 "0" *-- "0..n" Class04
1094+
Class05 "1" o-- "many" Class06
1095+
Class07 .. Class08
1096+
Class09 "many" --> "1" C2 : Where am i?
1097+
Class09 "0" --* "1..n" C3
1098+
Class09 --|> Class07
1099+
Class07 : equals()
1100+
Class07 : Object[] elementData
1101+
Class01 : #size()
1102+
Class01 : -int chimp
1103+
Class01 : +int gorilla
1104+
Class08 <--> C2: Cool label
1105+
class Class10 {
1106+
&lt;&lt;service&gt;&gt;
1107+
int id
1108+
size()
1109+
}
1110+
1111+
`,
1112+
{ logLevel: 1, htmlLabels: true }
1113+
);
1114+
});
10311115
});

packages/mermaid/src/diagrams/class/shapeUtil.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,36 @@ export async function textHelper<T extends SVGGraphicsElement>(
4545

4646
labelGroup = shapeSvg.insert('g').attr('class', 'label-group text');
4747
await addText(labelGroup, node, 0, ['font-weight: bolder']);
48+
// Determine styling based on annotations
49+
let labelStyles = ['font-weight: bolder']; // Default bold style
50+
let labelClass = 'classTitle';
51+
52+
if (node.annotations && node.annotations.length > 0) {
53+
const annotation = node.annotations[0].toLowerCase();
54+
switch (annotation) {
55+
case 'abstract':
56+
labelClass = 'classTitle abstract';
57+
labelStyles = [];
58+
break;
59+
case 'enumeration':
60+
labelClass = 'classTitle enumeration';
61+
labelStyles = [];
62+
break;
63+
case 'interface':
64+
labelClass = 'classTitle interface';
65+
labelStyles = [];
66+
break;
67+
default:
68+
labelClass = 'classTitle';
69+
labelStyles = ['font-weight: bolder'];
70+
break;
71+
}
72+
}
73+
74+
// Apply the CSS class to the label group
75+
labelGroup.attr('class', `label-group text ${labelClass}`);
76+
77+
await addText(labelGroup, node, 0, labelStyles);
4878
const labelGroupBBox = labelGroup.node()!.getBBox();
4979
labelGroupHeight = labelGroupBBox.height;
5080

packages/mermaid/src/diagrams/class/styles.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,18 @@ g.classGroup line {
148148
stroke: ${options.lineColor} !important;
149149
stroke-width: 1;
150150
}
151+
152+
.classTitle.abstract {
153+
font-style: italic;
154+
font-weight: normal;
155+
}
156+
.classTitle.enumeration {
157+
text-decoration: underline;
158+
font-weight: normal;
159+
}
160+
.classTitle.interface {
161+
font-weight: bold;
162+
}
151163
152164
.edgeTerminals {
153165
font-size: 11px;

0 commit comments

Comments
 (0)