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

package.dist.chunks.mermaid.core.classDiagram-4BHYIK4I.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.js", "../../../src/diagrams/class/svgDraw.js", "../../../src/diagrams/class/classDiagram.ts"],
  "sourcesContent": ["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.js';\nimport svgDraw from './svgDraw.js';\nimport { configureSvgSize } from '../../setupGraphViewbox.js';\nimport { getConfig } from '../../diagram-api/diagramAPI.js';\n\nlet idCache = {};\nconst padding = 20;\n\n/**\n * Gets the ID with the same label as in the cache\n *\n * @param {string} label The label to look for\n * @returns {string} The resulting ID\n */\nconst getGraphId = function (label) {\n  const foundEntry = Object.entries(idCache).find((entry) => entry[1].label === label);\n\n  if (foundEntry) {\n    return foundEntry[0];\n  }\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n *\n * @param {SVGSVGElement} elem The SVG element to append to\n */\nconst insertMarkers = function (elem) {\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', 'extensionStart')\n    .attr('class', 'extension')\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', 'extensionEnd')\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  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', 'compositionStart')\n    .attr('class', 'extension')\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', 'compositionEnd')\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\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', 'aggregationStart')\n    .attr('class', 'extension')\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', 'aggregationEnd')\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\n  elem\n    .append('defs')\n    .append('marker')\n    .attr('id', 'dependencyStart')\n    .attr('class', 'extension')\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', '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 18,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 {string} text\n * @param {string} id\n * @param {any} _version\n * @param diagObj\n */\nexport const draw = function (text, id, _version, diagObj) {\n  const conf = getConfig().class;\n  idCache = {};\n\n  log.info('Rendering diagram ' + text);\n\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\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 g = new graphlib.Graph({\n    multigraph: true,\n  });\n\n  // Set an object for the graph label\n  g.setGraph({\n    isMultiGraph: true,\n  });\n\n  // Default to assigning a new object as a label for each new edge.\n  g.setDefaultEdgeLabel(function () {\n    return {};\n  });\n\n  const classes = diagObj.db.getClasses();\n  const keys = [...classes.keys()];\n\n  for (const key of keys) {\n    const classDef = classes.get(key);\n    const node = svgDraw.drawClass(diagram, classDef, conf, diagObj);\n    idCache[node.id] = node;\n\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    g.setNode(node.id, node);\n\n    log.info('Org height: ' + node.height);\n  }\n\n  const relations = diagObj.db.getRelations();\n  relations.forEach(function (relation) {\n    log.info(\n      // cspell:ignore tjoho\n      'tjoho' + getGraphId(relation.id1) + getGraphId(relation.id2) + JSON.stringify(relation)\n    );\n    g.setEdge(\n      getGraphId(relation.id1),\n      getGraphId(relation.id2),\n      {\n        relation: relation,\n      },\n      relation.title || 'DEFAULT'\n    );\n  });\n\n  const notes = diagObj.db.getNotes();\n  notes.forEach(function (note) {\n    log.debug(`Adding note: ${JSON.stringify(note)}`);\n    const node = svgDraw.drawNote(diagram, note, conf, diagObj);\n    idCache[node.id] = node;\n\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    g.setNode(node.id, node);\n    if (note.class && classes.has(note.class)) {\n      g.setEdge(\n        note.id,\n        getGraphId(note.class),\n        {\n          relation: {\n            id1: note.id,\n            id2: note.class,\n            relation: {\n              type1: 'none',\n              type2: 'none',\n              lineType: 10,\n            },\n          },\n        },\n        'DEFAULT'\n      );\n    }\n  });\n\n  dagreLayout(g);\n  g.nodes().forEach(function (v) {\n    if (v !== undefined && g.node(v) !== undefined) {\n      log.debug('Node ' + v + ': ' + JSON.stringify(g.node(v)));\n      root\n        .select('#' + (diagObj.db.lookUpDomId(v) || v))\n        .attr(\n          'transform',\n          'translate(' +\n            (g.node(v).x - g.node(v).width / 2) +\n            ',' +\n            (g.node(v).y - g.node(v).height / 2) +\n            ' )'\n        );\n    }\n  });\n\n  g.edges().forEach(function (e) {\n    if (e !== undefined && g.edge(e) !== undefined) {\n      log.debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(g.edge(e)));\n      svgDraw.drawEdge(diagram, g.edge(e), g.edge(e).relation, conf, diagObj);\n    }\n  });\n\n  const svgBounds = diagram.node().getBBox();\n  const width = svgBounds.width + padding * 2;\n  const height = svgBounds.height + padding * 2;\n\n  configureSvgSize(diagram, height, width, conf.useMaxWidth);\n\n  // Ensure the viewBox includes the whole svgBounds area with extra space for padding\n  const vBox = `${svgBounds.x - padding} ${svgBounds.y - padding} ${width} ${height}`;\n  log.debug(`viewBox ${vBox}`);\n  diagram.attr('viewBox', vBox);\n};\n\nexport default {\n  draw,\n};\n", "import { line, curveBasis } from 'd3';\nimport utils from '../../utils.js';\nimport { log } from '../../logger.js';\nimport { parseGenericTypes } from '../common/common.js';\n\nlet edgeCount = 0;\nexport const drawEdge = function (elem, path, relation, conf, diagObj) {\n  const getRelationType = function (type) {\n    switch (type) {\n      case diagObj.db.relationType.AGGREGATION:\n        return 'aggregation';\n      case diagObj.db.relationType.EXTENSION:\n        return 'extension';\n      case diagObj.db.relationType.COMPOSITION:\n        return 'composition';\n      case diagObj.db.relationType.DEPENDENCY:\n        return 'dependency';\n      case diagObj.db.relationType.LOLLIPOP:\n        return 'lollipop';\n    }\n  };\n\n  path.points = path.points.filter((p) => !Number.isNaN(p.y));\n\n  // The data for our line\n  const lineData = path.points;\n\n  // This is the accessor function we talked about above\n  const lineFunction = line()\n    .x(function (d) {\n      return d.x;\n    })\n    .y(function (d) {\n      return d.y;\n    })\n    .curve(curveBasis);\n\n  const svgPath = elem\n    .append('path')\n    .attr('d', lineFunction(lineData))\n    .attr('id', 'edge' + edgeCount)\n    .attr('class', 'relation');\n  let url = '';\n  if (conf.arrowMarkerAbsolute) {\n    url =\n      window.location.protocol +\n      '//' +\n      window.location.host +\n      window.location.pathname +\n      window.location.search;\n    url = url.replace(/\\(/g, '\\\\(');\n    url = url.replace(/\\)/g, '\\\\)');\n  }\n\n  if (relation.relation.lineType == 1) {\n    svgPath.attr('class', 'relation dashed-line');\n  }\n  if (relation.relation.lineType == 10) {\n    svgPath.attr('class', 'relation dotted-line');\n  }\n  if (relation.relation.type1 !== 'none') {\n    svgPath.attr(\n      'marker-start',\n      'url(' + url + '#' + getRelationType(relation.relation.type1) + 'Start' + ')'\n    );\n  }\n  if (relation.relation.type2 !== 'none') {\n    svgPath.attr(\n      'marker-end',\n      'url(' + url + '#' + getRelationType(relation.relation.type2) + 'End' + ')'\n    );\n  }\n\n  let x, y;\n  const l = path.points.length;\n  // Calculate Label position\n  let labelPosition = utils.calcLabelPosition(path.points);\n  x = labelPosition.x;\n  y = labelPosition.y;\n\n  let p1_card_x, p1_card_y;\n  let p2_card_x, p2_card_y;\n\n  if (l % 2 !== 0 && l > 1) {\n    let cardinality_1_point = utils.calcCardinalityPosition(\n      relation.relation.type1 !== 'none',\n      path.points,\n      path.points[0]\n    );\n    let cardinality_2_point = utils.calcCardinalityPosition(\n      relation.relation.type2 !== 'none',\n      path.points,\n      path.points[l - 1]\n    );\n\n    log.debug('cardinality_1_point ' + JSON.stringify(cardinality_1_point));\n    log.debug('cardinality_2_point ' + JSON.stringify(cardinality_2_point));\n\n    p1_card_x = cardinality_1_point.x;\n    p1_card_y = cardinality_1_point.y;\n    p2_card_x = cardinality_2_point.x;\n    p2_card_y = cardinality_2_point.y;\n  }\n\n  if (relation.title !== undefined) {\n    const g = elem.append('g').attr('class', 'classLabel');\n    const label = g\n      .append('text')\n      .attr('class', 'label')\n      .attr('x', x)\n      .attr('y', y)\n      .attr('fill', 'red')\n      .attr('text-anchor', 'middle')\n      .text(relation.title);\n\n    window.label = label;\n    const bounds = label.node().getBBox();\n\n    g.insert('rect', ':first-child')\n      .attr('class', 'box')\n      .attr('x', bounds.x - conf.padding / 2)\n      .attr('y', bounds.y - conf.padding / 2)\n      .attr('width', bounds.width + conf.padding)\n      .attr('height', bounds.height + conf.padding);\n  }\n\n  log.info('Rendering relation ' + JSON.stringify(relation));\n  if (relation.relationTitle1 !== undefined && relation.relationTitle1 !== 'none') {\n    const g = elem.append('g').attr('class', 'cardinality');\n    g.append('text')\n      .attr('class', 'type1')\n      .attr('x', p1_card_x)\n      .attr('y', p1_card_y)\n      .attr('fill', 'black')\n      .attr('font-size', '6')\n      .text(relation.relationTitle1);\n  }\n  if (relation.relationTitle2 !== undefined && relation.relationTitle2 !== 'none') {\n    const g = elem.append('g').attr('class', 'cardinality');\n    g.append('text')\n      .attr('class', 'type2')\n      .attr('x', p2_card_x)\n      .attr('y', p2_card_y)\n      .attr('fill', 'black')\n      .attr('font-size', '6')\n      .text(relation.relationTitle2);\n  }\n\n  edgeCount++;\n};\n\n/**\n * Renders a class diagram\n *\n * @param {SVGSVGElement} elem The element to draw it into\n * @param classDef\n * @param conf\n * @param diagObj\n * @todo Add more information in the JSDOC here\n */\nexport const drawClass = function (elem, classDef, conf, diagObj) {\n  log.debug('Rendering class ', classDef, conf);\n\n  const id = classDef.id;\n  const classInfo = {\n    id: id,\n    label: classDef.id,\n    width: 0,\n    height: 0,\n  };\n\n  // add class group\n  const g = elem.append('g').attr('id', diagObj.db.lookUpDomId(id)).attr('class', 'classGroup');\n\n  let title;\n  if (classDef.link) {\n    title = g\n      .append('svg:a')\n      .attr('xlink:href', classDef.link)\n      .attr('target', classDef.linkTarget)\n      .append('text')\n      .attr('y', conf.textHeight + conf.padding)\n      .attr('x', 0);\n  } else {\n    title = g\n      .append('text')\n      .attr('y', conf.textHeight + conf.padding)\n      .attr('x', 0);\n  }\n\n  // add annotations\n  let isFirst = true;\n  classDef.annotations.forEach(function (member) {\n    const titleText2 = title.append('tspan').text('\u00AB' + member + '\u00BB');\n    if (!isFirst) {\n      titleText2.attr('dy', conf.textHeight);\n    }\n    isFirst = false;\n  });\n\n  let classTitleString = getClassTitleString(classDef);\n\n  const classTitle = title.append('tspan').text(classTitleString).attr('class', 'title');\n\n  // If class has annotations the title needs to have an offset of the text height\n  if (!isFirst) {\n    classTitle.attr('dy', conf.textHeight);\n  }\n\n  const titleHeight = title.node().getBBox().height;\n  let membersLine;\n  let membersBox;\n  let methodsLine;\n\n  // don't draw box if no members\n  if (classDef.members.length > 0) {\n    membersLine = g\n      .append('line') // text label for the x axis\n      .attr('x1', 0)\n      .attr('y1', conf.padding + titleHeight + conf.dividerMargin / 2)\n      .attr('y2', conf.padding + titleHeight + conf.dividerMargin / 2);\n\n    const members = g\n      .append('text') // text label for the x axis\n      .attr('x', conf.padding)\n      .attr('y', titleHeight + conf.dividerMargin + conf.textHeight)\n      .attr('fill', 'white')\n      .attr('class', 'classText');\n\n    isFirst = true;\n    classDef.members.forEach(function (member) {\n      addTspan(members, member, isFirst, conf);\n      isFirst = false;\n    });\n\n    membersBox = members.node().getBBox();\n  }\n\n  // don't draw box if no methods\n  if (classDef.methods.length > 0) {\n    methodsLine = g\n      .append('line') // text label for the x axis\n      .attr('x1', 0)\n      .attr('y1', conf.padding + titleHeight + conf.dividerMargin + membersBox.height)\n      .attr('y2', conf.padding + titleHeight + conf.dividerMargin + membersBox.height);\n\n    const methods = g\n      .append('text') // text label for the x axis\n      .attr('x', conf.padding)\n      .attr('y', titleHeight + 2 * conf.dividerMargin + membersBox.height + conf.textHeight)\n      .attr('fill', 'white')\n      .attr('class', 'classText');\n\n    isFirst = true;\n\n    classDef.methods.forEach(function (method) {\n      addTspan(methods, method, isFirst, conf);\n      isFirst = false;\n    });\n  }\n\n  const classBox = g.node().getBBox();\n  var cssClassStr = ' ';\n\n  if (classDef.cssClasses.length > 0) {\n    cssClassStr = cssClassStr + classDef.cssClasses.join(' ');\n  }\n\n  const rect = g\n    .insert('rect', ':first-child')\n    .attr('x', 0)\n    .attr('y', 0)\n    .attr('width', classBox.width + 2 * conf.padding)\n    .attr('height', classBox.height + conf.padding + 0.5 * conf.dividerMargin)\n    .attr('class', cssClassStr);\n\n  const rectWidth = rect.node().getBBox().width;\n\n  // Center title\n  // We subtract the width of each text element from the class box width and divide it by 2\n  title.node().childNodes.forEach(function (x) {\n    x.setAttribute('x', (rectWidth - x.getBBox().width) / 2);\n  });\n\n  if (classDef.tooltip) {\n    title.insert('title').text(classDef.tooltip);\n  }\n\n  if (membersLine) {\n    membersLine.attr('x2', rectWidth);\n  }\n  if (methodsLine) {\n    methodsLine.attr('x2', rectWidth);\n  }\n\n  classInfo.width = rectWidth;\n  classInfo.height = classBox.height + conf.padding + 0.5 * conf.dividerMargin;\n\n  return classInfo;\n};\n\nexport const getClassTitleString = function (classDef) {\n  let classTitleString = classDef.id;\n\n  if (classDef.type) {\n    classTitleString += '<' + parseGenericTypes(classDef.type) + '>';\n  }\n\n  return classTitleString;\n};\n\n/**\n * Renders a note diagram\n *\n * @param {SVGSVGElement} elem The element to draw it into\n * @param {{id: string; text: string; class: string;}} note\n * @param conf\n * @param _diagObj\n * @todo Add more information in the JSDOC here\n */\nexport const drawNote = function (elem, note, conf, _diagObj) {\n  log.debug('Rendering note ', note, conf);\n\n  const id = note.id;\n  const noteInfo = {\n    id: id,\n    text: note.text,\n    width: 0,\n    height: 0,\n  };\n\n  // add class group\n  const g = elem.append('g').attr('id', id).attr('class', 'classGroup');\n\n  // add text\n  let text = g\n    .append('text')\n    .attr('y', conf.textHeight + conf.padding)\n    .attr('x', 0);\n\n  const lines = JSON.parse(`\"${note.text}\"`).split('\\n');\n\n  lines.forEach(function (line) {\n    log.debug(`Adding line: ${line}`);\n    text.append('tspan').text(line).attr('class', 'title').attr('dy', conf.textHeight);\n  });\n\n  const noteBox = g.node().getBBox();\n\n  const rect = g\n    .insert('rect', ':first-child')\n    .attr('x', 0)\n    .attr('y', 0)\n    .attr('width', noteBox.width + 2 * conf.padding)\n    .attr(\n      'height',\n      noteBox.height + lines.length * conf.textHeight + conf.padding + 0.5 * conf.dividerMargin\n    );\n\n  const rectWidth = rect.node().getBBox().width;\n\n  // Center title\n  // We subtract the width of each text element from the class box width and divide it by 2\n  text.node().childNodes.forEach(function (x) {\n    x.setAttribute('x', (rectWidth - x.getBBox().width) / 2);\n  });\n\n  noteInfo.width = rectWidth;\n  noteInfo.height =\n    noteBox.height + lines.length * conf.textHeight + conf.padding + 0.5 * conf.dividerMargin;\n\n  return noteInfo;\n};\n\n/**\n * Adds a  for a member in a diagram\n *\n * @param {SVGElement} textEl The element to append to\n * @param {string} member The member\n * @param {boolean} isFirst\n * @param {{ padding: string; textHeight: string }} conf The configuration for the member\n */\nconst addTspan = function (textEl, member, isFirst, conf) {\n  const { displayText, cssStyle } = member.getDisplayDetails();\n  const tSpan = textEl.append('tspan').attr('x', conf.padding).text(displayText);\n\n  if (cssStyle !== '') {\n    tSpan.attr('style', member.cssStyle);\n  }\n\n  if (!isFirst) {\n    tSpan.attr('dy', conf.textHeight);\n  }\n};\n\nexport default {\n  getClassTitleString,\n  drawClass,\n  drawEdge,\n  drawNote,\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.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": ["line", "diagram"]
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy