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