summaryrefslogtreecommitdiff
path: root/themes/blowfish/assets/lib/mermaid/edges-0979260b.js.map
blob: 6d8f7f1b9729ae447073420fc9305dc15f6c9bdf (plain)
1
{"version":3,"file":"edges-0979260b.js","sources":["../src/dagre-wrapper/markers.js","../src/dagre-wrapper/createLabel.js","../src/dagre-wrapper/shapes/util.js","../src/dagre-wrapper/intersect/intersect-node.js","../src/dagre-wrapper/intersect/intersect-ellipse.js","../src/dagre-wrapper/intersect/intersect-circle.js","../src/dagre-wrapper/intersect/intersect-line.js","../src/dagre-wrapper/intersect/intersect-polygon.js","../src/dagre-wrapper/intersect/intersect-rect.js","../src/dagre-wrapper/intersect/index.js","../src/dagre-wrapper/shapes/note.js","../src/dagre-wrapper/nodes.js","../src/dagre-wrapper/edges.js"],"sourcesContent":["/** Setup arrow head and define the marker. The result is appended to the svg. */\n\nimport { log } from '../logger';\n\n// Only add the number of markers that the diagram needs\nconst insertMarkers = (elem, markerArray, type, id) => {\n  markerArray.forEach((markerName) => {\n    markers[markerName](elem, type, id);\n  });\n};\n\nconst extension = (elem, type, id) => {\n  log.trace('Making markers for ', id);\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', type + '-extensionStart')\n    .attr('class', 'marker extension ' + type)\n    .attr('refX', 0)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 1,7 L18,13 V 1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', type + '-extensionEnd')\n    .attr('class', 'marker extension ' + type)\n    .attr('refX', 19)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead\n};\n\nconst composition = (elem, type) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', type + '-compositionStart')\n    .attr('class', 'marker composition ' + type)\n    .attr('refX', 0)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', type + '-compositionEnd')\n    .attr('class', 'marker composition ' + type)\n    .attr('refX', 19)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst aggregation = (elem, type) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', type + '-aggregationStart')\n    .attr('class', 'marker aggregation ' + type)\n    .attr('refX', 0)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', type + '-aggregationEnd')\n    .attr('class', 'marker aggregation ' + type)\n    .attr('refX', 19)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst dependency = (elem, type) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', type + '-dependencyStart')\n    .attr('class', 'marker dependency ' + type)\n    .attr('refX', 0)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');\n\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', type + '-dependencyEnd')\n    .attr('class', 'marker dependency ' + type)\n    .attr('refX', 19)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 28)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\nconst lollipop = (elem, type) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', type + '-lollipopStart')\n    .attr('class', 'marker lollipop ' + type)\n    .attr('refX', 0)\n    .attr('refY', 7)\n    .attr('markerWidth', 190)\n    .attr('markerHeight', 240)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('stroke', 'black')\n    .attr('fill', 'white')\n    .attr('cx', 6)\n    .attr('cy', 7)\n    .attr('r', 6);\n};\nconst point = (elem, type) => {\n  elem\n    .append('marker')\n    .attr('id', type + '-pointEnd')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 12 20')\n    .attr('refX', 10)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 12)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 0 0 L 10 5 L 0 10 z')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0');\n  elem\n    .append('marker')\n    .attr('id', type + '-pointStart')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', 0)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 12)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 0 5 L 10 10 L 10 0 z')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0');\n};\nconst circle = (elem, type) => {\n  elem\n    .append('marker')\n    .attr('id', type + '-circleEnd')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', 11)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 11)\n    .attr('markerHeight', 11)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('cx', '5')\n    .attr('cy', '5')\n    .attr('r', '5')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0');\n\n  elem\n    .append('marker')\n    .attr('id', type + '-circleStart')\n    .attr('class', 'marker ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', -1)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 11)\n    .attr('markerHeight', 11)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('cx', '5')\n    .attr('cy', '5')\n    .attr('r', '5')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0');\n};\nconst cross = (elem, type) => {\n  elem\n    .append('marker')\n    .attr('id', type + '-crossEnd')\n    .attr('class', 'marker cross ' + type)\n    .attr('viewBox', '0 0 11 11')\n    .attr('refX', 12)\n    .attr('refY', 5.2)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 11)\n    .attr('markerHeight', 11)\n    .attr('orient', 'auto')\n    .append('path')\n    // .attr('stroke', 'black')\n    .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 2)\n    .style('stroke-dasharray', '1,0');\n\n  elem\n    .append('marker')\n    .attr('id', type + '-crossStart')\n    .attr('class', 'marker cross ' + type)\n    .attr('viewBox', '0 0 11 11')\n    .attr('refX', -1)\n    .attr('refY', 5.2)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 11)\n    .attr('markerHeight', 11)\n    .attr('orient', 'auto')\n    .append('path')\n    // .attr('stroke', 'black')\n    .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 2)\n    .style('stroke-dasharray', '1,0');\n};\nconst barb = (elem, type) => {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', type + '-barbEnd')\n    .attr('refX', 19)\n    .attr('refY', 7)\n    .attr('markerWidth', 20)\n    .attr('markerHeight', 14)\n    .attr('markerUnits', 'strokeWidth')\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');\n};\n\n// TODO rename the class diagram markers to something shape descriptive and semantic free\nconst markers = {\n  extension,\n  composition,\n  aggregation,\n  dependency,\n  lollipop,\n  point,\n  circle,\n  cross,\n  barb,\n};\nexport default insertMarkers;\n","import { select } from 'd3';\nimport { log } from '../logger';\nimport { getConfig } from '../config';\nimport { evaluate } from '../diagrams/common/common';\nimport { decodeEntities } from '../mermaidAPI';\n\n/**\n * @param dom\n * @param styleFn\n */\nfunction applyStyle(dom, styleFn) {\n  if (styleFn) {\n    dom.attr('style', styleFn);\n  }\n}\n\n/**\n * @param {any} node\n * @returns {SVGForeignObjectElement} Node\n */\nfunction addHtmlLabel(node) {\n  const fo = select(document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject'));\n  const div = fo.append('xhtml:div');\n\n  const label = node.label;\n  const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel';\n  div.html(\n    '<span class=\"' +\n      labelClass +\n      '\" ' +\n      (node.labelStyle ? 'style=\"' + node.labelStyle + '\"' : '') +\n      '>' +\n      label +\n      '</span>'\n  );\n\n  applyStyle(div, node.labelStyle);\n  div.style('display', 'inline-block');\n  // Fix for firefox\n  div.style('white-space', 'nowrap');\n  div.attr('xmlns', 'http://www.w3.org/1999/xhtml');\n  return fo.node();\n}\n\nconst createLabel = (_vertexText, style, isTitle, isNode) => {\n  let vertexText = _vertexText || '';\n  if (typeof vertexText === 'object') {\n    vertexText = vertexText[0];\n  }\n  if (evaluate(getConfig().flowchart.htmlLabels)) {\n    // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?\n    vertexText = vertexText.replace(/\\\\n|\\n/g, '<br />');\n    log.info('vertexText' + vertexText);\n    const node = {\n      isNode,\n      label: decodeEntities(vertexText).replace(\n        /fa[blrs]?:fa-[\\w-]+/g,\n        (s) => `<i class='${s.replace(':', ' ')}'></i>`\n      ),\n      labelStyle: style.replace('fill:', 'color:'),\n    };\n    let vertexNode = addHtmlLabel(node);\n    // vertexNode.parentNode.removeChild(vertexNode);\n    return vertexNode;\n  } else {\n    const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n    svgLabel.setAttribute('style', style.replace('color:', 'fill:'));\n    let rows = [];\n    if (typeof vertexText === 'string') {\n      rows = vertexText.split(/\\\\n|\\n|<br\\s*\\/?>/gi);\n    } else if (Array.isArray(vertexText)) {\n      rows = vertexText;\n    } else {\n      rows = [];\n    }\n\n    for (const row of rows) {\n      const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n      tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n      tspan.setAttribute('dy', '1em');\n      tspan.setAttribute('x', '0');\n      if (isTitle) {\n        tspan.setAttribute('class', 'title-row');\n      } else {\n        tspan.setAttribute('class', 'row');\n      }\n      tspan.textContent = row.trim();\n      svgLabel.appendChild(tspan);\n    }\n    return svgLabel;\n  }\n};\n\nexport default createLabel;\n","import createLabel from '../createLabel';\nimport { getConfig } from '../../config';\nimport { decodeEntities } from '../../mermaidAPI';\nimport { select } from 'd3';\nimport { evaluate, sanitizeText } from '../../diagrams/common/common';\nexport const labelHelper = (parent, node, _classes, isNode) => {\n  let classes;\n  if (!_classes) {\n    classes = 'node default';\n  } else {\n    classes = _classes;\n  }\n  // Add outer g element\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', classes)\n    .attr('id', node.domId || node.id);\n\n  // Create the label and insert it after the rect\n  const label = shapeSvg.insert('g').attr('class', 'label').attr('style', node.labelStyle);\n\n  // Replace labelText with default value if undefined\n  let labelText;\n  if (node.labelText === undefined) {\n    labelText = '';\n  } else {\n    labelText = typeof node.labelText === 'string' ? node.labelText : node.labelText[0];\n  }\n\n  const text = label\n    .node()\n    .appendChild(\n      createLabel(\n        sanitizeText(decodeEntities(labelText), getConfig()),\n        node.labelStyle,\n        false,\n        isNode\n      )\n    );\n\n  // Get the size of the label\n  let bbox = text.getBBox();\n\n  if (evaluate(getConfig().flowchart.htmlLabels)) {\n    const div = text.children[0];\n    const dv = select(text);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n\n  const halfPadding = node.padding / 2;\n\n  // Center the label\n  label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n\n  return { shapeSvg, bbox, halfPadding, label };\n};\n\nexport const updateNodeBounds = (node, element) => {\n  const bbox = element.node().getBBox();\n  node.width = bbox.width;\n  node.height = bbox.height;\n};\n\n/**\n * @param parent\n * @param w\n * @param h\n * @param points\n */\nexport function insertPolygonShape(parent, w, h, points) {\n  return parent\n    .insert('polygon', ':first-child')\n    .attr(\n      'points',\n      points\n        .map(function (d) {\n          return d.x + ',' + d.y;\n        })\n        .join(' ')\n    )\n    .attr('class', 'label-container')\n    .attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');\n}\n","/**\n * @param node\n * @param point\n */\nfunction intersectNode(node, point) {\n  // console.info('Intersect Node');\n  return node.intersect(point);\n}\n\nexport default intersectNode;\n","/**\n * @param node\n * @param rx\n * @param ry\n * @param point\n */\nfunction intersectEllipse(node, rx, ry, point) {\n  // Formulae from: https://mathworld.wolfram.com/Ellipse-LineIntersection.html\n\n  var cx = node.x;\n  var cy = node.y;\n\n  var px = cx - point.x;\n  var py = cy - point.y;\n\n  var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px);\n\n  var dx = Math.abs((rx * ry * px) / det);\n  if (point.x < cx) {\n    dx = -dx;\n  }\n  var dy = Math.abs((rx * ry * py) / det);\n  if (point.y < cy) {\n    dy = -dy;\n  }\n\n  return { x: cx + dx, y: cy + dy };\n}\n\nexport default intersectEllipse;\n","import intersectEllipse from './intersect-ellipse';\n\n/**\n * @param node\n * @param rx\n * @param point\n */\nfunction intersectCircle(node, rx, point) {\n  return intersectEllipse(node, rx, rx, point);\n}\n\nexport default intersectCircle;\n","/**\n * Returns the point at which two lines, p and q, intersect or returns undefined if they do not intersect.\n *\n * @param p1\n * @param p2\n * @param q1\n * @param q2\n */\nfunction intersectLine(p1, p2, q1, q2) {\n  // Algorithm from J. Avro, (ed.) Graphics Gems, No 2, Morgan Kaufmann, 1994,\n  // p7 and p473.\n\n  var a1, a2, b1, b2, c1, c2;\n  var r1, r2, r3, r4;\n  var denom, offset, num;\n  var x, y;\n\n  // Compute a1, b1, c1, where line joining points 1 and 2 is F(x,y) = a1 x +\n  // b1 y + c1 = 0.\n  a1 = p2.y - p1.y;\n  b1 = p1.x - p2.x;\n  c1 = p2.x * p1.y - p1.x * p2.y;\n\n  // Compute r3 and r4.\n  r3 = a1 * q1.x + b1 * q1.y + c1;\n  r4 = a1 * q2.x + b1 * q2.y + c1;\n\n  // Check signs of r3 and r4. If both point 3 and point 4 lie on\n  // same side of line 1, the line segments do not intersect.\n  if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) {\n    return /*DON'T_INTERSECT*/;\n  }\n\n  // Compute a2, b2, c2 where line joining points 3 and 4 is G(x,y) = a2 x + b2 y + c2 = 0\n  a2 = q2.y - q1.y;\n  b2 = q1.x - q2.x;\n  c2 = q2.x * q1.y - q1.x * q2.y;\n\n  // Compute r1 and r2\n  r1 = a2 * p1.x + b2 * p1.y + c2;\n  r2 = a2 * p2.x + b2 * p2.y + c2;\n\n  // Check signs of r1 and r2. If both point 1 and point 2 lie\n  // on same side of second line segment, the line segments do\n  // not intersect.\n  if (r1 !== 0 && r2 !== 0 && sameSign(r1, r2)) {\n    return /*DON'T_INTERSECT*/;\n  }\n\n  // Line segments intersect: compute intersection point.\n  denom = a1 * b2 - a2 * b1;\n  if (denom === 0) {\n    return /*COLLINEAR*/;\n  }\n\n  offset = Math.abs(denom / 2);\n\n  // The denom/2 is to get rounding instead of truncating. It\n  // is added or subtracted to the numerator, depending upon the\n  // sign of the numerator.\n  num = b1 * c2 - b2 * c1;\n  x = num < 0 ? (num - offset) / denom : (num + offset) / denom;\n\n  num = a2 * c1 - a1 * c2;\n  y = num < 0 ? (num - offset) / denom : (num + offset) / denom;\n\n  return { x: x, y: y };\n}\n\n/**\n * @param r1\n * @param r2\n */\nfunction sameSign(r1, r2) {\n  return r1 * r2 > 0;\n}\n\nexport default intersectLine;\n","/* eslint \"no-console\": off */\n\nimport intersectLine from './intersect-line';\n\nexport default intersectPolygon;\n\n/**\n * Returns the point ({x, y}) at which the point argument intersects with the node argument assuming\n * that it has the shape specified by polygon.\n *\n * @param node\n * @param polyPoints\n * @param point\n */\nfunction intersectPolygon(node, polyPoints, point) {\n  var x1 = node.x;\n  var y1 = node.y;\n\n  var intersections = [];\n\n  var minX = Number.POSITIVE_INFINITY;\n  var minY = Number.POSITIVE_INFINITY;\n  if (typeof polyPoints.forEach === 'function') {\n    polyPoints.forEach(function (entry) {\n      minX = Math.min(minX, entry.x);\n      minY = Math.min(minY, entry.y);\n    });\n  } else {\n    minX = Math.min(minX, polyPoints.x);\n    minY = Math.min(minY, polyPoints.y);\n  }\n\n  var left = x1 - node.width / 2 - minX;\n  var top = y1 - node.height / 2 - minY;\n\n  for (var i = 0; i < polyPoints.length; i++) {\n    var p1 = polyPoints[i];\n    var p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0];\n    var intersect = intersectLine(\n      node,\n      point,\n      { x: left + p1.x, y: top + p1.y },\n      { x: left + p2.x, y: top + p2.y }\n    );\n    if (intersect) {\n      intersections.push(intersect);\n    }\n  }\n\n  if (!intersections.length) {\n    // console.log('NO INTERSECTION FOUND, RETURN NODE CENTER', node);\n    return node;\n  }\n\n  if (intersections.length > 1) {\n    // More intersections, find the one nearest to edge end point\n    intersections.sort(function (p, q) {\n      var pdx = p.x - point.x;\n      var pdy = p.y - point.y;\n      var distp = Math.sqrt(pdx * pdx + pdy * pdy);\n\n      var qdx = q.x - point.x;\n      var qdy = q.y - point.y;\n      var distq = Math.sqrt(qdx * qdx + qdy * qdy);\n\n      return distp < distq ? -1 : distp === distq ? 0 : 1;\n    });\n  }\n  return intersections[0];\n}\n","const intersectRect = (node, point) => {\n  var x = node.x;\n  var y = node.y;\n\n  // Rectangle intersection algorithm from:\n  // https://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\n  var dx = point.x - x;\n  var dy = point.y - y;\n  var w = node.width / 2;\n  var h = node.height / 2;\n\n  var sx, sy;\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\n    // Intersection is top or bottom of rect.\n    if (dy < 0) {\n      h = -h;\n    }\n    sx = dy === 0 ? 0 : (h * dx) / dy;\n    sy = h;\n  } else {\n    // Intersection is left or right of rect.\n    if (dx < 0) {\n      w = -w;\n    }\n    sx = w;\n    sy = dx === 0 ? 0 : (w * dy) / dx;\n  }\n\n  return { x: x + sx, y: y + sy };\n};\n\nexport default intersectRect;\n","/*\n * Borrowed with love from from dagre-d3. Many thanks to cpettitt!\n */\n\nimport node from './intersect-node.js';\nimport circle from './intersect-circle.js';\nimport ellipse from './intersect-ellipse.js';\nimport polygon from './intersect-polygon.js';\nimport rect from './intersect-rect.js';\n\nexport default {\n  node,\n  circle,\n  ellipse,\n  polygon,\n  rect,\n};\n","import { updateNodeBounds, labelHelper } from './util';\nimport { log } from '../../logger';\nimport intersect from '../intersect/index.js';\n\nconst note = (parent, node) => {\n  const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes, true);\n\n  log.info('Classes = ', node.classes);\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  rect\n    .attr('rx', node.rx)\n    .attr('ry', node.ry)\n    .attr('x', -bbox.width / 2 - halfPadding)\n    .attr('y', -bbox.height / 2 - halfPadding)\n    .attr('width', bbox.width + node.padding)\n    .attr('height', bbox.height + node.padding);\n\n  updateNodeBounds(node, rect);\n\n  node.intersect = function (point) {\n    return intersect.rect(node, point);\n  };\n\n  return shapeSvg;\n};\n\nexport default note;\n","import { select } from 'd3';\nimport { log } from '../logger';\nimport { labelHelper, updateNodeBounds, insertPolygonShape } from './shapes/util';\nimport { getConfig } from '../config';\nimport intersect from './intersect/index.js';\nimport createLabel from './createLabel';\nimport note from './shapes/note';\nimport { parseMember } from '../diagrams/class/svgDraw';\nimport { evaluate } from '../diagrams/common/common';\n\nconst question = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const w = bbox.width + node.padding;\n  const h = bbox.height + node.padding;\n  const s = w + h;\n  const points = [\n    { x: s / 2, y: 0 },\n    { x: s, y: -s / 2 },\n    { x: s / 2, y: -s },\n    { x: 0, y: -s / 2 },\n  ];\n\n  log.info('Question main (Circle)');\n\n  const questionElem = insertPolygonShape(shapeSvg, s, s, points);\n  questionElem.attr('style', node.style);\n  updateNodeBounds(node, questionElem);\n\n  node.intersect = function (point) {\n    log.warn('Intersect called');\n    return intersect.polygon(node, points, point);\n  };\n\n  return shapeSvg;\n};\n\nconst choice = (parent, node) => {\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', 'node default')\n    .attr('id', node.domId || node.id);\n\n  const s = 28;\n  const points = [\n    { x: 0, y: s / 2 },\n    { x: s / 2, y: 0 },\n    { x: 0, y: -s / 2 },\n    { x: -s / 2, y: 0 },\n  ];\n\n  const choice = shapeSvg.insert('polygon', ':first-child').attr(\n    'points',\n    points\n      .map(function (d) {\n        return d.x + ',' + d.y;\n      })\n      .join(' ')\n  );\n  // center the circle around its coordinate\n  choice.attr('class', 'state-start').attr('r', 7).attr('width', 28).attr('height', 28);\n  node.width = 28;\n  node.height = 28;\n\n  node.intersect = function (point) {\n    return intersect.circle(node, 14, point);\n  };\n\n  return shapeSvg;\n};\n\nconst hexagon = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const f = 4;\n  const h = bbox.height + node.padding;\n  const m = h / f;\n  const w = bbox.width + 2 * m + node.padding;\n  const points = [\n    { x: m, y: 0 },\n    { x: w - m, y: 0 },\n    { x: w, y: -h / 2 },\n    { x: w - m, y: -h },\n    { x: m, y: -h },\n    { x: 0, y: -h / 2 },\n  ];\n\n  const hex = insertPolygonShape(shapeSvg, w, h, points);\n  hex.attr('style', node.style);\n  updateNodeBounds(node, hex);\n\n  node.intersect = function (point) {\n    return intersect.polygon(node, points, point);\n  };\n\n  return shapeSvg;\n};\n\nconst rect_left_inv_arrow = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const w = bbox.width + node.padding;\n  const h = bbox.height + node.padding;\n  const points = [\n    { x: -h / 2, y: 0 },\n    { x: w, y: 0 },\n    { x: w, y: -h },\n    { x: -h / 2, y: -h },\n    { x: 0, y: -h / 2 },\n  ];\n\n  const el = insertPolygonShape(shapeSvg, w, h, points);\n  el.attr('style', node.style);\n\n  node.width = w + h;\n  node.height = h;\n\n  node.intersect = function (point) {\n    return intersect.polygon(node, points, point);\n  };\n\n  return shapeSvg;\n};\n\nconst lean_right = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const w = bbox.width + node.padding;\n  const h = bbox.height + node.padding;\n  const points = [\n    { x: (-2 * h) / 6, y: 0 },\n    { x: w - h / 6, y: 0 },\n    { x: w + (2 * h) / 6, y: -h },\n    { x: h / 6, y: -h },\n  ];\n\n  const el = insertPolygonShape(shapeSvg, w, h, points);\n  el.attr('style', node.style);\n  updateNodeBounds(node, el);\n\n  node.intersect = function (point) {\n    return intersect.polygon(node, points, point);\n  };\n\n  return shapeSvg;\n};\n\nconst lean_left = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const w = bbox.width + node.padding;\n  const h = bbox.height + node.padding;\n  const points = [\n    { x: (2 * h) / 6, y: 0 },\n    { x: w + h / 6, y: 0 },\n    { x: w - (2 * h) / 6, y: -h },\n    { x: -h / 6, y: -h },\n  ];\n\n  const el = insertPolygonShape(shapeSvg, w, h, points);\n  el.attr('style', node.style);\n  updateNodeBounds(node, el);\n\n  node.intersect = function (point) {\n    return intersect.polygon(node, points, point);\n  };\n\n  return shapeSvg;\n};\n\nconst trapezoid = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const w = bbox.width + node.padding;\n  const h = bbox.height + node.padding;\n  const points = [\n    { x: (-2 * h) / 6, y: 0 },\n    { x: w + (2 * h) / 6, y: 0 },\n    { x: w - h / 6, y: -h },\n    { x: h / 6, y: -h },\n  ];\n\n  const el = insertPolygonShape(shapeSvg, w, h, points);\n  el.attr('style', node.style);\n  updateNodeBounds(node, el);\n\n  node.intersect = function (point) {\n    return intersect.polygon(node, points, point);\n  };\n\n  return shapeSvg;\n};\n\nconst inv_trapezoid = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const w = bbox.width + node.padding;\n  const h = bbox.height + node.padding;\n  const points = [\n    { x: h / 6, y: 0 },\n    { x: w - h / 6, y: 0 },\n    { x: w + (2 * h) / 6, y: -h },\n    { x: (-2 * h) / 6, y: -h },\n  ];\n\n  const el = insertPolygonShape(shapeSvg, w, h, points);\n  el.attr('style', node.style);\n  updateNodeBounds(node, el);\n\n  node.intersect = function (point) {\n    return intersect.polygon(node, points, point);\n  };\n\n  return shapeSvg;\n};\n\nconst rect_right_inv_arrow = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const w = bbox.width + node.padding;\n  const h = bbox.height + node.padding;\n  const points = [\n    { x: 0, y: 0 },\n    { x: w + h / 2, y: 0 },\n    { x: w, y: -h / 2 },\n    { x: w + h / 2, y: -h },\n    { x: 0, y: -h },\n  ];\n\n  const el = insertPolygonShape(shapeSvg, w, h, points);\n  el.attr('style', node.style);\n  updateNodeBounds(node, el);\n\n  node.intersect = function (point) {\n    return intersect.polygon(node, points, point);\n  };\n\n  return shapeSvg;\n};\n\nconst cylinder = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const w = bbox.width + node.padding;\n  const rx = w / 2;\n  const ry = rx / (2.5 + w / 50);\n  const h = bbox.height + ry + node.padding;\n\n  const shape =\n    'M 0,' +\n    ry +\n    ' a ' +\n    rx +\n    ',' +\n    ry +\n    ' 0,0,0 ' +\n    w +\n    ' 0 a ' +\n    rx +\n    ',' +\n    ry +\n    ' 0,0,0 ' +\n    -w +\n    ' 0 l 0,' +\n    h +\n    ' a ' +\n    rx +\n    ',' +\n    ry +\n    ' 0,0,0 ' +\n    w +\n    ' 0 l 0,' +\n    -h;\n\n  const el = shapeSvg\n    .attr('label-offset-y', ry)\n    .insert('path', ':first-child')\n    .attr('style', node.style)\n    .attr('d', shape)\n    .attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2 + ry) + ')');\n\n  updateNodeBounds(node, el);\n\n  node.intersect = function (point) {\n    const pos = intersect.rect(node, point);\n    const x = pos.x - node.x;\n\n    if (\n      rx != 0 &&\n      (Math.abs(x) < node.width / 2 ||\n        (Math.abs(x) == node.width / 2 && Math.abs(pos.y - node.y) > node.height / 2 - ry))\n    ) {\n      // ellipsis equation: x*x / a*a + y*y / b*b = 1\n      // solve for y to get adjusted value for pos.y\n      let y = ry * ry * (1 - (x * x) / (rx * rx));\n      if (y != 0) {\n        y = Math.sqrt(y);\n      }\n      y = ry - y;\n      if (point.y - node.y > 0) {\n        y = -y;\n      }\n\n      pos.y += y;\n    }\n\n    return pos;\n  };\n\n  return shapeSvg;\n};\n\nconst rect = (parent, node) => {\n  const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes, true);\n\n  log.trace('Classes = ', node.classes);\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  const totalWidth = bbox.width + node.padding;\n  const totalHeight = bbox.height + node.padding;\n  rect\n    .attr('class', 'basic label-container')\n    .attr('style', node.style)\n    .attr('rx', node.rx)\n    .attr('ry', node.ry)\n    .attr('x', -bbox.width / 2 - halfPadding)\n    .attr('y', -bbox.height / 2 - halfPadding)\n    .attr('width', totalWidth)\n    .attr('height', totalHeight);\n\n  if (node.props) {\n    const propKeys = new Set(Object.keys(node.props));\n    if (node.props.borders) {\n      applyNodePropertyBorders(rect, node.props.borders, totalWidth, totalHeight);\n      propKeys.delete('borders');\n    }\n    propKeys.forEach((propKey) => {\n      log.warn(`Unknown node property ${propKey}`);\n    });\n  }\n\n  updateNodeBounds(node, rect);\n\n  node.intersect = function (point) {\n    return intersect.rect(node, point);\n  };\n\n  return shapeSvg;\n};\n\nconst labelRect = (parent, node) => {\n  const { shapeSvg } = labelHelper(parent, node, 'label', true);\n\n  log.trace('Classes = ', node.classes);\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  // Hide the rect we are only after the label\n  const totalWidth = 0;\n  const totalHeight = 0;\n  rect.attr('width', totalWidth).attr('height', totalHeight);\n  shapeSvg.attr('class', 'label edgeLabel');\n\n  if (node.props) {\n    const propKeys = new Set(Object.keys(node.props));\n    if (node.props.borders) {\n      applyNodePropertyBorders(rect, node.props.borders, totalWidth, totalHeight);\n      propKeys.delete('borders');\n    }\n    propKeys.forEach((propKey) => {\n      log.warn(`Unknown node property ${propKey}`);\n    });\n  }\n\n  updateNodeBounds(node, rect);\n\n  node.intersect = function (point) {\n    return intersect.rect(node, point);\n  };\n\n  return shapeSvg;\n};\n\n/**\n * @param rect\n * @param borders\n * @param totalWidth\n * @param totalHeight\n */\nfunction applyNodePropertyBorders(rect, borders, totalWidth, totalHeight) {\n  const strokeDashArray = [];\n  const addBorder = (length) => {\n    strokeDashArray.push(length, 0);\n  };\n  const skipBorder = (length) => {\n    strokeDashArray.push(0, length);\n  };\n  if (borders.includes('t')) {\n    log.debug('add top border');\n    addBorder(totalWidth);\n  } else {\n    skipBorder(totalWidth);\n  }\n  if (borders.includes('r')) {\n    log.debug('add right border');\n    addBorder(totalHeight);\n  } else {\n    skipBorder(totalHeight);\n  }\n  if (borders.includes('b')) {\n    log.debug('add bottom border');\n    addBorder(totalWidth);\n  } else {\n    skipBorder(totalWidth);\n  }\n  if (borders.includes('l')) {\n    log.debug('add left border');\n    addBorder(totalHeight);\n  } else {\n    skipBorder(totalHeight);\n  }\n  rect.attr('stroke-dasharray', strokeDashArray.join(' '));\n}\n\nconst rectWithTitle = (parent, node) => {\n  // const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes);\n\n  let classes;\n  if (!node.classes) {\n    classes = 'node default';\n  } else {\n    classes = 'node ' + node.classes;\n  }\n  // Add outer g element\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', classes)\n    .attr('id', node.domId || node.id);\n\n  // Create the title label and insert it after the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n  // const innerRect = shapeSvg.insert('rect');\n  const innerLine = shapeSvg.insert('line');\n\n  const label = shapeSvg.insert('g').attr('class', 'label');\n\n  const text2 = node.labelText.flat ? node.labelText.flat() : node.labelText;\n  // const text2 = typeof text2prim === 'object' ? text2prim[0] : text2prim;\n\n  let title = '';\n  if (typeof text2 === 'object') {\n    title = text2[0];\n  } else {\n    title = text2;\n  }\n  log.info('Label text abc79', title, text2, typeof text2 === 'object');\n\n  const text = label.node().appendChild(createLabel(title, node.labelStyle, true, true));\n  let bbox = { width: 0, height: 0 };\n  if (evaluate(getConfig().flowchart.htmlLabels)) {\n    const div = text.children[0];\n    const dv = select(text);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n  log.info('Text 2', text2);\n  const textRows = text2.slice(1, text2.length);\n  let titleBox = text.getBBox();\n  const descr = label\n    .node()\n    .appendChild(\n      createLabel(textRows.join ? textRows.join('<br/>') : textRows, node.labelStyle, true, true)\n    );\n\n  if (evaluate(getConfig().flowchart.htmlLabels)) {\n    const div = descr.children[0];\n    const dv = select(descr);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n  // bbox = label.getBBox();\n  // log.info(descr);\n  const halfPadding = node.padding / 2;\n  select(descr).attr(\n    'transform',\n    'translate( ' +\n      // (titleBox.width - bbox.width) / 2 +\n      (bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) +\n      ', ' +\n      (titleBox.height + halfPadding + 5) +\n      ')'\n  );\n  select(text).attr(\n    'transform',\n    'translate( ' +\n      // (titleBox.width - bbox.width) / 2 +\n      (bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) +\n      ', ' +\n      0 +\n      ')'\n  );\n  // Get the size of the label\n\n  // Bounding box for title and text\n  bbox = label.node().getBBox();\n\n  // Center the label\n  label.attr(\n    'transform',\n    'translate(' + -bbox.width / 2 + ', ' + (-bbox.height / 2 - halfPadding + 3) + ')'\n  );\n\n  rect\n    .attr('class', 'outer title-state')\n    .attr('x', -bbox.width / 2 - halfPadding)\n    .attr('y', -bbox.height / 2 - halfPadding)\n    .attr('width', bbox.width + node.padding)\n    .attr('height', bbox.height + node.padding);\n\n  innerLine\n    .attr('class', 'divider')\n    .attr('x1', -bbox.width / 2 - halfPadding)\n    .attr('x2', bbox.width / 2 + halfPadding)\n    .attr('y1', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding)\n    .attr('y2', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding);\n\n  updateNodeBounds(node, rect);\n\n  node.intersect = function (point) {\n    return intersect.rect(node, point);\n  };\n\n  return shapeSvg;\n};\n\nconst stadium = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const h = bbox.height + node.padding;\n  const w = bbox.width + h / 4 + node.padding;\n\n  // add the rect\n  const rect = shapeSvg\n    .insert('rect', ':first-child')\n    .attr('style', node.style)\n    .attr('rx', h / 2)\n    .attr('ry', h / 2)\n    .attr('x', -w / 2)\n    .attr('y', -h / 2)\n    .attr('width', w)\n    .attr('height', h);\n\n  updateNodeBounds(node, rect);\n\n  node.intersect = function (point) {\n    return intersect.rect(node, point);\n  };\n\n  return shapeSvg;\n};\n\nconst circle = (parent, node) => {\n  const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, undefined, true);\n  const circle = shapeSvg.insert('circle', ':first-child');\n\n  // center the circle around its coordinate\n  circle\n    .attr('style', node.style)\n    .attr('rx', node.rx)\n    .attr('ry', node.ry)\n    .attr('r', bbox.width / 2 + halfPadding)\n    .attr('width', bbox.width + node.padding)\n    .attr('height', bbox.height + node.padding);\n\n  log.info('Circle main');\n\n  updateNodeBounds(node, circle);\n\n  node.intersect = function (point) {\n    log.info('Circle intersect', node, bbox.width / 2 + halfPadding, point);\n    return intersect.circle(node, bbox.width / 2 + halfPadding, point);\n  };\n\n  return shapeSvg;\n};\n\nconst doublecircle = (parent, node) => {\n  const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, undefined, true);\n  const gap = 5;\n  const circleGroup = shapeSvg.insert('g', ':first-child');\n  const outerCircle = circleGroup.insert('circle');\n  const innerCircle = circleGroup.insert('circle');\n\n  // center the circle around its coordinate\n  outerCircle\n    .attr('style', node.style)\n    .attr('rx', node.rx)\n    .attr('ry', node.ry)\n    .attr('r', bbox.width / 2 + halfPadding + gap)\n    .attr('width', bbox.width + node.padding + gap * 2)\n    .attr('height', bbox.height + node.padding + gap * 2);\n\n  innerCircle\n    .attr('style', node.style)\n    .attr('rx', node.rx)\n    .attr('ry', node.ry)\n    .attr('r', bbox.width / 2 + halfPadding)\n    .attr('width', bbox.width + node.padding)\n    .attr('height', bbox.height + node.padding);\n\n  log.info('DoubleCircle main');\n\n  updateNodeBounds(node, outerCircle);\n\n  node.intersect = function (point) {\n    log.info('DoubleCircle intersect', node, bbox.width / 2 + halfPadding + gap, point);\n    return intersect.circle(node, bbox.width / 2 + halfPadding + gap, point);\n  };\n\n  return shapeSvg;\n};\n\nconst subroutine = (parent, node) => {\n  const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n  const w = bbox.width + node.padding;\n  const h = bbox.height + node.padding;\n  const points = [\n    { x: 0, y: 0 },\n    { x: w, y: 0 },\n    { x: w, y: -h },\n    { x: 0, y: -h },\n    { x: 0, y: 0 },\n    { x: -8, y: 0 },\n    { x: w + 8, y: 0 },\n    { x: w + 8, y: -h },\n    { x: -8, y: -h },\n    { x: -8, y: 0 },\n  ];\n\n  const el = insertPolygonShape(shapeSvg, w, h, points);\n  el.attr('style', node.style);\n  updateNodeBounds(node, el);\n\n  node.intersect = function (point) {\n    return intersect.polygon(node, points, point);\n  };\n\n  return shapeSvg;\n};\n\nconst start = (parent, node) => {\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', 'node default')\n    .attr('id', node.domId || node.id);\n  const circle = shapeSvg.insert('circle', ':first-child');\n\n  // center the circle around its coordinate\n  circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);\n\n  updateNodeBounds(node, circle);\n\n  node.intersect = function (point) {\n    return intersect.circle(node, 7, point);\n  };\n\n  return shapeSvg;\n};\n\nconst forkJoin = (parent, node, dir) => {\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', 'node default')\n    .attr('id', node.domId || node.id);\n\n  let width = 70;\n  let height = 10;\n\n  if (dir === 'LR') {\n    width = 10;\n    height = 70;\n  }\n\n  const shape = shapeSvg\n    .append('rect')\n    .attr('x', (-1 * width) / 2)\n    .attr('y', (-1 * height) / 2)\n    .attr('width', width)\n    .attr('height', height)\n    .attr('class', 'fork-join');\n\n  updateNodeBounds(node, shape);\n  node.height = node.height + node.padding / 2;\n  node.width = node.width + node.padding / 2;\n  node.intersect = function (point) {\n    return intersect.rect(node, point);\n  };\n\n  return shapeSvg;\n};\n\nconst end = (parent, node) => {\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', 'node default')\n    .attr('id', node.domId || node.id);\n  const innerCircle = shapeSvg.insert('circle', ':first-child');\n  const circle = shapeSvg.insert('circle', ':first-child');\n\n  circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);\n\n  innerCircle.attr('class', 'state-end').attr('r', 5).attr('width', 10).attr('height', 10);\n\n  updateNodeBounds(node, circle);\n\n  node.intersect = function (point) {\n    return intersect.circle(node, 7, point);\n  };\n\n  return shapeSvg;\n};\n\nconst class_box = (parent, node) => {\n  const halfPadding = node.padding / 2;\n  const rowPadding = 4;\n  const lineHeight = 8;\n\n  let classes;\n  if (!node.classes) {\n    classes = 'node default';\n  } else {\n    classes = 'node ' + node.classes;\n  }\n  // Add outer g element\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', classes)\n    .attr('id', node.domId || node.id);\n\n  // Create the title label and insert it after the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n  const topLine = shapeSvg.insert('line');\n  const bottomLine = shapeSvg.insert('line');\n  let maxWidth = 0;\n  let maxHeight = rowPadding;\n\n  const labelContainer = shapeSvg.insert('g').attr('class', 'label');\n  let verticalPos = 0;\n  const hasInterface = node.classData.annotations && node.classData.annotations[0];\n\n  // 1. Create the labels\n  const interfaceLabelText = node.classData.annotations[0]\n    ? '«' + node.classData.annotations[0] + '»'\n    : '';\n  const interfaceLabel = labelContainer\n    .node()\n    .appendChild(createLabel(interfaceLabelText, node.labelStyle, true, true));\n  let interfaceBBox = interfaceLabel.getBBox();\n  if (evaluate(getConfig().flowchart.htmlLabels)) {\n    const div = interfaceLabel.children[0];\n    const dv = select(interfaceLabel);\n    interfaceBBox = div.getBoundingClientRect();\n    dv.attr('width', interfaceBBox.width);\n    dv.attr('height', interfaceBBox.height);\n  }\n  if (node.classData.annotations[0]) {\n    maxHeight += interfaceBBox.height + rowPadding;\n    maxWidth += interfaceBBox.width;\n  }\n\n  let classTitleString = node.classData.label;\n\n  if (node.classData.type !== undefined && node.classData.type !== '') {\n    if (getConfig().flowchart.htmlLabels) {\n      classTitleString += '&lt;' + node.classData.type + '&gt;';\n    } else {\n      classTitleString += '<' + node.classData.type + '>';\n    }\n  }\n  const classTitleLabel = labelContainer\n    .node()\n    .appendChild(createLabel(classTitleString, node.labelStyle, true, true));\n  select(classTitleLabel).attr('class', 'classTitle');\n  let classTitleBBox = classTitleLabel.getBBox();\n  if (evaluate(getConfig().flowchart.htmlLabels)) {\n    const div = classTitleLabel.children[0];\n    const dv = select(classTitleLabel);\n    classTitleBBox = div.getBoundingClientRect();\n    dv.attr('width', classTitleBBox.width);\n    dv.attr('height', classTitleBBox.height);\n  }\n  maxHeight += classTitleBBox.height + rowPadding;\n  if (classTitleBBox.width > maxWidth) {\n    maxWidth = classTitleBBox.width;\n  }\n  const classAttributes = [];\n  node.classData.members.forEach((str) => {\n    const parsedInfo = parseMember(str);\n    let parsedText = parsedInfo.displayText;\n    if (getConfig().flowchart.htmlLabels) {\n      parsedText = parsedText.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n    }\n    const lbl = labelContainer\n      .node()\n      .appendChild(\n        createLabel(\n          parsedText,\n          parsedInfo.cssStyle ? parsedInfo.cssStyle : node.labelStyle,\n          true,\n          true\n        )\n      );\n    let bbox = lbl.getBBox();\n    if (evaluate(getConfig().flowchart.htmlLabels)) {\n      const div = lbl.children[0];\n      const dv = select(lbl);\n      bbox = div.getBoundingClientRect();\n      dv.attr('width', bbox.width);\n      dv.attr('height', bbox.height);\n    }\n    if (bbox.width > maxWidth) {\n      maxWidth = bbox.width;\n    }\n    maxHeight += bbox.height + rowPadding;\n    classAttributes.push(lbl);\n  });\n\n  maxHeight += lineHeight;\n\n  const classMethods = [];\n  node.classData.methods.forEach((str) => {\n    const parsedInfo = parseMember(str);\n    let displayText = parsedInfo.displayText;\n    if (getConfig().flowchart.htmlLabels) {\n      displayText = displayText.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n    }\n    const lbl = labelContainer\n      .node()\n      .appendChild(\n        createLabel(\n          displayText,\n          parsedInfo.cssStyle ? parsedInfo.cssStyle : node.labelStyle,\n          true,\n          true\n        )\n      );\n    let bbox = lbl.getBBox();\n    if (evaluate(getConfig().flowchart.htmlLabels)) {\n      const div = lbl.children[0];\n      const dv = select(lbl);\n      bbox = div.getBoundingClientRect();\n      dv.attr('width', bbox.width);\n      dv.attr('height', bbox.height);\n    }\n    if (bbox.width > maxWidth) {\n      maxWidth = bbox.width;\n    }\n    maxHeight += bbox.height + rowPadding;\n\n    classMethods.push(lbl);\n  });\n\n  maxHeight += lineHeight;\n\n  // 2. Position the labels\n\n  // position the interface label\n  if (hasInterface) {\n    let diffX = (maxWidth - interfaceBBox.width) / 2;\n    select(interfaceLabel).attr(\n      'transform',\n      'translate( ' + ((-1 * maxWidth) / 2 + diffX) + ', ' + (-1 * maxHeight) / 2 + ')'\n    );\n    verticalPos = interfaceBBox.height + rowPadding;\n  }\n  // Position the class title label\n  let diffX = (maxWidth - classTitleBBox.width) / 2;\n  select(classTitleLabel).attr(\n    'transform',\n    'translate( ' +\n      ((-1 * maxWidth) / 2 + diffX) +\n      ', ' +\n      ((-1 * maxHeight) / 2 + verticalPos) +\n      ')'\n  );\n  verticalPos += classTitleBBox.height + rowPadding;\n\n  topLine\n    .attr('class', 'divider')\n    .attr('x1', -maxWidth / 2 - halfPadding)\n    .attr('x2', maxWidth / 2 + halfPadding)\n    .attr('y1', -maxHeight / 2 - halfPadding + lineHeight + verticalPos)\n    .attr('y2', -maxHeight / 2 - halfPadding + lineHeight + verticalPos);\n\n  verticalPos += lineHeight;\n\n  classAttributes.forEach((lbl) => {\n    select(lbl).attr(\n      'transform',\n      'translate( ' +\n        -maxWidth / 2 +\n        ', ' +\n        ((-1 * maxHeight) / 2 + verticalPos + lineHeight / 2) +\n        ')'\n    );\n    verticalPos += classTitleBBox.height + rowPadding;\n  });\n\n  verticalPos += lineHeight;\n  bottomLine\n    .attr('class', 'divider')\n    .attr('x1', -maxWidth / 2 - halfPadding)\n    .attr('x2', maxWidth / 2 + halfPadding)\n    .attr('y1', -maxHeight / 2 - halfPadding + lineHeight + verticalPos)\n    .attr('y2', -maxHeight / 2 - halfPadding + lineHeight + verticalPos);\n\n  verticalPos += lineHeight;\n\n  classMethods.forEach((lbl) => {\n    select(lbl).attr(\n      'transform',\n      'translate( ' + -maxWidth / 2 + ', ' + ((-1 * maxHeight) / 2 + verticalPos) + ')'\n    );\n    verticalPos += classTitleBBox.height + rowPadding;\n  });\n\n  rect\n    .attr('class', 'outer title-state')\n    .attr('x', -maxWidth / 2 - halfPadding)\n    .attr('y', -(maxHeight / 2) - halfPadding)\n    .attr('width', maxWidth + node.padding)\n    .attr('height', maxHeight + node.padding);\n\n  updateNodeBounds(node, rect);\n\n  node.intersect = function (point) {\n    return intersect.rect(node, point);\n  };\n\n  return shapeSvg;\n};\n\nconst shapes = {\n  rhombus: question,\n  question,\n  rect,\n  labelRect,\n  rectWithTitle,\n  choice,\n  circle,\n  doublecircle,\n  stadium,\n  hexagon,\n  rect_left_inv_arrow,\n  lean_right,\n  lean_left,\n  trapezoid,\n  inv_trapezoid,\n  rect_right_inv_arrow,\n  cylinder,\n  start,\n  end,\n  note,\n  subroutine,\n  fork: forkJoin,\n  join: forkJoin,\n  class_box,\n};\n\nlet nodeElems = {};\n\nexport const insertNode = (elem, node, dir) => {\n  let newEl;\n  let el;\n\n  // Add link when appropriate\n  if (node.link) {\n    let target;\n    if (getConfig().securityLevel === 'sandbox') {\n      target = '_top';\n    } else if (node.linkTarget) {\n      target = node.linkTarget || '_blank';\n    }\n    newEl = elem.insert('svg:a').attr('xlink:href', node.link).attr('target', target);\n    el = shapes[node.shape](newEl, node, dir);\n  } else {\n    el = shapes[node.shape](elem, node, dir);\n    newEl = el;\n  }\n  if (node.tooltip) {\n    el.attr('title', node.tooltip);\n  }\n  if (node.class) {\n    el.attr('class', 'node default ' + node.class);\n  }\n\n  nodeElems[node.id] = newEl;\n\n  if (node.haveCallback) {\n    nodeElems[node.id].attr('class', nodeElems[node.id].attr('class') + ' clickable');\n  }\n  return newEl;\n};\nexport const setNodeElem = (elem, node) => {\n  nodeElems[node.id] = elem;\n};\nexport const clear = () => {\n  nodeElems = {};\n};\n\nexport const positionNode = (node) => {\n  const el = nodeElems[node.id];\n  log.trace(\n    'Transforming node',\n    node.diff,\n    node,\n    'translate(' + (node.x - node.width / 2 - 5) + ', ' + node.width / 2 + ')'\n  );\n  const padding = 8;\n  const diff = node.diff || 0;\n  if (node.clusterNode) {\n    el.attr(\n      'transform',\n      'translate(' +\n        (node.x + diff - node.width / 2) +\n        ', ' +\n        (node.y - node.height / 2 - padding) +\n        ')'\n    );\n  } else {\n    el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');\n  }\n  return diff;\n};\n","import { log } from '../logger';\nimport createLabel from './createLabel';\nimport { line, curveBasis, select } from 'd3';\nimport { getConfig } from '../config';\nimport utils from '../utils';\nimport { evaluate } from '../diagrams/common/common';\n\nlet edgeLabels = {};\nlet terminalLabels = {};\n\nexport const clear = () => {\n  edgeLabels = {};\n  terminalLabels = {};\n};\n\nexport const insertEdgeLabel = (elem, edge) => {\n  // Create the actual text element\n  const labelElement = createLabel(edge.label, edge.labelStyle);\n\n  // Create outer g, edgeLabel, this will be positioned after graph layout\n  const edgeLabel = elem.insert('g').attr('class', 'edgeLabel');\n\n  // Create inner g, label, this will be positioned now for centering the text\n  const label = edgeLabel.insert('g').attr('class', 'label');\n  label.node().appendChild(labelElement);\n\n  // Center the label\n  let bbox = labelElement.getBBox();\n  if (evaluate(getConfig().flowchart.htmlLabels)) {\n    const div = labelElement.children[0];\n    const dv = select(labelElement);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n  label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n\n  // Make element accessible by id for positioning\n  edgeLabels[edge.id] = edgeLabel;\n\n  // Update the abstract data of the edge with the new information about its width and height\n  edge.width = bbox.width;\n  edge.height = bbox.height;\n\n  let fo;\n  if (edge.startLabelLeft) {\n    // Create the actual text element\n    const startLabelElement = createLabel(edge.startLabelLeft, edge.labelStyle);\n    const startEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n    const inner = startEdgeLabelLeft.insert('g').attr('class', 'inner');\n    fo = inner.node().appendChild(startLabelElement);\n    const slBox = startLabelElement.getBBox();\n    inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n    if (!terminalLabels[edge.id]) {\n      terminalLabels[edge.id] = {};\n    }\n    terminalLabels[edge.id].startLeft = startEdgeLabelLeft;\n    setTerminalWidth(fo, edge.startLabelLeft);\n  }\n  if (edge.startLabelRight) {\n    // Create the actual text element\n    const startLabelElement = createLabel(edge.startLabelRight, edge.labelStyle);\n    const startEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n    const inner = startEdgeLabelRight.insert('g').attr('class', 'inner');\n    fo = startEdgeLabelRight.node().appendChild(startLabelElement);\n    inner.node().appendChild(startLabelElement);\n    const slBox = startLabelElement.getBBox();\n    inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n    if (!terminalLabels[edge.id]) {\n      terminalLabels[edge.id] = {};\n    }\n    terminalLabels[edge.id].startRight = startEdgeLabelRight;\n    setTerminalWidth(fo, edge.startLabelRight);\n  }\n  if (edge.endLabelLeft) {\n    // Create the actual text element\n    const endLabelElement = createLabel(edge.endLabelLeft, edge.labelStyle);\n    const endEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n    const inner = endEdgeLabelLeft.insert('g').attr('class', 'inner');\n    fo = inner.node().appendChild(endLabelElement);\n    const slBox = endLabelElement.getBBox();\n    inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n    endEdgeLabelLeft.node().appendChild(endLabelElement);\n\n    if (!terminalLabels[edge.id]) {\n      terminalLabels[edge.id] = {};\n    }\n    terminalLabels[edge.id].endLeft = endEdgeLabelLeft;\n    setTerminalWidth(fo, edge.endLabelLeft);\n  }\n  if (edge.endLabelRight) {\n    // Create the actual text element\n    const endLabelElement = createLabel(edge.endLabelRight, edge.labelStyle);\n    const endEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n    const inner = endEdgeLabelRight.insert('g').attr('class', 'inner');\n\n    fo = inner.node().appendChild(endLabelElement);\n    const slBox = endLabelElement.getBBox();\n    inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n    endEdgeLabelRight.node().appendChild(endLabelElement);\n    if (!terminalLabels[edge.id]) {\n      terminalLabels[edge.id] = {};\n    }\n    terminalLabels[edge.id].endRight = endEdgeLabelRight;\n    setTerminalWidth(fo, edge.endLabelRight);\n  }\n  return labelElement;\n};\n\n/**\n * @param {any} fo\n * @param {any} value\n */\nfunction setTerminalWidth(fo, value) {\n  if (getConfig().flowchart.htmlLabels && fo) {\n    fo.style.width = value.length * 9 + 'px';\n    fo.style.height = '12px';\n  }\n}\n\nexport const positionEdgeLabel = (edge, paths) => {\n  log.info('Moving label abc78 ', edge.id, edge.label, edgeLabels[edge.id]);\n  let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n  if (edge.label) {\n    const el = edgeLabels[edge.id];\n    let x = edge.x;\n    let y = edge.y;\n    if (path) {\n      //   // debugger;\n      const pos = utils.calcLabelPosition(path);\n      log.info(\n        'Moving label ' + edge.label + ' from (',\n        x,\n        ',',\n        y,\n        ') to (',\n        pos.x,\n        ',',\n        pos.y,\n        ') abc78'\n      );\n      if (paths.updatedPath) {\n        x = pos.x;\n        y = pos.y;\n      }\n    }\n    el.attr('transform', 'translate(' + x + ', ' + y + ')');\n  }\n\n  //let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n  if (edge.startLabelLeft) {\n    const el = terminalLabels[edge.id].startLeft;\n    let x = edge.x;\n    let y = edge.y;\n    if (path) {\n      // debugger;\n      const pos = utils.calcTerminalLabelPosition(edge.arrowTypeStart ? 10 : 0, 'start_left', path);\n      x = pos.x;\n      y = pos.y;\n    }\n    el.attr('transform', 'translate(' + x + ', ' + y + ')');\n  }\n  if (edge.startLabelRight) {\n    const el = terminalLabels[edge.id].startRight;\n    let x = edge.x;\n    let y = edge.y;\n    if (path) {\n      // debugger;\n      const pos = utils.calcTerminalLabelPosition(\n        edge.arrowTypeStart ? 10 : 0,\n        'start_right',\n        path\n      );\n      x = pos.x;\n      y = pos.y;\n    }\n    el.attr('transform', 'translate(' + x + ', ' + y + ')');\n  }\n  if (edge.endLabelLeft) {\n    const el = terminalLabels[edge.id].endLeft;\n    let x = edge.x;\n    let y = edge.y;\n    if (path) {\n      // debugger;\n      const pos = utils.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, 'end_left', path);\n      x = pos.x;\n      y = pos.y;\n    }\n    el.attr('transform', 'translate(' + x + ', ' + y + ')');\n  }\n  if (edge.endLabelRight) {\n    const el = terminalLabels[edge.id].endRight;\n    let x = edge.x;\n    let y = edge.y;\n    if (path) {\n      // debugger;\n      const pos = utils.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, 'end_right', path);\n      x = pos.x;\n      y = pos.y;\n    }\n    el.attr('transform', 'translate(' + x + ', ' + y + ')');\n  }\n};\n\nconst outsideNode = (node, point) => {\n  // log.warn('Checking bounds ', node, point);\n  const x = node.x;\n  const y = node.y;\n  const dx = Math.abs(point.x - x);\n  const dy = Math.abs(point.y - y);\n  const w = node.width / 2;\n  const h = node.height / 2;\n  if (dx >= w || dy >= h) {\n    return true;\n  }\n  return false;\n};\n\nexport const intersection = (node, outsidePoint, insidePoint) => {\n  log.warn(`intersection calc abc89:\n  outsidePoint: ${JSON.stringify(outsidePoint)}\n  insidePoint : ${JSON.stringify(insidePoint)}\n  node        : x:${node.x} y:${node.y} w:${node.width} h:${node.height}`);\n  const x = node.x;\n  const y = node.y;\n\n  const dx = Math.abs(x - insidePoint.x);\n  // const dy = Math.abs(y - insidePoint.y);\n  const w = node.width / 2;\n  let r = insidePoint.x < outsidePoint.x ? w - dx : w + dx;\n  const h = node.height / 2;\n\n  // const edges = {\n  //   x1: x - w,\n  //   x2: x + w,\n  //   y1: y - h,\n  //   y2: y + h\n  // };\n\n  // if (\n  //   outsidePoint.x === edges.x1 ||\n  //   outsidePoint.x === edges.x2 ||\n  //   outsidePoint.y === edges.y1 ||\n  //   outsidePoint.y === edges.y2\n  // ) {\n  //   log.warn('abc89 calc equals on edge', outsidePoint, edges);\n  //   return outsidePoint;\n  // }\n\n  const Q = Math.abs(outsidePoint.y - insidePoint.y);\n  const R = Math.abs(outsidePoint.x - insidePoint.x);\n  // log.warn();\n  if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h) {\n    // Intersection is top or bottom of rect.\n    // let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;\n    let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;\n    r = (R * q) / Q;\n    const res = {\n      x: insidePoint.x < outsidePoint.x ? insidePoint.x + r : insidePoint.x - R + r,\n      y: insidePoint.y < outsidePoint.y ? insidePoint.y + Q - q : insidePoint.y - Q + q,\n    };\n\n    if (r === 0) {\n      res.x = outsidePoint.x;\n      res.y = outsidePoint.y;\n    }\n    if (R === 0) {\n      res.x = outsidePoint.x;\n    }\n    if (Q === 0) {\n      res.y = outsidePoint.y;\n    }\n\n    log.warn(`abc89 topp/bott calc, Q ${Q}, q ${q}, R ${R}, r ${r}`, res);\n\n    return res;\n  } else {\n    // Intersection onn sides of rect\n    if (insidePoint.x < outsidePoint.x) {\n      r = outsidePoint.x - w - x;\n    } else {\n      // r = outsidePoint.x - w - x;\n      r = x - w - outsidePoint.x;\n    }\n    let q = (Q * r) / R;\n    //  OK let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x + dx - w;\n    // OK let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : outsidePoint.x + r;\n    let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x - R + r;\n    // let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : outsidePoint.x + r;\n    let _y = insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q;\n    log.warn(`sides calc abc89, Q ${Q}, q ${q}, R ${R}, r ${r}`, { _x, _y });\n    if (r === 0) {\n      _x = outsidePoint.x;\n      _y = outsidePoint.y;\n    }\n    if (R === 0) {\n      _x = outsidePoint.x;\n    }\n    if (Q === 0) {\n      _y = outsidePoint.y;\n    }\n\n    return { x: _x, y: _y };\n  }\n};\n/**\n * This function will page a path and node where the last point(s) in the path is inside the node\n * and return an update path ending by the border of the node.\n *\n * @param {Array} _points\n * @param {any} boundryNode\n * @returns {Array} Points\n */\nconst cutPathAtIntersect = (_points, boundryNode) => {\n  log.warn('abc88 cutPathAtIntersect', _points, boundryNode);\n  let points = [];\n  let lastPointOutside = _points[0];\n  let isInside = false;\n  _points.forEach((point) => {\n    // const node = clusterDb[edge.toCluster].node;\n    log.info('abc88 checking point', point, boundryNode);\n\n    // check if point is inside the boundary rect\n    if (!outsideNode(boundryNode, point) && !isInside) {\n      // First point inside the rect found\n      // Calc the intersection coord between the point anf the last point outside the rect\n      const inter = intersection(boundryNode, lastPointOutside, point);\n      log.warn('abc88 inside', point, lastPointOutside, inter);\n      log.warn('abc88 intersection', inter);\n\n      // // Check case where the intersection is the same as the last point\n      let pointPresent = false;\n      points.forEach((p) => {\n        pointPresent = pointPresent || (p.x === inter.x && p.y === inter.y);\n      });\n      // // if (!pointPresent) {\n      if (!points.some((e) => e.x === inter.x && e.y === inter.y)) {\n        points.push(inter);\n      } else {\n        log.warn('abc88 no intersect', inter, points);\n      }\n      // points.push(inter);\n      isInside = true;\n    } else {\n      // Outside\n      log.warn('abc88 outside', point, lastPointOutside);\n      lastPointOutside = point;\n      // points.push(point);\n      if (!isInside) {\n        points.push(point);\n      }\n    }\n  });\n  log.warn('abc88 returning points', points);\n  return points;\n};\n\n//(edgePaths, e, edge, clusterDb, diagramtype, graph)\nexport const insertEdge = function (elem, e, edge, clusterDb, diagramType, graph) {\n  let points = edge.points;\n  let pointsHasChanged = false;\n  const tail = graph.node(e.v);\n  var head = graph.node(e.w);\n\n  log.info('abc88 InsertEdge: ', edge);\n  if (head.intersect && tail.intersect) {\n    points = points.slice(1, edge.points.length - 1);\n    points.unshift(tail.intersect(points[0]));\n    log.info(\n      'Last point',\n      points[points.length - 1],\n      head,\n      head.intersect(points[points.length - 1])\n    );\n    points.push(head.intersect(points[points.length - 1]));\n  }\n  if (edge.toCluster) {\n    log.info('to cluster abc88', clusterDb[edge.toCluster]);\n    points = cutPathAtIntersect(edge.points, clusterDb[edge.toCluster].node);\n    // log.trace('edge', edge);\n    // points = [];\n    // let lastPointOutside; // = edge.points[0];\n    // let isInside = false;\n    // edge.points.forEach(point => {\n    //   const node = clusterDb[edge.toCluster].node;\n    //   log.warn('checking from', edge.fromCluster, point, node);\n\n    //   if (!outsideNode(node, point) && !isInside) {\n    //     log.trace('inside', edge.toCluster, point, lastPointOutside);\n\n    //     // First point inside the rect\n    //     const inter = intersection(node, lastPointOutside, point);\n\n    //     let pointPresent = false;\n    //     points.forEach(p => {\n    //       pointPresent = pointPresent || (p.x === inter.x && p.y === inter.y);\n    //     });\n    //     // if (!pointPresent) {\n    //     if (!points.find(e => e.x === inter.x && e.y === inter.y)) {\n    //       points.push(inter);\n    //     } else {\n    //       log.warn('no intersect', inter, points);\n    //     }\n    //     isInside = true;\n    // } else {\n    //   // outside\n    //   lastPointOutside = point;\n    //   if (!isInside) points.push(point);\n    // }\n    // });\n    pointsHasChanged = true;\n  }\n\n  if (edge.fromCluster) {\n    log.info('from cluster abc88', clusterDb[edge.fromCluster]);\n    points = cutPathAtIntersect(points.reverse(), clusterDb[edge.fromCluster].node).reverse();\n\n    pointsHasChanged = true;\n  }\n\n  // The data for our line\n  const lineData = points.filter((p) => !Number.isNaN(p.y));\n\n  // This is the accessor function we talked about above\n  let curve;\n  // Currently only flowcharts get the curve from the settings, perhaps this should\n  // be expanded to a common setting? Restricting it for now in order not to cause side-effects that\n  // have not been thought through\n  if (diagramType === 'graph' || diagramType === 'flowchart') {\n    curve = edge.curve || curveBasis;\n  } else {\n    curve = curveBasis;\n  }\n  // curve = curveLinear;\n  const lineFunction = line()\n    .x(function (d) {\n      return d.x;\n    })\n    .y(function (d) {\n      return d.y;\n    })\n    .curve(curve);\n\n  // Construct stroke classes based on properties\n  let strokeClasses;\n  switch (edge.thickness) {\n    case 'normal':\n      strokeClasses = 'edge-thickness-normal';\n      break;\n    case 'thick':\n      strokeClasses = 'edge-thickness-thick';\n      break;\n    case 'invisible':\n      strokeClasses = 'edge-thickness-thick';\n      break;\n    default:\n      strokeClasses = '';\n  }\n  switch (edge.pattern) {\n    case 'solid':\n      strokeClasses += ' edge-pattern-solid';\n      break;\n    case 'dotted':\n      strokeClasses += ' edge-pattern-dotted';\n      break;\n    case 'dashed':\n      strokeClasses += ' edge-pattern-dashed';\n      break;\n  }\n\n  const svgPath = elem\n    .append('path')\n    .attr('d', lineFunction(lineData))\n    .attr('id', edge.id)\n    .attr('class', ' ' + strokeClasses + (edge.classes ? ' ' + edge.classes : ''))\n    .attr('style', edge.style);\n\n  // DEBUG code, adds a red circle at each edge coordinate\n  // edge.points.forEach((point) => {\n  //   elem\n  //     .append('circle')\n  //     .style('stroke', 'red')\n  //     .style('fill', 'red')\n  //     .attr('r', 1)\n  //     .attr('cx', point.x)\n  //     .attr('cy', point.y);\n  // });\n\n  let url = '';\n  // // TODO: Can we load this config only from the rendered graph type?\n  if (getConfig().flowchart.arrowMarkerAbsolute || getConfig().state.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  log.info('arrowTypeStart', edge.arrowTypeStart);\n  log.info('arrowTypeEnd', edge.arrowTypeEnd);\n\n  switch (edge.arrowTypeStart) {\n    case 'arrow_cross':\n      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-crossStart' + ')');\n      break;\n    case 'arrow_point':\n      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-pointStart' + ')');\n      break;\n    case 'arrow_barb':\n      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-barbStart' + ')');\n      break;\n    case 'arrow_circle':\n      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-circleStart' + ')');\n      break;\n    case 'aggregation':\n      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-aggregationStart' + ')');\n      break;\n    case 'extension':\n      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-extensionStart' + ')');\n      break;\n    case 'composition':\n      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-compositionStart' + ')');\n      break;\n    case 'dependency':\n      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-dependencyStart' + ')');\n      break;\n    case 'lollipop':\n      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-lollipopStart' + ')');\n      break;\n    default:\n  }\n  switch (edge.arrowTypeEnd) {\n    case 'arrow_cross':\n      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-crossEnd' + ')');\n      break;\n    case 'arrow_point':\n      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-pointEnd' + ')');\n      break;\n    case 'arrow_barb':\n      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-barbEnd' + ')');\n      break;\n    case 'arrow_circle':\n      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-circleEnd' + ')');\n      break;\n    case 'aggregation':\n      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-aggregationEnd' + ')');\n      break;\n    case 'extension':\n      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-extensionEnd' + ')');\n      break;\n    case 'composition':\n      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-compositionEnd' + ')');\n      break;\n    case 'dependency':\n      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-dependencyEnd' + ')');\n      break;\n    case 'lollipop':\n      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-lollipopEnd' + ')');\n      break;\n    default:\n  }\n  let paths = {};\n  if (pointsHasChanged) {\n    paths.updatedPath = points;\n  }\n  paths.originalPath = edge.points;\n  return paths;\n};\n"],"names":["insertMarkers","elem","markerArray","type","id","markerName","markers","extension","log","composition","aggregation","dependency","lollipop","point","circle","cross","barb","insertMarkers$1","applyStyle","dom","styleFn","addHtmlLabel","node","fo","select","div","label","labelClass","createLabel","_vertexText","style","isTitle","isNode","vertexText","evaluate","getConfig","decodeEntities","s","svgLabel","rows","row","tspan","createLabel$1","labelHelper","parent","_classes","classes","shapeSvg","labelText","text","sanitizeText","bbox","dv","halfPadding","updateNodeBounds","element","insertPolygonShape","w","h","points","d","intersectNode","intersectEllipse","rx","ry","cx","cy","px","py","det","dx","dy","intersectCircle","intersectLine","p1","p2","q1","q2","a1","a2","b1","b2","c1","c2","r1","r2","r3","r4","denom","offset","num","x","y","sameSign","intersectPolygon","polyPoints","x1","y1","intersections","minX","minY","entry","left","top","i","intersect","q","pdx","pdy","distp","qdx","qdy","distq","intersectRect","sx","sy","intersectRect$1","ellipse","polygon","rect","note","note$1","question","questionElem","choice","hexagon","f","m","hex","rect_left_inv_arrow","lean_right","el","lean_left","trapezoid","inv_trapezoid","rect_right_inv_arrow","cylinder","shape","pos","totalWidth","totalHeight","propKeys","applyNodePropertyBorders","propKey","labelRect","borders","strokeDashArray","addBorder","length","skipBorder","rectWithTitle","innerLine","text2","title","textRows","titleBox","descr","stadium","doublecircle","gap","circleGroup","outerCircle","innerCircle","subroutine","start","forkJoin","dir","width","height","end","class_box","rowPadding","lineHeight","topLine","bottomLine","maxWidth","maxHeight","labelContainer","verticalPos","hasInterface","interfaceLabelText","interfaceLabel","interfaceBBox","classTitleString","classTitleLabel","classTitleBBox","classAttributes","str","parsedInfo","parseMember","parsedText","lbl","classMethods","displayText","diffX","shapes","nodeElems","insertNode","newEl","target","setNodeElem","clear","positionNode","padding","diff","edgeLabels","terminalLabels","insertEdgeLabel","edge","labelElement","edgeLabel","startLabelElement","startEdgeLabelLeft","inner","slBox","setTerminalWidth","startEdgeLabelRight","endLabelElement","endEdgeLabelLeft","endEdgeLabelRight","value","positionEdgeLabel","paths","path","utils","outsideNode","intersection","outsidePoint","insidePoint","r","Q","R","res","_x","_y","cutPathAtIntersect","_points","boundryNode","lastPointOutside","isInside","inter","pointPresent","p","e","insertEdge","clusterDb","diagramType","graph","pointsHasChanged","tail","head","lineData","curve","curveBasis","lineFunction","line","strokeClasses","svgPath","url"],"mappings":"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"}