All Downloads are FREE. Search and download functionalities are using the official Maven repository.

package.dist.chunks.mermaid.core.classDiagram-v2-FI7KE7WJ.mjs.map Maven / Gradle / Ivy

Go to download

Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.

There is a newer version: 11.4.0
Show newest version
{
  "version": 3,
  "sources": ["../../../src/diagrams/class/classRenderer-v2.ts", "../../../src/dagre-wrapper/index.js", "../../../src/dagre-wrapper/mermaid-graphlib.js", "../../../src/dagre-wrapper/clusters.js", "../../../src/diagrams/class/classDiagram-v2.ts"],
  "sourcesContent": ["// @ts-nocheck - don't check until handle it\nimport { select, curveLinear } from 'd3';\nimport * as graphlib from 'dagre-d3-es/src/graphlib/index.js';\nimport { log } from '../../logger.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { render } from '../../dagre-wrapper/index.js';\nimport utils, { getEdgeId } from '../../utils.js';\nimport { interpolateToCurve, getStylesFromArray } from '../../utils.js';\nimport { setupGraphViewbox } from '../../setupGraphViewbox.js';\nimport common from '../common/common.js';\nimport type { ClassRelation, ClassNote, ClassMap, NamespaceMap } from './classTypes.js';\nimport type { EdgeData } from '../../types.js';\n\nconst sanitizeText = (txt: string) => common.sanitizeText(txt, getConfig());\n\nlet conf = {\n  dividerMargin: 10,\n  padding: 5,\n  textHeight: 10,\n  curve: undefined,\n};\n\ninterface RectParameters {\n  id: string;\n  shape: 'rect';\n  labelStyle: string;\n  domId: string;\n  labelText: string;\n  padding: number | undefined;\n  style?: string;\n}\n\n/**\n * Function that adds the vertices found during parsing to the graph to be rendered.\n *\n * @param namespaces - Object containing the vertices.\n * @param g - The graph that is to be drawn.\n * @param _id - id of the graph\n * @param diagObj - The diagram object\n */\nexport const addNamespaces = function (\n  namespaces: NamespaceMap,\n  g: graphlib.Graph,\n  _id: string,\n  diagObj: any\n) {\n  log.info('keys:', [...namespaces.keys()]);\n  log.info(namespaces);\n\n  // Iterate through each item in the vertex object (containing all the vertices found) in the graph definition\n  namespaces.forEach(function (vertex) {\n    // parent node must be one of [rect, roundedWithTitle, noteGroup, divider]\n    const shape = 'rect';\n\n    const node: RectParameters = {\n      shape: shape,\n      id: vertex.id,\n      domId: vertex.domId,\n      labelText: sanitizeText(vertex.id),\n      labelStyle: '',\n      style: 'fill: none; stroke: black',\n      // TODO V10: Flowchart ? Keeping flowchart for backwards compatibility. Remove in next major release\n      padding: getConfig().flowchart?.padding ?? getConfig().class?.padding,\n    };\n\n    g.setNode(vertex.id, node);\n    addClasses(vertex.classes, g, _id, diagObj, vertex.id);\n\n    log.info('setNode', node);\n  });\n};\n\n/**\n * Function that adds the vertices found during parsing to the graph to be rendered.\n *\n * @param classes - Object containing the vertices.\n * @param g - The graph that is to be drawn.\n * @param _id - id of the graph\n * @param diagObj - The diagram object\n * @param parent - id of the parent namespace, if it exists\n */\nexport const addClasses = function (\n  classes: ClassMap,\n  g: graphlib.Graph,\n  _id: string,\n  diagObj: any,\n  parent?: string\n) {\n  log.info('keys:', [...classes.keys()]);\n  log.info(classes);\n\n  // Iterate through each item in the vertex object (containing all the vertices found) in the graph definition\n  [...classes.values()]\n    .filter((vertex) => vertex.parent === parent)\n    .forEach(function (vertex) {\n      /**\n       * Variable for storing the classes for the vertex\n       */\n      const cssClassStr = vertex.cssClasses.join(' ');\n\n      const styles = getStylesFromArray(vertex.styles);\n\n      // Use vertex id as text in the box if no text is provided by the graph definition\n      const vertexText = vertex.label ?? vertex.id;\n      const radius = 0;\n      const shape = 'class_box';\n\n      // Add the node\n      const node = {\n        labelStyle: styles.labelStyle,\n        shape: shape,\n        labelText: sanitizeText(vertexText),\n        classData: vertex,\n        rx: radius,\n        ry: radius,\n        class: cssClassStr,\n        style: styles.style,\n        id: vertex.id,\n        domId: vertex.domId,\n        tooltip: diagObj.db.getTooltip(vertex.id, parent) || '',\n        haveCallback: vertex.haveCallback,\n        link: vertex.link,\n        width: vertex.type === 'group' ? 500 : undefined,\n        type: vertex.type,\n        // TODO V10: Flowchart ? Keeping flowchart for backwards compatibility. Remove in next major release\n        padding: getConfig().flowchart?.padding ?? getConfig().class?.padding,\n      };\n      g.setNode(vertex.id, node);\n\n      if (parent) {\n        g.setParent(vertex.id, parent);\n      }\n\n      log.info('setNode', node);\n    });\n};\n\n/**\n * Function that adds the additional vertices (notes) found during parsing to the graph to be rendered.\n *\n * @param notes - Object containing the additional vertices (notes).\n * @param g - The graph that is to be drawn.\n * @param startEdgeId - starting index for note edge\n * @param classes - Classes\n */\nexport const addNotes = function (\n  notes: ClassNote[],\n  g: graphlib.Graph,\n  startEdgeId: number,\n  classes: ClassMap\n) {\n  log.info(notes);\n\n  notes.forEach(function (note, i) {\n    const vertex = note;\n\n    const cssNoteStr = '';\n\n    const styles = { labelStyle: '', style: '' };\n\n    const vertexText = vertex.text;\n\n    const radius = 0;\n    const shape = 'note';\n    const node = {\n      labelStyle: styles.labelStyle,\n      shape: shape,\n      labelText: sanitizeText(vertexText),\n      noteData: vertex,\n      rx: radius,\n      ry: radius,\n      class: cssNoteStr,\n      style: styles.style,\n      id: vertex.id,\n      domId: vertex.id,\n      tooltip: '',\n      type: 'note',\n      // TODO V10: Flowchart ? Keeping flowchart for backwards compatibility. Remove in next major release\n      padding: getConfig().flowchart?.padding ?? getConfig().class?.padding,\n    };\n    g.setNode(vertex.id, node);\n    log.info('setNode', node);\n\n    if (!vertex.class || !classes.has(vertex.class)) {\n      return;\n    }\n    const edgeId = startEdgeId + i;\n\n    const edgeData: EdgeData = {\n      id: `edgeNote${edgeId}`,\n      //Set relationship style and line type\n      classes: 'relation',\n      pattern: 'dotted',\n      // Set link type for rendering\n      arrowhead: 'none',\n      //Set edge extra labels\n      startLabelRight: '',\n      endLabelLeft: '',\n      //Set relation arrow types\n      arrowTypeStart: 'none',\n      arrowTypeEnd: 'none',\n      style: 'fill:none',\n      labelStyle: '',\n      curve: interpolateToCurve(conf.curve, curveLinear),\n    };\n\n    // Add the edge to the graph\n    g.setEdge(vertex.id, vertex.class, edgeData, edgeId);\n  });\n};\n\n/**\n * Add edges to graph based on parsed graph definition\n *\n * @param relations -\n * @param g - The graph object\n */\nexport const addRelations = function (relations: ClassRelation[], g: graphlib.Graph) {\n  const conf = getConfig().flowchart;\n  let cnt = 0;\n\n  relations.forEach(function (edge) {\n    cnt++;\n    const edgeData: EdgeData = {\n      //Set relationship style and line type\n      classes: 'relation',\n      pattern: edge.relation.lineType == 1 ? 'dashed' : 'solid',\n      id: getEdgeId(edge.id1, edge.id2, {\n        prefix: 'id',\n        counter: cnt,\n      }),\n      // Set link type for rendering\n      arrowhead: edge.type === 'arrow_open' ? 'none' : 'normal',\n      //Set edge extra labels\n      startLabelRight: edge.relationTitle1 === 'none' ? '' : edge.relationTitle1,\n      endLabelLeft: edge.relationTitle2 === 'none' ? '' : edge.relationTitle2,\n      //Set relation arrow types\n      arrowTypeStart: getArrowMarker(edge.relation.type1),\n      arrowTypeEnd: getArrowMarker(edge.relation.type2),\n      style: 'fill:none',\n      labelStyle: '',\n      curve: interpolateToCurve(conf?.curve, curveLinear),\n    };\n\n    log.info(edgeData, edge);\n\n    if (edge.style !== undefined) {\n      const styles = getStylesFromArray(edge.style);\n      edgeData.style = styles.style;\n      edgeData.labelStyle = styles.labelStyle;\n    }\n\n    edge.text = edge.title;\n    if (edge.text === undefined) {\n      if (edge.style !== undefined) {\n        edgeData.arrowheadStyle = 'fill: #333';\n      }\n    } else {\n      edgeData.arrowheadStyle = 'fill: #333';\n      edgeData.labelpos = 'c';\n\n      // TODO V10: Flowchart ? Keeping flowchart for backwards compatibility. Remove in next major release\n      if (getConfig().flowchart?.htmlLabels ?? getConfig().htmlLabels) {\n        edgeData.labelType = 'html';\n        edgeData.label = '' + edge.text + '';\n      } else {\n        edgeData.labelType = 'text';\n        edgeData.label = edge.text.replace(common.lineBreakRegex, '\\n');\n\n        if (edge.style === undefined) {\n          edgeData.style = edgeData.style || 'stroke: #333; stroke-width: 1.5px;fill:none';\n        }\n\n        edgeData.labelStyle = edgeData.labelStyle.replace('color:', 'fill:');\n      }\n    }\n    // Add the edge to the graph\n    g.setEdge(edge.id1, edge.id2, edgeData, cnt);\n  });\n};\n\n/**\n * Merges the value of `conf` with the passed `cnf`\n *\n * @param cnf - Config to merge\n */\nexport const setConf = function (cnf: any) {\n  conf = {\n    ...conf,\n    ...cnf,\n  };\n};\n\n/**\n * Draws a class diagram in the tag with id: id based on the definition in text.\n *\n * @param text -\n * @param id -\n * @param _version -\n * @param diagObj -\n */\nexport const draw = async function (text: string, id: string, _version: string, diagObj: any) {\n  log.info('Drawing class - ', id);\n\n  // TODO V10: Why flowchart? Might be a mistake when copying.\n  const conf = getConfig().flowchart ?? getConfig().class;\n  const securityLevel = getConfig().securityLevel;\n  log.info('config:', conf);\n  const nodeSpacing = conf?.nodeSpacing ?? 50;\n  const rankSpacing = conf?.rankSpacing ?? 50;\n\n  // Create the input mermaid.graph\n  const g: graphlib.Graph = new graphlib.Graph({\n    multigraph: true,\n    compound: true,\n  })\n    .setGraph({\n      rankdir: diagObj.db.getDirection(),\n      nodesep: nodeSpacing,\n      ranksep: rankSpacing,\n      marginx: 8,\n      marginy: 8,\n    })\n    .setDefaultEdgeLabel(function () {\n      return {};\n    });\n\n  // Fetch the vertices/nodes and edges/links from the parsed graph definition\n  const namespaces: NamespaceMap = diagObj.db.getNamespaces();\n  const classes: ClassMap = diagObj.db.getClasses();\n  const relations: ClassRelation[] = diagObj.db.getRelations();\n  const notes: ClassNote[] = diagObj.db.getNotes();\n  log.info(relations);\n  addNamespaces(namespaces, g, id, diagObj);\n  addClasses(classes, g, id, diagObj);\n  addRelations(relations, g);\n  addNotes(notes, g, relations.length + 1, classes);\n\n  // Set up an SVG group so that we can translate the final graph.\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 svg = root.select(`[id=\"${id}\"]`);\n\n  // Run the renderer. This is what draws the final graph.\n  const element = root.select('#' + id + ' g');\n  await render(\n    element,\n    g,\n    ['aggregation', 'extension', 'composition', 'dependency', 'lollipop'],\n    'classDiagram',\n    id\n  );\n\n  utils.insertTitle(svg, 'classTitleText', conf?.titleTopMargin ?? 5, diagObj.db.getDiagramTitle());\n\n  setupGraphViewbox(g, svg, conf?.diagramPadding, conf?.useMaxWidth);\n\n  // Add label rects for non html labels\n  if (!conf?.htmlLabels) {\n    const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0]!.contentDocument : document;\n    const labels = doc.querySelectorAll('[id=\"' + id + '\"] .edgeLabel .label');\n    for (const label of labels) {\n      // Get dimensions of label\n      const dim = label.getBBox();\n\n      const rect = doc.createElementNS('http://www.w3.org/2000/svg', 'rect');\n      rect.setAttribute('rx', 0);\n      rect.setAttribute('ry', 0);\n      rect.setAttribute('width', dim.width);\n      rect.setAttribute('height', dim.height);\n\n      label.insertBefore(rect, label.firstChild);\n    }\n  }\n};\n\n/**\n * Gets the arrow marker for a type index\n *\n * @param type - The type to look for\n * @returns The arrow marker\n */\nfunction getArrowMarker(type: number) {\n  let marker;\n  switch (type) {\n    case 0:\n      marker = 'aggregation';\n      break;\n    case 1:\n      marker = 'extension';\n      break;\n    case 2:\n      marker = 'composition';\n      break;\n    case 3:\n      marker = 'dependency';\n      break;\n    case 4:\n      marker = 'lollipop';\n      break;\n    default:\n      marker = 'none';\n  }\n  return marker;\n}\n\nexport default {\n  setConf,\n  draw,\n};\n", "import { layout as dagreLayout } from 'dagre-d3-es/src/dagre/index.js';\nimport * as graphlibJson from 'dagre-d3-es/src/graphlib/json.js';\nimport insertMarkers from './markers.js';\nimport { updateNodeBounds } from './shapes/util.js';\nimport {\n  clear as clearGraphlib,\n  clusterDb,\n  adjustClustersAndEdges,\n  findNonClusterChild,\n  sortNodesByHierarchy,\n} from './mermaid-graphlib.js';\nimport { insertNode, positionNode, clear as clearNodes, setNodeElem } from './nodes.js';\nimport { insertCluster, clear as clearClusters } from './clusters.js';\nimport { insertEdgeLabel, positionEdgeLabel, insertEdge, clear as clearEdges } from './edges.js';\nimport { log } from '../logger.js';\nimport { getSubGraphTitleMargins } from '../utils/subGraphTitleMargins.js';\nimport { getConfig } from '../diagram-api/diagramAPI.js';\n\nconst recursiveRender = async (_elem, graph, diagramType, id, parentCluster, siteConfig) => {\n  log.info('Graph in recursive render: XXX', graphlibJson.write(graph), parentCluster);\n  const dir = graph.graph().rankdir;\n  log.trace('Dir in recursive render - dir:', dir);\n\n  const elem = _elem.insert('g').attr('class', 'root');\n  if (!graph.nodes()) {\n    log.info('No nodes found for', graph);\n  } else {\n    log.info('Recursive render XXX', graph.nodes());\n  }\n  if (graph.edges().length > 0) {\n    log.trace('Recursive edges', graph.edge(graph.edges()[0]));\n  }\n  const clusters = elem.insert('g').attr('class', 'clusters');\n  const edgePaths = elem.insert('g').attr('class', 'edgePaths');\n  const edgeLabels = elem.insert('g').attr('class', 'edgeLabels');\n  const nodes = elem.insert('g').attr('class', 'nodes');\n\n  // Insert nodes, this will insert them into the dom and each node will get a size. The size is updated\n  // to the abstract node and is later used by dagre for the layout\n  await Promise.all(\n    graph.nodes().map(async function (v) {\n      const node = graph.node(v);\n      if (parentCluster !== undefined) {\n        const data = JSON.parse(JSON.stringify(parentCluster.clusterData));\n        // data.clusterPositioning = true;\n        log.info('Setting data for cluster XXX (', v, ') ', data, parentCluster);\n        graph.setNode(parentCluster.id, data);\n        if (!graph.parent(v)) {\n          log.trace('Setting parent', v, parentCluster.id);\n          graph.setParent(v, parentCluster.id, data);\n        }\n      }\n      log.info('(Insert) Node XXX' + v + ': ' + JSON.stringify(graph.node(v)));\n      if (node?.clusterNode) {\n        // const children = graph.children(v);\n        log.info('Cluster identified', v, node.width, graph.node(v));\n        // `node.graph.setGraph` applies the graph configurations such as nodeSpacing to subgraphs as without this the default values would be used\n        // We override only the `ranksep` and `nodesep` configurations to allow for setting subgraph spacing while avoiding overriding other properties\n        const { ranksep, nodesep } = graph.graph();\n        node.graph.setGraph({\n          ...node.graph.graph(),\n          ranksep,\n          nodesep,\n        });\n        const o = await recursiveRender(\n          nodes,\n          node.graph,\n          diagramType,\n          id,\n          graph.node(v),\n          siteConfig\n        );\n        const newEl = o.elem;\n        updateNodeBounds(node, newEl);\n        node.diff = o.diff || 0;\n        log.info('Node bounds (abc123)', v, node, node.width, node.x, node.y);\n        setNodeElem(newEl, node);\n\n        log.warn('Recursive render complete ', newEl, node);\n      } else {\n        if (graph.children(v).length > 0) {\n          // This is a cluster but not to be rendered recursively\n          // Render as before\n          log.info('Cluster - the non recursive path XXX', v, node.id, node, graph);\n          log.info(findNonClusterChild(node.id, graph));\n          clusterDb[node.id] = { id: findNonClusterChild(node.id, graph), node };\n          // insertCluster(clusters, graph.node(v));\n        } else {\n          log.info('Node - the non recursive path', v, node.id, node);\n          await insertNode(nodes, graph.node(v), dir);\n        }\n      }\n    })\n  );\n\n  // Insert labels, this will insert them into the dom so that the width can be calculated\n  // Also figure out which edges point to/from clusters and adjust them accordingly\n  // Edges from/to clusters really points to the first child in the cluster.\n  // TODO: pick optimal child in the cluster to us as link anchor\n  graph.edges().forEach(async function (e) {\n    const edge = graph.edge(e.v, e.w, e.name);\n    log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n    log.info('Edge ' + e.v + ' -> ' + e.w + ': ', e, ' ', JSON.stringify(graph.edge(e)));\n\n    // Check if link is either from or to a cluster\n    log.info('Fix', clusterDb, 'ids:', e.v, e.w, 'Translating: ', clusterDb[e.v], clusterDb[e.w]);\n    await insertEdgeLabel(edgeLabels, edge);\n  });\n\n  graph.edges().forEach(function (e) {\n    log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n  });\n  log.info('Graph before layout:', JSON.stringify(graphlibJson.write(graph)));\n  log.info('#############################################');\n  log.info('###                Layout                 ###');\n  log.info('#############################################');\n  log.info(graph);\n  dagreLayout(graph);\n  log.info('Graph after layout:', JSON.stringify(graphlibJson.write(graph)));\n  // Move the nodes to the correct place\n  let diff = 0;\n  const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);\n  sortNodesByHierarchy(graph).forEach(function (v) {\n    const node = graph.node(v);\n    log.info('Position ' + v + ': ' + JSON.stringify(graph.node(v)));\n    log.info(\n      'Position ' + v + ': (' + node.x,\n      ',' + node.y,\n      ') width: ',\n      node.width,\n      ' height: ',\n      node.height\n    );\n    if (node?.clusterNode) {\n      // clusterDb[node.id].node = node;\n      node.y += subGraphTitleTotalMargin;\n      positionNode(node);\n    } else {\n      // Non cluster node\n      if (graph.children(v).length > 0) {\n        // A cluster in the non-recursive way\n        // positionCluster(node);\n        node.height += subGraphTitleTotalMargin;\n        insertCluster(clusters, node);\n        clusterDb[node.id].node = node;\n      } else {\n        node.y += subGraphTitleTotalMargin / 2;\n        positionNode(node);\n      }\n    }\n  });\n\n  // Move the edge labels to the correct place after layout\n  graph.edges().forEach(function (e) {\n    const edge = graph.edge(e);\n    log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(edge), edge);\n\n    edge.points.forEach((point) => (point.y += subGraphTitleTotalMargin / 2));\n    const paths = insertEdge(edgePaths, e, edge, clusterDb, diagramType, graph, id);\n    positionEdgeLabel(edge, paths);\n  });\n\n  graph.nodes().forEach(function (v) {\n    const n = graph.node(v);\n    log.info(v, n.type, n.diff);\n    if (n.type === 'group') {\n      diff = n.diff;\n    }\n  });\n  return { elem, diff };\n};\n\nexport const render = async (elem, graph, markers, diagramType, id) => {\n  insertMarkers(elem, markers, diagramType, id);\n  clearNodes();\n  clearEdges();\n  clearClusters();\n  clearGraphlib();\n\n  log.warn('Graph at first:', JSON.stringify(graphlibJson.write(graph)));\n  adjustClustersAndEdges(graph);\n  log.warn('Graph after:', JSON.stringify(graphlibJson.write(graph)));\n  // log.warn('Graph ever  after:', graphlibJson.write(graph.node('A').graph));\n  const siteConfig = getConfig();\n  await recursiveRender(elem, graph, diagramType, id, undefined, siteConfig);\n};\n\n// const shapeDefinitions = {};\n// export const addShape = ({ shapeType: fun }) => {\n//   shapeDefinitions[shapeType] = fun;\n// };\n\n// const arrowDefinitions = {};\n// export const addArrow = ({ arrowType: fun }) => {\n//   arrowDefinitions[arrowType] = fun;\n// };\n", "/** Decorates with functions required by mermaids dagre-wrapper. */\nimport { log } from '../logger.js';\nimport * as graphlibJson from 'dagre-d3-es/src/graphlib/json.js';\nimport * as graphlib from 'dagre-d3-es/src/graphlib/index.js';\n\nexport let clusterDb = {};\nlet descendants = {};\nlet parents = {};\n\nexport const clear = () => {\n  descendants = {};\n  parents = {};\n  clusterDb = {};\n};\n\nconst isDescendant = (id, ancestorId) => {\n  // if (id === ancestorId) return true;\n\n  log.trace('In isDescendant', ancestorId, ' ', id, ' = ', descendants[ancestorId].includes(id));\n  if (descendants[ancestorId].includes(id)) {\n    return true;\n  }\n\n  return false;\n};\n\nconst edgeInCluster = (edge, clusterId) => {\n  log.info('Descendants of ', clusterId, ' is ', descendants[clusterId]);\n  log.info('Edge is ', edge);\n  // Edges to/from the cluster is not in the cluster, they are in the parent\n  if (edge.v === clusterId) {\n    return false;\n  }\n  if (edge.w === clusterId) {\n    return false;\n  }\n\n  if (!descendants[clusterId]) {\n    log.debug('Tilt, ', clusterId, ',not in descendants');\n    return false;\n  }\n  return (\n    descendants[clusterId].includes(edge.v) ||\n    isDescendant(edge.v, clusterId) ||\n    isDescendant(edge.w, clusterId) ||\n    descendants[clusterId].includes(edge.w)\n  );\n};\n\nconst copy = (clusterId, graph, newGraph, rootId) => {\n  log.warn(\n    'Copying children of ',\n    clusterId,\n    'root',\n    rootId,\n    'data',\n    graph.node(clusterId),\n    rootId\n  );\n  const nodes = graph.children(clusterId) || [];\n\n  // Include cluster node if it is not the root\n  if (clusterId !== rootId) {\n    nodes.push(clusterId);\n  }\n\n  log.warn('Copying (nodes) clusterId', clusterId, 'nodes', nodes);\n\n  nodes.forEach((node) => {\n    if (graph.children(node).length > 0) {\n      copy(node, graph, newGraph, rootId);\n    } else {\n      const data = graph.node(node);\n      log.info('cp ', node, ' to ', rootId, ' with parent ', clusterId); //,node, data, ' parent is ', clusterId);\n      newGraph.setNode(node, data);\n      if (rootId !== graph.parent(node)) {\n        log.warn('Setting parent', node, graph.parent(node));\n        newGraph.setParent(node, graph.parent(node));\n      }\n\n      if (clusterId !== rootId && node !== clusterId) {\n        log.debug('Setting parent', node, clusterId);\n        newGraph.setParent(node, clusterId);\n      } else {\n        log.info('In copy ', clusterId, 'root', rootId, 'data', graph.node(clusterId), rootId);\n        log.debug(\n          'Not Setting parent for node=',\n          node,\n          'cluster!==rootId',\n          clusterId !== rootId,\n          'node!==clusterId',\n          node !== clusterId\n        );\n      }\n      const edges = graph.edges(node);\n      log.debug('Copying Edges', edges);\n      edges.forEach((edge) => {\n        log.info('Edge', edge);\n        const data = graph.edge(edge.v, edge.w, edge.name);\n        log.info('Edge data', data, rootId);\n        try {\n          // Do not copy edges in and out of the root cluster, they belong to the parent graph\n          if (edgeInCluster(edge, rootId)) {\n            log.info('Copying as ', edge.v, edge.w, data, edge.name);\n            newGraph.setEdge(edge.v, edge.w, data, edge.name);\n            log.info('newGraph edges ', newGraph.edges(), newGraph.edge(newGraph.edges()[0]));\n          } else {\n            log.info(\n              'Skipping copy of edge ',\n              edge.v,\n              '-->',\n              edge.w,\n              ' rootId: ',\n              rootId,\n              ' clusterId:',\n              clusterId\n            );\n          }\n        } catch (e) {\n          log.error(e);\n        }\n      });\n    }\n    log.debug('Removing node', node);\n    graph.removeNode(node);\n  });\n};\nexport const extractDescendants = (id, graph) => {\n  // log.debug('Extracting ', id);\n  const children = graph.children(id);\n  let res = [...children];\n\n  for (const child of children) {\n    parents[child] = id;\n    res = [...res, ...extractDescendants(child, graph)];\n  }\n\n  return res;\n};\n\n/**\n * Validates the graph, checking that all parent child relation points to existing nodes and that\n * edges between nodes also ia correct. When not correct the function logs the discrepancies.\n *\n * @param graph\n */\nexport const validate = (graph) => {\n  const edges = graph.edges();\n  log.trace('Edges: ', edges);\n  for (const edge of edges) {\n    if (graph.children(edge.v).length > 0) {\n      log.trace('The node ', edge.v, ' is part of and edge even though it has children');\n      return false;\n    }\n    if (graph.children(edge.w).length > 0) {\n      log.trace('The node ', edge.w, ' is part of and edge even though it has children');\n      return false;\n    }\n  }\n  return true;\n};\n\n/**\n * Finds a child that is not a cluster. When faking an edge between a node and a cluster.\n *\n * @param id\n * @param {any} graph\n */\nexport const findNonClusterChild = (id, graph) => {\n  // const node = graph.node(id);\n  log.trace('Searching', id);\n  // const children = graph.children(id).reverse();\n  const children = graph.children(id); //.reverse();\n  log.trace('Searching children of id ', id, children);\n  if (children.length < 1) {\n    log.trace('This is a valid node', id);\n    return id;\n  }\n  for (const child of children) {\n    const _id = findNonClusterChild(child, graph);\n    if (_id) {\n      log.trace('Found replacement for', id, ' => ', _id);\n      return _id;\n    }\n  }\n};\n\nconst getAnchorId = (id) => {\n  if (!clusterDb[id]) {\n    return id;\n  }\n  // If the cluster has no external connections\n  if (!clusterDb[id].externalConnections) {\n    return id;\n  }\n\n  // Return the replacement node\n  if (clusterDb[id]) {\n    return clusterDb[id].id;\n  }\n  return id;\n};\n\nexport const adjustClustersAndEdges = (graph, depth) => {\n  if (!graph || depth > 10) {\n    log.debug('Opting out, no graph ');\n    return;\n  } else {\n    log.debug('Opting in, graph ');\n  }\n  // Go through the nodes and for each cluster found, save a replacement node, this can be used when\n  // faking a link to a cluster\n  graph.nodes().forEach(function (id) {\n    const children = graph.children(id);\n    if (children.length > 0) {\n      log.warn(\n        'Cluster identified',\n        id,\n        ' Replacement id in edges: ',\n        findNonClusterChild(id, graph)\n      );\n      descendants[id] = extractDescendants(id, graph);\n      clusterDb[id] = { id: findNonClusterChild(id, graph), clusterData: graph.node(id) };\n    }\n  });\n\n  // Check incoming and outgoing edges for each cluster\n  graph.nodes().forEach(function (id) {\n    const children = graph.children(id);\n    const edges = graph.edges();\n    if (children.length > 0) {\n      log.debug('Cluster identified', id, descendants);\n      edges.forEach((edge) => {\n        // log.debug('Edge, descendants: ', edge, descendants[id]);\n\n        // Check if any edge leaves the cluster (not the actual cluster, that's a link from the box)\n        if (edge.v !== id && edge.w !== id) {\n          // Any edge where either the one of the nodes is descending to the cluster but not the other\n          // if (descendants[id].indexOf(edge.v) < 0 && descendants[id].indexOf(edge.w) < 0) {\n\n          const d1 = isDescendant(edge.v, id);\n          const d2 = isDescendant(edge.w, id);\n\n          // d1 xor d2 - if either d1 is true and d2 is false or the other way around\n          if (d1 ^ d2) {\n            log.warn('Edge: ', edge, ' leaves cluster ', id);\n            log.warn('Descendants of XXX ', id, ': ', descendants[id]);\n            clusterDb[id].externalConnections = true;\n          }\n        }\n      });\n    } else {\n      log.debug('Not a cluster ', id, descendants);\n    }\n  });\n\n  for (let id of Object.keys(clusterDb)) {\n    const nonClusterChild = clusterDb[id].id;\n    const parent = graph.parent(nonClusterChild);\n\n    // Change replacement node of id to parent of current replacement node if valid\n    if (parent !== id && clusterDb[parent] && !clusterDb[parent].externalConnections) {\n      clusterDb[id].id = parent;\n    }\n  }\n\n  // For clusters with incoming and/or outgoing edges translate those edges to a real node\n  // in the cluster in order to fake the edge\n  graph.edges().forEach(function (e) {\n    const edge = graph.edge(e);\n    log.warn('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n    log.warn('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));\n\n    let v = e.v;\n    let w = e.w;\n    // Check if link is either from or to a cluster\n    log.warn(\n      'Fix XXX',\n      clusterDb,\n      'ids:',\n      e.v,\n      e.w,\n      'Translating: ',\n      clusterDb[e.v],\n      ' --- ',\n      clusterDb[e.w]\n    );\n    if (clusterDb[e.v] && clusterDb[e.w] && clusterDb[e.v] === clusterDb[e.w]) {\n      // cspell:ignore trixing\n      log.warn('Fixing and trixing link to self - removing XXX', e.v, e.w, e.name);\n      log.warn('Fixing and trixing - removing XXX', e.v, e.w, e.name);\n      v = getAnchorId(e.v);\n      w = getAnchorId(e.w);\n      graph.removeEdge(e.v, e.w, e.name);\n      const specialId = e.w + '---' + e.v;\n      graph.setNode(specialId, {\n        domId: specialId,\n        id: specialId,\n        labelStyle: '',\n        labelText: edge.label,\n        padding: 0,\n        shape: 'labelRect',\n        style: '',\n      });\n      const edge1 = structuredClone(edge);\n      const edge2 = structuredClone(edge);\n      edge1.label = '';\n      edge1.arrowTypeEnd = 'none';\n      edge2.label = '';\n      edge1.fromCluster = e.v;\n      edge2.toCluster = e.v;\n\n      graph.setEdge(v, specialId, edge1, e.name + '-cyclic-special');\n      graph.setEdge(specialId, w, edge2, e.name + '-cyclic-special');\n    } else if (clusterDb[e.v] || clusterDb[e.w]) {\n      log.warn('Fixing and trixing - removing XXX', e.v, e.w, e.name);\n      v = getAnchorId(e.v);\n      w = getAnchorId(e.w);\n      graph.removeEdge(e.v, e.w, e.name);\n      if (v !== e.v) {\n        const parent = graph.parent(v);\n        clusterDb[parent].externalConnections = true;\n        edge.fromCluster = e.v;\n      }\n      if (w !== e.w) {\n        const parent = graph.parent(w);\n        clusterDb[parent].externalConnections = true;\n        edge.toCluster = e.w;\n      }\n      log.warn('Fix Replacing with XXX', v, w, e.name);\n      graph.setEdge(v, w, edge, e.name);\n    }\n  });\n  log.warn('Adjusted Graph', graphlibJson.write(graph));\n  extractor(graph, 0);\n\n  log.trace(clusterDb);\n\n  // Remove references to extracted cluster\n  // graph.edges().forEach(edge => {\n  //   if (isDescendant(edge.v, clusterId) || isDescendant(edge.w, clusterId)) {\n  //     graph.removeEdge(edge);\n  //   }\n  // });\n};\n\nexport const extractor = (graph, depth) => {\n  log.warn('extractor - ', depth, graphlibJson.write(graph), graph.children('D'));\n  if (depth > 10) {\n    log.error('Bailing out');\n    return;\n  }\n  // For clusters without incoming and/or outgoing edges, create a new cluster-node\n  // containing the nodes and edges in the custer in a new graph\n  // for (let i = 0;)\n  let nodes = graph.nodes();\n  let hasChildren = false;\n  for (const node of nodes) {\n    const children = graph.children(node);\n    hasChildren = hasChildren || children.length > 0;\n  }\n\n  if (!hasChildren) {\n    log.debug('Done, no node has children', graph.nodes());\n    return;\n  }\n  // const clusters = Object.keys(clusterDb);\n  // clusters.forEach(clusterId => {\n  log.debug('Nodes = ', nodes, depth);\n  for (const node of nodes) {\n    log.debug(\n      'Extracting node',\n      node,\n      clusterDb,\n      clusterDb[node] && !clusterDb[node].externalConnections,\n      !graph.parent(node),\n      graph.node(node),\n      graph.children('D'),\n      ' Depth ',\n      depth\n    );\n    // Note that the node might have been removed after the Object.keys call so better check\n    // that it still is in the game\n    if (!clusterDb[node]) {\n      // Skip if the node is not a cluster\n      log.debug('Not a cluster', node, depth);\n      // break;\n    } else if (\n      !clusterDb[node].externalConnections &&\n      // !graph.parent(node) &&\n      graph.children(node) &&\n      graph.children(node).length > 0\n    ) {\n      log.warn(\n        'Cluster without external connections, without a parent and with children',\n        node,\n        depth\n      );\n\n      const graphSettings = graph.graph();\n      let dir = graphSettings.rankdir === 'TB' ? 'LR' : 'TB';\n      if (clusterDb[node]?.clusterData?.dir) {\n        dir = clusterDb[node].clusterData.dir;\n        log.warn('Fixing dir', clusterDb[node].clusterData.dir, dir);\n      }\n\n      const clusterGraph = new graphlib.Graph({\n        multigraph: true,\n        compound: true,\n      })\n        .setGraph({\n          rankdir: dir, // Todo: set proper spacing\n          nodesep: 50,\n          ranksep: 50,\n          marginx: 8,\n          marginy: 8,\n        })\n        .setDefaultEdgeLabel(function () {\n          return {};\n        });\n\n      log.warn('Old graph before copy', graphlibJson.write(graph));\n      copy(node, graph, clusterGraph, node);\n      graph.setNode(node, {\n        clusterNode: true,\n        id: node,\n        clusterData: clusterDb[node].clusterData,\n        labelText: clusterDb[node].labelText,\n        graph: clusterGraph,\n      });\n      log.warn('New graph after copy node: (', node, ')', graphlibJson.write(clusterGraph));\n      log.debug('Old graph after copy', graphlibJson.write(graph));\n    } else {\n      log.warn(\n        'Cluster ** ',\n        node,\n        ' **not meeting the criteria !externalConnections:',\n        !clusterDb[node].externalConnections,\n        ' no parent: ',\n        !graph.parent(node),\n        ' children ',\n        graph.children(node) && graph.children(node).length > 0,\n        graph.children('D'),\n        depth\n      );\n      log.debug(clusterDb);\n    }\n  }\n\n  nodes = graph.nodes();\n  log.warn('New list of nodes', nodes);\n  for (const node of nodes) {\n    const data = graph.node(node);\n    log.warn(' Now next level', node, data);\n    if (data.clusterNode) {\n      extractor(data.graph, depth + 1);\n    }\n  }\n};\n\nconst sorter = (graph, nodes) => {\n  if (nodes.length === 0) {\n    return [];\n  }\n  let result = Object.assign(nodes);\n  nodes.forEach((node) => {\n    const children = graph.children(node);\n    const sorted = sorter(graph, children);\n    result = [...result, ...sorted];\n  });\n\n  return result;\n};\n\nexport const sortNodesByHierarchy = (graph) => sorter(graph, graph.children());\n", "import intersectRect from './intersect/intersect-rect.js';\nimport { log } from '../logger.js';\nimport createLabel from './createLabel.js';\nimport { createText } from '../rendering-util/createText.js';\nimport { select } from 'd3';\nimport { getConfig } from '../diagram-api/diagramAPI.js';\nimport { evaluate } from '../diagrams/common/common.js';\nimport { getSubGraphTitleMargins } from '../utils/subGraphTitleMargins.js';\n\nconst rect = (parent, node) => {\n  log.info('Creating subgraph rect for ', node.id, node);\n  const siteConfig = getConfig();\n\n  // Add outer g element\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', 'cluster' + (node.class ? ' ' + node.class : ''))\n    .attr('id', node.id);\n\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  const useHtmlLabels = evaluate(siteConfig.flowchart.htmlLabels);\n\n  // Create the label and insert it after the rect\n  const label = shapeSvg.insert('g').attr('class', 'cluster-label');\n\n  // const text = label\n  //   .node()\n  //   .appendChild(createLabel(node.labelText, node.labelStyle, undefined, true));\n  const text =\n    node.labelType === 'markdown'\n      ? createText(label, node.labelText, { style: node.labelStyle, useHtmlLabels }, siteConfig)\n      : label.node().appendChild(createLabel(node.labelText, node.labelStyle, undefined, true));\n\n  // Get the size of the label\n  let bbox = text.getBBox();\n\n  if (evaluate(siteConfig.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 padding = 0 * node.padding;\n  const halfPadding = padding / 2;\n\n  const width = node.width <= bbox.width + padding ? bbox.width + padding : node.width;\n  if (node.width <= bbox.width + padding) {\n    node.diff = (bbox.width - node.width) / 2 - node.padding / 2;\n  } else {\n    node.diff = -node.padding / 2;\n  }\n\n  log.trace('Data ', node, JSON.stringify(node));\n  // center the rect around its coordinate\n  rect\n    .attr('style', node.style)\n    .attr('rx', node.rx)\n    .attr('ry', node.ry)\n    .attr('x', node.x - width / 2)\n    .attr('y', node.y - node.height / 2 - halfPadding)\n    .attr('width', width)\n    .attr('height', node.height + padding);\n\n  const { subGraphTitleTopMargin } = getSubGraphTitleMargins(siteConfig);\n  if (useHtmlLabels) {\n    label.attr(\n      'transform',\n      // This puts the label on top of the box instead of inside it\n      `translate(${node.x - bbox.width / 2}, ${node.y - node.height / 2 + subGraphTitleTopMargin})`\n    );\n  } else {\n    label.attr(\n      'transform',\n      // This puts the label on top of the box instead of inside it\n      `translate(${node.x}, ${node.y - node.height / 2 + subGraphTitleTopMargin})`\n    );\n  }\n  // Center the label\n\n  const rectBox = rect.node().getBBox();\n  node.width = rectBox.width;\n  node.height = rectBox.height;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return shapeSvg;\n};\n\n/**\n * Non visible cluster where the note is group with its\n *\n * @param {any} parent\n * @param {any} node\n * @returns {any} ShapeSvg\n */\nconst noteGroup = (parent, node) => {\n  // Add outer g element\n  const shapeSvg = parent.insert('g').attr('class', 'note-cluster').attr('id', node.id);\n\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  const padding = 0 * node.padding;\n  const halfPadding = padding / 2;\n\n  // center the rect around its coordinate\n  rect\n    .attr('rx', node.rx)\n    .attr('ry', node.ry)\n    .attr('x', node.x - node.width / 2 - halfPadding)\n    .attr('y', node.y - node.height / 2 - halfPadding)\n    .attr('width', node.width + padding)\n    .attr('height', node.height + padding)\n    .attr('fill', 'none');\n\n  const rectBox = rect.node().getBBox();\n  node.width = rectBox.width;\n  node.height = rectBox.height;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return shapeSvg;\n};\nconst roundedWithTitle = (parent, node) => {\n  const siteConfig = getConfig();\n\n  // Add outer g element\n  const shapeSvg = parent.insert('g').attr('class', node.classes).attr('id', node.id);\n\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  // Create the label and insert it after the rect\n  const label = shapeSvg.insert('g').attr('class', 'cluster-label');\n  const innerRect = shapeSvg.append('rect');\n\n  const text = label\n    .node()\n    .appendChild(createLabel(node.labelText, node.labelStyle, undefined, true));\n\n  // Get the size of the label\n  let bbox = text.getBBox();\n  if (evaluate(siteConfig.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  bbox = text.getBBox();\n  const padding = 0 * node.padding;\n  const halfPadding = padding / 2;\n\n  const width = node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width;\n  if (node.width <= bbox.width + node.padding) {\n    node.diff = (bbox.width + node.padding * 0 - node.width) / 2;\n  } else {\n    node.diff = -node.padding / 2;\n  }\n\n  // center the rect around its coordinate\n  rect\n    .attr('class', 'outer')\n    .attr('x', node.x - width / 2 - halfPadding)\n    .attr('y', node.y - node.height / 2 - halfPadding)\n    .attr('width', width + padding)\n    .attr('height', node.height + padding);\n  innerRect\n    .attr('class', 'inner')\n    .attr('x', node.x - width / 2 - halfPadding)\n    .attr('y', node.y - node.height / 2 - halfPadding + bbox.height - 1)\n    .attr('width', width + padding)\n    .attr('height', node.height + padding - bbox.height - 3);\n\n  const { subGraphTitleTopMargin } = getSubGraphTitleMargins(siteConfig);\n  // Center the label\n  label.attr(\n    'transform',\n    `translate(${node.x - bbox.width / 2}, ${\n      node.y -\n      node.height / 2 -\n      node.padding / 3 +\n      (evaluate(siteConfig.flowchart.htmlLabels) ? 5 : 3) +\n      subGraphTitleTopMargin\n    })`\n  );\n\n  const rectBox = rect.node().getBBox();\n  node.height = rectBox.height;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return shapeSvg;\n};\n\nconst divider = (parent, node) => {\n  // Add outer g element\n  const shapeSvg = parent.insert('g').attr('class', node.classes).attr('id', node.id);\n\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  const padding = 0 * node.padding;\n  const halfPadding = padding / 2;\n\n  // center the rect around its coordinate\n  rect\n    .attr('class', 'divider')\n    .attr('x', node.x - node.width / 2 - halfPadding)\n    .attr('y', node.y - node.height / 2)\n    .attr('width', node.width + padding)\n    .attr('height', node.height + padding);\n\n  const rectBox = rect.node().getBBox();\n  node.width = rectBox.width;\n  node.height = rectBox.height;\n  node.diff = -node.padding / 2;\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return shapeSvg;\n};\n\nconst shapes = { rect, roundedWithTitle, noteGroup, divider };\n\nlet clusterElems = {};\n\nexport const insertCluster = (elem, node) => {\n  log.trace('Inserting cluster');\n  const shape = node.shape || 'rect';\n  clusterElems[node.id] = shapes[shape](elem, node);\n};\nexport const getClusterTitleWidth = (elem, node) => {\n  const label = createLabel(node.labelText, node.labelStyle, undefined, true);\n  elem.node().appendChild(label);\n  const width = label.getBBox().width;\n  elem.node().removeChild(label);\n  return width;\n};\n\nexport const clear = () => {\n  clusterElems = {};\n};\n\nexport const positionCluster = (node) => {\n  log.info('Position cluster (' + node.id + ', ' + node.x + ', ' + node.y + ')');\n  const el = clusterElems[node.id];\n\n  el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');\n};\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\n// @ts-ignore: JISON doesn't support types\nimport parser from './parser/classDiagram.jison';\nimport db from './classDb.js';\nimport styles from './styles.js';\nimport renderer from './classRenderer-v2.js';\n\nexport const diagram: DiagramDefinition = {\n  parser,\n  db,\n  renderer,\n  styles,\n  init: (cnf) => {\n    if (!cnf.class) {\n      cnf.class = {};\n    }\n    cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n    db.clear();\n  },\n};\n"],
  "mappings": "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",
  "names": ["select", "graphlib", "graphlibJson", "clear", "data", "rect", "clear", "clear", "conf", "select", "rect"]
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy