Skip to content

Commit 1ab2e6c

Browse files
committed
style elements based on stereotype annotations
1 parent 35a92ef commit 1ab2e6c

File tree

3 files changed

+130
-3
lines changed

3 files changed

+130
-3
lines changed

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

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

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

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,44 @@ export async function textHelper<T extends SVGGraphicsElement>(
3636

3737
annotationGroup = shapeSvg.insert('g').attr('class', 'annotation-group text');
3838
if (node.annotations.length > 0) {
39-
const annotation = node.annotations[0];
40-
await addText(annotationGroup, { text: ${annotation}»` } as unknown as ClassMember, 0);
39+
await addText(annotationGroup, { text: `` } as unknown as ClassMember, 0);
4140

4241
const annotationGroupBBox = annotationGroup.node()!.getBBox();
4342
annotationGroupHeight = annotationGroupBBox.height;
4443
}
4544

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

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

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

0 commit comments

Comments
 (0)