Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: Add ability to get classDefs from classDb #6190

Open
wants to merge 8 commits into
base: develop
Choose a base branch
from
13 changes: 10 additions & 3 deletions packages/mermaid/src/diagrams/class/classDb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ const MERMAID_DOM_ID_PREFIX = 'classId-';

let relations: ClassRelation[] = [];
let classes = new Map<string, ClassNode>();
const styleClasses = new Map<string, StyleClass>();
let styleClasses = new Map<string, StyleClass>();
let notes: ClassNote[] = [];
let interfaces: Interface[] = [];
let classCounter = 0;
Expand Down Expand Up @@ -126,6 +126,7 @@ export const lookUpDomId = function (_id: string): string {
export const clear = function () {
relations = [];
classes = new Map();
styleClasses = new Map();
notes = [];
interfaces = [];
functions = [];
Expand Down Expand Up @@ -285,15 +286,16 @@ export const setCssClass = function (ids: string, className: string) {
};

export const defineClass = function (ids: string[], style: string[]) {
const styles = style[0].split(',');
yari-dewalt marked this conversation as resolved.
Show resolved Hide resolved
for (const id of ids) {
let styleClass = styleClasses.get(id);
if (styleClass === undefined) {
styleClass = { id, styles: [], textStyles: [] };
styleClasses.set(id, styleClass);
}

if (style) {
style.forEach(function (s) {
if (styles.length > 0) {
styles.forEach(function (s: string) {
if (/color/.exec(s)) {
const newStyle = s.replace('fill', 'bgFill'); // .replace('color', 'fill');
styleClass.textStyles.push(newStyle);
Expand Down Expand Up @@ -578,6 +580,10 @@ function getArrowMarker(type: number) {
return marker;
}

export const getClassDefs = () => {
return styleClasses;
};

export const getData = () => {
const nodes: Node[] = [];
const edges: Edge[] = [];
Expand Down Expand Up @@ -732,5 +738,6 @@ export default {
getNamespace,
getNamespaces,
setCssStyle,
getClassDefs,
getData,
};
27 changes: 27 additions & 0 deletions packages/mermaid/src/diagrams/class/classDiagram-styles.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,5 +111,32 @@ describe('class diagram, ', function () {
]);
expect(parser.yy.getClass('Class01').cssClasses).toBe('default pink bold');
});
it('should detect classDefs', function () {
const str =
'classDiagram\n' +
'class Animal\nclassDef red fill:red,color:white,stroke:red\nclassDef large color:black,font-size:20px,font-weight:bold';

parser.parse(str);
const expected = new Map([
[
'red',
{
id: 'red',
styles: ['fill:red', 'color:white', 'stroke:red'],
textStyles: ['color:white'],
},
],
[
'large',
{
id: 'large',
styles: ['color:black', 'font-size:20px', 'font-weight:bold'],
textStyles: ['color:black'],
},
],
]);

expect(parser.yy.getClassDefs()).toStrictEqual(expected);
});
});
});
Loading