summaryrefslogtreecommitdiff
path: root/themes/blowfish/assets/lib/mermaid/stateDiagram-v2-78805701.js.map
blob: d3a70e031bd81bcec8a413db61ff0eb515a21caa (plain)
1
{"version":3,"file":"stateDiagram-v2-78805701.js","sources":["../src/diagrams/state/stateRenderer-v2.js","../src/diagrams/state/stateDiagram-v2.ts"],"sourcesContent":["import * as graphlib from 'dagre-d3-es/src/graphlib/index.js';\nimport { select } from 'd3';\nimport { getConfig } from '../../config';\nimport { render } from '../../dagre-wrapper/index.js';\nimport { log } from '../../logger';\nimport { configureSvgSize } from '../../setupGraphViewbox';\nimport common from '../common/common';\nimport utils from '../../utils';\n\nimport {\n  DEFAULT_DIAGRAM_DIRECTION,\n  DEFAULT_NESTED_DOC_DIR,\n  STMT_STATE,\n  STMT_RELATION,\n  DEFAULT_STATE_TYPE,\n  DIVIDER_TYPE,\n} from './stateCommon';\n\n// --------------------------------------\n// Shapes\nconst SHAPE_STATE = 'rect';\nconst SHAPE_STATE_WITH_DESC = 'rectWithTitle';\nconst SHAPE_START = 'start';\nconst SHAPE_END = 'end';\nconst SHAPE_DIVIDER = 'divider';\nconst SHAPE_GROUP = 'roundedWithTitle';\nconst SHAPE_NOTE = 'note';\nconst SHAPE_NOTEGROUP = 'noteGroup';\n\n// --------------------------------------\n// CSS classes\nconst CSS_DIAGRAM = 'statediagram';\nconst CSS_STATE = 'state';\nconst CSS_DIAGRAM_STATE = `${CSS_DIAGRAM}-${CSS_STATE}`;\nconst CSS_EDGE = 'transition';\nconst CSS_NOTE = 'note';\nconst CSS_NOTE_EDGE = 'note-edge';\nconst CSS_EDGE_NOTE_EDGE = `${CSS_EDGE} ${CSS_NOTE_EDGE}`;\nconst CSS_DIAGRAM_NOTE = `${CSS_DIAGRAM}-${CSS_NOTE}`;\nconst CSS_CLUSTER = 'cluster';\nconst CSS_DIAGRAM_CLUSTER = `${CSS_DIAGRAM}-${CSS_CLUSTER}`;\nconst CSS_CLUSTER_ALT = 'cluster-alt';\nconst CSS_DIAGRAM_CLUSTER_ALT = `${CSS_DIAGRAM}-${CSS_CLUSTER_ALT}`;\n\n// --------------------------------------\n// DOM and element IDs\nconst PARENT = 'parent';\nconst NOTE = 'note';\nconst DOMID_STATE = 'state';\nconst DOMID_TYPE_SPACER = '----';\nconst NOTE_ID = `${DOMID_TYPE_SPACER}${NOTE}`;\nconst PARENT_ID = `${DOMID_TYPE_SPACER}${PARENT}`;\n// --------------------------------------\n// Graph edge settings\nconst G_EDGE_STYLE = 'fill:none';\nconst G_EDGE_ARROWHEADSTYLE = 'fill: #333';\nconst G_EDGE_LABELPOS = 'c';\nconst G_EDGE_LABELTYPE = 'text';\nconst G_EDGE_THICKNESS = 'normal';\n\n// --------------------------------------\n// List of nodes created from the parsed diagram statement items\nlet nodeDb = {};\n\nlet graphItemCount = 0; // used to construct ids, etc.\n\n// Configuration\nconst conf = {};\n\n// -----------------------------------------------------------------------\n\nexport const setConf = function (cnf) {\n  const keys = Object.keys(cnf);\n  for (const key of keys) {\n    conf[key] = cnf[key];\n  }\n};\n\n/**\n * Returns the all the classdef styles (a.k.a. classes) from classDef statements in the graph definition.\n *\n * @param {string} text - the diagram text to be parsed\n * @param diagramObj\n * @returns {object} ClassDef styles (a Map with keys = strings, values = )\n */\nexport const getClasses = function (text, diagramObj) {\n  log.trace('Extracting classes');\n  diagramObj.db.clear();\n  try {\n    // Parse the graph definition\n    diagramObj.parser.parse(text);\n    // must run extract() to turn the parsed statements into states, relationships, classes, etc.\n    diagramObj.db.extract(diagramObj.db.getRootDocV2());\n    return diagramObj.db.getClasses();\n  } catch (e) {\n    return e;\n  }\n};\n\n/**\n * Get classes from the db for the info item.\n * If there aren't any or if dbInfoItem isn't defined, return an empty string.\n * Else create 1 string from the list of classes found\n *\n * @param {undefined | null | object} dbInfoItem\n * @returns {string}\n */\nfunction getClassesFromDbInfo(dbInfoItem) {\n  if (dbInfoItem === undefined || dbInfoItem === null) {\n    return '';\n  } else {\n    if (dbInfoItem.classes) {\n      return dbInfoItem.classes.join(' ');\n    } else {\n      return '';\n    }\n  }\n}\n\n/**\n * Create a standard string for the dom ID of an item.\n * If a type is given, insert that before the counter, preceded by the type spacer\n *\n * @param itemId\n * @param counter\n * @param {string | null} type\n * @param typeSpacer\n * @returns {string}\n */\nexport function stateDomId(itemId = '', counter = 0, type = '', typeSpacer = DOMID_TYPE_SPACER) {\n  const typeStr = type !== null && type.length > 0 ? `${typeSpacer}${type}` : '';\n  return `${DOMID_STATE}-${itemId}${typeStr}-${counter}`;\n}\n\n/**\n * Create a graph node based on the statement information\n *\n * @param g - graph\n * @param {object} parent\n * @param {object} parsedItem - parsed statement item\n * @param {object[]} diagramStates - the list of all known  states for the diagram\n * @param {object} diagramDb\n * @param {boolean} altFlag - for clusters, add the \"statediagram-cluster-alt\" CSS class\n */\nconst setupNode = (g, parent, parsedItem, diagramStates, diagramDb, altFlag) => {\n  const itemId = parsedItem.id;\n  const classStr = getClassesFromDbInfo(diagramStates[itemId]);\n\n  if (itemId !== 'root') {\n    let shape = SHAPE_STATE;\n    if (parsedItem.start === true) {\n      shape = SHAPE_START;\n    }\n    if (parsedItem.start === false) {\n      shape = SHAPE_END;\n    }\n    if (parsedItem.type !== DEFAULT_STATE_TYPE) {\n      shape = parsedItem.type;\n    }\n\n    // Add the node to our list (nodeDb)\n    if (!nodeDb[itemId]) {\n      nodeDb[itemId] = {\n        id: itemId,\n        shape,\n        description: common.sanitizeText(itemId, getConfig()),\n        classes: `${classStr} ${CSS_DIAGRAM_STATE}`,\n      };\n    }\n\n    const newNode = nodeDb[itemId];\n\n    // Save data for description and group so that for instance a statement without description overwrites\n    // one with description  @todo TODO What does this mean? If important, add a test for it\n\n    // Build of the array of description strings\n    if (parsedItem.description) {\n      if (Array.isArray(newNode.description)) {\n        // There already is an array of strings,add to it\n        newNode.shape = SHAPE_STATE_WITH_DESC;\n        newNode.description.push(parsedItem.description);\n      } else {\n        if (newNode.description.length > 0) {\n          // if there is a description already transform it to an array\n          newNode.shape = SHAPE_STATE_WITH_DESC;\n          if (newNode.description === itemId) {\n            // If the previous description was this, remove it\n            newNode.description = [parsedItem.description];\n          } else {\n            newNode.description = [newNode.description, parsedItem.description];\n          }\n        } else {\n          newNode.shape = SHAPE_STATE;\n          newNode.description = parsedItem.description;\n        }\n      }\n      newNode.description = common.sanitizeTextOrArray(newNode.description, getConfig());\n    }\n\n    // If there's only 1 description entry, just use a regular state shape\n    if (newNode.description.length === 1 && newNode.shape === SHAPE_STATE_WITH_DESC) {\n      newNode.shape = SHAPE_STATE;\n    }\n\n    // group\n    if (!newNode.type && parsedItem.doc) {\n      log.info('Setting cluster for ', itemId, getDir(parsedItem));\n      newNode.type = 'group';\n      newNode.dir = getDir(parsedItem);\n      newNode.shape = parsedItem.type === DIVIDER_TYPE ? SHAPE_DIVIDER : SHAPE_GROUP;\n      newNode.classes =\n        newNode.classes +\n        ' ' +\n        CSS_DIAGRAM_CLUSTER +\n        ' ' +\n        (altFlag ? CSS_DIAGRAM_CLUSTER_ALT : '');\n    }\n\n    // This is what will be added to the graph\n    const nodeData = {\n      labelStyle: '',\n      shape: newNode.shape,\n      labelText: newNode.description,\n      // typeof newNode.description === 'object'\n      //   ? newNode.description[0]\n      //   : newNode.description,\n      classes: newNode.classes,\n      style: '', //styles.style,\n      id: itemId,\n      dir: newNode.dir,\n      domId: stateDomId(itemId, graphItemCount),\n      type: newNode.type,\n      padding: 15, //getConfig().flowchart.padding\n    };\n\n    if (parsedItem.note) {\n      // Todo: set random id\n      const noteData = {\n        labelStyle: '',\n        shape: SHAPE_NOTE,\n        labelText: parsedItem.note.text,\n        classes: CSS_DIAGRAM_NOTE,\n        style: '', // styles.style,\n        id: itemId + NOTE_ID + '-' + graphItemCount,\n        domId: stateDomId(itemId, graphItemCount, NOTE),\n        type: newNode.type,\n        padding: 15, //getConfig().flowchart.padding\n      };\n      const groupData = {\n        labelStyle: '',\n        shape: SHAPE_NOTEGROUP,\n        labelText: parsedItem.note.text,\n        classes: newNode.classes,\n        style: '', // styles.style,\n        id: itemId + PARENT_ID,\n        domId: stateDomId(itemId, graphItemCount, PARENT),\n        type: 'group',\n        padding: 0, //getConfig().flowchart.padding\n      };\n      graphItemCount++;\n\n      const parentNodeId = itemId + PARENT_ID;\n      g.setNode(parentNodeId, groupData);\n\n      g.setNode(noteData.id, noteData);\n      g.setNode(itemId, nodeData);\n\n      g.setParent(itemId, parentNodeId);\n      g.setParent(noteData.id, parentNodeId);\n\n      let from = itemId;\n      let to = noteData.id;\n\n      if (parsedItem.note.position === 'left of') {\n        from = noteData.id;\n        to = itemId;\n      }\n      g.setEdge(from, to, {\n        arrowhead: 'none',\n        arrowType: '',\n        style: G_EDGE_STYLE,\n        labelStyle: '',\n        classes: CSS_EDGE_NOTE_EDGE,\n        arrowheadStyle: G_EDGE_ARROWHEADSTYLE,\n        labelpos: G_EDGE_LABELPOS,\n        labelType: G_EDGE_LABELTYPE,\n        thickness: G_EDGE_THICKNESS,\n      });\n    } else {\n      g.setNode(itemId, nodeData);\n    }\n  }\n\n  if (parent && parent.id !== 'root') {\n    log.trace('Setting node ', itemId, ' to be child of its parent ', parent.id);\n    g.setParent(itemId, parent.id);\n  }\n  if (parsedItem.doc) {\n    log.trace('Adding nodes children ');\n    setupDoc(g, parsedItem, parsedItem.doc, diagramStates, diagramDb, !altFlag);\n  }\n};\n\n/**\n * Turn parsed statements (item.stmt) into nodes, relationships, etc. for a document.\n * (A document may be nested within others.)\n *\n * @param g\n * @param parentParsedItem - parsed Item that is the parent of this document (doc)\n * @param doc - the document to set up; it is a list of parsed statements\n * @param {object[]} diagramStates - the list of all known states for the diagram\n * @param diagramDb\n * @param {boolean} altFlag\n * @todo This duplicates some of what is done in stateDb.js extract method\n */\nconst setupDoc = (g, parentParsedItem, doc, diagramStates, diagramDb, altFlag) => {\n  // graphItemCount = 0;\n  log.trace('items', doc);\n  doc.forEach((item) => {\n    switch (item.stmt) {\n      case STMT_STATE:\n        setupNode(g, parentParsedItem, item, diagramStates, diagramDb, altFlag);\n        break;\n      case DEFAULT_STATE_TYPE:\n        setupNode(g, parentParsedItem, item, diagramStates, diagramDb, altFlag);\n        break;\n      case STMT_RELATION:\n        {\n          setupNode(g, parentParsedItem, item.state1, diagramStates, diagramDb, altFlag);\n          setupNode(g, parentParsedItem, item.state2, diagramStates, diagramDb, altFlag);\n          const edgeData = {\n            id: 'edge' + graphItemCount,\n            arrowhead: 'normal',\n            arrowTypeEnd: 'arrow_barb',\n            style: G_EDGE_STYLE,\n            labelStyle: '',\n            label: common.sanitizeText(item.description, getConfig()),\n            arrowheadStyle: G_EDGE_ARROWHEADSTYLE,\n            labelpos: G_EDGE_LABELPOS,\n            labelType: G_EDGE_LABELTYPE,\n            thickness: G_EDGE_THICKNESS,\n            classes: CSS_EDGE,\n          };\n          g.setEdge(item.state1.id, item.state2.id, edgeData, graphItemCount);\n          graphItemCount++;\n        }\n        break;\n    }\n  });\n};\n\n/**\n * Get the direction from the statement items.\n * Look through all of the documents (docs) in the parsedItems\n * Because is a _document_ direction, the default direction is not necessarily the same as the overall default _diagram_ direction.\n * @param {object[]} parsedItem - the parsed statement item to look through\n * @param [defaultDir=DEFAULT_NESTED_DOC_DIR] - the direction to use if none is found\n * @returns {string}\n */\nconst getDir = (parsedItem, defaultDir = DEFAULT_NESTED_DOC_DIR) => {\n  let dir = defaultDir;\n  if (parsedItem.doc) {\n    for (let i = 0; i < parsedItem.doc.length; i++) {\n      const parsedItemDoc = parsedItem.doc[i];\n      if (parsedItemDoc.stmt === 'dir') {\n        dir = parsedItemDoc.value;\n      }\n    }\n  }\n  return dir;\n};\n\n/**\n * Draws a state diagram 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 diag\n */\nexport const draw = function (text, id, _version, diag) {\n  log.info('Drawing state diagram (v2)', id);\n  // diag.sb.clear();\n  nodeDb = {};\n  // Fetch the default direction, use TD if none was found\n  let dir = diag.db.getDirection();\n  if (dir === undefined) {\n    dir = DEFAULT_DIAGRAM_DIRECTION;\n  }\n\n  const { securityLevel, state: conf } = getConfig();\n  const nodeSpacing = conf.nodeSpacing || 50;\n  const rankSpacing = conf.rankSpacing || 50;\n\n  log.info(diag.db.getRootDocV2());\n\n  // This parses the diagram text and sets the classes, relations, styles, classDefs, etc.\n  diag.db.extract(diag.db.getRootDocV2());\n  log.info(diag.db.getRootDocV2());\n\n  const diagramStates = diag.db.getStates();\n\n  // Create the input mermaid.graph\n  const g = new graphlib.Graph({\n    multigraph: true,\n    compound: true,\n  })\n    .setGraph({\n      rankdir: getDir(diag.db.getRootDocV2()),\n      nodesep: nodeSpacing,\n      ranksep: rankSpacing,\n      marginx: 8,\n      marginy: 8,\n    })\n    .setDefaultEdgeLabel(function () {\n      return {};\n    });\n\n  setupNode(g, undefined, diag.db.getRootDocV2(), diagramStates, diag.db, true);\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\n  const element = root.select('#' + id + ' g');\n  render(element, g, ['barb'], CSS_DIAGRAM, id);\n\n  const padding = 8;\n\n  utils.insertTitle(svg, 'statediagramTitleText', conf.titleTopMargin, diag.db.getDiagramTitle());\n\n  const bounds = svg.node().getBBox();\n  const width = bounds.width + padding * 2;\n  const height = bounds.height + padding * 2;\n\n  // Zoom in a bit\n  svg.attr('class', CSS_DIAGRAM);\n\n  const svgBounds = svg.node().getBBox();\n\n  configureSvgSize(svg, 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  svg.attr('viewBox', vBox);\n\n  // Add label rects for non html labels\n  // if (!evaluate(conf.htmlLabels) || true) {\n  const labels = document.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 = document.createElementNS('http://www.w3.org/2000/svg', SHAPE_STATE);\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\nexport default {\n  setConf,\n  getClasses,\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-v2';\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":["SHAPE_STATE","SHAPE_STATE_WITH_DESC","SHAPE_START","SHAPE_END","SHAPE_DIVIDER","SHAPE_GROUP","SHAPE_NOTE","SHAPE_NOTEGROUP","CSS_DIAGRAM","CSS_STATE","CSS_DIAGRAM_STATE","CSS_EDGE","CSS_NOTE","CSS_NOTE_EDGE","CSS_EDGE_NOTE_EDGE","CSS_DIAGRAM_NOTE","CSS_CLUSTER","CSS_DIAGRAM_CLUSTER","CSS_CLUSTER_ALT","CSS_DIAGRAM_CLUSTER_ALT","PARENT","NOTE","DOMID_STATE","DOMID_TYPE_SPACER","NOTE_ID","PARENT_ID","G_EDGE_STYLE","G_EDGE_ARROWHEADSTYLE","G_EDGE_LABELPOS","G_EDGE_LABELTYPE","G_EDGE_THICKNESS","nodeDb","graphItemCount","setConf","cnf","keys","key","getClasses","text","diagramObj","log","e","getClassesFromDbInfo","dbInfoItem","stateDomId","itemId","counter","type","typeSpacer","typeStr","setupNode","g","parent","parsedItem","diagramStates","diagramDb","altFlag","classStr","shape","DEFAULT_STATE_TYPE","common","getConfig","newNode","getDir","DIVIDER_TYPE","nodeData","noteData","groupData","parentNodeId","from","to","setupDoc","parentParsedItem","doc","item","STMT_STATE","STMT_RELATION","edgeData","defaultDir","DEFAULT_NESTED_DOC_DIR","dir","i","parsedItemDoc","draw","id","_version","diag","DEFAULT_DIAGRAM_DIRECTION","securityLevel","conf","nodeSpacing","rankSpacing","graphlib.Graph","sandboxElement","select","root","svg","element","render","padding","utils","bounds","width","height","svgBounds","configureSvgSize","vBox","labels","label","dim","rect","renderer","diagram","parser","db","styles"],"mappings":"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"}