summaryrefslogtreecommitdiff
path: root/themes/blowfish/assets/lib/mermaid/stateDiagram-5f0c5df2.js.map
blob: 450bef669f74f8a53bfb77f2c4310e3655a3dcf6 (plain)
1
{"version":3,"file":"stateDiagram-5f0c5df2.js","sources":["../src/diagrams/state/id-cache.js","../src/diagrams/state/shapes.js","../src/diagrams/state/stateRenderer.js","../src/diagrams/state/stateDiagram.ts"],"sourcesContent":["const idCache = {};\n\nexport const set = (key, val) => {\n  idCache[key] = val;\n};\n\nexport const get = (k) => idCache[k];\nexport const keys = () => Object.keys(idCache);\nexport const size = () => keys().length;\n\nexport default {\n  get,\n  set,\n  keys,\n  size,\n};\n","import { line, curveBasis } from 'd3';\nimport idCache from './id-cache.js';\nimport stateDb from './stateDb';\nimport utils from '../../utils';\nimport common from '../common/common';\nimport { getConfig } from '../../config';\nimport { log } from '../../logger';\n\n/**\n * Draws a start state as a black circle\n *\n * @param {any} g\n */\nexport const drawStartState = (g) =>\n  g\n    .append('circle')\n    // .style('stroke', 'black')\n    // .style('fill', 'black')\n    .attr('class', 'start-state')\n    .attr('r', getConfig().state.sizeUnit)\n    .attr('cx', getConfig().state.padding + getConfig().state.sizeUnit)\n    .attr('cy', getConfig().state.padding + getConfig().state.sizeUnit);\n\n/**\n * Draws a start state as a black circle\n *\n * @param {any} g\n */\nexport const drawDivider = (g) =>\n  g\n    .append('line')\n    .style('stroke', 'grey')\n    .style('stroke-dasharray', '3')\n    .attr('x1', getConfig().state.textHeight)\n    .attr('class', 'divider')\n    .attr('x2', getConfig().state.textHeight * 2)\n    .attr('y1', 0)\n    .attr('y2', 0);\n\n/**\n * Draws a an end state as a black circle\n *\n * @param {any} g\n * @param {any} stateDef\n */\nexport const drawSimpleState = (g, stateDef) => {\n  const state = g\n    .append('text')\n    .attr('x', 2 * getConfig().state.padding)\n    .attr('y', getConfig().state.textHeight + 2 * getConfig().state.padding)\n    .attr('font-size', getConfig().state.fontSize)\n    .attr('class', 'state-title')\n    .text(stateDef.id);\n\n  const classBox = state.node().getBBox();\n  g.insert('rect', ':first-child')\n    .attr('x', getConfig().state.padding)\n    .attr('y', getConfig().state.padding)\n    .attr('width', classBox.width + 2 * getConfig().state.padding)\n    .attr('height', classBox.height + 2 * getConfig().state.padding)\n    .attr('rx', getConfig().state.radius);\n\n  return state;\n};\n\n/**\n * Draws a state with descriptions\n *\n * @param {any} g The d3 svg object to add the state to\n * @param {any} stateDef\n * @returns {any} The d3 svg state\n */\nexport const drawDescrState = (g, stateDef) => {\n  const addTspan = function (textEl, txt, isFirst) {\n    const tSpan = textEl\n      .append('tspan')\n      .attr('x', 2 * getConfig().state.padding)\n      .text(txt);\n    if (!isFirst) {\n      tSpan.attr('dy', getConfig().state.textHeight);\n    }\n  };\n  const title = g\n    .append('text')\n    .attr('x', 2 * getConfig().state.padding)\n    .attr('y', getConfig().state.textHeight + 1.3 * getConfig().state.padding)\n    .attr('font-size', getConfig().state.fontSize)\n    .attr('class', 'state-title')\n    .text(stateDef.descriptions[0]);\n\n  const titleBox = title.node().getBBox();\n  const titleHeight = titleBox.height;\n\n  const description = g\n    .append('text') // text label for the x axis\n    .attr('x', getConfig().state.padding)\n    .attr(\n      'y',\n      titleHeight +\n        getConfig().state.padding * 0.4 +\n        getConfig().state.dividerMargin +\n        getConfig().state.textHeight\n    )\n    .attr('class', 'state-description');\n\n  let isFirst = true;\n  let isSecond = true;\n  stateDef.descriptions.forEach(function (descr) {\n    if (!isFirst) {\n      addTspan(description, descr, isSecond);\n      isSecond = false;\n    }\n    isFirst = false;\n  });\n\n  const descrLine = g\n    .append('line') // text label for the x axis\n    .attr('x1', getConfig().state.padding)\n    .attr('y1', getConfig().state.padding + titleHeight + getConfig().state.dividerMargin / 2)\n    .attr('y2', getConfig().state.padding + titleHeight + getConfig().state.dividerMargin / 2)\n    .attr('class', 'descr-divider');\n  const descrBox = description.node().getBBox();\n  const width = Math.max(descrBox.width, titleBox.width);\n\n  descrLine.attr('x2', width + 3 * getConfig().state.padding);\n  // const classBox = title.node().getBBox();\n\n  g.insert('rect', ':first-child')\n    .attr('x', getConfig().state.padding)\n    .attr('y', getConfig().state.padding)\n    .attr('width', width + 2 * getConfig().state.padding)\n    .attr('height', descrBox.height + titleHeight + 2 * getConfig().state.padding)\n    .attr('rx', getConfig().state.radius);\n\n  return g;\n};\n\n/** Adds the creates a box around the existing content and adds a panel for the id on top of the content. */\n/**\n * Function that creates an title row and a frame around a substate for a composite state diagram.\n * The function returns a new d3 svg object with updated width and height properties;\n *\n * @param {any} g The d3 svg object for the substate to framed\n * @param {any} stateDef The info about the\n * @param {any} altBkg\n */\nexport const addTitleAndBox = (g, stateDef, altBkg) => {\n  const pad = getConfig().state.padding;\n  const dblPad = 2 * getConfig().state.padding;\n  const orgBox = g.node().getBBox();\n  const orgWidth = orgBox.width;\n  const orgX = orgBox.x;\n\n  const title = g\n    .append('text')\n    .attr('x', 0)\n    .attr('y', getConfig().state.titleShift)\n    .attr('font-size', getConfig().state.fontSize)\n    .attr('class', 'state-title')\n    .text(stateDef.id);\n\n  const titleBox = title.node().getBBox();\n  const titleWidth = titleBox.width + dblPad;\n  let width = Math.max(titleWidth, orgWidth); // + dblPad;\n  if (width === orgWidth) {\n    width = width + dblPad;\n  }\n  let startX;\n  // const lineY = 1 - getConfig().state.textHeight;\n  // const descrLine = g\n  //   .append('line') // text label for the x axis\n  //   .attr('x1', 0)\n  //   .attr('y1', lineY)\n  //   .attr('y2', lineY)\n  //   .attr('class', 'descr-divider');\n\n  const graphBox = g.node().getBBox();\n  // descrLine.attr('x2', graphBox.width + getConfig().state.padding);\n\n  if (stateDef.doc) {\n    // console.warn(\n    //   stateDef.id,\n    //   'orgX: ',\n    //   orgX,\n    //   'width: ',\n    //   width,\n    //   'titleWidth: ',\n    //   titleWidth,\n    //   'orgWidth: ',\n    //   orgWidth,\n    //   'width',\n    //   width\n    // );\n  }\n\n  startX = orgX - pad;\n  if (titleWidth > orgWidth) {\n    startX = (orgWidth - width) / 2 + pad;\n  }\n  if (Math.abs(orgX - graphBox.x) < pad && titleWidth > orgWidth) {\n    startX = orgX - (titleWidth - orgWidth) / 2;\n  }\n\n  const lineY = 1 - getConfig().state.textHeight;\n  // White color\n  g.insert('rect', ':first-child')\n    .attr('x', startX)\n    .attr('y', lineY)\n    .attr('class', altBkg ? 'alt-composit' : 'composit')\n    .attr('width', width)\n    .attr(\n      'height',\n      graphBox.height + getConfig().state.textHeight + getConfig().state.titleShift + 1\n    )\n    .attr('rx', '0');\n\n  title.attr('x', startX + pad);\n  if (titleWidth <= orgWidth) {\n    title.attr('x', orgX + (width - dblPad) / 2 - titleWidth / 2 + pad);\n  }\n\n  // Title background\n  g.insert('rect', ':first-child')\n    .attr('x', startX)\n    .attr(\n      'y',\n      getConfig().state.titleShift - getConfig().state.textHeight - getConfig().state.padding\n    )\n    .attr('width', width)\n    // Just needs to be higher then the descr line, will be clipped by the white color box\n    .attr('height', getConfig().state.textHeight * 3)\n    .attr('rx', getConfig().state.radius);\n\n  // Full background\n  g.insert('rect', ':first-child')\n    .attr('x', startX)\n    .attr(\n      'y',\n      getConfig().state.titleShift - getConfig().state.textHeight - getConfig().state.padding\n    )\n    .attr('width', width)\n    .attr('height', graphBox.height + 3 + 2 * getConfig().state.textHeight)\n    .attr('rx', getConfig().state.radius);\n\n  return g;\n};\n\nconst drawEndState = (g) => {\n  g.append('circle')\n    // .style('stroke', 'black')\n    // .style('fill', 'white')\n    .attr('class', 'end-state-outer')\n    .attr('r', getConfig().state.sizeUnit + getConfig().state.miniPadding)\n    .attr(\n      'cx',\n      getConfig().state.padding + getConfig().state.sizeUnit + getConfig().state.miniPadding\n    )\n    .attr(\n      'cy',\n      getConfig().state.padding + getConfig().state.sizeUnit + getConfig().state.miniPadding\n    );\n\n  return (\n    g\n      .append('circle')\n      // .style('stroke', 'black')\n      // .style('fill', 'black')\n      .attr('class', 'end-state-inner')\n      .attr('r', getConfig().state.sizeUnit)\n      .attr('cx', getConfig().state.padding + getConfig().state.sizeUnit + 2)\n      .attr('cy', getConfig().state.padding + getConfig().state.sizeUnit + 2)\n  );\n};\nconst drawForkJoinState = (g, stateDef) => {\n  let width = getConfig().state.forkWidth;\n  let height = getConfig().state.forkHeight;\n\n  if (stateDef.parentId) {\n    let tmp = width;\n    width = height;\n    height = tmp;\n  }\n  return g\n    .append('rect')\n    .style('stroke', 'black')\n    .style('fill', 'black')\n    .attr('width', width)\n    .attr('height', height)\n    .attr('x', getConfig().state.padding)\n    .attr('y', getConfig().state.padding);\n};\n\nexport const drawText = function (elem, textData) {\n  // Remove and ignore br:s\n  const nText = textData.text.replace(common.lineBreakRegex, ' ');\n\n  const textElem = elem.append('text');\n  textElem.attr('x', textData.x);\n  textElem.attr('y', textData.y);\n  textElem.style('text-anchor', textData.anchor);\n  textElem.attr('fill', textData.fill);\n  if (textData.class !== undefined) {\n    textElem.attr('class', textData.class);\n  }\n\n  const span = textElem.append('tspan');\n  span.attr('x', textData.x + textData.textMargin * 2);\n  span.attr('fill', textData.fill);\n  span.text(nText);\n\n  return textElem;\n};\n\nconst _drawLongText = (_text, x, y, g) => {\n  let textHeight = 0;\n\n  const textElem = g.append('text');\n  textElem.style('text-anchor', 'start');\n  textElem.attr('class', 'noteText');\n\n  let text = _text.replace(/\\r\\n/g, '<br/>');\n  text = text.replace(/\\n/g, '<br/>');\n  const lines = text.split(common.lineBreakRegex);\n\n  let tHeight = 1.25 * getConfig().state.noteMargin;\n  for (const line of lines) {\n    const txt = line.trim();\n\n    if (txt.length > 0) {\n      const span = textElem.append('tspan');\n      span.text(txt);\n      if (tHeight === 0) {\n        const textBounds = span.node().getBBox();\n        tHeight += textBounds.height;\n      }\n      textHeight += tHeight;\n      span.attr('x', x + getConfig().state.noteMargin);\n      span.attr('y', y + textHeight + 1.25 * getConfig().state.noteMargin);\n    }\n  }\n  return { textWidth: textElem.node().getBBox().width, textHeight };\n};\n\n/**\n * Draws a note to the diagram\n *\n * @param text - The text of the given note.\n * @param g - The element the note is attached to.\n */\n\nexport const drawNote = (text, g) => {\n  g.attr('class', 'state-note');\n  const note = g.append('rect').attr('x', 0).attr('y', getConfig().state.padding);\n  const rectElem = g.append('g');\n\n  const { textWidth, textHeight } = _drawLongText(text, 0, 0, rectElem);\n  note.attr('height', textHeight + 2 * getConfig().state.noteMargin);\n  note.attr('width', textWidth + getConfig().state.noteMargin * 2);\n\n  return note;\n};\n\n/**\n * Starting point for drawing a state. The function finds out the specifics about the state and\n * renders with appropriate function.\n *\n * @param {any} elem\n * @param {any} stateDef\n */\n\nexport const drawState = function (elem, stateDef) {\n  const id = stateDef.id;\n  const stateInfo = {\n    id: id,\n    label: stateDef.id,\n    width: 0,\n    height: 0,\n  };\n\n  const g = elem.append('g').attr('id', id).attr('class', 'stateGroup');\n\n  if (stateDef.type === 'start') {\n    drawStartState(g);\n  }\n  if (stateDef.type === 'end') {\n    drawEndState(g);\n  }\n  if (stateDef.type === 'fork' || stateDef.type === 'join') {\n    drawForkJoinState(g, stateDef);\n  }\n  if (stateDef.type === 'note') {\n    drawNote(stateDef.note.text, g);\n  }\n  if (stateDef.type === 'divider') {\n    drawDivider(g);\n  }\n  if (stateDef.type === 'default' && stateDef.descriptions.length === 0) {\n    drawSimpleState(g, stateDef);\n  }\n  if (stateDef.type === 'default' && stateDef.descriptions.length > 0) {\n    drawDescrState(g, stateDef);\n  }\n\n  const stateBox = g.node().getBBox();\n  stateInfo.width = stateBox.width + 2 * getConfig().state.padding;\n  stateInfo.height = stateBox.height + 2 * getConfig().state.padding;\n\n  idCache.set(id, stateInfo);\n  // stateCnt++;\n  return stateInfo;\n};\n\nlet edgeCount = 0;\nexport const drawEdge = function (elem, path, relation) {\n  const getRelationType = function (type) {\n    switch (type) {\n      case stateDb.relationType.AGGREGATION:\n        return 'aggregation';\n      case stateDb.relationType.EXTENSION:\n        return 'extension';\n      case stateDb.relationType.COMPOSITION:\n        return 'composition';\n      case stateDb.relationType.DEPENDENCY:\n        return 'dependency';\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', 'transition');\n  let url = '';\n  if (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\n  svgPath.attr(\n    'marker-end',\n    'url(' + url + '#' + getRelationType(stateDb.relationType.DEPENDENCY) + 'End' + ')'\n  );\n\n  if (relation.title !== undefined) {\n    const label = elem.append('g').attr('class', 'stateLabel');\n\n    const { x, y } = utils.calcLabelPosition(path.points);\n\n    const rows = common.getRows(relation.title);\n\n    let titleHeight = 0;\n    const titleRows = [];\n    let maxWidth = 0;\n    let minX = 0;\n\n    for (let i = 0; i <= rows.length; i++) {\n      const title = label\n        .append('text')\n        .attr('text-anchor', 'middle')\n        .text(rows[i])\n        .attr('x', x)\n        .attr('y', y + titleHeight);\n\n      const boundstmp = title.node().getBBox();\n      maxWidth = Math.max(maxWidth, boundstmp.width);\n      minX = Math.min(minX, boundstmp.x);\n\n      log.info(boundstmp.x, x, y + titleHeight);\n\n      if (titleHeight === 0) {\n        const titleBox = title.node().getBBox();\n        titleHeight = titleBox.height;\n        log.info('Title height', titleHeight, y);\n      }\n      titleRows.push(title);\n    }\n\n    let boxHeight = titleHeight * rows.length;\n    if (rows.length > 1) {\n      const heightAdj = (rows.length - 1) * titleHeight * 0.5;\n\n      titleRows.forEach((title, i) => title.attr('y', y + i * titleHeight - heightAdj));\n      boxHeight = titleHeight * rows.length;\n    }\n\n    const bounds = label.node().getBBox();\n\n    label\n      .insert('rect', ':first-child')\n      .attr('class', 'box')\n      .attr('x', x - maxWidth / 2 - getConfig().state.padding / 2)\n      .attr('y', y - boxHeight / 2 - getConfig().state.padding / 2 - 3.5)\n      .attr('width', maxWidth + getConfig().state.padding)\n      .attr('height', boxHeight + getConfig().state.padding);\n\n    log.info(bounds);\n\n    //label.attr('transform', '0 -' + (bounds.y / 2));\n\n    // Debug points\n    // path.points.forEach(point => {\n    //   g.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    // g.append('circle')\n    //   .style('stroke', 'blue')\n    //   .style('fill', 'blue')\n    //   .attr('r', 1)\n    //   .attr('cx', x)\n    //   .attr('cy', y);\n  }\n\n  edgeCount++;\n};\n","import { select } from 'd3';\nimport { layout as dagreLayout } from 'dagre-d3-es/src/dagre/index.js';\nimport * as graphlib from 'dagre-d3-es/src/graphlib/index.js';\nimport { log } from '../../logger';\nimport common from '../common/common';\nimport { drawState, addTitleAndBox, drawEdge } from './shapes';\nimport { getConfig } from '../../config';\nimport { configureSvgSize } from '../../setupGraphViewbox';\n\n// TODO Move conf object to main conf in mermaidAPI\nlet conf;\n\nconst transformationLog = {};\n\nexport const setConf = function () {\n  //no-op\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param {any} elem\n */\nconst insertMarkers = function (elem) {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', 'dependencyEnd')\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 19,7 L9,13 L14,7 L9,1 Z');\n};\n\n/**\n * Draws a flowchart in the tag with id: id based on the graph definition in text.\n *\n * @param {any} text\n * @param {any} id\n * @param _version\n * @param diagObj\n */\nexport const draw = function (text, id, _version, diagObj) {\n  conf = getConfig().state;\n  const securityLevel = getConfig().securityLevel;\n  // Handle root and Document for when rendering in sandbox mode\n  let sandboxElement;\n  if (securityLevel === 'sandbox') {\n    sandboxElement = select('#i' + id);\n  }\n  const root =\n    securityLevel === 'sandbox'\n      ? select(sandboxElement.nodes()[0].contentDocument.body)\n      : select('body');\n  const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document;\n\n  // diagObj.db.clear();\n  // parser.parse(text);\n  log.debug('Rendering diagram ' + text);\n\n  // Fetch the default direction, use TD if none was found\n  const diagram = root.select(`[id='${id}']`);\n  insertMarkers(diagram);\n\n  // Layout graph, Create a new directed graph\n  const graph = new graphlib.Graph({\n    multigraph: true,\n    compound: true,\n    // acyclicer: 'greedy',\n    rankdir: 'RL',\n    // ranksep: '20'\n  });\n\n  // Default to assigning a new object as a label for each new edge.\n  graph.setDefaultEdgeLabel(function () {\n    return {};\n  });\n\n  const rootDoc = diagObj.db.getRootDoc();\n  renderDoc(rootDoc, diagram, undefined, false, root, doc, diagObj);\n\n  const padding = conf.padding;\n  const bounds = diagram.node().getBBox();\n\n  const width = bounds.width + padding * 2;\n  const height = bounds.height + padding * 2;\n\n  // zoom in a bit\n  const svgWidth = width * 1.75;\n  configureSvgSize(diagram, height, svgWidth, conf.useMaxWidth);\n\n  diagram.attr(\n    'viewBox',\n    `${bounds.x - conf.padding}  ${bounds.y - conf.padding} ` + width + ' ' + height\n  );\n};\nconst getLabelWidth = (text) => {\n  return text ? text.length * conf.fontSizeFactor : 1;\n};\n\nconst renderDoc = (doc, diagram, parentId, altBkg, root, domDocument, diagObj) => {\n  // Layout graph, Create a new directed graph\n  const graph = new graphlib.Graph({\n    compound: true,\n    multigraph: true,\n  });\n\n  let i;\n  let edgeFreeDoc = true;\n  for (i = 0; i < doc.length; i++) {\n    if (doc[i].stmt === 'relation') {\n      edgeFreeDoc = false;\n      break;\n    }\n  }\n\n  // Set an object for the graph label\n  if (parentId) {\n    graph.setGraph({\n      rankdir: 'LR',\n      multigraph: true,\n      compound: true,\n      // acyclicer: 'greedy',\n      ranker: 'tight-tree',\n      ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor,\n      nodeSep: edgeFreeDoc ? 1 : 50,\n      isMultiGraph: true,\n      // ranksep: 5,\n      // nodesep: 1\n    });\n  } else {\n    graph.setGraph({\n      rankdir: 'TB',\n      multigraph: true,\n      compound: true,\n      // isCompound: true,\n      // acyclicer: 'greedy',\n      // ranker: 'longest-path'\n      ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor,\n      nodeSep: edgeFreeDoc ? 1 : 50,\n      ranker: 'tight-tree',\n      // ranker: 'network-simplex'\n      isMultiGraph: true,\n    });\n  }\n\n  // Default to assigning a new object as a label for each new edge.\n  graph.setDefaultEdgeLabel(function () {\n    return {};\n  });\n\n  diagObj.db.extract(doc);\n  const states = diagObj.db.getStates();\n  const relations = diagObj.db.getRelations();\n\n  const keys = Object.keys(states);\n\n  let first = true;\n\n  for (const key of keys) {\n    const stateDef = states[key];\n\n    if (parentId) {\n      stateDef.parentId = parentId;\n    }\n\n    let node;\n    if (stateDef.doc) {\n      let sub = diagram.append('g').attr('id', stateDef.id).attr('class', 'stateGroup');\n      node = renderDoc(stateDef.doc, sub, stateDef.id, !altBkg, root, domDocument, diagObj);\n\n      if (first) {\n        // first = false;\n        sub = addTitleAndBox(sub, stateDef, altBkg);\n        let boxBounds = sub.node().getBBox();\n        node.width = boxBounds.width;\n        node.height = boxBounds.height + conf.padding / 2;\n        transformationLog[stateDef.id] = { y: conf.compositTitleSize };\n      } else {\n        // sub = addIdAndBox(sub, stateDef);\n        let boxBounds = sub.node().getBBox();\n        node.width = boxBounds.width;\n        node.height = boxBounds.height;\n        // transformationLog[stateDef.id] = { y: conf.compositTitleSize };\n      }\n    } else {\n      node = drawState(diagram, stateDef, graph);\n    }\n\n    if (stateDef.note) {\n      // Draw note note\n      const noteDef = {\n        descriptions: [],\n        id: stateDef.id + '-note',\n        note: stateDef.note,\n        type: 'note',\n      };\n      const note = drawState(diagram, noteDef, graph);\n\n      // graph.setNode(node.id, node);\n      if (stateDef.note.position === 'left of') {\n        graph.setNode(node.id + '-note', note);\n        graph.setNode(node.id, node);\n      } else {\n        graph.setNode(node.id, node);\n        graph.setNode(node.id + '-note', note);\n      }\n      // graph.setNode(node.id);\n      graph.setParent(node.id, node.id + '-group');\n      graph.setParent(node.id + '-note', node.id + '-group');\n    } else {\n      // Add nodes to the graph. The first argument is the node id. The second is\n      // metadata about the node. In this case we're going to add labels to each of\n      // our nodes.\n      graph.setNode(node.id, node);\n    }\n  }\n\n  log.debug('Count=', graph.nodeCount(), graph);\n  let cnt = 0;\n  relations.forEach(function (relation) {\n    cnt++;\n    log.debug('Setting edge', relation);\n    graph.setEdge(\n      relation.id1,\n      relation.id2,\n      {\n        relation: relation,\n        width: getLabelWidth(relation.title),\n        height: conf.labelHeight * common.getRows(relation.title).length,\n        labelpos: 'c',\n      },\n      'id' + cnt\n    );\n  });\n\n  dagreLayout(graph);\n\n  log.debug('Graph after layout', graph.nodes());\n  const svgElem = diagram.node();\n\n  graph.nodes().forEach(function (v) {\n    if (v !== undefined && graph.node(v) !== undefined) {\n      log.warn('Node ' + v + ': ' + JSON.stringify(graph.node(v)));\n      root\n        .select('#' + svgElem.id + ' #' + v)\n        .attr(\n          'transform',\n          'translate(' +\n            (graph.node(v).x - graph.node(v).width / 2) +\n            ',' +\n            (graph.node(v).y +\n              (transformationLog[v] ? transformationLog[v].y : 0) -\n              graph.node(v).height / 2) +\n            ' )'\n        );\n      root\n        .select('#' + svgElem.id + ' #' + v)\n        .attr('data-x-shift', graph.node(v).x - graph.node(v).width / 2);\n      const dividers = domDocument.querySelectorAll('#' + svgElem.id + ' #' + v + ' .divider');\n      dividers.forEach((divider) => {\n        const parent = divider.parentElement;\n        let pWidth = 0;\n        let pShift = 0;\n        if (parent) {\n          if (parent.parentElement) {\n            pWidth = parent.parentElement.getBBox().width;\n          }\n          pShift = parseInt(parent.getAttribute('data-x-shift'), 10);\n          if (Number.isNaN(pShift)) {\n            pShift = 0;\n          }\n        }\n        divider.setAttribute('x1', 0 - pShift + 8);\n        divider.setAttribute('x2', pWidth - pShift - 8);\n      });\n    } else {\n      log.debug('No Node ' + v + ': ' + JSON.stringify(graph.node(v)));\n    }\n  });\n\n  let stateBox = svgElem.getBBox();\n\n  graph.edges().forEach(function (e) {\n    if (e !== undefined && graph.edge(e) !== undefined) {\n      log.debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));\n      drawEdge(diagram, graph.edge(e), graph.edge(e).relation);\n    }\n  });\n\n  stateBox = svgElem.getBBox();\n\n  const stateInfo = {\n    id: parentId ? parentId : 'root',\n    label: parentId ? parentId : 'root',\n    width: 0,\n    height: 0,\n  };\n\n  stateInfo.width = stateBox.width + 2 * conf.padding;\n  stateInfo.height = stateBox.height + 2 * conf.padding;\n\n  log.debug('Doc rendered', stateInfo, graph);\n  return stateInfo;\n};\n\nexport default {\n  setConf,\n  draw,\n};\n","import { DiagramDefinition } from '../../diagram-api/types';\n// @ts-ignore: TODO Fix ts errors\nimport parser from './parser/stateDiagram';\nimport db from './stateDb';\nimport styles from './styles';\nimport renderer from './stateRenderer';\n\nexport const diagram: DiagramDefinition = {\n  parser,\n  db,\n  renderer,\n  styles,\n  init: (cnf) => {\n    if (!cnf.state) {\n      cnf.state = {};\n    }\n    cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n    db.clear();\n  },\n};\n"],"names":["idCache","set","key","val","get","k","keys","size","idCache$1","drawStartState","g","getConfig","drawDivider","drawSimpleState","stateDef","state","classBox","drawDescrState","addTspan","textEl","txt","isFirst","tSpan","titleBox","titleHeight","description","isSecond","descr","descrLine","descrBox","width","addTitleAndBox","altBkg","pad","dblPad","orgBox","orgWidth","orgX","title","titleWidth","startX","graphBox","lineY","drawEndState","drawForkJoinState","height","tmp","_drawLongText","_text","x","y","textHeight","textElem","text","lines","common","tHeight","line","span","textBounds","drawNote","note","rectElem","textWidth","drawState","elem","id","stateInfo","stateBox","edgeCount","drawEdge","path","relation","getRelationType","type","stateDb","p","lineData","lineFunction","d","curveBasis","svgPath","url","label","utils","rows","titleRows","maxWidth","minX","i","boundstmp","log","boxHeight","heightAdj","bounds","conf","transformationLog","setConf","insertMarkers","draw","_version","diagObj","securityLevel","sandboxElement","select","root","doc","diagram","graphlib.Graph","rootDoc","renderDoc","padding","svgWidth","configureSvgSize","getLabelWidth","parentId","domDocument","graph","edgeFreeDoc","states","relations","node","sub","boxBounds","noteDef","cnt","dagreLayout","svgElem","v","divider","parent","pWidth","pShift","e","renderer","parser","db","styles","cnf"],"mappings":"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"}