{ "version": 3, "sources": ["../src/diagrams/class/svgDraw.js"], "sourcesContent": ["import { line, curveBasis } from 'd3';\nimport utils from '../../utils.js';\nimport { log } from '../../logger.js';\nimport { parseGenericTypes } from '../common/common.js';\n\nlet edgeCount = 0;\nexport const drawEdge = function (elem, path, relation, conf, diagObj) {\n const getRelationType = function (type) {\n switch (type) {\n case diagObj.db.relationType.AGGREGATION:\n return 'aggregation';\n case diagObj.db.relationType.EXTENSION:\n return 'extension';\n case diagObj.db.relationType.COMPOSITION:\n return 'composition';\n case diagObj.db.relationType.DEPENDENCY:\n return 'dependency';\n case diagObj.db.relationType.LOLLIPOP:\n return 'lollipop';\n }\n };\n\n path.points = path.points.filter((p) => !Number.isNaN(p.y));\n\n // The data for our line\n const lineData = path.points;\n\n // This is the accessor function we talked about above\n const lineFunction = line()\n .x(function (d) {\n return d.x;\n })\n .y(function (d) {\n return d.y;\n })\n .curve(curveBasis);\n\n const svgPath = elem\n .append('path')\n .attr('d', lineFunction(lineData))\n .attr('id', 'edge' + edgeCount)\n .attr('class', 'relation');\n let url = '';\n if (conf.arrowMarkerAbsolute) {\n url =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n window.location.search;\n url = url.replace(/\\(/g, '\\\\(');\n url = url.replace(/\\)/g, '\\\\)');\n }\n\n if (relation.relation.lineType == 1) {\n svgPath.attr('class', 'relation dashed-line');\n }\n if (relation.relation.lineType == 10) {\n svgPath.attr('class', 'relation dotted-line');\n }\n if (relation.relation.type1 !== 'none') {\n svgPath.attr(\n 'marker-start',\n 'url(' + url + '#' + getRelationType(relation.relation.type1) + 'Start' + ')'\n );\n }\n if (relation.relation.type2 !== 'none') {\n svgPath.attr(\n 'marker-end',\n 'url(' + url + '#' + getRelationType(relation.relation.type2) + 'End' + ')'\n );\n }\n\n let x, y;\n const l = path.points.length;\n // Calculate Label position\n let labelPosition = utils.calcLabelPosition(path.points);\n x = labelPosition.x;\n y = labelPosition.y;\n\n let p1_card_x, p1_card_y;\n let p2_card_x, p2_card_y;\n\n if (l % 2 !== 0 && l > 1) {\n let cardinality_1_point = utils.calcCardinalityPosition(\n relation.relation.type1 !== 'none',\n path.points,\n path.points[0]\n );\n let cardinality_2_point = utils.calcCardinalityPosition(\n relation.relation.type2 !== 'none',\n path.points,\n path.points[l - 1]\n );\n\n log.debug('cardinality_1_point ' + JSON.stringify(cardinality_1_point));\n log.debug('cardinality_2_point ' + JSON.stringify(cardinality_2_point));\n\n p1_card_x = cardinality_1_point.x;\n p1_card_y = cardinality_1_point.y;\n p2_card_x = cardinality_2_point.x;\n p2_card_y = cardinality_2_point.y;\n }\n\n if (relation.title !== undefined) {\n const g = elem.append('g').attr('class', 'classLabel');\n const label = g\n .append('text')\n .attr('class', 'label')\n .attr('x', x)\n .attr('y', y)\n .attr('fill', 'red')\n .attr('text-anchor', 'middle')\n .text(relation.title);\n\n window.label = label;\n const bounds = label.node().getBBox();\n\n g.insert('rect', ':first-child')\n .attr('class', 'box')\n .attr('x', bounds.x - conf.padding / 2)\n .attr('y', bounds.y - conf.padding / 2)\n .attr('width', bounds.width + conf.padding)\n .attr('height', bounds.height + conf.padding);\n }\n\n log.info('Rendering relation ' + JSON.stringify(relation));\n if (relation.relationTitle1 !== undefined && relation.relationTitle1 !== 'none') {\n const g = elem.append('g').attr('class', 'cardinality');\n g.append('text')\n .attr('class', 'type1')\n .attr('x', p1_card_x)\n .attr('y', p1_card_y)\n .attr('fill', 'black')\n .attr('font-size', '6')\n .text(relation.relationTitle1);\n }\n if (relation.relationTitle2 !== undefined && relation.relationTitle2 !== 'none') {\n const g = elem.append('g').attr('class', 'cardinality');\n g.append('text')\n .attr('class', 'type2')\n .attr('x', p2_card_x)\n .attr('y', p2_card_y)\n .attr('fill', 'black')\n .attr('font-size', '6')\n .text(relation.relationTitle2);\n }\n\n edgeCount++;\n};\n\n/**\n * Renders a class diagram\n *\n * @param {SVGSVGElement} elem The element to draw it into\n * @param classDef\n * @param conf\n * @param diagObj\n * @todo Add more information in the JSDOC here\n */\nexport const drawClass = function (elem, classDef, conf, diagObj) {\n log.debug('Rendering class ', classDef, conf);\n\n const id = classDef.id;\n const classInfo = {\n id: id,\n label: classDef.id,\n width: 0,\n height: 0,\n };\n\n // add class group\n const g = elem.append('g').attr('id', diagObj.db.lookUpDomId(id)).attr('class', 'classGroup');\n\n // add title\n let title;\n if (classDef.link) {\n title = g\n .append('svg:a')\n .attr('xlink:href', classDef.link)\n .attr('target', classDef.linkTarget)\n .append('text')\n .attr('y', conf.textHeight + conf.padding)\n .attr('x', 0);\n } else {\n title = g\n .append('text')\n .attr('y', conf.textHeight + conf.padding)\n .attr('x', 0);\n }\n\n // add annotations\n let isFirst = true;\n classDef.annotations.forEach(function (member) {\n const titleText2 = title.append('tspan').text('\u00AB' + member + '\u00BB');\n if (!isFirst) {\n titleText2.attr('dy', conf.textHeight);\n }\n isFirst = false;\n });\n\n let classTitleString = getClassTitleString(classDef);\n\n const classTitle = title.append('tspan').text(classTitleString).attr('class', 'title');\n\n // If class has annotations the title needs to have an offset of the text height\n if (!isFirst) {\n classTitle.attr('dy', conf.textHeight);\n }\n\n const titleHeight = title.node().getBBox().height;\n\n const membersLine = g\n .append('line') // text label for the x axis\n .attr('x1', 0)\n .attr('y1', conf.padding + titleHeight + conf.dividerMargin / 2)\n .attr('y2', conf.padding + titleHeight + conf.dividerMargin / 2);\n\n const members = g\n .append('text') // text label for the x axis\n .attr('x', conf.padding)\n .attr('y', titleHeight + conf.dividerMargin + conf.textHeight)\n .attr('fill', 'white')\n .attr('class', 'classText');\n\n isFirst = true;\n classDef.members.forEach(function (member) {\n addTspan(members, member, isFirst, conf);\n isFirst = false;\n });\n\n const membersBox = members.node().getBBox();\n\n const methodsLine = g\n .append('line') // text label for the x axis\n .attr('x1', 0)\n .attr('y1', conf.padding + titleHeight + conf.dividerMargin + membersBox.height)\n .attr('y2', conf.padding + titleHeight + conf.dividerMargin + membersBox.height);\n\n const methods = g\n .append('text') // text label for the x axis\n .attr('x', conf.padding)\n .attr('y', titleHeight + 2 * conf.dividerMargin + membersBox.height + conf.textHeight)\n .attr('fill', 'white')\n .attr('class', 'classText');\n\n isFirst = true;\n\n classDef.methods.forEach(function (method) {\n addTspan(methods, method, isFirst, conf);\n isFirst = false;\n });\n\n const classBox = g.node().getBBox();\n var cssClassStr = ' ';\n\n if (classDef.cssClasses.length > 0) {\n cssClassStr = cssClassStr + classDef.cssClasses.join(' ');\n }\n\n const rect = g\n .insert('rect', ':first-child')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', classBox.width + 2 * conf.padding)\n .attr('height', classBox.height + conf.padding + 0.5 * conf.dividerMargin)\n .attr('class', cssClassStr);\n\n const rectWidth = rect.node().getBBox().width;\n\n // Center title\n // We subtract the width of each text element from the class box width and divide it by 2\n title.node().childNodes.forEach(function (x) {\n x.setAttribute('x', (rectWidth - x.getBBox().width) / 2);\n });\n\n if (classDef.tooltip) {\n title.insert('title').text(classDef.tooltip);\n }\n\n membersLine.attr('x2', rectWidth);\n methodsLine.attr('x2', rectWidth);\n\n classInfo.width = rectWidth;\n classInfo.height = classBox.height + conf.padding + 0.5 * conf.dividerMargin;\n\n return classInfo;\n};\n\nexport const getClassTitleString = function (classDef) {\n let classTitleString = classDef.id;\n\n if (classDef.type) {\n classTitleString += '<' + classDef.type + '>';\n }\n\n return classTitleString;\n};\n\n/**\n * Renders a note diagram\n *\n * @param {SVGSVGElement} elem The element to draw it into\n * @param {{id: string; text: string; class: string;}} note\n * @param conf\n * @param diagObj\n * @todo Add more information in the JSDOC here\n */\nexport const drawNote = function (elem, note, conf, diagObj) {\n log.debug('Rendering note ', note, conf);\n\n const id = note.id;\n const noteInfo = {\n id: id,\n text: note.text,\n width: 0,\n height: 0,\n };\n\n // add class group\n const g = elem.append('g').attr('id', id).attr('class', 'classGroup');\n\n // add text\n let text = g\n .append('text')\n .attr('y', conf.textHeight + conf.padding)\n .attr('x', 0);\n\n const lines = JSON.parse(`\"${note.text}\"`).split('\\n');\n\n lines.forEach(function (line) {\n log.debug(`Adding line: ${line}`);\n text.append('tspan').text(line).attr('class', 'title').attr('dy', conf.textHeight);\n });\n\n const noteBox = g.node().getBBox();\n\n const rect = g\n .insert('rect', ':first-child')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', noteBox.width + 2 * conf.padding)\n .attr(\n 'height',\n noteBox.height + lines.length * conf.textHeight + conf.padding + 0.5 * conf.dividerMargin\n );\n\n const rectWidth = rect.node().getBBox().width;\n\n // Center title\n // We subtract the width of each text element from the class box width and divide it by 2\n text.node().childNodes.forEach(function (x) {\n x.setAttribute('x', (rectWidth - x.getBBox().width) / 2);\n });\n\n noteInfo.width = rectWidth;\n noteInfo.height =\n noteBox.height + lines.length * conf.textHeight + conf.padding + 0.5 * conf.dividerMargin;\n\n return noteInfo;\n};\n\nexport const parseMember = function (text) {\n let displayText = '';\n let cssStyle = '';\n let returnType = '';\n\n let visibility = '';\n let firstChar = text.substring(0, 1);\n let lastChar = text.substring(text.length - 1, text.length);\n\n if (firstChar.match(/[#+~-]/)) {\n visibility = firstChar;\n }\n\n let noClassifierRe = /[\\s\\w)~]/;\n if (!lastChar.match(noClassifierRe)) {\n cssStyle = parseClassifier(lastChar);\n }\n\n const startIndex = visibility === '' ? 0 : 1;\n let endIndex = cssStyle === '' ? text.length : text.length - 1;\n text = text.substring(startIndex, endIndex);\n\n const methodStart = text.indexOf('(');\n const methodEnd = text.indexOf(')');\n const isMethod = methodStart > 1 && methodEnd > methodStart && methodEnd <= text.length;\n\n if (isMethod) {\n let methodName = text.substring(0, methodStart).trim();\n\n const parameters = text.substring(methodStart + 1, methodEnd);\n\n displayText = visibility + methodName + '(' + parseGenericTypes(parameters.trim()) + ')';\n\n if (methodEnd < text.length) {\n // special case: classifier after the closing parenthesis\n let potentialClassifier = text.substring(methodEnd + 1, methodEnd + 2);\n if (cssStyle === '' && !potentialClassifier.match(noClassifierRe)) {\n cssStyle = parseClassifier(potentialClassifier);\n returnType = text.substring(methodEnd + 2).trim();\n } else {\n returnType = text.substring(methodEnd + 1).trim();\n }\n\n if (returnType !== '') {\n if (returnType.charAt(0) === ':') {\n returnType = returnType.substring(1).trim();\n }\n returnType = ' : ' + parseGenericTypes(returnType);\n displayText += returnType;\n }\n }\n } else {\n // finally - if all else fails, just send the text back as written (other than parsing for generic types)\n displayText = visibility + parseGenericTypes(text);\n }\n\n return {\n displayText,\n cssStyle,\n };\n};\n\n/**\n * Adds a for a member in a diagram\n *\n * @param {SVGElement} textEl The element to append to\n * @param {string} txt The member\n * @param {boolean} isFirst\n * @param {{ padding: string; textHeight: string }} conf The configuration for the member\n */\nconst addTspan = function (textEl, txt, isFirst, conf) {\n let member = parseMember(txt);\n\n const tSpan = textEl.append('tspan').attr('x', conf.padding).text(member.displayText);\n\n if (member.cssStyle !== '') {\n tSpan.attr('style', member.cssStyle);\n }\n\n if (!isFirst) {\n tSpan.attr('dy', conf.textHeight);\n }\n};\n\n/**\n * Gives the styles for a classifier\n *\n * @param {'+' | '-' | '#' | '~' | '*' | '$'} classifier The classifier string\n * @returns {string} Styling for the classifier\n */\nconst parseClassifier = function (classifier) {\n switch (classifier) {\n case '*':\n return 'font-style:italic;';\n case '$':\n return 'text-decoration:underline;';\n default:\n return '';\n }\n};\n\nexport default {\n getClassTitleString,\n drawClass,\n drawEdge,\n drawNote,\n parseMember,\n};\n"], "mappings": "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", "names": ["line", "curveBasis", "edgeCount", "drawEdge", "__name", "elem", "path", "relation", "conf", "diagObj", "getRelationType", "type", "p", "lineData", "lineFunction", "line", "curveBasis", "svgPath", "url", "x", "y", "l", "labelPosition", "utils_default", "p1_card_x", "p1_card_y", "p2_card_x", "p2_card_y", "cardinality_1_point", "cardinality_2_point", "log", "g", "label", "bounds", "drawClass", "classDef", "id", "classInfo", "title", "isFirst", "member", "titleText2", "classTitleString", "getClassTitleString", "classTitle", "titleHeight", "membersLine", "members", "addTspan", "membersBox", "methodsLine", "methods", "method", "classBox", "cssClassStr", "rectWidth", "drawNote", "note", "noteInfo", "text", "lines", "noteBox", "parseMember", "displayText", "cssStyle", "returnType", "visibility", "firstChar", "lastChar", "noClassifierRe", "parseClassifier", "startIndex", "endIndex", "methodStart", "methodEnd", "methodName", "parameters", "parseGenericTypes", "potentialClassifier", "textEl", "txt", "tSpan", "classifier", "svgDraw_default"] }