mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-01-14 06:43:25 +08:00
21705 lines
840 KiB
JavaScript
21705 lines
840 KiB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
|
|
if(typeof exports === 'object' && typeof module === 'object')
|
|
module.exports = factory();
|
|
else if(typeof define === 'function' && define.amd)
|
|
define([], factory);
|
|
else if(typeof exports === 'object')
|
|
exports["mermaid"] = factory();
|
|
else
|
|
root["mermaid"] = factory();
|
|
})(typeof self !== "undefined" ? self : this, function() {
|
|
return /******/ (function(modules) { // webpackBootstrap
|
|
/******/ // The module cache
|
|
/******/ var installedModules = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __webpack_require__(moduleId) {
|
|
/******/
|
|
/******/ // Check if module is in cache
|
|
/******/ if(installedModules[moduleId]) {
|
|
/******/ return installedModules[moduleId].exports;
|
|
/******/ }
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = installedModules[moduleId] = {
|
|
/******/ i: moduleId,
|
|
/******/ l: false,
|
|
/******/ exports: {}
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
/******/
|
|
/******/ // Flag the module as loaded
|
|
/******/ module.l = true;
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/******/
|
|
/******/ // expose the modules object (__webpack_modules__)
|
|
/******/ __webpack_require__.m = modules;
|
|
/******/
|
|
/******/ // expose the module cache
|
|
/******/ __webpack_require__.c = installedModules;
|
|
/******/
|
|
/******/ // define getter function for harmony exports
|
|
/******/ __webpack_require__.d = function(exports, name, getter) {
|
|
/******/ if(!__webpack_require__.o(exports, name)) {
|
|
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
|
|
/******/ }
|
|
/******/ };
|
|
/******/
|
|
/******/ // define __esModule on exports
|
|
/******/ __webpack_require__.r = function(exports) {
|
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
/******/ }
|
|
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
/******/ };
|
|
/******/
|
|
/******/ // create a fake namespace object
|
|
/******/ // mode & 1: value is a module id, require it
|
|
/******/ // mode & 2: merge all properties of value into the ns
|
|
/******/ // mode & 4: return value when already ns object
|
|
/******/ // mode & 8|1: behave like require
|
|
/******/ __webpack_require__.t = function(value, mode) {
|
|
/******/ if(mode & 1) value = __webpack_require__(value);
|
|
/******/ if(mode & 8) return value;
|
|
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
|
|
/******/ var ns = Object.create(null);
|
|
/******/ __webpack_require__.r(ns);
|
|
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
|
|
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
|
|
/******/ return ns;
|
|
/******/ };
|
|
/******/
|
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
/******/ __webpack_require__.n = function(module) {
|
|
/******/ var getter = module && module.__esModule ?
|
|
/******/ function getDefault() { return module['default']; } :
|
|
/******/ function getModuleExports() { return module; };
|
|
/******/ __webpack_require__.d(getter, 'a', getter);
|
|
/******/ return getter;
|
|
/******/ };
|
|
/******/
|
|
/******/ // Object.prototype.hasOwnProperty.call
|
|
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
|
/******/
|
|
/******/ // __webpack_public_path__
|
|
/******/ __webpack_require__.p = "";
|
|
/******/
|
|
/******/
|
|
/******/ // Load entry module and return exports
|
|
/******/ return __webpack_require__(__webpack_require__.s = "./src/mermaid.js");
|
|
/******/ })
|
|
/************************************************************************/
|
|
/******/ ({
|
|
|
|
/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/dark/index.scss":
|
|
/*!*****************************************************************************************************************!*\
|
|
!*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/dark/index.scss ***!
|
|
\*****************************************************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js")(false);
|
|
// Module
|
|
exports.push([module.i, "/* Flowchart variables */\n/* Sequence Diagram variables */\n/* Gantt chart variables */\n/* state colors */\n.label {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n color: #333; }\n\n.label text {\n fill: #333; }\n\n.node rect,\n.node circle,\n.node ellipse,\n.node polygon,\n.node path {\n fill: #BDD5EA;\n stroke: purple;\n stroke-width: 1px; }\n\n.node .label {\n text-align: center; }\n\n.node.clickable {\n cursor: pointer; }\n\n.arrowheadPath {\n fill: lightgrey; }\n\n.edgePath .path {\n stroke: lightgrey;\n stroke-width: 1.5px; }\n\n.edgeLabel {\n background-color: #e8e8e8;\n text-align: center; }\n .edgeLabel rect {\n opacity: 0.5; }\n\n.cluster rect {\n fill: #6D6D65;\n stroke: rgba(255, 255, 255, 0.25);\n stroke-width: 1px; }\n\n.cluster text {\n fill: #F9FFFE; }\n\ndiv.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 12px;\n background: #6D6D65;\n border: 1px solid rgba(255, 255, 255, 0.25);\n border-radius: 2px;\n pointer-events: none;\n z-index: 100; }\n\n.actor {\n stroke: #81B1DB;\n fill: #BDD5EA; }\n\ntext.actor {\n fill: black;\n stroke: none; }\n\n.actor-line {\n stroke: lightgrey; }\n\n.messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: '2 2';\n stroke: lightgrey; }\n\n.messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: '2 2';\n stroke: lightgrey; }\n\n#arrowhead {\n fill: lightgrey; }\n\n.sequenceNumber {\n fill: white; }\n\n#sequencenumber {\n fill: lightgrey; }\n\n#crosshead path {\n fill: lightgrey !important;\n stroke: lightgrey !important; }\n\n.messageText {\n fill: lightgrey;\n stroke: none; }\n\n.labelBox {\n stroke: #81B1DB;\n fill: #BDD5EA; }\n\n.labelText {\n fill: #323D47;\n stroke: none; }\n\n.loopText {\n fill: lightgrey;\n stroke: none; }\n\n.loopLine {\n stroke-width: 2;\n stroke-dasharray: '2 2';\n stroke: #81B1DB; }\n\n.note {\n stroke: rgba(255, 255, 255, 0.25);\n fill: #fff5ad; }\n\n.noteText {\n fill: black;\n stroke: none;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 14px; }\n\n.activation0 {\n fill: #f4f4f4;\n stroke: #666; }\n\n.activation1 {\n fill: #f4f4f4;\n stroke: #666; }\n\n.activation2 {\n fill: #f4f4f4;\n stroke: #666; }\n\n/** Section styling */\n.mermaid-main-font {\n font-family: \"trebuchet ms\", verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.section {\n stroke: none;\n opacity: 0.2; }\n\n.section0 {\n fill: rgba(255, 255, 255, 0.3); }\n\n.section2 {\n fill: #EAE8B9; }\n\n.section1,\n.section3 {\n fill: white;\n opacity: 0.2; }\n\n.sectionTitle0 {\n fill: #F9FFFE; }\n\n.sectionTitle1 {\n fill: #F9FFFE; }\n\n.sectionTitle2 {\n fill: #F9FFFE; }\n\n.sectionTitle3 {\n fill: #F9FFFE; }\n\n.sectionTitle {\n text-anchor: start;\n font-size: 11px;\n text-height: 14px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n/* Grid and axis */\n.grid .tick {\n stroke: lightgrey;\n opacity: 0.8;\n shape-rendering: crispEdges; }\n .grid .tick text {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.grid path {\n stroke-width: 0; }\n\n/* Today line */\n.today {\n fill: none;\n stroke: #DB5757;\n stroke-width: 2px; }\n\n/* Task styling */\n/* Default task */\n.task {\n stroke-width: 2; }\n\n.taskText {\n text-anchor: middle;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.taskText:not([font-size]) {\n font-size: 11px; }\n\n.taskTextOutsideRight {\n fill: #323D47;\n text-anchor: start;\n font-size: 11px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.taskTextOutsideLeft {\n fill: #323D47;\n text-anchor: end;\n font-size: 11px; }\n\n/* Special case clickable */\n.task.clickable {\n cursor: pointer; }\n\n.taskText.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n.taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n.taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n/* Specific task settings for the sections*/\n.taskText0,\n.taskText1,\n.taskText2,\n.taskText3 {\n fill: #323D47; }\n\n.task0,\n.task1,\n.task2,\n.task3 {\n fill: #BDD5EA;\n stroke: rgba(255, 255, 255, 0.5); }\n\n.taskTextOutside0,\n.taskTextOutside2 {\n fill: lightgrey; }\n\n.taskTextOutside1,\n.taskTextOutside3 {\n fill: lightgrey; }\n\n/* Active task */\n.active0,\n.active1,\n.active2,\n.active3 {\n fill: #81B1DB;\n stroke: rgba(255, 255, 255, 0.5); }\n\n.activeText0,\n.activeText1,\n.activeText2,\n.activeText3 {\n fill: #323D47 !important; }\n\n/* Completed task */\n.done0,\n.done1,\n.done2,\n.done3 {\n stroke: grey;\n fill: lightgrey;\n stroke-width: 2; }\n\n.doneText0,\n.doneText1,\n.doneText2,\n.doneText3 {\n fill: #323D47 !important; }\n\n/* Tasks on the critical line */\n.crit0,\n.crit1,\n.crit2,\n.crit3 {\n stroke: #E83737;\n fill: #E83737;\n stroke-width: 2; }\n\n.activeCrit0,\n.activeCrit1,\n.activeCrit2,\n.activeCrit3 {\n stroke: #E83737;\n fill: #81B1DB;\n stroke-width: 2; }\n\n.doneCrit0,\n.doneCrit1,\n.doneCrit2,\n.doneCrit3 {\n stroke: #E83737;\n fill: lightgrey;\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges; }\n\n.milestone {\n transform: rotate(45deg) scale(0.8, 0.8); }\n\n.milestoneText {\n font-style: italic; }\n\n.doneCritText0,\n.doneCritText1,\n.doneCritText2,\n.doneCritText3 {\n fill: #323D47 !important; }\n\n.activeCritText0,\n.activeCritText1,\n.activeCritText2,\n.activeCritText3 {\n fill: #323D47 !important; }\n\n.titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: #323D47;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.classGroup text {\n fill: purple;\n stroke: none;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 10px; }\n g.classGroup text .title {\n font-weight: bolder; }\n\ng.clickable {\n cursor: pointer; }\n\ng.classGroup rect {\n fill: #BDD5EA;\n stroke: purple; }\n\ng.classGroup line {\n stroke: purple;\n stroke-width: 1; }\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: #BDD5EA;\n opacity: 0.5; }\n\n.classLabel .label {\n fill: purple;\n font-size: 10px; }\n\n.relation {\n stroke: purple;\n stroke-width: 1;\n fill: none; }\n\n.dashed-line {\n stroke-dasharray: 3; }\n\n#compositionStart {\n fill: purple;\n stroke: purple;\n stroke-width: 1; }\n\n#compositionEnd {\n fill: purple;\n stroke: purple;\n stroke-width: 1; }\n\n#aggregationStart {\n fill: #BDD5EA;\n stroke: purple;\n stroke-width: 1; }\n\n#aggregationEnd {\n fill: #BDD5EA;\n stroke: purple;\n stroke-width: 1; }\n\n#dependencyStart {\n fill: purple;\n stroke: purple;\n stroke-width: 1; }\n\n#dependencyEnd {\n fill: purple;\n stroke: purple;\n stroke-width: 1; }\n\n#extensionStart {\n fill: purple;\n stroke: purple;\n stroke-width: 1; }\n\n#extensionEnd {\n fill: purple;\n stroke: purple;\n stroke-width: 1; }\n\n.commit-id,\n.commit-msg,\n.branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.pieTitleText {\n text-anchor: middle;\n font-size: 25px;\n fill: #323D47;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.slice {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.stateGroup text {\n fill: purple;\n stroke: none;\n font-size: 10px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.stateGroup text {\n fill: purple;\n stroke: none;\n font-size: 10px; }\n\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: black; }\n\ng.stateGroup rect {\n fill: #BDD5EA;\n stroke: purple; }\n\ng.stateGroup line {\n stroke: purple;\n stroke-width: 1; }\n\n.transition {\n stroke: purple;\n stroke-width: 1;\n fill: none; }\n\n.stateGroup .composit {\n fill: white;\n border-bottom: 1px; }\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px; }\n\n.state-note {\n stroke: rgba(255, 255, 255, 0.25);\n fill: #fff5ad; }\n .state-note text {\n fill: black;\n stroke: none;\n font-size: 10px; }\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: #BDD5EA;\n opacity: 0.5; }\n\n.stateLabel text {\n fill: black;\n font-size: 10px;\n font-weight: bold;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.node circle.state-start {\n fill: black;\n stroke: black; }\n\n.node circle.state-end {\n fill: black;\n stroke: white;\n stroke-width: 1.5; }\n\n#statediagram-barbEnd {\n fill: purple; }\n\n.statediagram-cluster rect {\n fill: #BDD5EA;\n stroke: purple;\n stroke-width: 1px; }\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-state .divider {\n stroke: purple; }\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-cluster.statediagram-cluster .inner {\n fill: white; }\n\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: #e0e0e0; }\n\n.statediagram-cluster .inner {\n rx: 0;\n ry: 0; }\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: #efefef; }\n\n.note-edge {\n stroke-dasharray: 5; }\n\n.statediagram-note rect {\n fill: #fff5ad;\n stroke: rgba(255, 255, 255, 0.25);\n stroke-width: 1px;\n rx: 0;\n ry: 0; }\n\n:root {\n --mermaid-font-family: '\"trebuchet ms\", verdana, arial';\n --mermaid-font-family: \"Comic Sans MS\", \"Comic Sans\", cursive; }\n", ""]);
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/default/index.scss":
|
|
/*!********************************************************************************************************************!*\
|
|
!*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/default/index.scss ***!
|
|
\********************************************************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js")(false);
|
|
// Module
|
|
exports.push([module.i, "/* Flowchart variables */\n/* Sequence Diagram variables */\n/* Gantt chart variables */\n/* state colors */\n.label {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n color: #333; }\n\n.label text {\n fill: #333; }\n\n.node rect,\n.node circle,\n.node ellipse,\n.node polygon,\n.node path {\n fill: #ECECFF;\n stroke: #9370DB;\n stroke-width: 1px; }\n\n.node .label {\n text-align: center; }\n\n.node.clickable {\n cursor: pointer; }\n\n.arrowheadPath {\n fill: #333333; }\n\n.edgePath .path {\n stroke: #333333;\n stroke-width: 1.5px; }\n\n.edgeLabel {\n background-color: #e8e8e8;\n text-align: center; }\n .edgeLabel rect {\n opacity: 0.5; }\n\n.cluster rect {\n fill: #ffffde;\n stroke: #aaaa33;\n stroke-width: 1px; }\n\n.cluster text {\n fill: #333; }\n\ndiv.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 12px;\n background: #ffffde;\n border: 1px solid #aaaa33;\n border-radius: 2px;\n pointer-events: none;\n z-index: 100; }\n\n.actor {\n stroke: #CCCCFF;\n fill: #ECECFF; }\n\ntext.actor {\n fill: black;\n stroke: none; }\n\n.actor-line {\n stroke: grey; }\n\n.messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: '2 2';\n stroke: #333; }\n\n.messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: '2 2';\n stroke: #333; }\n\n#arrowhead {\n fill: #333; }\n\n.sequenceNumber {\n fill: white; }\n\n#sequencenumber {\n fill: #333; }\n\n#crosshead path {\n fill: #333 !important;\n stroke: #333 !important; }\n\n.messageText {\n fill: #333;\n stroke: none; }\n\n.labelBox {\n stroke: #CCCCFF;\n fill: #ECECFF; }\n\n.labelText {\n fill: black;\n stroke: none; }\n\n.loopText {\n fill: black;\n stroke: none; }\n\n.loopLine {\n stroke-width: 2;\n stroke-dasharray: '2 2';\n stroke: #CCCCFF; }\n\n.note {\n stroke: #aaaa33;\n fill: #fff5ad; }\n\n.noteText {\n fill: black;\n stroke: none;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 14px; }\n\n.activation0 {\n fill: #f4f4f4;\n stroke: #666; }\n\n.activation1 {\n fill: #f4f4f4;\n stroke: #666; }\n\n.activation2 {\n fill: #f4f4f4;\n stroke: #666; }\n\n/** Section styling */\n.mermaid-main-font {\n font-family: \"trebuchet ms\", verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.section {\n stroke: none;\n opacity: 0.2; }\n\n.section0 {\n fill: rgba(102, 102, 255, 0.49); }\n\n.section2 {\n fill: #fff400; }\n\n.section1,\n.section3 {\n fill: white;\n opacity: 0.2; }\n\n.sectionTitle0 {\n fill: #333; }\n\n.sectionTitle1 {\n fill: #333; }\n\n.sectionTitle2 {\n fill: #333; }\n\n.sectionTitle3 {\n fill: #333; }\n\n.sectionTitle {\n text-anchor: start;\n font-size: 11px;\n text-height: 14px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n/* Grid and axis */\n.grid .tick {\n stroke: lightgrey;\n opacity: 0.8;\n shape-rendering: crispEdges; }\n .grid .tick text {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.grid path {\n stroke-width: 0; }\n\n/* Today line */\n.today {\n fill: none;\n stroke: red;\n stroke-width: 2px; }\n\n/* Task styling */\n/* Default task */\n.task {\n stroke-width: 2; }\n\n.taskText {\n text-anchor: middle;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.taskText:not([font-size]) {\n font-size: 11px; }\n\n.taskTextOutsideRight {\n fill: black;\n text-anchor: start;\n font-size: 11px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.taskTextOutsideLeft {\n fill: black;\n text-anchor: end;\n font-size: 11px; }\n\n/* Special case clickable */\n.task.clickable {\n cursor: pointer; }\n\n.taskText.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n.taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n.taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n/* Specific task settings for the sections*/\n.taskText0,\n.taskText1,\n.taskText2,\n.taskText3 {\n fill: white; }\n\n.task0,\n.task1,\n.task2,\n.task3 {\n fill: #8a90dd;\n stroke: #534fbc; }\n\n.taskTextOutside0,\n.taskTextOutside2 {\n fill: black; }\n\n.taskTextOutside1,\n.taskTextOutside3 {\n fill: black; }\n\n/* Active task */\n.active0,\n.active1,\n.active2,\n.active3 {\n fill: #bfc7ff;\n stroke: #534fbc; }\n\n.activeText0,\n.activeText1,\n.activeText2,\n.activeText3 {\n fill: black !important; }\n\n/* Completed task */\n.done0,\n.done1,\n.done2,\n.done3 {\n stroke: grey;\n fill: lightgrey;\n stroke-width: 2; }\n\n.doneText0,\n.doneText1,\n.doneText2,\n.doneText3 {\n fill: black !important; }\n\n/* Tasks on the critical line */\n.crit0,\n.crit1,\n.crit2,\n.crit3 {\n stroke: #ff8888;\n fill: red;\n stroke-width: 2; }\n\n.activeCrit0,\n.activeCrit1,\n.activeCrit2,\n.activeCrit3 {\n stroke: #ff8888;\n fill: #bfc7ff;\n stroke-width: 2; }\n\n.doneCrit0,\n.doneCrit1,\n.doneCrit2,\n.doneCrit3 {\n stroke: #ff8888;\n fill: lightgrey;\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges; }\n\n.milestone {\n transform: rotate(45deg) scale(0.8, 0.8); }\n\n.milestoneText {\n font-style: italic; }\n\n.doneCritText0,\n.doneCritText1,\n.doneCritText2,\n.doneCritText3 {\n fill: black !important; }\n\n.activeCritText0,\n.activeCritText1,\n.activeCritText2,\n.activeCritText3 {\n fill: black !important; }\n\n.titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: black;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.classGroup text {\n fill: #9370DB;\n stroke: none;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 10px; }\n g.classGroup text .title {\n font-weight: bolder; }\n\ng.clickable {\n cursor: pointer; }\n\ng.classGroup rect {\n fill: #ECECFF;\n stroke: #9370DB; }\n\ng.classGroup line {\n stroke: #9370DB;\n stroke-width: 1; }\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: #ECECFF;\n opacity: 0.5; }\n\n.classLabel .label {\n fill: #9370DB;\n font-size: 10px; }\n\n.relation {\n stroke: #9370DB;\n stroke-width: 1;\n fill: none; }\n\n.dashed-line {\n stroke-dasharray: 3; }\n\n#compositionStart {\n fill: #9370DB;\n stroke: #9370DB;\n stroke-width: 1; }\n\n#compositionEnd {\n fill: #9370DB;\n stroke: #9370DB;\n stroke-width: 1; }\n\n#aggregationStart {\n fill: #ECECFF;\n stroke: #9370DB;\n stroke-width: 1; }\n\n#aggregationEnd {\n fill: #ECECFF;\n stroke: #9370DB;\n stroke-width: 1; }\n\n#dependencyStart {\n fill: #9370DB;\n stroke: #9370DB;\n stroke-width: 1; }\n\n#dependencyEnd {\n fill: #9370DB;\n stroke: #9370DB;\n stroke-width: 1; }\n\n#extensionStart {\n fill: #9370DB;\n stroke: #9370DB;\n stroke-width: 1; }\n\n#extensionEnd {\n fill: #9370DB;\n stroke: #9370DB;\n stroke-width: 1; }\n\n.commit-id,\n.commit-msg,\n.branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.pieTitleText {\n text-anchor: middle;\n font-size: 25px;\n fill: black;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.slice {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.stateGroup text {\n fill: #9370DB;\n stroke: none;\n font-size: 10px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.stateGroup text {\n fill: #9370DB;\n stroke: none;\n font-size: 10px; }\n\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: black; }\n\ng.stateGroup rect {\n fill: #ECECFF;\n stroke: #9370DB; }\n\ng.stateGroup line {\n stroke: #9370DB;\n stroke-width: 1; }\n\n.transition {\n stroke: #9370DB;\n stroke-width: 1;\n fill: none; }\n\n.stateGroup .composit {\n fill: white;\n border-bottom: 1px; }\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px; }\n\n.state-note {\n stroke: #aaaa33;\n fill: #fff5ad; }\n .state-note text {\n fill: black;\n stroke: none;\n font-size: 10px; }\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: #ECECFF;\n opacity: 0.5; }\n\n.stateLabel text {\n fill: black;\n font-size: 10px;\n font-weight: bold;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.node circle.state-start {\n fill: black;\n stroke: black; }\n\n.node circle.state-end {\n fill: black;\n stroke: white;\n stroke-width: 1.5; }\n\n#statediagram-barbEnd {\n fill: #9370DB; }\n\n.statediagram-cluster rect {\n fill: #ECECFF;\n stroke: #9370DB;\n stroke-width: 1px; }\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-state .divider {\n stroke: #9370DB; }\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-cluster.statediagram-cluster .inner {\n fill: white; }\n\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: #e0e0e0; }\n\n.statediagram-cluster .inner {\n rx: 0;\n ry: 0; }\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: #efefef; }\n\n.note-edge {\n stroke-dasharray: 5; }\n\n.statediagram-note rect {\n fill: #fff5ad;\n stroke: #aaaa33;\n stroke-width: 1px;\n rx: 0;\n ry: 0; }\n\n:root {\n --mermaid-font-family: '\"trebuchet ms\", verdana, arial';\n --mermaid-font-family: \"Comic Sans MS\", \"Comic Sans\", cursive; }\n", ""]);
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/forest/index.scss":
|
|
/*!*******************************************************************************************************************!*\
|
|
!*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/forest/index.scss ***!
|
|
\*******************************************************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js")(false);
|
|
// Module
|
|
exports.push([module.i, "/* Flowchart variables */\n/* Sequence Diagram variables */\n/* Gantt chart variables */\n/* state colors */\n.label {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n color: #333; }\n\n.label text {\n fill: #333; }\n\n.node rect,\n.node circle,\n.node ellipse,\n.node polygon,\n.node path {\n fill: #cde498;\n stroke: #13540c;\n stroke-width: 1px; }\n\n.node .label {\n text-align: center; }\n\n.node.clickable {\n cursor: pointer; }\n\n.arrowheadPath {\n fill: green; }\n\n.edgePath .path {\n stroke: green;\n stroke-width: 1.5px; }\n\n.edgeLabel {\n background-color: #e8e8e8;\n text-align: center; }\n .edgeLabel rect {\n opacity: 0.5; }\n\n.cluster rect {\n fill: #cdffb2;\n stroke: #6eaa49;\n stroke-width: 1px; }\n\n.cluster text {\n fill: #333; }\n\ndiv.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 12px;\n background: #cdffb2;\n border: 1px solid #6eaa49;\n border-radius: 2px;\n pointer-events: none;\n z-index: 100; }\n\n.actor {\n stroke: #13540c;\n fill: #cde498; }\n\ntext.actor {\n fill: black;\n stroke: none; }\n\n.actor-line {\n stroke: grey; }\n\n.messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: '2 2';\n stroke: #333; }\n\n.messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: '2 2';\n stroke: #333; }\n\n#arrowhead {\n fill: #333; }\n\n.sequenceNumber {\n fill: white; }\n\n#sequencenumber {\n fill: #333; }\n\n#crosshead path {\n fill: #333 !important;\n stroke: #333 !important; }\n\n.messageText {\n fill: #333;\n stroke: none; }\n\n.labelBox {\n stroke: #326932;\n fill: #cde498; }\n\n.labelText {\n fill: black;\n stroke: none; }\n\n.loopText {\n fill: black;\n stroke: none; }\n\n.loopLine {\n stroke-width: 2;\n stroke-dasharray: '2 2';\n stroke: #326932; }\n\n.note {\n stroke: #6eaa49;\n fill: #fff5ad; }\n\n.noteText {\n fill: black;\n stroke: none;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 14px; }\n\n.activation0 {\n fill: #f4f4f4;\n stroke: #666; }\n\n.activation1 {\n fill: #f4f4f4;\n stroke: #666; }\n\n.activation2 {\n fill: #f4f4f4;\n stroke: #666; }\n\n/** Section styling */\n.mermaid-main-font {\n font-family: \"trebuchet ms\", verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.section {\n stroke: none;\n opacity: 0.2; }\n\n.section0 {\n fill: #6eaa49; }\n\n.section2 {\n fill: #6eaa49; }\n\n.section1,\n.section3 {\n fill: white;\n opacity: 0.2; }\n\n.sectionTitle0 {\n fill: #333; }\n\n.sectionTitle1 {\n fill: #333; }\n\n.sectionTitle2 {\n fill: #333; }\n\n.sectionTitle3 {\n fill: #333; }\n\n.sectionTitle {\n text-anchor: start;\n font-size: 11px;\n text-height: 14px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n/* Grid and axis */\n.grid .tick {\n stroke: lightgrey;\n opacity: 0.8;\n shape-rendering: crispEdges; }\n .grid .tick text {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.grid path {\n stroke-width: 0; }\n\n/* Today line */\n.today {\n fill: none;\n stroke: red;\n stroke-width: 2px; }\n\n/* Task styling */\n/* Default task */\n.task {\n stroke-width: 2; }\n\n.taskText {\n text-anchor: middle;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.taskText:not([font-size]) {\n font-size: 11px; }\n\n.taskTextOutsideRight {\n fill: black;\n text-anchor: start;\n font-size: 11px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.taskTextOutsideLeft {\n fill: black;\n text-anchor: end;\n font-size: 11px; }\n\n/* Special case clickable */\n.task.clickable {\n cursor: pointer; }\n\n.taskText.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n.taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n.taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n/* Specific task settings for the sections*/\n.taskText0,\n.taskText1,\n.taskText2,\n.taskText3 {\n fill: white; }\n\n.task0,\n.task1,\n.task2,\n.task3 {\n fill: #487e3a;\n stroke: #13540c; }\n\n.taskTextOutside0,\n.taskTextOutside2 {\n fill: black; }\n\n.taskTextOutside1,\n.taskTextOutside3 {\n fill: black; }\n\n/* Active task */\n.active0,\n.active1,\n.active2,\n.active3 {\n fill: #cde498;\n stroke: #13540c; }\n\n.activeText0,\n.activeText1,\n.activeText2,\n.activeText3 {\n fill: black !important; }\n\n/* Completed task */\n.done0,\n.done1,\n.done2,\n.done3 {\n stroke: grey;\n fill: lightgrey;\n stroke-width: 2; }\n\n.doneText0,\n.doneText1,\n.doneText2,\n.doneText3 {\n fill: black !important; }\n\n/* Tasks on the critical line */\n.crit0,\n.crit1,\n.crit2,\n.crit3 {\n stroke: #ff8888;\n fill: red;\n stroke-width: 2; }\n\n.activeCrit0,\n.activeCrit1,\n.activeCrit2,\n.activeCrit3 {\n stroke: #ff8888;\n fill: #cde498;\n stroke-width: 2; }\n\n.doneCrit0,\n.doneCrit1,\n.doneCrit2,\n.doneCrit3 {\n stroke: #ff8888;\n fill: lightgrey;\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges; }\n\n.milestone {\n transform: rotate(45deg) scale(0.8, 0.8); }\n\n.milestoneText {\n font-style: italic; }\n\n.doneCritText0,\n.doneCritText1,\n.doneCritText2,\n.doneCritText3 {\n fill: black !important; }\n\n.activeCritText0,\n.activeCritText1,\n.activeCritText2,\n.activeCritText3 {\n fill: black !important; }\n\n.titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: black;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.classGroup text {\n fill: #13540c;\n stroke: none;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 10px; }\n g.classGroup text .title {\n font-weight: bolder; }\n\ng.clickable {\n cursor: pointer; }\n\ng.classGroup rect {\n fill: #cde498;\n stroke: #13540c; }\n\ng.classGroup line {\n stroke: #13540c;\n stroke-width: 1; }\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: #cde498;\n opacity: 0.5; }\n\n.classLabel .label {\n fill: #13540c;\n font-size: 10px; }\n\n.relation {\n stroke: #13540c;\n stroke-width: 1;\n fill: none; }\n\n.dashed-line {\n stroke-dasharray: 3; }\n\n#compositionStart {\n fill: #13540c;\n stroke: #13540c;\n stroke-width: 1; }\n\n#compositionEnd {\n fill: #13540c;\n stroke: #13540c;\n stroke-width: 1; }\n\n#aggregationStart {\n fill: #cde498;\n stroke: #13540c;\n stroke-width: 1; }\n\n#aggregationEnd {\n fill: #cde498;\n stroke: #13540c;\n stroke-width: 1; }\n\n#dependencyStart {\n fill: #13540c;\n stroke: #13540c;\n stroke-width: 1; }\n\n#dependencyEnd {\n fill: #13540c;\n stroke: #13540c;\n stroke-width: 1; }\n\n#extensionStart {\n fill: #13540c;\n stroke: #13540c;\n stroke-width: 1; }\n\n#extensionEnd {\n fill: #13540c;\n stroke: #13540c;\n stroke-width: 1; }\n\n.commit-id,\n.commit-msg,\n.branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.pieTitleText {\n text-anchor: middle;\n font-size: 25px;\n fill: black;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.slice {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.stateGroup text {\n fill: #13540c;\n stroke: none;\n font-size: 10px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.stateGroup text {\n fill: #13540c;\n stroke: none;\n font-size: 10px; }\n\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: black; }\n\ng.stateGroup rect {\n fill: #cde498;\n stroke: #13540c; }\n\ng.stateGroup line {\n stroke: #13540c;\n stroke-width: 1; }\n\n.transition {\n stroke: #13540c;\n stroke-width: 1;\n fill: none; }\n\n.stateGroup .composit {\n fill: white;\n border-bottom: 1px; }\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px; }\n\n.state-note {\n stroke: #6eaa49;\n fill: #fff5ad; }\n .state-note text {\n fill: black;\n stroke: none;\n font-size: 10px; }\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: #cde498;\n opacity: 0.5; }\n\n.stateLabel text {\n fill: black;\n font-size: 10px;\n font-weight: bold;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.node circle.state-start {\n fill: black;\n stroke: black; }\n\n.node circle.state-end {\n fill: black;\n stroke: white;\n stroke-width: 1.5; }\n\n#statediagram-barbEnd {\n fill: #13540c; }\n\n.statediagram-cluster rect {\n fill: #cde498;\n stroke: #13540c;\n stroke-width: 1px; }\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-state .divider {\n stroke: #13540c; }\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-cluster.statediagram-cluster .inner {\n fill: white; }\n\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: #e0e0e0; }\n\n.statediagram-cluster .inner {\n rx: 0;\n ry: 0; }\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: #efefef; }\n\n.note-edge {\n stroke-dasharray: 5; }\n\n.statediagram-note rect {\n fill: #fff5ad;\n stroke: #6eaa49;\n stroke-width: 1px;\n rx: 0;\n ry: 0; }\n\n:root {\n --mermaid-font-family: '\"trebuchet ms\", verdana, arial';\n --mermaid-font-family: \"Comic Sans MS\", \"Comic Sans\", cursive; }\n", ""]);
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/neutral/index.scss":
|
|
/*!********************************************************************************************************************!*\
|
|
!*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/neutral/index.scss ***!
|
|
\********************************************************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js")(false);
|
|
// Module
|
|
exports.push([module.i, "/* Flowchart variables */\n/* Sequence Diagram variables */\n/* Gantt chart variables */\n/* state colors */\n.label {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n color: #333; }\n\n.label text {\n fill: #333; }\n\n.node rect,\n.node circle,\n.node ellipse,\n.node polygon,\n.node path {\n fill: #eee;\n stroke: #999;\n stroke-width: 1px; }\n\n.node .label {\n text-align: center; }\n\n.node.clickable {\n cursor: pointer; }\n\n.arrowheadPath {\n fill: #333333; }\n\n.edgePath .path {\n stroke: #666;\n stroke-width: 1.5px; }\n\n.edgeLabel {\n background-color: white;\n text-align: center; }\n .edgeLabel rect {\n opacity: 0.5; }\n\n.cluster rect {\n fill: #eaf2fb;\n stroke: #26a;\n stroke-width: 1px; }\n\n.cluster text {\n fill: #333; }\n\ndiv.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 12px;\n background: #eaf2fb;\n border: 1px solid #26a;\n border-radius: 2px;\n pointer-events: none;\n z-index: 100; }\n\n.actor {\n stroke: #999;\n fill: #eee; }\n\ntext.actor {\n fill: #333;\n stroke: none; }\n\n.actor-line {\n stroke: #666; }\n\n.messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: '2 2';\n stroke: #333; }\n\n.messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: '2 2';\n stroke: #333; }\n\n#arrowhead {\n fill: #333; }\n\n.sequenceNumber {\n fill: white; }\n\n#sequencenumber {\n fill: #333; }\n\n#crosshead path {\n fill: #333 !important;\n stroke: #333 !important; }\n\n.messageText {\n fill: #333;\n stroke: none; }\n\n.labelBox {\n stroke: #999;\n fill: #eee; }\n\n.labelText {\n fill: #333;\n stroke: none; }\n\n.loopText {\n fill: #333;\n stroke: none; }\n\n.loopLine {\n stroke-width: 2;\n stroke-dasharray: '2 2';\n stroke: #999; }\n\n.note {\n stroke: #777700;\n fill: #ffa; }\n\n.noteText {\n fill: black;\n stroke: none;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 14px; }\n\n.activation0 {\n fill: #f4f4f4;\n stroke: #666; }\n\n.activation1 {\n fill: #f4f4f4;\n stroke: #666; }\n\n.activation2 {\n fill: #f4f4f4;\n stroke: #666; }\n\n/** Section styling */\n.mermaid-main-font {\n font-family: \"trebuchet ms\", verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.section {\n stroke: none;\n opacity: 0.2; }\n\n.section0 {\n fill: #80b3e6; }\n\n.section2 {\n fill: #80b3e6; }\n\n.section1,\n.section3 {\n fill: white;\n opacity: 0.2; }\n\n.sectionTitle0 {\n fill: #333; }\n\n.sectionTitle1 {\n fill: #333; }\n\n.sectionTitle2 {\n fill: #333; }\n\n.sectionTitle3 {\n fill: #333; }\n\n.sectionTitle {\n text-anchor: start;\n font-size: 11px;\n text-height: 14px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n/* Grid and axis */\n.grid .tick {\n stroke: #e6e6e6;\n opacity: 0.8;\n shape-rendering: crispEdges; }\n .grid .tick text {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.grid path {\n stroke-width: 0; }\n\n/* Today line */\n.today {\n fill: none;\n stroke: #d42;\n stroke-width: 2px; }\n\n/* Task styling */\n/* Default task */\n.task {\n stroke-width: 2; }\n\n.taskText {\n text-anchor: middle;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.taskText:not([font-size]) {\n font-size: 11px; }\n\n.taskTextOutsideRight {\n fill: #333;\n text-anchor: start;\n font-size: 11px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.taskTextOutsideLeft {\n fill: #333;\n text-anchor: end;\n font-size: 11px; }\n\n/* Special case clickable */\n.task.clickable {\n cursor: pointer; }\n\n.taskText.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n.taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n.taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: #003163 !important;\n font-weight: bold; }\n\n/* Specific task settings for the sections*/\n.taskText0,\n.taskText1,\n.taskText2,\n.taskText3 {\n fill: white; }\n\n.task0,\n.task1,\n.task2,\n.task3 {\n fill: #26a;\n stroke: #1a4d80; }\n\n.taskTextOutside0,\n.taskTextOutside2 {\n fill: #333; }\n\n.taskTextOutside1,\n.taskTextOutside3 {\n fill: #333; }\n\n/* Active task */\n.active0,\n.active1,\n.active2,\n.active3 {\n fill: #eee;\n stroke: #1a4d80; }\n\n.activeText0,\n.activeText1,\n.activeText2,\n.activeText3 {\n fill: #333 !important; }\n\n/* Completed task */\n.done0,\n.done1,\n.done2,\n.done3 {\n stroke: #666;\n fill: #bbb;\n stroke-width: 2; }\n\n.doneText0,\n.doneText1,\n.doneText2,\n.doneText3 {\n fill: #333 !important; }\n\n/* Tasks on the critical line */\n.crit0,\n.crit1,\n.crit2,\n.crit3 {\n stroke: #b1361b;\n fill: #d42;\n stroke-width: 2; }\n\n.activeCrit0,\n.activeCrit1,\n.activeCrit2,\n.activeCrit3 {\n stroke: #b1361b;\n fill: #eee;\n stroke-width: 2; }\n\n.doneCrit0,\n.doneCrit1,\n.doneCrit2,\n.doneCrit3 {\n stroke: #b1361b;\n fill: #bbb;\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges; }\n\n.milestone {\n transform: rotate(45deg) scale(0.8, 0.8); }\n\n.milestoneText {\n font-style: italic; }\n\n.doneCritText0,\n.doneCritText1,\n.doneCritText2,\n.doneCritText3 {\n fill: #333 !important; }\n\n.activeCritText0,\n.activeCritText1,\n.activeCritText2,\n.activeCritText3 {\n fill: #333 !important; }\n\n.titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: #333;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.classGroup text {\n fill: #999;\n stroke: none;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family);\n font-size: 10px; }\n g.classGroup text .title {\n font-weight: bolder; }\n\ng.clickable {\n cursor: pointer; }\n\ng.classGroup rect {\n fill: #eee;\n stroke: #999; }\n\ng.classGroup line {\n stroke: #999;\n stroke-width: 1; }\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: #eee;\n opacity: 0.5; }\n\n.classLabel .label {\n fill: #999;\n font-size: 10px; }\n\n.relation {\n stroke: #999;\n stroke-width: 1;\n fill: none; }\n\n.dashed-line {\n stroke-dasharray: 3; }\n\n#compositionStart {\n fill: #999;\n stroke: #999;\n stroke-width: 1; }\n\n#compositionEnd {\n fill: #999;\n stroke: #999;\n stroke-width: 1; }\n\n#aggregationStart {\n fill: #eee;\n stroke: #999;\n stroke-width: 1; }\n\n#aggregationEnd {\n fill: #eee;\n stroke: #999;\n stroke-width: 1; }\n\n#dependencyStart {\n fill: #999;\n stroke: #999;\n stroke-width: 1; }\n\n#dependencyEnd {\n fill: #999;\n stroke: #999;\n stroke-width: 1; }\n\n#extensionStart {\n fill: #999;\n stroke: #999;\n stroke-width: 1; }\n\n#extensionEnd {\n fill: #999;\n stroke: #999;\n stroke-width: 1; }\n\n.commit-id,\n.commit-msg,\n.branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.pieTitleText {\n text-anchor: middle;\n font-size: 25px;\n fill: #333;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.slice {\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.stateGroup text {\n fill: #999;\n stroke: none;\n font-size: 10px;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\ng.stateGroup text {\n fill: #999;\n stroke: none;\n font-size: 10px; }\n\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: black; }\n\ng.stateGroup rect {\n fill: #eee;\n stroke: #999; }\n\ng.stateGroup line {\n stroke: #999;\n stroke-width: 1; }\n\n.transition {\n stroke: #999;\n stroke-width: 1;\n fill: none; }\n\n.stateGroup .composit {\n fill: white;\n border-bottom: 1px; }\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px; }\n\n.state-note {\n stroke: #777700;\n fill: #ffa; }\n .state-note text {\n fill: black;\n stroke: none;\n font-size: 10px; }\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: #eee;\n opacity: 0.5; }\n\n.stateLabel text {\n fill: black;\n font-size: 10px;\n font-weight: bold;\n font-family: 'trebuchet ms', verdana, arial;\n font-family: var(--mermaid-font-family); }\n\n.node circle.state-start {\n fill: black;\n stroke: black; }\n\n.node circle.state-end {\n fill: black;\n stroke: white;\n stroke-width: 1.5; }\n\n#statediagram-barbEnd {\n fill: #999; }\n\n.statediagram-cluster rect {\n fill: #eee;\n stroke: #999;\n stroke-width: 1px; }\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-state .divider {\n stroke: #999; }\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-cluster.statediagram-cluster .inner {\n fill: white; }\n\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: #e0e0e0; }\n\n.statediagram-cluster .inner {\n rx: 0;\n ry: 0; }\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px; }\n\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: #efefef; }\n\n.note-edge {\n stroke-dasharray: 5; }\n\n.statediagram-note rect {\n fill: #ffa;\n stroke: #777700;\n stroke-width: 1px;\n rx: 0;\n ry: 0; }\n\n:root {\n --mermaid-font-family: '\"trebuchet ms\", verdana, arial';\n --mermaid-font-family: \"Comic Sans MS\", \"Comic Sans\", cursive; }\n", ""]);
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/css-loader/dist/runtime/api.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/css-loader/dist/runtime/api.js ***!
|
|
\*****************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
/*
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
Author Tobias Koppers @sokra
|
|
*/
|
|
// css base code, injected by the css-loader
|
|
module.exports = function (useSourceMap) {
|
|
var list = []; // return the list of modules as css string
|
|
|
|
list.toString = function toString() {
|
|
return this.map(function (item) {
|
|
var content = cssWithMappingToString(item, useSourceMap);
|
|
|
|
if (item[2]) {
|
|
return '@media ' + item[2] + '{' + content + '}';
|
|
} else {
|
|
return content;
|
|
}
|
|
}).join('');
|
|
}; // import a list of modules into the list
|
|
|
|
|
|
list.i = function (modules, mediaQuery) {
|
|
if (typeof modules === 'string') {
|
|
modules = [[null, modules, '']];
|
|
}
|
|
|
|
var alreadyImportedModules = {};
|
|
|
|
for (var i = 0; i < this.length; i++) {
|
|
var id = this[i][0];
|
|
|
|
if (id != null) {
|
|
alreadyImportedModules[id] = true;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < modules.length; i++) {
|
|
var item = modules[i]; // skip already imported module
|
|
// this implementation is not 100% perfect for weird media query combinations
|
|
// when a module is imported multiple times with different media queries.
|
|
// I hope this will never occur (Hey this way we have smaller bundles)
|
|
|
|
if (item[0] == null || !alreadyImportedModules[item[0]]) {
|
|
if (mediaQuery && !item[2]) {
|
|
item[2] = mediaQuery;
|
|
} else if (mediaQuery) {
|
|
item[2] = '(' + item[2] + ') and (' + mediaQuery + ')';
|
|
}
|
|
|
|
list.push(item);
|
|
}
|
|
}
|
|
};
|
|
|
|
return list;
|
|
};
|
|
|
|
function cssWithMappingToString(item, useSourceMap) {
|
|
var content = item[1] || '';
|
|
var cssMapping = item[3];
|
|
|
|
if (!cssMapping) {
|
|
return content;
|
|
}
|
|
|
|
if (useSourceMap && typeof btoa === 'function') {
|
|
var sourceMapping = toComment(cssMapping);
|
|
var sourceURLs = cssMapping.sources.map(function (source) {
|
|
return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */';
|
|
});
|
|
return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
|
|
}
|
|
|
|
return [content].join('\n');
|
|
} // Adapted from convert-source-map (MIT)
|
|
|
|
|
|
function toComment(sourceMap) {
|
|
// eslint-disable-next-line no-undef
|
|
var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
|
|
var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;
|
|
return '/*# ' + data + ' */';
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/node-libs-browser/mock/empty.js":
|
|
/*!************************************************************************!*\
|
|
!*** E:/Projekte/mermaid/node_modules/node-libs-browser/mock/empty.js ***!
|
|
\************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/path-browserify/index.js":
|
|
/*!*****************************************************************!*\
|
|
!*** E:/Projekte/mermaid/node_modules/path-browserify/index.js ***!
|
|
\*****************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process) {// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
|
|
// backported and transplited with Babel, with backwards-compat fixes
|
|
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
// resolves . and .. elements in a path array with directory names there
|
|
// must be no slashes, empty elements, or device names (c:\) in the array
|
|
// (so also no leading and trailing slashes - it does not distinguish
|
|
// relative and absolute paths)
|
|
function normalizeArray(parts, allowAboveRoot) {
|
|
// if the path tries to go above the root, `up` ends up > 0
|
|
var up = 0;
|
|
for (var i = parts.length - 1; i >= 0; i--) {
|
|
var last = parts[i];
|
|
if (last === '.') {
|
|
parts.splice(i, 1);
|
|
} else if (last === '..') {
|
|
parts.splice(i, 1);
|
|
up++;
|
|
} else if (up) {
|
|
parts.splice(i, 1);
|
|
up--;
|
|
}
|
|
}
|
|
|
|
// if the path is allowed to go above the root, restore leading ..s
|
|
if (allowAboveRoot) {
|
|
for (; up--; up) {
|
|
parts.unshift('..');
|
|
}
|
|
}
|
|
|
|
return parts;
|
|
}
|
|
|
|
// path.resolve([from ...], to)
|
|
// posix version
|
|
exports.resolve = function() {
|
|
var resolvedPath = '',
|
|
resolvedAbsolute = false;
|
|
|
|
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
|
var path = (i >= 0) ? arguments[i] : process.cwd();
|
|
|
|
// Skip empty and invalid entries
|
|
if (typeof path !== 'string') {
|
|
throw new TypeError('Arguments to path.resolve must be strings');
|
|
} else if (!path) {
|
|
continue;
|
|
}
|
|
|
|
resolvedPath = path + '/' + resolvedPath;
|
|
resolvedAbsolute = path.charAt(0) === '/';
|
|
}
|
|
|
|
// At this point the path should be resolved to a full absolute path, but
|
|
// handle relative paths to be safe (might happen when process.cwd() fails)
|
|
|
|
// Normalize the path
|
|
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
|
|
return !!p;
|
|
}), !resolvedAbsolute).join('/');
|
|
|
|
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
|
|
};
|
|
|
|
// path.normalize(path)
|
|
// posix version
|
|
exports.normalize = function(path) {
|
|
var isAbsolute = exports.isAbsolute(path),
|
|
trailingSlash = substr(path, -1) === '/';
|
|
|
|
// Normalize the path
|
|
path = normalizeArray(filter(path.split('/'), function(p) {
|
|
return !!p;
|
|
}), !isAbsolute).join('/');
|
|
|
|
if (!path && !isAbsolute) {
|
|
path = '.';
|
|
}
|
|
if (path && trailingSlash) {
|
|
path += '/';
|
|
}
|
|
|
|
return (isAbsolute ? '/' : '') + path;
|
|
};
|
|
|
|
// posix version
|
|
exports.isAbsolute = function(path) {
|
|
return path.charAt(0) === '/';
|
|
};
|
|
|
|
// posix version
|
|
exports.join = function() {
|
|
var paths = Array.prototype.slice.call(arguments, 0);
|
|
return exports.normalize(filter(paths, function(p, index) {
|
|
if (typeof p !== 'string') {
|
|
throw new TypeError('Arguments to path.join must be strings');
|
|
}
|
|
return p;
|
|
}).join('/'));
|
|
};
|
|
|
|
|
|
// path.relative(from, to)
|
|
// posix version
|
|
exports.relative = function(from, to) {
|
|
from = exports.resolve(from).substr(1);
|
|
to = exports.resolve(to).substr(1);
|
|
|
|
function trim(arr) {
|
|
var start = 0;
|
|
for (; start < arr.length; start++) {
|
|
if (arr[start] !== '') break;
|
|
}
|
|
|
|
var end = arr.length - 1;
|
|
for (; end >= 0; end--) {
|
|
if (arr[end] !== '') break;
|
|
}
|
|
|
|
if (start > end) return [];
|
|
return arr.slice(start, end - start + 1);
|
|
}
|
|
|
|
var fromParts = trim(from.split('/'));
|
|
var toParts = trim(to.split('/'));
|
|
|
|
var length = Math.min(fromParts.length, toParts.length);
|
|
var samePartsLength = length;
|
|
for (var i = 0; i < length; i++) {
|
|
if (fromParts[i] !== toParts[i]) {
|
|
samePartsLength = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
var outputParts = [];
|
|
for (var i = samePartsLength; i < fromParts.length; i++) {
|
|
outputParts.push('..');
|
|
}
|
|
|
|
outputParts = outputParts.concat(toParts.slice(samePartsLength));
|
|
|
|
return outputParts.join('/');
|
|
};
|
|
|
|
exports.sep = '/';
|
|
exports.delimiter = ':';
|
|
|
|
exports.dirname = function (path) {
|
|
if (typeof path !== 'string') path = path + '';
|
|
if (path.length === 0) return '.';
|
|
var code = path.charCodeAt(0);
|
|
var hasRoot = code === 47 /*/*/;
|
|
var end = -1;
|
|
var matchedSlash = true;
|
|
for (var i = path.length - 1; i >= 1; --i) {
|
|
code = path.charCodeAt(i);
|
|
if (code === 47 /*/*/) {
|
|
if (!matchedSlash) {
|
|
end = i;
|
|
break;
|
|
}
|
|
} else {
|
|
// We saw the first non-path separator
|
|
matchedSlash = false;
|
|
}
|
|
}
|
|
|
|
if (end === -1) return hasRoot ? '/' : '.';
|
|
if (hasRoot && end === 1) {
|
|
// return '//';
|
|
// Backwards-compat fix:
|
|
return '/';
|
|
}
|
|
return path.slice(0, end);
|
|
};
|
|
|
|
function basename(path) {
|
|
if (typeof path !== 'string') path = path + '';
|
|
|
|
var start = 0;
|
|
var end = -1;
|
|
var matchedSlash = true;
|
|
var i;
|
|
|
|
for (i = path.length - 1; i >= 0; --i) {
|
|
if (path.charCodeAt(i) === 47 /*/*/) {
|
|
// If we reached a path separator that was not part of a set of path
|
|
// separators at the end of the string, stop now
|
|
if (!matchedSlash) {
|
|
start = i + 1;
|
|
break;
|
|
}
|
|
} else if (end === -1) {
|
|
// We saw the first non-path separator, mark this as the end of our
|
|
// path component
|
|
matchedSlash = false;
|
|
end = i + 1;
|
|
}
|
|
}
|
|
|
|
if (end === -1) return '';
|
|
return path.slice(start, end);
|
|
}
|
|
|
|
// Uses a mixed approach for backwards-compatibility, as ext behavior changed
|
|
// in new Node.js versions, so only basename() above is backported here
|
|
exports.basename = function (path, ext) {
|
|
var f = basename(path);
|
|
if (ext && f.substr(-1 * ext.length) === ext) {
|
|
f = f.substr(0, f.length - ext.length);
|
|
}
|
|
return f;
|
|
};
|
|
|
|
exports.extname = function (path) {
|
|
if (typeof path !== 'string') path = path + '';
|
|
var startDot = -1;
|
|
var startPart = 0;
|
|
var end = -1;
|
|
var matchedSlash = true;
|
|
// Track the state of characters (if any) we see before our first dot and
|
|
// after any path separator we find
|
|
var preDotState = 0;
|
|
for (var i = path.length - 1; i >= 0; --i) {
|
|
var code = path.charCodeAt(i);
|
|
if (code === 47 /*/*/) {
|
|
// If we reached a path separator that was not part of a set of path
|
|
// separators at the end of the string, stop now
|
|
if (!matchedSlash) {
|
|
startPart = i + 1;
|
|
break;
|
|
}
|
|
continue;
|
|
}
|
|
if (end === -1) {
|
|
// We saw the first non-path separator, mark this as the end of our
|
|
// extension
|
|
matchedSlash = false;
|
|
end = i + 1;
|
|
}
|
|
if (code === 46 /*.*/) {
|
|
// If this is our first dot, mark it as the start of our extension
|
|
if (startDot === -1)
|
|
startDot = i;
|
|
else if (preDotState !== 1)
|
|
preDotState = 1;
|
|
} else if (startDot !== -1) {
|
|
// We saw a non-dot and non-path separator before our dot, so we should
|
|
// have a good chance at having a non-empty extension
|
|
preDotState = -1;
|
|
}
|
|
}
|
|
|
|
if (startDot === -1 || end === -1 ||
|
|
// We saw a non-dot character immediately before the dot
|
|
preDotState === 0 ||
|
|
// The (right-most) trimmed path component is exactly '..'
|
|
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
|
return '';
|
|
}
|
|
return path.slice(startDot, end);
|
|
};
|
|
|
|
function filter (xs, f) {
|
|
if (xs.filter) return xs.filter(f);
|
|
var res = [];
|
|
for (var i = 0; i < xs.length; i++) {
|
|
if (f(xs[i], i, xs)) res.push(xs[i]);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
// String.prototype.substr - negative index don't work in IE8
|
|
var substr = 'ab'.substr(-1) === 'b'
|
|
? function (str, start, len) { return str.substr(start, len) }
|
|
: function (str, start, len) {
|
|
if (start < 0) start = str.length + start;
|
|
return str.substr(start, len);
|
|
}
|
|
;
|
|
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js?dc43")))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/process/browser.js?dc43":
|
|
/*!***********************************************************!*\
|
|
!*** E:/Projekte/mermaid/node_modules/process/browser.js ***!
|
|
\***********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
// shim for using process in browser
|
|
var process = module.exports = {};
|
|
|
|
// cached from whatever global is present so that test runners that stub it
|
|
// don't break things. But we need to wrap it in a try catch in case it is
|
|
// wrapped in strict mode code which doesn't define any globals. It's inside a
|
|
// function because try/catches deoptimize in certain engines.
|
|
|
|
var cachedSetTimeout;
|
|
var cachedClearTimeout;
|
|
|
|
function defaultSetTimout() {
|
|
throw new Error('setTimeout has not been defined');
|
|
}
|
|
function defaultClearTimeout () {
|
|
throw new Error('clearTimeout has not been defined');
|
|
}
|
|
(function () {
|
|
try {
|
|
if (typeof setTimeout === 'function') {
|
|
cachedSetTimeout = setTimeout;
|
|
} else {
|
|
cachedSetTimeout = defaultSetTimout;
|
|
}
|
|
} catch (e) {
|
|
cachedSetTimeout = defaultSetTimout;
|
|
}
|
|
try {
|
|
if (typeof clearTimeout === 'function') {
|
|
cachedClearTimeout = clearTimeout;
|
|
} else {
|
|
cachedClearTimeout = defaultClearTimeout;
|
|
}
|
|
} catch (e) {
|
|
cachedClearTimeout = defaultClearTimeout;
|
|
}
|
|
} ())
|
|
function runTimeout(fun) {
|
|
if (cachedSetTimeout === setTimeout) {
|
|
//normal enviroments in sane situations
|
|
return setTimeout(fun, 0);
|
|
}
|
|
// if setTimeout wasn't available but was latter defined
|
|
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
|
cachedSetTimeout = setTimeout;
|
|
return setTimeout(fun, 0);
|
|
}
|
|
try {
|
|
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
return cachedSetTimeout(fun, 0);
|
|
} catch(e){
|
|
try {
|
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
return cachedSetTimeout.call(null, fun, 0);
|
|
} catch(e){
|
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
|
return cachedSetTimeout.call(this, fun, 0);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
function runClearTimeout(marker) {
|
|
if (cachedClearTimeout === clearTimeout) {
|
|
//normal enviroments in sane situations
|
|
return clearTimeout(marker);
|
|
}
|
|
// if clearTimeout wasn't available but was latter defined
|
|
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
|
cachedClearTimeout = clearTimeout;
|
|
return clearTimeout(marker);
|
|
}
|
|
try {
|
|
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
return cachedClearTimeout(marker);
|
|
} catch (e){
|
|
try {
|
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
return cachedClearTimeout.call(null, marker);
|
|
} catch (e){
|
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
|
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
|
return cachedClearTimeout.call(this, marker);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
var queue = [];
|
|
var draining = false;
|
|
var currentQueue;
|
|
var queueIndex = -1;
|
|
|
|
function cleanUpNextTick() {
|
|
if (!draining || !currentQueue) {
|
|
return;
|
|
}
|
|
draining = false;
|
|
if (currentQueue.length) {
|
|
queue = currentQueue.concat(queue);
|
|
} else {
|
|
queueIndex = -1;
|
|
}
|
|
if (queue.length) {
|
|
drainQueue();
|
|
}
|
|
}
|
|
|
|
function drainQueue() {
|
|
if (draining) {
|
|
return;
|
|
}
|
|
var timeout = runTimeout(cleanUpNextTick);
|
|
draining = true;
|
|
|
|
var len = queue.length;
|
|
while(len) {
|
|
currentQueue = queue;
|
|
queue = [];
|
|
while (++queueIndex < len) {
|
|
if (currentQueue) {
|
|
currentQueue[queueIndex].run();
|
|
}
|
|
}
|
|
queueIndex = -1;
|
|
len = queue.length;
|
|
}
|
|
currentQueue = null;
|
|
draining = false;
|
|
runClearTimeout(timeout);
|
|
}
|
|
|
|
process.nextTick = function (fun) {
|
|
var args = new Array(arguments.length - 1);
|
|
if (arguments.length > 1) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
args[i - 1] = arguments[i];
|
|
}
|
|
}
|
|
queue.push(new Item(fun, args));
|
|
if (queue.length === 1 && !draining) {
|
|
runTimeout(drainQueue);
|
|
}
|
|
};
|
|
|
|
// v8 likes predictible objects
|
|
function Item(fun, array) {
|
|
this.fun = fun;
|
|
this.array = array;
|
|
}
|
|
Item.prototype.run = function () {
|
|
this.fun.apply(null, this.array);
|
|
};
|
|
process.title = 'browser';
|
|
process.browser = true;
|
|
process.env = {};
|
|
process.argv = [];
|
|
process.version = ''; // empty string to avoid regexp issues
|
|
process.versions = {};
|
|
|
|
function noop() {}
|
|
|
|
process.on = noop;
|
|
process.addListener = noop;
|
|
process.once = noop;
|
|
process.off = noop;
|
|
process.removeListener = noop;
|
|
process.removeAllListeners = noop;
|
|
process.emit = noop;
|
|
process.prependListener = noop;
|
|
process.prependOnceListener = noop;
|
|
|
|
process.listeners = function (name) { return [] }
|
|
|
|
process.binding = function (name) {
|
|
throw new Error('process.binding is not supported');
|
|
};
|
|
|
|
process.cwd = function () { return '/' };
|
|
process.chdir = function (dir) {
|
|
throw new Error('process.chdir is not supported');
|
|
};
|
|
process.umask = function() { return 0; };
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/process/browser.js?f28c":
|
|
/*!*****************************************!*\
|
|
!*** ./node_modules/process/browser.js ***!
|
|
\*****************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
// shim for using process in browser
|
|
var process = module.exports = {};
|
|
|
|
// cached from whatever global is present so that test runners that stub it
|
|
// don't break things. But we need to wrap it in a try catch in case it is
|
|
// wrapped in strict mode code which doesn't define any globals. It's inside a
|
|
// function because try/catches deoptimize in certain engines.
|
|
|
|
var cachedSetTimeout;
|
|
var cachedClearTimeout;
|
|
|
|
function defaultSetTimout() {
|
|
throw new Error('setTimeout has not been defined');
|
|
}
|
|
function defaultClearTimeout () {
|
|
throw new Error('clearTimeout has not been defined');
|
|
}
|
|
(function () {
|
|
try {
|
|
if (typeof setTimeout === 'function') {
|
|
cachedSetTimeout = setTimeout;
|
|
} else {
|
|
cachedSetTimeout = defaultSetTimout;
|
|
}
|
|
} catch (e) {
|
|
cachedSetTimeout = defaultSetTimout;
|
|
}
|
|
try {
|
|
if (typeof clearTimeout === 'function') {
|
|
cachedClearTimeout = clearTimeout;
|
|
} else {
|
|
cachedClearTimeout = defaultClearTimeout;
|
|
}
|
|
} catch (e) {
|
|
cachedClearTimeout = defaultClearTimeout;
|
|
}
|
|
} ())
|
|
function runTimeout(fun) {
|
|
if (cachedSetTimeout === setTimeout) {
|
|
//normal enviroments in sane situations
|
|
return setTimeout(fun, 0);
|
|
}
|
|
// if setTimeout wasn't available but was latter defined
|
|
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
|
cachedSetTimeout = setTimeout;
|
|
return setTimeout(fun, 0);
|
|
}
|
|
try {
|
|
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
return cachedSetTimeout(fun, 0);
|
|
} catch(e){
|
|
try {
|
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
return cachedSetTimeout.call(null, fun, 0);
|
|
} catch(e){
|
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
|
return cachedSetTimeout.call(this, fun, 0);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
function runClearTimeout(marker) {
|
|
if (cachedClearTimeout === clearTimeout) {
|
|
//normal enviroments in sane situations
|
|
return clearTimeout(marker);
|
|
}
|
|
// if clearTimeout wasn't available but was latter defined
|
|
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
|
cachedClearTimeout = clearTimeout;
|
|
return clearTimeout(marker);
|
|
}
|
|
try {
|
|
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
return cachedClearTimeout(marker);
|
|
} catch (e){
|
|
try {
|
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
return cachedClearTimeout.call(null, marker);
|
|
} catch (e){
|
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
|
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
|
return cachedClearTimeout.call(this, marker);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
var queue = [];
|
|
var draining = false;
|
|
var currentQueue;
|
|
var queueIndex = -1;
|
|
|
|
function cleanUpNextTick() {
|
|
if (!draining || !currentQueue) {
|
|
return;
|
|
}
|
|
draining = false;
|
|
if (currentQueue.length) {
|
|
queue = currentQueue.concat(queue);
|
|
} else {
|
|
queueIndex = -1;
|
|
}
|
|
if (queue.length) {
|
|
drainQueue();
|
|
}
|
|
}
|
|
|
|
function drainQueue() {
|
|
if (draining) {
|
|
return;
|
|
}
|
|
var timeout = runTimeout(cleanUpNextTick);
|
|
draining = true;
|
|
|
|
var len = queue.length;
|
|
while(len) {
|
|
currentQueue = queue;
|
|
queue = [];
|
|
while (++queueIndex < len) {
|
|
if (currentQueue) {
|
|
currentQueue[queueIndex].run();
|
|
}
|
|
}
|
|
queueIndex = -1;
|
|
len = queue.length;
|
|
}
|
|
currentQueue = null;
|
|
draining = false;
|
|
runClearTimeout(timeout);
|
|
}
|
|
|
|
process.nextTick = function (fun) {
|
|
var args = new Array(arguments.length - 1);
|
|
if (arguments.length > 1) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
args[i - 1] = arguments[i];
|
|
}
|
|
}
|
|
queue.push(new Item(fun, args));
|
|
if (queue.length === 1 && !draining) {
|
|
runTimeout(drainQueue);
|
|
}
|
|
};
|
|
|
|
// v8 likes predictible objects
|
|
function Item(fun, array) {
|
|
this.fun = fun;
|
|
this.array = array;
|
|
}
|
|
Item.prototype.run = function () {
|
|
this.fun.apply(null, this.array);
|
|
};
|
|
process.title = 'browser';
|
|
process.browser = true;
|
|
process.env = {};
|
|
process.argv = [];
|
|
process.version = ''; // empty string to avoid regexp issues
|
|
process.versions = {};
|
|
|
|
function noop() {}
|
|
|
|
process.on = noop;
|
|
process.addListener = noop;
|
|
process.once = noop;
|
|
process.off = noop;
|
|
process.removeListener = noop;
|
|
process.removeAllListeners = noop;
|
|
process.emit = noop;
|
|
process.prependListener = noop;
|
|
process.prependOnceListener = noop;
|
|
|
|
process.listeners = function (name) { return [] }
|
|
|
|
process.binding = function (name) {
|
|
throw new Error('process.binding is not supported');
|
|
};
|
|
|
|
process.cwd = function () { return '/' };
|
|
process.chdir = function (dir) {
|
|
throw new Error('process.chdir is not supported');
|
|
};
|
|
process.umask = function() { return 0; };
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/webpack/buildin/module.js":
|
|
/*!************************************************!*\
|
|
!*** ./node_modules/webpack/buildin/module.js ***!
|
|
\************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = function(module) {
|
|
if (!module.webpackPolyfill) {
|
|
module.deprecate = function() {};
|
|
module.paths = [];
|
|
// module.parent = undefined by default
|
|
if (!module.children) module.children = [];
|
|
Object.defineProperty(module, "loaded", {
|
|
enumerable: true,
|
|
get: function() {
|
|
return module.l;
|
|
}
|
|
});
|
|
Object.defineProperty(module, "id", {
|
|
enumerable: true,
|
|
get: function() {
|
|
return module.i;
|
|
}
|
|
});
|
|
module.webpackPolyfill = 1;
|
|
}
|
|
return module;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./package.json":
|
|
/*!**********************!*\
|
|
!*** ./package.json ***!
|
|
\**********************/
|
|
/*! exports provided: name, version, description, main, keywords, scripts, repository, author, license, standard, dependencies, devDependencies, files, yarn-upgrade-all, sideEffects, default */
|
|
/***/ (function(module) {
|
|
|
|
module.exports = JSON.parse("{\"name\":\"mermaid\",\"version\":\"8.5.1\",\"description\":\"Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.\",\"main\":\"dist/mermaid.core.js\",\"keywords\":[\"diagram\",\"markdown\",\"flowchart\",\"sequence diagram\",\"gantt\",\"class diagram\",\"git graph\"],\"scripts\":{\"build:development\":\"webpack --progress --colors\",\"build:production\":\"yarn build:development -p --config webpack.config.prod.babel.js\",\"build\":\"yarn build:development && yarn build:production\",\"postbuild\":\"documentation build src/mermaidAPI.js --shallow -f md --markdown-toc false -o docs/mermaidAPI.md\",\"build:watch\":\"yarn build --watch\",\"minify\":\"minify ./dist/mermaid.js > ./dist/mermaid.min.js\",\"release\":\"yarn build\",\"lint\":\"eslint src\",\"e2e:depr\":\"yarn lint && jest e2e --config e2e/jest.config.js\",\"cypress\":\"percy exec -- cypress run\",\"e2e\":\"start-server-and-test dev http://localhost:9000/ cypress\",\"e2e-upd\":\"yarn lint && jest e2e -u --config e2e/jest.config.js\",\"dev\":\"webpack-dev-server --config webpack.config.e2e.js\",\"test\":\"yarn lint && jest src/.*\",\"test:watch\":\"jest --watch src\",\"prepublishOnly\":\"yarn build && yarn test && yarn e2e\",\"prepush\":\"yarn test\",\"prepare\":\"yarn build\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/knsv/mermaid\"},\"author\":\"Knut Sveidqvist\",\"license\":\"MIT\",\"standard\":{\"ignore\":[\"**/parser/*.js\",\"dist/**/*.js\",\"cypress/**/*.js\"],\"globals\":[\"page\"]},\"dependencies\":{\"@braintree/sanitize-url\":\"^3.1.0\",\"crypto-random-string\":\"^3.0.1\",\"d3\":\"^5.7.0\",\"dagre\":\"^0.8.4\",\"dagre-d3\":\"^0.6.4\",\"entity-decode\":\"^2.0.2\",\"graphlib\":\"^2.1.7\",\"he\":\"^1.2.0\",\"minify\":\"^4.1.1\",\"moment-mini\":\"^2.22.1\",\"scope-css\":\"^1.2.1\"},\"devDependencies\":{\"@babel/core\":\"^7.2.2\",\"@babel/preset-env\":\"^7.8.4\",\"@babel/register\":\"^7.0.0\",\"@percy/cypress\":\"*\",\"babel-core\":\"7.0.0-bridge.0\",\"babel-jest\":\"^24.9.0\",\"babel-loader\":\"^8.0.4\",\"coveralls\":\"^3.0.2\",\"css-loader\":\"^2.0.1\",\"css-to-string-loader\":\"^0.1.3\",\"cypress\":\"4.0.1\",\"documentation\":\"^12.0.1\",\"eslint\":\"^6.3.0\",\"eslint-config-prettier\":\"^6.3.0\",\"eslint-plugin-prettier\":\"^3.1.0\",\"husky\":\"^1.2.1\",\"identity-obj-proxy\":\"^3.0.0\",\"jest\":\"^24.9.0\",\"jison\":\"^0.4.18\",\"moment\":\"^2.23.0\",\"node-sass\":\"^4.12.0\",\"prettier\":\"^1.18.2\",\"puppeteer\":\"^1.17.0\",\"sass-loader\":\"^7.1.0\",\"start-server-and-test\":\"^1.10.6\",\"terser-webpack-plugin\":\"^2.2.2\",\"webpack\":\"^4.41.2\",\"webpack-bundle-analyzer\":\"^3.7.0\",\"webpack-cli\":\"^3.1.2\",\"webpack-dev-server\":\"^3.4.1\",\"webpack-node-externals\":\"^1.7.2\",\"yarn-upgrade-all\":\"^0.5.0\"},\"files\":[\"dist\"],\"yarn-upgrade-all\":{\"ignore\":[\"babel-core\"]},\"sideEffects\":[\"**/*.css\",\"**/*.scss\"]}");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/config.js":
|
|
/*!***********************!*\
|
|
!*** ./src/config.js ***!
|
|
\***********************/
|
|
/*! exports provided: setConfig, getConfig, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConfig", function() { return setConfig; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; });
|
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
|
|
var config = {};
|
|
|
|
var setConf = function setConf(cnf) {
|
|
// Top level initially mermaid, gflow, sequenceDiagram and gantt
|
|
var lvl1Keys = Object.keys(cnf);
|
|
|
|
for (var i = 0; i < lvl1Keys.length; i++) {
|
|
if (_typeof(cnf[lvl1Keys[i]]) === 'object' && cnf[lvl1Keys[i]] != null) {
|
|
var lvl2Keys = Object.keys(cnf[lvl1Keys[i]]);
|
|
|
|
for (var j = 0; j < lvl2Keys.length; j++) {
|
|
// logger.debug('Setting conf ', lvl1Keys[i], '-', lvl2Keys[j])
|
|
if (typeof config[lvl1Keys[i]] === 'undefined') {
|
|
config[lvl1Keys[i]] = {};
|
|
} // logger.debug('Setting config: ' + lvl1Keys[i] + ' ' + lvl2Keys[j] + ' to ' + cnf[lvl1Keys[i]][lvl2Keys[j]])
|
|
|
|
|
|
config[lvl1Keys[i]][lvl2Keys[j]] = cnf[lvl1Keys[i]][lvl2Keys[j]];
|
|
}
|
|
} else {
|
|
config[lvl1Keys[i]] = cnf[lvl1Keys[i]];
|
|
}
|
|
}
|
|
};
|
|
|
|
var setConfig = function setConfig(conf) {
|
|
setConf(conf);
|
|
};
|
|
var getConfig = function getConfig() {
|
|
return config;
|
|
};
|
|
var configApi = {
|
|
setConfig: setConfig,
|
|
getConfig: getConfig // get conf() {
|
|
// return config;
|
|
// }
|
|
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = (configApi);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/clusters.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/dagre-wrapper/clusters.js ***!
|
|
\***************************************/
|
|
/*! exports provided: insertCluster, getClusterTitleWidth, clear, positionCluster */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertCluster", function() { return insertCluster; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClusterTitleWidth", function() { return getClusterTitleWidth; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "positionCluster", function() { return positionCluster; });
|
|
/* harmony import */ var _intersect_intersect_rect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./intersect/intersect-rect */ "./src/dagre-wrapper/intersect/intersect-rect.js");
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
|
|
/* harmony import */ var _createLabel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createLabel */ "./src/dagre-wrapper/createLabel.js");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../config */ "./src/config.js");
|
|
|
|
// eslint-disable-line
|
|
|
|
|
|
|
|
|
|
|
|
var rect = function rect(parent, node) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].trace('Creating subgraph rect for ', node.id, node); // Add outer g element
|
|
|
|
var shapeSvg = parent.insert('g').attr('class', 'cluster').attr('id', node.id); // add the rect
|
|
|
|
var rect = shapeSvg.insert('rect', ':first-child'); // Create the label and insert it after the rect
|
|
|
|
var label = shapeSvg.insert('g').attr('class', 'cluster-label');
|
|
var text = label.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_2__["default"])(node.labelText, node.labelStyle, undefined, true)); // Get the size of the label
|
|
|
|
var bbox = text.getBBox();
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
|
|
var div = text.children[0];
|
|
var dv = Object(d3__WEBPACK_IMPORTED_MODULE_3__["select"])(text);
|
|
bbox = div.getBoundingClientRect();
|
|
dv.attr('width', bbox.width);
|
|
dv.attr('height', bbox.height);
|
|
}
|
|
|
|
var padding = 0 * node.padding;
|
|
var halfPadding = padding / 2;
|
|
_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].trace('Data ', node, JSON.stringify(node)); // center the rect around its coordinate
|
|
|
|
rect.attr('rx', node.rx).attr('ry', node.ry).attr('x', node.x - node.width / 2 - halfPadding).attr('y', node.y - node.height / 2 - halfPadding).attr('width', node.width + padding).attr('height', node.height + padding); // Center the label
|
|
|
|
label.attr('transform', 'translate(' + (node.x - bbox.width / 2) + ', ' + (node.y - node.height / 2 - node.padding / 3 + 3) + ')');
|
|
var rectBox = rect.node().getBBox();
|
|
node.width = rectBox.width;
|
|
node.height = rectBox.height;
|
|
|
|
node.intersect = function (point) {
|
|
return Object(_intersect_intersect_rect__WEBPACK_IMPORTED_MODULE_0__["default"])(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
/**
|
|
* Non visiable cluster where the note is group with its
|
|
*/
|
|
|
|
|
|
var noteGroup = function noteGroup(parent, node) {
|
|
// Add outer g element
|
|
var shapeSvg = parent.insert('g').attr('class', 'note-cluster').attr('id', node.id); // add the rect
|
|
|
|
var rect = shapeSvg.insert('rect', ':first-child');
|
|
var padding = 0 * node.padding;
|
|
var halfPadding = padding / 2; // center the rect around its coordinate
|
|
|
|
rect.attr('rx', node.rx).attr('ry', node.ry).attr('x', node.x - node.width / 2 - halfPadding).attr('y', node.y - node.height / 2 - halfPadding).attr('width', node.width + padding).attr('height', node.height + padding).attr('fill', 'none');
|
|
var rectBox = rect.node().getBBox();
|
|
node.width = rectBox.width;
|
|
node.height = rectBox.height;
|
|
|
|
node.intersect = function (point) {
|
|
return Object(_intersect_intersect_rect__WEBPACK_IMPORTED_MODULE_0__["default"])(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var roundedWithTitle = function roundedWithTitle(parent, node) {
|
|
// Add outer g element
|
|
var shapeSvg = parent.insert('g').attr('class', node.classes).attr('id', node.id); // add the rect
|
|
|
|
var rect = shapeSvg.insert('rect', ':first-child'); // Create the label and insert it after the rect
|
|
|
|
var label = shapeSvg.insert('g').attr('class', 'cluster-label');
|
|
var innerRect = shapeSvg.append('rect');
|
|
var text = label.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_2__["default"])(node.labelText, node.labelStyle, undefined, true)); // Get the size of the label
|
|
|
|
var bbox = text.getBBox();
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
|
|
var div = text.children[0];
|
|
var dv = Object(d3__WEBPACK_IMPORTED_MODULE_3__["select"])(text);
|
|
bbox = div.getBoundingClientRect();
|
|
dv.attr('width', bbox.width);
|
|
dv.attr('height', bbox.height);
|
|
}
|
|
|
|
bbox = text.getBBox();
|
|
var padding = 0 * node.padding;
|
|
var halfPadding = padding / 2; // center the rect around its coordinate
|
|
|
|
rect.attr('class', 'outer').attr('x', node.x - node.width / 2 - halfPadding).attr('y', node.y - node.height / 2 - halfPadding).attr('width', node.width + padding).attr('height', node.height + padding);
|
|
innerRect.attr('class', 'inner').attr('x', node.x - node.width / 2 - halfPadding).attr('y', node.y - node.height / 2 - halfPadding + bbox.height - 1).attr('width', node.width + padding).attr('height', node.height + padding - bbox.height - 3); // Center the label
|
|
|
|
label.attr('transform', 'translate(' + (node.x - bbox.width / 2) + ', ' + (node.y - node.height / 2 - node.padding / 3 + (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels ? 5 : 3)) + ')');
|
|
var rectBox = rect.node().getBBox();
|
|
node.width = rectBox.width;
|
|
node.height = rectBox.height;
|
|
|
|
node.intersect = function (point) {
|
|
return Object(_intersect_intersect_rect__WEBPACK_IMPORTED_MODULE_0__["default"])(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var divider = function divider(parent, node) {
|
|
// Add outer g element
|
|
var shapeSvg = parent.insert('g').attr('class', node.classes).attr('id', node.id); // add the rect
|
|
|
|
var rect = shapeSvg.insert('rect', ':first-child');
|
|
var padding = 0 * node.padding;
|
|
var halfPadding = padding / 2; // center the rect around its coordinate
|
|
|
|
rect.attr('class', 'divider').attr('x', node.x - node.width / 2 - halfPadding).attr('y', node.y - node.height / 2).attr('width', node.width + padding).attr('height', node.height + padding);
|
|
var rectBox = rect.node().getBBox();
|
|
node.width = rectBox.width;
|
|
node.height = rectBox.height;
|
|
|
|
node.intersect = function (point) {
|
|
return Object(_intersect_intersect_rect__WEBPACK_IMPORTED_MODULE_0__["default"])(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var shapes = {
|
|
rect: rect,
|
|
roundedWithTitle: roundedWithTitle,
|
|
noteGroup: noteGroup,
|
|
divider: divider
|
|
};
|
|
var clusterElems = {};
|
|
var insertCluster = function insertCluster(elem, node) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].trace('Inserting cluster');
|
|
var shape = node.shape || 'rect';
|
|
clusterElems[node.id] = shapes[shape](elem, node);
|
|
};
|
|
var getClusterTitleWidth = function getClusterTitleWidth(elem, node) {
|
|
var label = Object(_createLabel__WEBPACK_IMPORTED_MODULE_2__["default"])(node.labelText, node.labelStyle, undefined, true);
|
|
elem.node().appendChild(label);
|
|
var width = label.getBBox().width;
|
|
elem.node().removeChild(label);
|
|
return width;
|
|
};
|
|
var clear = function clear() {
|
|
clusterElems = {};
|
|
};
|
|
var positionCluster = function positionCluster(node) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('Position cluster');
|
|
var el = clusterElems[node.id];
|
|
el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/createLabel.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/dagre-wrapper/createLabel.js ***!
|
|
\******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config */ "./src/config.js");
|
|
|
|
// eslint-disable-line
|
|
// let vertexNode;
|
|
// if (getConfig().flowchart.htmlLabels) {
|
|
// // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?
|
|
// const node = {
|
|
// label: vertexText.replace(/fa[lrsb]?:fa-[\w-]+/g, s => `<i class='${s.replace(':', ' ')}'></i>`)
|
|
// };
|
|
// vertexNode = addHtmlLabel(svg, node).node();
|
|
// vertexNode.parentNode.removeChild(vertexNode);
|
|
// } else {
|
|
// const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
// svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));
|
|
// const rows = vertexText.split(common.lineBreakRegex);
|
|
// for (let j = 0; j < rows.length; j++) {
|
|
// const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
|
|
// tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
|
|
// tspan.setAttribute('dy', '1em');
|
|
// tspan.setAttribute('x', '1');
|
|
// tspan.textContent = rows[j];
|
|
// svgLabel.appendChild(tspan);
|
|
// }
|
|
// vertexNode = svgLabel;
|
|
// }
|
|
|
|
|
|
|
|
function applyStyle(dom, styleFn) {
|
|
if (styleFn) {
|
|
dom.attr('style', styleFn);
|
|
}
|
|
}
|
|
|
|
function addHtmlLabel(node) {
|
|
// var fo = root.append('foreignObject').attr('width', '100000');
|
|
// var div = fo.append('xhtml:div');
|
|
// div.attr('xmlns', 'http://www.w3.org/1999/xhtml');
|
|
// var label = node.label;
|
|
// switch (typeof label) {
|
|
// case 'function':
|
|
// div.insert(label);
|
|
// break;
|
|
// case 'object':
|
|
// // Currently we assume this is a DOM object.
|
|
// div.insert(function() {
|
|
// return label;
|
|
// });
|
|
// break;
|
|
// default:
|
|
// div.html(label);
|
|
// }
|
|
// applyStyle(div, node.labelStyle);
|
|
// div.style('display', 'inline-block');
|
|
// // Fix for firefox
|
|
// div.style('white-space', 'nowrap');
|
|
// var client = div.node().getBoundingClientRect();
|
|
// fo.attr('width', client.width).attr('height', client.height);
|
|
var fo = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject'));
|
|
var div = fo.append('xhtml:div');
|
|
var label = node.label;
|
|
var labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel';
|
|
div.html('<span class="' + labelClass + '">' + label + '</span>');
|
|
applyStyle(div, node.labelStyle);
|
|
div.style('display', 'inline-block'); // Fix for firefox
|
|
|
|
div.style('white-space', 'nowrap');
|
|
div.attr('xmlns', 'http://www.w3.org/1999/xhtml');
|
|
return fo.node();
|
|
}
|
|
|
|
var createLabel = function createLabel(_vertexText, style, isTitle, isNode) {
|
|
var vertexText = _vertexText || '';
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_2__["getConfig"])().flowchart.htmlLabels) {
|
|
// TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?
|
|
vertexText = vertexText.replace(/\\n|\n/g, '<br />');
|
|
_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('vertexText' + vertexText);
|
|
var node = {
|
|
isNode: isNode,
|
|
label: vertexText.replace(/fa[lrsb]?:fa-[\w-]+/g, function (s) {
|
|
return "<i class='".concat(s.replace(':', ' '), "'></i>");
|
|
})
|
|
};
|
|
var vertexNode = addHtmlLabel(node); // vertexNode.parentNode.removeChild(vertexNode);
|
|
|
|
return vertexNode;
|
|
} else {
|
|
var svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
svgLabel.setAttribute('style', style.replace('color:', 'fill:'));
|
|
var rows = [];
|
|
|
|
if (typeof vertexText === 'string') {
|
|
rows = vertexText.split(/\\n|\n|<br\s*\/?>/gi);
|
|
} else if (Array.isArray(vertexText)) {
|
|
rows = vertexText;
|
|
} else {
|
|
rows = [];
|
|
}
|
|
|
|
for (var j = 0; j < rows.length; j++) {
|
|
var tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
|
|
tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
|
|
tspan.setAttribute('dy', '1em');
|
|
tspan.setAttribute('x', '0');
|
|
|
|
if (isTitle) {
|
|
tspan.setAttribute('class', 'title-row');
|
|
} else {
|
|
tspan.setAttribute('class', 'row');
|
|
}
|
|
|
|
tspan.textContent = rows[j].trim();
|
|
svgLabel.appendChild(tspan);
|
|
}
|
|
|
|
return svgLabel;
|
|
}
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (createLabel);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/edges.js":
|
|
/*!************************************!*\
|
|
!*** ./src/dagre-wrapper/edges.js ***!
|
|
\************************************/
|
|
/*! exports provided: clear, insertEdgeLabel, positionEdgeLabel, insertEdge */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertEdgeLabel", function() { return insertEdgeLabel; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "positionEdgeLabel", function() { return positionEdgeLabel; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertEdge", function() { return insertEdge; });
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
|
|
/* harmony import */ var _createLabel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./createLabel */ "./src/dagre-wrapper/createLabel.js");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config */ "./src/config.js");
|
|
// eslint-disable-line
|
|
|
|
|
|
|
|
|
|
var edgeLabels = {};
|
|
var clear = function clear() {
|
|
edgeLabels = {};
|
|
};
|
|
var insertEdgeLabel = function insertEdgeLabel(elem, edge) {
|
|
// Create the actual text element
|
|
var labelElement = Object(_createLabel__WEBPACK_IMPORTED_MODULE_1__["default"])(edge.label, edge.labelStyle); // Create outer g, edgeLabel, this will be positioned after graph layout
|
|
|
|
var edgeLabel = elem.insert('g').attr('class', 'edgeLabel'); // Create inner g, label, this will be positioned now for centering the text
|
|
|
|
var label = edgeLabel.insert('g').attr('class', 'label');
|
|
label.node().appendChild(labelElement); // Center the label
|
|
|
|
var bbox = labelElement.getBBox();
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"])().flowchart.htmlLabels) {
|
|
var div = labelElement.children[0];
|
|
var dv = Object(d3__WEBPACK_IMPORTED_MODULE_2__["select"])(labelElement);
|
|
bbox = div.getBoundingClientRect();
|
|
dv.attr('width', bbox.width);
|
|
dv.attr('height', bbox.height);
|
|
}
|
|
|
|
label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')'); // Make element accessible by id for positioning
|
|
|
|
edgeLabels[edge.id] = edgeLabel; // Update the abstract data of the edge with the new information about its width and height
|
|
|
|
edge.width = bbox.width;
|
|
edge.height = bbox.height;
|
|
};
|
|
var positionEdgeLabel = function positionEdgeLabel(edge) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Moving label', edge.id, edge.label, edgeLabels[edge.id]);
|
|
|
|
if (edge.label) {
|
|
var el = edgeLabels[edge.id];
|
|
el.attr('transform', 'translate(' + edge.x + ', ' + edge.y + ')');
|
|
}
|
|
}; // const getRelationType = function(type) {
|
|
// switch (type) {
|
|
// case stateDb.relationType.AGGREGATION:
|
|
// return 'aggregation';
|
|
// case stateDb.relationType.EXTENSION:
|
|
// return 'extension';
|
|
// case stateDb.relationType.COMPOSITION:
|
|
// return 'composition';
|
|
// case stateDb.relationType.DEPENDENCY:
|
|
// return 'dependency';
|
|
// }
|
|
// };
|
|
|
|
var outsideNode = function outsideNode(node, point) {
|
|
var x = node.x;
|
|
var y = node.y;
|
|
var dx = Math.abs(point.x - x);
|
|
var dy = Math.abs(point.y - y);
|
|
var w = node.width / 2;
|
|
var h = node.height / 2;
|
|
|
|
if (dx > w || dy > h) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
var intersection = function intersection(node, outsidePoint, insidePoint) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('intersection o:', outsidePoint, ' i:', insidePoint, node);
|
|
var x = node.x;
|
|
var y = node.y;
|
|
var dx = Math.abs(x - insidePoint.x);
|
|
var w = node.width / 2;
|
|
var r = insidePoint.x < outsidePoint.x ? w - dx : w + dx;
|
|
var dy = Math.abs(y - insidePoint.y);
|
|
var h = node.height / 2;
|
|
var q = insidePoint.y < outsidePoint.y ? h - dy : h - dy;
|
|
var Q = Math.abs(outsidePoint.y - insidePoint.y);
|
|
var R = Math.abs(outsidePoint.x - insidePoint.x);
|
|
|
|
if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h || false) {
|
|
// eslint-disable-line
|
|
// Intersection is top or bottom of rect.
|
|
r = R * q / Q;
|
|
return {
|
|
x: insidePoint.x < outsidePoint.x ? insidePoint.x + r : insidePoint.x - r,
|
|
y: insidePoint.y + q
|
|
};
|
|
} else {
|
|
q = Q * r / R;
|
|
r = R * q / Q;
|
|
return {
|
|
x: insidePoint.x < outsidePoint.x ? insidePoint.x + r : insidePoint.x + dx - w,
|
|
y: insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q
|
|
};
|
|
}
|
|
}; //(edgePaths, e, edge, clusterDb, diagramtype, graph)
|
|
|
|
|
|
var insertEdge = function insertEdge(elem, e, edge, clusterDb, diagramType, graph) {
|
|
var points = edge.points;
|
|
var tail = graph.node(e.v);
|
|
var head = graph.node(e.w);
|
|
|
|
if (head.intersect && tail.intersect) {
|
|
points = points.slice(1, edge.points.length - 1);
|
|
points.unshift(tail.intersect(points[0]));
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Last point', points[points.length - 1], head, head.intersect(points[points.length - 1]));
|
|
points.push(head.intersect(points[points.length - 1]));
|
|
}
|
|
|
|
if (edge.toCluster) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('edge', edge);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('to cluster', clusterDb[edge.toCluster]);
|
|
points = [];
|
|
var lastPointOutside;
|
|
var isInside = false;
|
|
edge.points.forEach(function (point) {
|
|
var node = clusterDb[edge.toCluster].node;
|
|
|
|
if (!outsideNode(node, point) && !isInside) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('inside', edge.toCluster, point, lastPointOutside); // First point inside the rect
|
|
|
|
var insterection = intersection(node, lastPointOutside, point);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('intersect', insterection);
|
|
points.push(insterection);
|
|
isInside = true;
|
|
} else {
|
|
if (!isInside) points.push(point);
|
|
}
|
|
|
|
lastPointOutside = point;
|
|
});
|
|
}
|
|
|
|
if (edge.fromCluster) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('edge', edge);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('from cluster', clusterDb[edge.toCluster]);
|
|
var updatedPoints = [];
|
|
|
|
var _lastPointOutside;
|
|
|
|
var _isInside = false;
|
|
|
|
for (var i = points.length - 1; i >= 0; i--) {
|
|
var point = points[i];
|
|
var node = clusterDb[edge.fromCluster].node;
|
|
|
|
if (!outsideNode(node, point) && !_isInside) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('inside', edge.toCluster, point); // First point inside the rect
|
|
|
|
var insterection = intersection(node, _lastPointOutside, point); // logger.trace('intersect', intersection(node, lastPointOutside, point));
|
|
|
|
updatedPoints.unshift(insterection); // points.push(insterection);
|
|
|
|
_isInside = true;
|
|
} else {
|
|
// at the outside
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Outside point', point);
|
|
if (!_isInside) updatedPoints.unshift(point);
|
|
}
|
|
|
|
_lastPointOutside = point;
|
|
}
|
|
|
|
points = updatedPoints;
|
|
} // The data for our line
|
|
|
|
|
|
var lineData = points.filter(function (p) {
|
|
return !Number.isNaN(p.y);
|
|
}); // This is the accessor function we talked about above
|
|
|
|
var lineFunction = Object(d3__WEBPACK_IMPORTED_MODULE_2__["line"])().x(function (d) {
|
|
return d.x;
|
|
}).y(function (d) {
|
|
return d.y;
|
|
}).curve(d3__WEBPACK_IMPORTED_MODULE_2__["curveBasis"]);
|
|
var svgPath = elem.append('path').attr('d', lineFunction(lineData)).attr('id', edge.id).attr('class', 'transition' + (edge.classes ? ' ' + edge.classes : '')); // DEBUG code, adds a red circle at each edge coordinate
|
|
// edge.points.forEach(point => {
|
|
// elem
|
|
// .append('circle')
|
|
// .style('stroke', 'red')
|
|
// .style('fill', 'red')
|
|
// .attr('r', 1)
|
|
// .attr('cx', point.x)
|
|
// .attr('cy', point.y);
|
|
// });
|
|
|
|
var url = '';
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"])().state.arrowMarkerAbsolute) {
|
|
url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
|
|
url = url.replace(/\(/g, '\\(');
|
|
url = url.replace(/\)/g, '\\)');
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('arrowType', edge.arrowType);
|
|
|
|
switch (edge.arrowType) {
|
|
case 'arrow_cross':
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-crossEnd' + ')');
|
|
break;
|
|
|
|
case 'double_arrow_cross':
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-crossEnd' + ')');
|
|
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-crossStart' + ')');
|
|
break;
|
|
|
|
case 'arrow_point':
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-pointEnd' + ')');
|
|
break;
|
|
|
|
case 'double_arrow_point':
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-pointEnd' + ')');
|
|
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-pointStart' + ')');
|
|
break;
|
|
|
|
case 'arrow_barb':
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-barbEnd' + ')');
|
|
break;
|
|
|
|
case 'double_arrow_barb':
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-barnEnd' + ')');
|
|
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-barbStart' + ')');
|
|
break;
|
|
|
|
case 'arrow_circle':
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-circleEnd' + ')');
|
|
break;
|
|
|
|
case 'double_arrow_circle':
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-circleEnd' + ')');
|
|
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-circleStart' + ')');
|
|
break;
|
|
|
|
default:
|
|
}
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/index.js":
|
|
/*!************************************!*\
|
|
!*** ./src/dagre-wrapper/index.js ***!
|
|
\************************************/
|
|
/*! exports provided: render */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
|
|
/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dagre */ "dagre");
|
|
/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dagre__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! graphlib */ "graphlib");
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _markers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./markers */ "./src/dagre-wrapper/markers.js");
|
|
/* harmony import */ var _shapes_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./shapes/util */ "./src/dagre-wrapper/shapes/util.js");
|
|
/* harmony import */ var _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mermaid-graphlib */ "./src/dagre-wrapper/mermaid-graphlib.js");
|
|
/* harmony import */ var _nodes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./nodes */ "./src/dagre-wrapper/nodes.js");
|
|
/* harmony import */ var _clusters__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./clusters */ "./src/dagre-wrapper/clusters.js");
|
|
/* harmony import */ var _edges__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./edges */ "./src/dagre-wrapper/edges.js");
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var recursiveRender = function recursiveRender(_elem, graph, diagramtype, parentCluster) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Graph in recursive render:', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph), parentCluster);
|
|
var dir = graph.graph().rankdir;
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].warn('Dir in recursive render - dir:', dir);
|
|
|
|
var elem = _elem.insert('g').attr('class', 'root'); // eslint-disable-line
|
|
|
|
|
|
if (!graph.nodes()) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('No nodes found for', graph);
|
|
} else {
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Recursive render', graph.nodes());
|
|
}
|
|
|
|
if (graph.edges().length > 0) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Recursive edges', graph.edge(graph.edges()[0]));
|
|
}
|
|
|
|
var clusters = elem.insert('g').attr('class', 'clusters'); // eslint-disable-line
|
|
|
|
var edgePaths = elem.insert('g').attr('class', 'edgePaths');
|
|
var edgeLabels = elem.insert('g').attr('class', 'edgeLabels');
|
|
var nodes = elem.insert('g').attr('class', 'nodes'); // Insert nodes, this will insert them into the dom and each node will get a size. The size is updated
|
|
// to the abstract node and is later used by dagre for the layout
|
|
|
|
graph.nodes().forEach(function (v) {
|
|
var node = graph.node(v);
|
|
|
|
if (typeof parentCluster !== 'undefined') {
|
|
var data = JSON.parse(JSON.stringify(parentCluster.clusterData)); // data.clusterPositioning = true;
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Setting data for cluster', data);
|
|
graph.setNode(parentCluster.id, data);
|
|
graph.setParent(v, parentCluster.id, data);
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('(Insert) Node ' + v + ': ' + JSON.stringify(graph.node(v)));
|
|
|
|
if (node && node.clusterNode) {
|
|
// const children = graph.children(v);
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Cluster identified', v, node, graph.node(v));
|
|
var newEl = recursiveRender(nodes, node.graph, diagramtype, graph.node(v));
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, newEl);
|
|
Object(_nodes__WEBPACK_IMPORTED_MODULE_5__["setNodeElem"])(newEl, node);
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].warn('Recursive render complete', newEl, node);
|
|
} else {
|
|
if (graph.children(v).length > 0) {
|
|
// This is a cluster but not to be rendered recusively
|
|
// Render as before
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Cluster - the non recursive path', v, node.id, node, graph);
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace(Object(_mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["findNonClusterChild"])(node.id, graph));
|
|
_mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"][node.id] = {
|
|
id: Object(_mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["findNonClusterChild"])(node.id, graph),
|
|
node: node
|
|
}; // insertCluster(clusters, graph.node(v));
|
|
} else {
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Node - the non recursive path', v, node.id, node);
|
|
Object(_nodes__WEBPACK_IMPORTED_MODULE_5__["insertNode"])(nodes, graph.node(v), dir);
|
|
}
|
|
}
|
|
}); // Insert labels, this will insert them into the dom so that the width can be calculated
|
|
// Also figure out which edges point to/from clusters and adjust them accordingly
|
|
// Edges from/to clusters really points to the first child in the cluster.
|
|
// TODO: pick optimal child in the cluster to us as link anchor
|
|
|
|
graph.edges().forEach(function (e) {
|
|
var edge = graph.edge(e.v, e.w, e.name);
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Edge ' + e.v + ' -> ' + e.w + ': ', e, ' ', JSON.stringify(graph.edge(e))); // Check if link is either from or to a cluster
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Fix', _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"], 'ids:', e.v, e.w, 'Translateing: ', _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"][e.v], _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"][e.w]);
|
|
Object(_edges__WEBPACK_IMPORTED_MODULE_7__["insertEdgeLabel"])(edgeLabels, edge);
|
|
});
|
|
graph.edges().forEach(function (e) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));
|
|
});
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('#############################################');
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('### Layout ###');
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('#############################################');
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info(graph);
|
|
dagre__WEBPACK_IMPORTED_MODULE_0___default.a.layout(graph);
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Graph after layout:', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph)); // Move the nodes to the correct place
|
|
|
|
graph.nodes().forEach(function (v) {
|
|
var node = graph.node(v);
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].trace('Position ' + v + ': ' + JSON.stringify(graph.node(v)));
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Position ' + v + ': (' + node.x, ',' + node.y, ') width: ', node.width, ' height: ', node.height);
|
|
|
|
if (node && node.clusterNode) {
|
|
// clusterDb[node.id].node = node;
|
|
Object(_nodes__WEBPACK_IMPORTED_MODULE_5__["positionNode"])(node);
|
|
} else {
|
|
// Non cluster node
|
|
if (graph.children(v).length > 0) {
|
|
// A cluster in the non-recurive way
|
|
// positionCluster(node);
|
|
Object(_clusters__WEBPACK_IMPORTED_MODULE_6__["insertCluster"])(clusters, node);
|
|
_mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"][node.id].node = node;
|
|
} else {
|
|
Object(_nodes__WEBPACK_IMPORTED_MODULE_5__["positionNode"])(node);
|
|
}
|
|
}
|
|
}); // Move the edge labels to the correct place after layout
|
|
|
|
graph.edges().forEach(function (e) {
|
|
var edge = graph.edge(e);
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(edge), edge);
|
|
Object(_edges__WEBPACK_IMPORTED_MODULE_7__["insertEdge"])(edgePaths, e, edge, _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"], diagramtype, graph);
|
|
Object(_edges__WEBPACK_IMPORTED_MODULE_7__["positionEdgeLabel"])(edge);
|
|
});
|
|
return elem;
|
|
};
|
|
|
|
var render = function render(elem, graph, markers, diagramtype, id) {
|
|
Object(_markers__WEBPACK_IMPORTED_MODULE_2__["default"])(elem, markers, diagramtype, id);
|
|
Object(_nodes__WEBPACK_IMPORTED_MODULE_5__["clear"])();
|
|
Object(_edges__WEBPACK_IMPORTED_MODULE_7__["clear"])();
|
|
Object(_clusters__WEBPACK_IMPORTED_MODULE_6__["clear"])();
|
|
Object(_mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clear"])();
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].warn('Graph before:', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph));
|
|
Object(_mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["adjustClustersAndEdges"])(graph);
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].warn('Graph after:', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph));
|
|
_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].warn('Graph ever after:', graph.graph());
|
|
recursiveRender(elem, graph, diagramtype);
|
|
}; // const shapeDefinitions = {};
|
|
// export const addShape = ({ shapeType: fun }) => {
|
|
// shapeDefinitions[shapeType] = fun;
|
|
// };
|
|
// const arrowDefinitions = {};
|
|
// export const addArrow = ({ arrowType: fun }) => {
|
|
// arrowDefinitions[arrowType] = fun;
|
|
// };
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/intersect/index.js":
|
|
/*!**********************************************!*\
|
|
!*** ./src/dagre-wrapper/intersect/index.js ***!
|
|
\**********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _intersect_node_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./intersect-node.js */ "./src/dagre-wrapper/intersect/intersect-node.js");
|
|
/* harmony import */ var _intersect_node_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_intersect_node_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _intersect_circle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./intersect-circle.js */ "./src/dagre-wrapper/intersect/intersect-circle.js");
|
|
/* harmony import */ var _intersect_ellipse_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./intersect-ellipse.js */ "./src/dagre-wrapper/intersect/intersect-ellipse.js");
|
|
/* harmony import */ var _intersect_polygon_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./intersect-polygon.js */ "./src/dagre-wrapper/intersect/intersect-polygon.js");
|
|
/* harmony import */ var _intersect_rect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./intersect-rect.js */ "./src/dagre-wrapper/intersect/intersect-rect.js");
|
|
/*
|
|
* Borrowed with love from from dagrge-d3. Many thanks to cpettitt!
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
node: _intersect_node_js__WEBPACK_IMPORTED_MODULE_0___default.a,
|
|
circle: _intersect_circle_js__WEBPACK_IMPORTED_MODULE_1__["default"],
|
|
ellipse: _intersect_ellipse_js__WEBPACK_IMPORTED_MODULE_2__["default"],
|
|
polygon: _intersect_polygon_js__WEBPACK_IMPORTED_MODULE_3__["default"],
|
|
rect: _intersect_rect_js__WEBPACK_IMPORTED_MODULE_4__["default"]
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/intersect/intersect-circle.js":
|
|
/*!*********************************************************!*\
|
|
!*** ./src/dagre-wrapper/intersect/intersect-circle.js ***!
|
|
\*********************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _intersect_ellipse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./intersect-ellipse */ "./src/dagre-wrapper/intersect/intersect-ellipse.js");
|
|
|
|
|
|
function intersectCircle(node, rx, point) {
|
|
return Object(_intersect_ellipse__WEBPACK_IMPORTED_MODULE_0__["default"])(node, rx, rx, point);
|
|
}
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (intersectCircle);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/intersect/intersect-ellipse.js":
|
|
/*!**********************************************************!*\
|
|
!*** ./src/dagre-wrapper/intersect/intersect-ellipse.js ***!
|
|
\**********************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
function intersectEllipse(node, rx, ry, point) {
|
|
// Formulae from: http://mathworld.wolfram.com/Ellipse-LineIntersection.html
|
|
var cx = node.x;
|
|
var cy = node.y;
|
|
var px = cx - point.x;
|
|
var py = cy - point.y;
|
|
var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px);
|
|
var dx = Math.abs(rx * ry * px / det);
|
|
|
|
if (point.x < cx) {
|
|
dx = -dx;
|
|
}
|
|
|
|
var dy = Math.abs(rx * ry * py / det);
|
|
|
|
if (point.y < cy) {
|
|
dy = -dy;
|
|
}
|
|
|
|
return {
|
|
x: cx + dx,
|
|
y: cy + dy
|
|
};
|
|
}
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (intersectEllipse);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/intersect/intersect-line.js":
|
|
/*!*******************************************************!*\
|
|
!*** ./src/dagre-wrapper/intersect/intersect-line.js ***!
|
|
\*******************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/*
|
|
* Returns the point at which two lines, p and q, intersect or returns
|
|
* undefined if they do not intersect.
|
|
*/
|
|
function intersectLine(p1, p2, q1, q2) {
|
|
// Algorithm from J. Avro, (ed.) Graphics Gems, No 2, Morgan Kaufmann, 1994,
|
|
// p7 and p473.
|
|
var a1, a2, b1, b2, c1, c2;
|
|
var r1, r2, r3, r4;
|
|
var denom, offset, num;
|
|
var x, y; // Compute a1, b1, c1, where line joining points 1 and 2 is F(x,y) = a1 x +
|
|
// b1 y + c1 = 0.
|
|
|
|
a1 = p2.y - p1.y;
|
|
b1 = p1.x - p2.x;
|
|
c1 = p2.x * p1.y - p1.x * p2.y; // Compute r3 and r4.
|
|
|
|
r3 = a1 * q1.x + b1 * q1.y + c1;
|
|
r4 = a1 * q2.x + b1 * q2.y + c1; // Check signs of r3 and r4. If both point 3 and point 4 lie on
|
|
// same side of line 1, the line segments do not intersect.
|
|
|
|
if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) {
|
|
return;
|
|
} // Compute a2, b2, c2 where line joining points 3 and 4 is G(x,y) = a2 x + b2 y + c2 = 0
|
|
|
|
|
|
a2 = q2.y - q1.y;
|
|
b2 = q1.x - q2.x;
|
|
c2 = q2.x * q1.y - q1.x * q2.y; // Compute r1 and r2
|
|
|
|
r1 = a2 * p1.x + b2 * p1.y + c2;
|
|
r2 = a2 * p2.x + b2 * p2.y + c2; // Check signs of r1 and r2. If both point 1 and point 2 lie
|
|
// on same side of second line segment, the line segments do
|
|
// not intersect.
|
|
|
|
if (r1 !== 0 && r2 !== 0 && sameSign(r1, r2)) {
|
|
return;
|
|
} // Line segments intersect: compute intersection point.
|
|
|
|
|
|
denom = a1 * b2 - a2 * b1;
|
|
|
|
if (denom === 0) {
|
|
return;
|
|
}
|
|
|
|
offset = Math.abs(denom / 2); // The denom/2 is to get rounding instead of truncating. It
|
|
// is added or subtracted to the numerator, depending upon the
|
|
// sign of the numerator.
|
|
|
|
num = b1 * c2 - b2 * c1;
|
|
x = num < 0 ? (num - offset) / denom : (num + offset) / denom;
|
|
num = a2 * c1 - a1 * c2;
|
|
y = num < 0 ? (num - offset) / denom : (num + offset) / denom;
|
|
return {
|
|
x: x,
|
|
y: y
|
|
};
|
|
}
|
|
|
|
function sameSign(r1, r2) {
|
|
return r1 * r2 > 0;
|
|
}
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (intersectLine);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/intersect/intersect-node.js":
|
|
/*!*******************************************************!*\
|
|
!*** ./src/dagre-wrapper/intersect/intersect-node.js ***!
|
|
\*******************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = intersectNode;
|
|
|
|
function intersectNode(node, point) {
|
|
console.info('Intersect Node');
|
|
return node.intersect(point);
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/intersect/intersect-polygon.js":
|
|
/*!**********************************************************!*\
|
|
!*** ./src/dagre-wrapper/intersect/intersect-polygon.js ***!
|
|
\**********************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _intersect_line__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./intersect-line */ "./src/dagre-wrapper/intersect/intersect-line.js");
|
|
/* eslint "no-console": off */
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (intersectPolygon);
|
|
/*
|
|
* Returns the point ({x, y}) at which the point argument intersects with the
|
|
* node argument assuming that it has the shape specified by polygon.
|
|
*/
|
|
|
|
function intersectPolygon(node, polyPoints, point) {
|
|
var x1 = node.x;
|
|
var y1 = node.y;
|
|
var intersections = [];
|
|
var minX = Number.POSITIVE_INFINITY;
|
|
var minY = Number.POSITIVE_INFINITY;
|
|
polyPoints.forEach(function (entry) {
|
|
minX = Math.min(minX, entry.x);
|
|
minY = Math.min(minY, entry.y);
|
|
});
|
|
var left = x1 - node.width / 2 - minX;
|
|
var top = y1 - node.height / 2 - minY;
|
|
|
|
for (var i = 0; i < polyPoints.length; i++) {
|
|
var p1 = polyPoints[i];
|
|
var p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0];
|
|
var intersect = Object(_intersect_line__WEBPACK_IMPORTED_MODULE_0__["default"])(node, point, {
|
|
x: left + p1.x,
|
|
y: top + p1.y
|
|
}, {
|
|
x: left + p2.x,
|
|
y: top + p2.y
|
|
});
|
|
|
|
if (intersect) {
|
|
intersections.push(intersect);
|
|
}
|
|
}
|
|
|
|
if (!intersections.length) {
|
|
console.log('NO INTERSECTION FOUND, RETURN NODE CENTER', node);
|
|
return node;
|
|
}
|
|
|
|
if (intersections.length > 1) {
|
|
// More intersections, find the one nearest to edge end point
|
|
intersections.sort(function (p, q) {
|
|
var pdx = p.x - point.x;
|
|
var pdy = p.y - point.y;
|
|
var distp = Math.sqrt(pdx * pdx + pdy * pdy);
|
|
var qdx = q.x - point.x;
|
|
var qdy = q.y - point.y;
|
|
var distq = Math.sqrt(qdx * qdx + qdy * qdy);
|
|
return distp < distq ? -1 : distp === distq ? 0 : 1;
|
|
});
|
|
}
|
|
|
|
return intersections[0];
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/intersect/intersect-rect.js":
|
|
/*!*******************************************************!*\
|
|
!*** ./src/dagre-wrapper/intersect/intersect-rect.js ***!
|
|
\*******************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
var intersectRect = function intersectRect(node, point) {
|
|
var x = node.x;
|
|
var y = node.y; // Rectangle intersection algorithm from:
|
|
// http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes
|
|
|
|
var dx = point.x - x;
|
|
var dy = point.y - y;
|
|
var w = node.width / 2;
|
|
var h = node.height / 2;
|
|
var sx, sy;
|
|
|
|
if (Math.abs(dy) * w > Math.abs(dx) * h) {
|
|
// Intersection is top or bottom of rect.
|
|
if (dy < 0) {
|
|
h = -h;
|
|
}
|
|
|
|
sx = dy === 0 ? 0 : h * dx / dy;
|
|
sy = h;
|
|
} else {
|
|
// Intersection is left or right of rect.
|
|
if (dx < 0) {
|
|
w = -w;
|
|
}
|
|
|
|
sx = w;
|
|
sy = dx === 0 ? 0 : w * dy / dx;
|
|
}
|
|
|
|
return {
|
|
x: x + sx,
|
|
y: y + sy
|
|
};
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (intersectRect);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/markers.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/dagre-wrapper/markers.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
|
|
/**
|
|
* Setup arrow head and define the marker. The result is appended to the svg.
|
|
*/
|
|
// Only add the number of markers that the diagram needs
|
|
|
|
var insertMarkers = function insertMarkers(elem, markerArray, type, id) {
|
|
markerArray.forEach(function (markerName) {
|
|
markers[markerName](elem, type, id);
|
|
});
|
|
};
|
|
|
|
var extension = function extension(elem, type, id) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Making markers for ', id);
|
|
elem.append('defs').append('marker').attr('id', type + '-extensionStart').attr('class', 'extension ' + type).attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 1,7 L18,13 V 1 Z');
|
|
elem.append('defs').append('marker').attr('id', type + '-extensionEnd ' + type).attr('class', 'extension ' + type).attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead
|
|
};
|
|
|
|
var composition = function composition(elem, type) {
|
|
elem.append('defs').append('marker').attr('id', type + '-compositionStart').attr('class', 'extension ' + type).attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
elem.append('defs').append('marker').attr('id', type + '-compositionEnd').attr('class', 'extension ' + type).attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
};
|
|
|
|
var aggregation = function aggregation(elem, type) {
|
|
elem.append('defs').append('marker').attr('id', type + '-aggregationStart').attr('class', 'extension ' + type).attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
elem.append('defs').append('marker').attr('id', type + '-aggregationEnd').attr('class', type).attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
};
|
|
|
|
var dependency = function dependency(elem, type) {
|
|
elem.append('defs').append('marker').attr('id', type + '-dependencyStart').attr('class', 'extension ' + type).attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');
|
|
elem.append('defs').append('marker').attr('id', type + '-dependencyEnd').attr('class', type).attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');
|
|
};
|
|
|
|
var point = function point(elem, type) {
|
|
elem.append('marker').attr('id', type + '-pointEnd').attr('class', type).attr('viewBox', '0 0 10 10').attr('refX', 10).attr('refY', 5).attr('markerUnits', 'strokeWidth').attr('markerWidth', 8).attr('markerHeight', 8).attr('orient', 'auto').append('path').attr('d', 'M 0 0 L 10 5 L 0 10 z').attr('class', 'arrowMarkerPath').style('stroke-width', 1).style('stroke-dasharray', '1,0');
|
|
elem.append('marker').attr('id', type + '-pointStart').attr('class', type).attr('viewBox', '0 0 10 10').attr('refX', 0).attr('refY', 5).attr('markerUnits', 'strokeWidth').attr('markerWidth', 8).attr('markerHeight', 8).attr('orient', 'auto').append('path').attr('d', 'M 0 5 L 10 10 L 10 0 z').attr('class', 'arrowMarkerPath').style('stroke-width', 1).style('stroke-dasharray', '1,0');
|
|
};
|
|
|
|
var circle = function circle(elem, type) {
|
|
elem.append('marker').attr('id', type + '-circleEnd').attr('class', type).attr('viewBox', '0 0 10 10').attr('refX', 11).attr('refY', 5).attr('markerUnits', 'strokeWidth').attr('markerWidth', 7).attr('markerHeight', 7).attr('orient', 'auto').append('circle').attr('cx', '5').attr('cy', '5').attr('r', '5').attr('class', 'arrowMarkerPath').style('stroke-width', 1).style('stroke-dasharray', '1,0');
|
|
elem.append('marker').attr('id', type + '-circleStart').attr('class', type).attr('viewBox', '0 0 10 10').attr('refX', -1).attr('refY', 5).attr('markerUnits', 'strokeWidth').attr('markerWidth', 7).attr('markerHeight', 7).attr('orient', 'auto').append('circle').attr('cx', '5').attr('cy', '5').attr('r', '5').attr('class', 'arrowMarkerPath').style('stroke-width', 1).style('stroke-dasharray', '1,0');
|
|
};
|
|
|
|
var cross = function cross(elem, type) {
|
|
elem.append('marker').attr('id', type + '-crossEnd').attr('class', type).attr('viewBox', '0 0 11 11').attr('refX', 12).attr('refY', 5.2).attr('markerUnits', 'strokeWidth').attr('markerWidth', 7).attr('markerHeight', 7).attr('orient', 'auto').append('path').attr('stroke', 'black').attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9').attr('class', 'arrowMarkerPath').style('stroke-width', 2).style('stroke-dasharray', '1,0');
|
|
elem.append('marker').attr('id', type + '-crossStart').attr('class', type).attr('viewBox', '0 0 11 11').attr('refX', -1).attr('refY', 5.2).attr('markerUnits', 'strokeWidth').attr('markerWidth', 7).attr('markerHeight', 7).attr('orient', 'auto').append('path').attr('stroke', 'black').attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9').attr('class', 'arrowMarkerPath').style('stroke-width', 2).style('stroke-dasharray', '1,0');
|
|
};
|
|
|
|
var barb = function barb(elem, type) {
|
|
elem.append('defs').append('marker').attr('id', type + '-barbEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 14).attr('markerUnits', 0).attr('orient', 'auto').append('path').attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');
|
|
}; // TODO rename the class diagram markers to something shape descriptive and semanitc free
|
|
|
|
|
|
var markers = {
|
|
extension: extension,
|
|
composition: composition,
|
|
aggregation: aggregation,
|
|
dependency: dependency,
|
|
point: point,
|
|
circle: circle,
|
|
cross: cross,
|
|
barb: barb
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = (insertMarkers);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/mermaid-graphlib.js":
|
|
/*!***********************************************!*\
|
|
!*** ./src/dagre-wrapper/mermaid-graphlib.js ***!
|
|
\***********************************************/
|
|
/*! exports provided: clusterDb, clear, extractDecendants, validate, findNonClusterChild, adjustClustersAndEdges, extractor */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clusterDb", function() { return clusterDb; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractDecendants", function() { return extractDecendants; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validate", function() { return validate; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findNonClusterChild", function() { return findNonClusterChild; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "adjustClustersAndEdges", function() { return adjustClustersAndEdges; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractor", function() { return extractor; });
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! graphlib */ "graphlib");
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_1__);
|
|
/**
|
|
* Decorates with functions required by mermaids dagre-wrapper.
|
|
*/
|
|
|
|
|
|
var clusterDb = {};
|
|
var decendants = {};
|
|
var parents = {};
|
|
var clear = function clear() {
|
|
decendants = {};
|
|
parents = {};
|
|
clusterDb = {};
|
|
};
|
|
|
|
var isDecendant = function isDecendant(id, ancenstorId) {
|
|
// if (id === ancenstorId) return true;
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('In isDecendant', ancenstorId, ' ', id, ' = ', decendants[ancenstorId].indexOf(id) >= 0);
|
|
if (decendants[ancenstorId].indexOf(id) >= 0) return true;
|
|
return false;
|
|
};
|
|
|
|
var edgeInCluster = function edgeInCluster(edge, clusterId) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Decendants of ', clusterId, ' is ', decendants[clusterId]);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Edge is ', edge); // Edges to/from the cluster is not in the cluster, they are in the parent
|
|
|
|
if (edge.v === clusterId) return false;
|
|
if (edge.w === clusterId) return false;
|
|
|
|
if (!decendants[clusterId]) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Tilt, ', clusterId, ',not in decendants');
|
|
return false;
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Here ');
|
|
if (decendants[clusterId].indexOf(edge.v) >= 0) return true;
|
|
if (isDecendant(edge.v, clusterId)) return true;
|
|
if (isDecendant(edge.w, clusterId)) return true;
|
|
if (decendants[clusterId].indexOf(edge.w) >= 0) return true;
|
|
return false;
|
|
};
|
|
|
|
var copy = function copy(clusterId, graph, newGraph, rootId) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Copying children of ', clusterId, 'root', rootId, 'data', graph.node(clusterId), rootId);
|
|
var nodes = graph.children(clusterId) || []; // Include cluster node if it is not the root
|
|
|
|
if (clusterId !== rootId) {
|
|
nodes.push(clusterId);
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Copying (nodes) clusterId', clusterId, 'nodes', nodes);
|
|
nodes.forEach(function (node) {
|
|
if (graph.children(node).length > 0) {
|
|
copy(node, graph, newGraph, rootId);
|
|
} else {
|
|
var data = graph.node(node);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('cp ', node, ' to ', rootId, ' with parent ', clusterId); //,node, data, ' parent is ', clusterId);
|
|
|
|
newGraph.setNode(node, data);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Setting parent', node, graph.parent(node));
|
|
|
|
if (rootId !== graph.parent(node)) {
|
|
newGraph.setParent(node, graph.parent(node));
|
|
}
|
|
|
|
if (clusterId !== rootId && node !== clusterId) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Setting parent', node, clusterId);
|
|
newGraph.setParent(node, clusterId);
|
|
} else {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('In copy ', clusterId, 'root', rootId, 'data', graph.node(clusterId), rootId);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Not Setting parent for node=', node, 'cluster!==rootId', clusterId !== rootId, 'node!==clusterId', node !== clusterId);
|
|
}
|
|
|
|
var edges = graph.edges(node);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Copying Edges', edges);
|
|
edges.forEach(function (edge) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Edge', edge);
|
|
var data = graph.edge(edge.v, edge.w, edge.name);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Edge data', data, rootId);
|
|
|
|
try {
|
|
// Do not copy edges in and out of the root cluster, they belong to the parent graph
|
|
if (edgeInCluster(edge, rootId)) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Copying as ', edge.v, edge.w, data, edge.name);
|
|
newGraph.setEdge(edge.v, edge.w, data, edge.name);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('newGraph edges ', newGraph.edges(), newGraph.edge(newGraph.edges()[0]));
|
|
} else {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Skipping copy of edge ', edge.v, '-->', edge.w, ' rootId: ', rootId, ' clusterId:', clusterId);
|
|
}
|
|
} catch (e) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].error(e);
|
|
}
|
|
});
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Removing node', node);
|
|
graph.removeNode(node);
|
|
});
|
|
};
|
|
|
|
var extractDecendants = function extractDecendants(id, graph) {
|
|
// log.debug('Extracting ', id);
|
|
var children = graph.children(id);
|
|
var res = [].concat(children);
|
|
|
|
for (var i = 0; i < children.length; i++) {
|
|
parents[children[i]] = id;
|
|
res = res.concat(extractDecendants(children[i], graph));
|
|
}
|
|
|
|
return res;
|
|
};
|
|
/**
|
|
* Validates the graph, checking that all parent child relation points to existing nodes and that
|
|
* edges between nodes also ia correct. When not correct the function logs the discrepancies.
|
|
* @param {graphlib graph} g
|
|
*/
|
|
|
|
var validate = function validate(graph) {
|
|
var edges = graph.edges();
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Edges: ', edges);
|
|
|
|
for (var i = 0; i < edges.length; i++) {
|
|
if (graph.children(edges[i].v).length > 0) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('The node ', edges[i].v, ' is part of and edge even though it has children');
|
|
return false;
|
|
}
|
|
|
|
if (graph.children(edges[i].w).length > 0) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('The node ', edges[i].w, ' is part of and edge even though it has children');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
};
|
|
/**
|
|
* Finds a child that is not a cluster. When faking a edge between a node and a cluster.
|
|
* @param {Finds a } id
|
|
* @param {*} graph
|
|
*/
|
|
|
|
var findNonClusterChild = function findNonClusterChild(id, graph) {
|
|
// const node = graph.node(id);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Searching', id);
|
|
var children = graph.children(id);
|
|
|
|
if (children.length < 1) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('This is a valid node', id);
|
|
return id;
|
|
}
|
|
|
|
for (var i = 0; i < children.length; i++) {
|
|
var _id = findNonClusterChild(children[i], graph);
|
|
|
|
if (_id) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Found replacement for', id, ' => ', _id);
|
|
return _id;
|
|
}
|
|
}
|
|
};
|
|
|
|
var getAnchorId = function getAnchorId(id) {
|
|
if (!clusterDb[id]) {
|
|
return id;
|
|
} // If the cluster has no external connections
|
|
|
|
|
|
if (!clusterDb[id].externalConnections) {
|
|
return id;
|
|
} // Return the replacement node
|
|
|
|
|
|
if (clusterDb[id]) {
|
|
return clusterDb[id].id;
|
|
}
|
|
|
|
return id;
|
|
};
|
|
|
|
var adjustClustersAndEdges = function adjustClustersAndEdges(graph, depth) {
|
|
if (!graph || depth > 10) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Opting out, no graph ');
|
|
return;
|
|
} else {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Opting in, graph ');
|
|
} // Go through the nodes and for each cluster found, save a replacment node, this can be used when
|
|
// faking a link to a cluster
|
|
|
|
|
|
graph.nodes().forEach(function (id) {
|
|
var children = graph.children(id);
|
|
|
|
if (children.length > 0) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Cluster identified', id, ' Replacement id in edges: ', findNonClusterChild(id, graph));
|
|
decendants[id] = extractDecendants(id, graph);
|
|
clusterDb[id] = {
|
|
id: findNonClusterChild(id, graph),
|
|
clusterData: graph.node(id)
|
|
};
|
|
}
|
|
}); // Check incoming and outgoing edges for each cluster
|
|
|
|
graph.nodes().forEach(function (id) {
|
|
var children = graph.children(id);
|
|
var edges = graph.edges();
|
|
|
|
if (children.length > 0) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Cluster identified', id, decendants);
|
|
edges.forEach(function (edge) {
|
|
// log.debug('Edge, decendants: ', edge, decendants[id]);
|
|
// Check if any edge leaves the cluster (not the actual cluster, thats a link from the box)
|
|
if (edge.v !== id && edge.w !== id) {
|
|
// Any edge where either the one of the nodes is decending to the cluster but not the other
|
|
// if (decendants[id].indexOf(edge.v) < 0 && decendants[id].indexOf(edge.w) < 0) {
|
|
var d1 = isDecendant(edge.v, id);
|
|
var d2 = isDecendant(edge.w, id); // d1 xor d2 - if either d1 is true and d2 is false or the other way around
|
|
|
|
if (d1 ^ d2) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Edge: ', edge, ' leaves cluster ', id);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Decendants of ', id, ': ', decendants[id]);
|
|
clusterDb[id].externalConnections = true;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
extractor(graph, 0); // For clusters with incoming and/or outgoing edges translate those edges to a real node
|
|
// in the cluster inorder to fake the edge
|
|
|
|
graph.edges().forEach(function (e) {
|
|
var edge = graph.edge(e);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));
|
|
var v = e.v;
|
|
var w = e.w; // Check if link is either from or to a cluster
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Fix', clusterDb, 'ids:', e.v, e.w, 'Translateing: ', clusterDb[e.v], clusterDb[e.w]);
|
|
|
|
if (clusterDb[e.v] || clusterDb[e.w]) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Fixing and trixing - removing', e.v, e.w, e.name);
|
|
v = getAnchorId(e.v);
|
|
w = getAnchorId(e.w);
|
|
graph.removeEdge(e.v, e.w, e.name);
|
|
if (v !== e.v) edge.fromCluster = e.v;
|
|
if (w !== e.w) edge.toCluster = e.w;
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Replacing with', v, w, e.name);
|
|
graph.setEdge(v, w, edge, e.name);
|
|
}
|
|
});
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Adjusted Graph', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph));
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace(clusterDb); // Remove references to extracted cluster
|
|
// graph.edges().forEach(edge => {
|
|
// if (isDecendant(edge.v, clusterId) || isDecendant(edge.w, clusterId)) {
|
|
// graph.removeEdge(edge);
|
|
// }
|
|
// });
|
|
};
|
|
var extractor = function extractor(graph, depth) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('extractor - ', depth, graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph), graph.children('D'));
|
|
|
|
if (depth > 10) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].error('Bailing out');
|
|
return;
|
|
} // For clusters without incoming and/or outgoing edges, create a new cluster-node
|
|
// containing the nodes and edges in the custer in a new graph
|
|
// for (let i = 0;)
|
|
|
|
|
|
var nodes = graph.nodes();
|
|
var hasChildren = false;
|
|
|
|
for (var i = 0; i < nodes.length; i++) {
|
|
var node = nodes[i];
|
|
var children = graph.children(node);
|
|
hasChildren = hasChildren || children.length > 0;
|
|
}
|
|
|
|
if (!hasChildren) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Done, no node has children', graph.nodes());
|
|
return;
|
|
} // const clusters = Object.keys(clusterDb);
|
|
// clusters.forEach(clusterId => {
|
|
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Nodes = ', nodes, depth);
|
|
|
|
for (var _i = 0; _i < nodes.length; _i++) {
|
|
var _node = nodes[_i];
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Extracting node', _node, clusterDb, clusterDb[_node] && !clusterDb[_node].externalConnections, !graph.parent(_node), graph.node(_node), graph.children('D'), ' Depth ', depth); // Note that the node might have been removed after the Object.keys call so better check
|
|
// that it still is in the game
|
|
|
|
if (!clusterDb[_node]) {
|
|
// Skip if the node is not a cluster
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Not a cluster', _node, depth); // break;
|
|
} else if (!clusterDb[_node].externalConnections && !graph.parent(_node) && graph.children(_node) && graph.children(_node).length > 0) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Cluster without external connections, without a parent and with children', _node, depth);
|
|
var graphSettings = graph.graph();
|
|
var clusterGraph = new graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.Graph({
|
|
multigraph: true,
|
|
compound: true
|
|
}).setGraph({
|
|
rankdir: graphSettings.rankdir === 'TB' ? 'LR' : 'TB',
|
|
// Todo: set proper spacing
|
|
nodesep: 50,
|
|
ranksep: 50,
|
|
marginx: 8,
|
|
marginy: 8
|
|
}).setDefaultEdgeLabel(function () {
|
|
return {};
|
|
});
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Old graph before copy', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph));
|
|
copy(_node, graph, clusterGraph, _node);
|
|
graph.setNode(_node, {
|
|
clusterNode: true,
|
|
id: _node,
|
|
clusterData: clusterDb[_node].clusterData,
|
|
labelText: clusterDb[_node].labelText,
|
|
graph: clusterGraph
|
|
});
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('New graph after copy', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(clusterGraph));
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Old graph after copy', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph));
|
|
} else {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Cluster ** ', _node, ' **not meeting the criteria !externalConnections:', !clusterDb[_node].externalConnections, ' no parent: ', !graph.parent(_node), ' children ', graph.children(_node) && graph.children(_node).length > 0, graph.children('D'), depth);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(clusterDb);
|
|
}
|
|
}
|
|
|
|
nodes = graph.nodes();
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('New list of nodes', nodes);
|
|
|
|
for (var _i2 = 0; _i2 < nodes.length; _i2++) {
|
|
var _node2 = nodes[_i2];
|
|
var data = graph.node(_node2);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(' Now next leveö', _node2, data);
|
|
|
|
if (data.clusterNode) {
|
|
extractor(data.graph, depth + 1);
|
|
}
|
|
}
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/nodes.js":
|
|
/*!************************************!*\
|
|
!*** ./src/dagre-wrapper/nodes.js ***!
|
|
\************************************/
|
|
/*! exports provided: insertNode, setNodeElem, clear, positionNode */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertNode", function() { return insertNode; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setNodeElem", function() { return setNodeElem; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "positionNode", function() { return positionNode; });
|
|
/* harmony import */ var _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./intersect/index.js */ "./src/dagre-wrapper/intersect/index.js");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
|
|
/* harmony import */ var _shapes_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./shapes/util */ "./src/dagre-wrapper/shapes/util.js");
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../config */ "./src/config.js");
|
|
/* harmony import */ var _createLabel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./createLabel */ "./src/dagre-wrapper/createLabel.js");
|
|
/* harmony import */ var _shapes_note__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./shapes/note */ "./src/dagre-wrapper/shapes/note.js");
|
|
|
|
|
|
// eslint-disable-line
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var question = function question(parent, node) {
|
|
var _labelHelper = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper.shapeSvg,
|
|
bbox = _labelHelper.bbox;
|
|
|
|
var w = bbox.width + node.padding;
|
|
var h = bbox.height + node.padding;
|
|
var s = w + h;
|
|
var points = [{
|
|
x: s / 2,
|
|
y: 0
|
|
}, {
|
|
x: s,
|
|
y: -s / 2
|
|
}, {
|
|
x: s / 2,
|
|
y: -s
|
|
}, {
|
|
x: 0,
|
|
y: -s / 2
|
|
}];
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].info('Question main (Circle)');
|
|
var questionElem = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["insertPolygonShape"])(shapeSvg, s, s, points);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, questionElem);
|
|
|
|
node.intersect = function (point) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('Intersect called');
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].polygon(node, points, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var hexagon = function hexagon(parent, node) {
|
|
var _labelHelper2 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper2.shapeSvg,
|
|
bbox = _labelHelper2.bbox;
|
|
|
|
var f = 4;
|
|
var h = bbox.height + node.padding;
|
|
var m = h / f;
|
|
var w = bbox.width + 2 * m + node.padding;
|
|
var points = [{
|
|
x: m,
|
|
y: 0
|
|
}, {
|
|
x: w - m,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: -h / 2
|
|
}, {
|
|
x: w - m,
|
|
y: -h
|
|
}, {
|
|
x: m,
|
|
y: -h
|
|
}, {
|
|
x: 0,
|
|
y: -h / 2
|
|
}];
|
|
var hex = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["insertPolygonShape"])(shapeSvg, w, h, points);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, hex);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].polygon(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var rect_left_inv_arrow = function rect_left_inv_arrow(parent, node) {
|
|
var _labelHelper3 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper3.shapeSvg,
|
|
bbox = _labelHelper3.bbox;
|
|
|
|
var w = bbox.width + node.padding;
|
|
var h = bbox.height + node.padding;
|
|
var points = [{
|
|
x: -h / 2,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: -h
|
|
}, {
|
|
x: -h / 2,
|
|
y: -h
|
|
}, {
|
|
x: 0,
|
|
y: -h / 2
|
|
}];
|
|
var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["insertPolygonShape"])(shapeSvg, w, h, points);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, el);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].polygon(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var lean_right = function lean_right(parent, node) {
|
|
var _labelHelper4 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper4.shapeSvg,
|
|
bbox = _labelHelper4.bbox;
|
|
|
|
var w = bbox.width + node.padding;
|
|
var h = bbox.height + node.padding;
|
|
var points = [{
|
|
x: -2 * h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w - h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w + 2 * h / 6,
|
|
y: -h
|
|
}, {
|
|
x: h / 6,
|
|
y: -h
|
|
}];
|
|
var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["insertPolygonShape"])(shapeSvg, w, h, points);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, el);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].polygon(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var lean_left = function lean_left(parent, node) {
|
|
var _labelHelper5 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper5.shapeSvg,
|
|
bbox = _labelHelper5.bbox;
|
|
|
|
var w = bbox.width + node.padding;
|
|
var h = bbox.height + node.padding;
|
|
var points = [{
|
|
x: 2 * h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w + h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w - 2 * h / 6,
|
|
y: -h
|
|
}, {
|
|
x: -h / 6,
|
|
y: -h
|
|
}];
|
|
var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["insertPolygonShape"])(shapeSvg, w, h, points);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, el);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].polygon(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var trapezoid = function trapezoid(parent, node) {
|
|
var _labelHelper6 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper6.shapeSvg,
|
|
bbox = _labelHelper6.bbox;
|
|
|
|
var w = bbox.width + node.padding;
|
|
var h = bbox.height + node.padding;
|
|
var points = [{
|
|
x: -2 * h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w + 2 * h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w - h / 6,
|
|
y: -h
|
|
}, {
|
|
x: h / 6,
|
|
y: -h
|
|
}];
|
|
var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["insertPolygonShape"])(shapeSvg, w, h, points);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, el);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].polygon(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var inv_trapezoid = function inv_trapezoid(parent, node) {
|
|
var _labelHelper7 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper7.shapeSvg,
|
|
bbox = _labelHelper7.bbox;
|
|
|
|
var w = bbox.width + node.padding;
|
|
var h = bbox.height + node.padding;
|
|
var points = [{
|
|
x: h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w - h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w + 2 * h / 6,
|
|
y: -h
|
|
}, {
|
|
x: -2 * h / 6,
|
|
y: -h
|
|
}];
|
|
var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["insertPolygonShape"])(shapeSvg, w, h, points);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, el);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].polygon(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var rect_right_inv_arrow = function rect_right_inv_arrow(parent, node) {
|
|
var _labelHelper8 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper8.shapeSvg,
|
|
bbox = _labelHelper8.bbox;
|
|
|
|
var w = bbox.width + node.padding;
|
|
var h = bbox.height + node.padding;
|
|
var points = [{
|
|
x: 0,
|
|
y: 0
|
|
}, {
|
|
x: w + h / 2,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: -h / 2
|
|
}, {
|
|
x: w + h / 2,
|
|
y: -h
|
|
}, {
|
|
x: 0,
|
|
y: -h
|
|
}];
|
|
var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["insertPolygonShape"])(shapeSvg, w, h, points);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, el);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].polygon(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var cylinder = function cylinder(parent, node) {
|
|
var _labelHelper9 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper9.shapeSvg,
|
|
bbox = _labelHelper9.bbox;
|
|
|
|
var w = bbox.width + node.padding;
|
|
var rx = w / 2;
|
|
var ry = rx / (2.5 + w / 50);
|
|
var h = bbox.height + ry + node.padding;
|
|
var shape = 'M 0,' + ry + ' a ' + rx + ',' + ry + ' 0,0,0 ' + w + ' 0 a ' + rx + ',' + ry + ' 0,0,0 ' + -w + ' 0 l 0,' + h + ' a ' + rx + ',' + ry + ' 0,0,0 ' + w + ' 0 l 0,' + -h;
|
|
var el = shapeSvg.attr('label-offset-y', ry).insert('path', ':first-child').attr('d', shape).attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2 + ry) + ')');
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, el);
|
|
|
|
node.intersect = function (point) {
|
|
var pos = _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].rect(node, point);
|
|
var x = pos.x - node.x;
|
|
|
|
if (rx != 0 && (Math.abs(x) < node.width / 2 || Math.abs(x) == node.width / 2 && Math.abs(pos.y - node.y) > node.height / 2 - ry)) {
|
|
// ellipsis equation: x*x / a*a + y*y / b*b = 1
|
|
// solve for y to get adjustion value for pos.y
|
|
var y = ry * ry * (1 - x * x / (rx * rx));
|
|
if (y != 0) y = Math.sqrt(y);
|
|
y = ry - y;
|
|
if (point.y - node.y > 0) y = -y;
|
|
pos.y += y;
|
|
}
|
|
|
|
return pos;
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var rect = function rect(parent, node) {
|
|
var _labelHelper10 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, 'node ' + node.classes, true),
|
|
shapeSvg = _labelHelper10.shapeSvg,
|
|
bbox = _labelHelper10.bbox,
|
|
halfPadding = _labelHelper10.halfPadding;
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].trace('Classes = ', node.classes); // add the rect
|
|
|
|
var rect = shapeSvg.insert('rect', ':first-child');
|
|
rect.attr('class', 'basic label-container').attr('rx', node.rx).attr('ry', node.ry).attr('x', -bbox.width / 2 - halfPadding).attr('y', -bbox.height / 2 - halfPadding).attr('width', bbox.width + node.padding).attr('height', bbox.height + node.padding);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, rect);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].rect(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var rectWithTitle = function rectWithTitle(parent, node) {
|
|
// const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes);
|
|
var classes;
|
|
|
|
if (!node.classes) {
|
|
classes = 'node default';
|
|
} else {
|
|
classes = 'node ' + node.classes;
|
|
} // Add outer g element
|
|
|
|
|
|
var shapeSvg = parent.insert('g').attr('class', classes).attr('id', node.id); // Create the title label and insert it after the rect
|
|
|
|
var rect = shapeSvg.insert('rect', ':first-child'); // const innerRect = shapeSvg.insert('rect');
|
|
|
|
var innerLine = shapeSvg.insert('line');
|
|
var label = shapeSvg.insert('g').attr('class', 'label');
|
|
var text2 = node.labelText.flat();
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].info('Label text', text2[0]);
|
|
var text = label.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_5__["default"])(text2[0], node.labelStyle, true, true));
|
|
var bbox;
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
|
|
var div = text.children[0];
|
|
var dv = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])(text);
|
|
bbox = div.getBoundingClientRect();
|
|
dv.attr('width', bbox.width);
|
|
dv.attr('height', bbox.height);
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].info('Text 2', text2);
|
|
var textRows = text2.slice(1, text2.length);
|
|
var titleBox = text.getBBox();
|
|
var descr = label.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_5__["default"])(textRows.join('<br/>'), node.labelStyle, true, true));
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
|
|
var _div = descr.children[0];
|
|
|
|
var _dv = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])(descr);
|
|
|
|
bbox = _div.getBoundingClientRect();
|
|
|
|
_dv.attr('width', bbox.width);
|
|
|
|
_dv.attr('height', bbox.height);
|
|
} // bbox = label.getBBox();
|
|
// logger.info(descr);
|
|
|
|
|
|
var halfPadding = node.padding / 2;
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])(descr).attr('transform', 'translate( ' + ( // (titleBox.width - bbox.width) / 2 +
|
|
bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) + ', ' + (titleBox.height + halfPadding + 5) + ')');
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])(text).attr('transform', 'translate( ' + ( // (titleBox.width - bbox.width) / 2 +
|
|
bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) + ', ' + 0 + ')'); // Get the size of the label
|
|
// Bounding box for title and text
|
|
|
|
bbox = label.node().getBBox(); // Center the label
|
|
|
|
label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + (-bbox.height / 2 - halfPadding + 3) + ')');
|
|
rect.attr('class', 'outer title-state').attr('x', -bbox.width / 2 - halfPadding).attr('y', -bbox.height / 2 - halfPadding).attr('width', bbox.width + node.padding).attr('height', bbox.height + node.padding);
|
|
innerLine.attr('class', 'divider').attr('x1', -bbox.width / 2 - halfPadding).attr('x2', bbox.width / 2 + halfPadding).attr('y1', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding).attr('y2', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, rect);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].rect(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var stadium = function stadium(parent, node) {
|
|
var _labelHelper11 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper11.shapeSvg,
|
|
bbox = _labelHelper11.bbox;
|
|
|
|
var h = bbox.height + node.padding;
|
|
var w = bbox.width + h / 4 + node.padding; // add the rect
|
|
|
|
var rect = shapeSvg.insert('rect', ':first-child').attr('rx', h / 2).attr('ry', h / 2).attr('x', -w / 2).attr('y', -h / 2).attr('width', w).attr('height', h);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, rect);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].rect(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var circle = function circle(parent, node) {
|
|
var _labelHelper12 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper12.shapeSvg,
|
|
bbox = _labelHelper12.bbox,
|
|
halfPadding = _labelHelper12.halfPadding;
|
|
|
|
var circle = shapeSvg.insert('circle', ':first-child'); // center the circle around its coordinate
|
|
|
|
circle.attr('rx', node.rx).attr('ry', node.ry).attr('r', bbox.width / 2 + halfPadding).attr('width', bbox.width + node.padding).attr('height', bbox.height + node.padding);
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].info('Circle main');
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, circle);
|
|
|
|
node.intersect = function (point) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].info('Circle intersect', node, bbox.width / 2 + halfPadding, point);
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].circle(node, bbox.width / 2 + halfPadding, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var subroutine = function subroutine(parent, node) {
|
|
var _labelHelper13 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["labelHelper"])(parent, node, undefined, true),
|
|
shapeSvg = _labelHelper13.shapeSvg,
|
|
bbox = _labelHelper13.bbox;
|
|
|
|
var w = bbox.width + node.padding;
|
|
var h = bbox.height + node.padding;
|
|
var points = [{
|
|
x: 0,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: -h
|
|
}, {
|
|
x: 0,
|
|
y: -h
|
|
}, {
|
|
x: 0,
|
|
y: 0
|
|
}, {
|
|
x: -8,
|
|
y: 0
|
|
}, {
|
|
x: w + 8,
|
|
y: 0
|
|
}, {
|
|
x: w + 8,
|
|
y: -h
|
|
}, {
|
|
x: -8,
|
|
y: -h
|
|
}, {
|
|
x: -8,
|
|
y: 0
|
|
}];
|
|
var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["insertPolygonShape"])(shapeSvg, w, h, points);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, el);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].polygon(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var start = function start(parent, node) {
|
|
var shapeSvg = parent.insert('g').attr('class', 'node default').attr('id', node.id);
|
|
var circle = shapeSvg.insert('circle', ':first-child'); // center the circle around its coordinate
|
|
|
|
circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, circle);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].circle(node, 7, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var forkJoin = function forkJoin(parent, node, dir) {
|
|
var shapeSvg = parent.insert('g').attr('class', 'node default').attr('id', node.id);
|
|
var width = 70;
|
|
var height = 10;
|
|
|
|
if (dir === 'LR') {
|
|
width = 10;
|
|
height = 70;
|
|
}
|
|
|
|
var shape = shapeSvg.append('rect').style('stroke', 'black').style('fill', 'black').attr('x', -1 * width / 2).attr('y', -1 * height / 2).attr('width', width).attr('height', height).attr('class', 'fork-join');
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, shape);
|
|
node.height = node.height + node.padding / 2;
|
|
node.width = node.width + node.padding / 2;
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].rect(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var end = function end(parent, node) {
|
|
var shapeSvg = parent.insert('g').attr('class', 'node default').attr('id', node.id);
|
|
var innerCircle = shapeSvg.insert('circle', ':first-child');
|
|
var circle = shapeSvg.insert('circle', ':first-child');
|
|
circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);
|
|
innerCircle.attr('class', 'state-end').attr('r', 5).attr('width', 10).attr('height', 10);
|
|
Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, circle);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].circle(node, 7, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
var shapes = {
|
|
question: question,
|
|
rect: rect,
|
|
rectWithTitle: rectWithTitle,
|
|
circle: circle,
|
|
stadium: stadium,
|
|
hexagon: hexagon,
|
|
rect_left_inv_arrow: rect_left_inv_arrow,
|
|
lean_right: lean_right,
|
|
lean_left: lean_left,
|
|
trapezoid: trapezoid,
|
|
inv_trapezoid: inv_trapezoid,
|
|
rect_right_inv_arrow: rect_right_inv_arrow,
|
|
cylinder: cylinder,
|
|
start: start,
|
|
end: end,
|
|
note: _shapes_note__WEBPACK_IMPORTED_MODULE_6__["default"],
|
|
subroutine: subroutine,
|
|
fork: forkJoin,
|
|
join: forkJoin
|
|
};
|
|
var nodeElems = {};
|
|
var insertNode = function insertNode(elem, node, dir) {
|
|
nodeElems[node.id] = shapes[node.shape](elem, node, dir);
|
|
};
|
|
var setNodeElem = function setNodeElem(elem, node) {
|
|
nodeElems[node.id] = elem;
|
|
};
|
|
var clear = function clear() {
|
|
nodeElems = {};
|
|
};
|
|
var positionNode = function positionNode(node) {
|
|
var el = nodeElems[node.id];
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].trace('Transforming node', node, 'translate(' + (node.x - node.width / 2 - 5) + ', ' + (node.y - node.height / 2 - 5) + ')');
|
|
var padding = 8;
|
|
|
|
if (node.clusterNode) {
|
|
el.attr('transform', 'translate(' + (node.x - node.width / 2 - padding) + ', ' + (node.y - node.height / 2 - padding) + ')');
|
|
} else {
|
|
el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');
|
|
}
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/shapes/note.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/dagre-wrapper/shapes/note.js ***!
|
|
\******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/dagre-wrapper/shapes/util.js");
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _intersect_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../intersect/index.js */ "./src/dagre-wrapper/intersect/index.js");
|
|
|
|
// eslint-disable-line
|
|
|
|
|
|
|
|
var note = function note(parent, node) {
|
|
var _labelHelper = Object(_util__WEBPACK_IMPORTED_MODULE_0__["labelHelper"])(parent, node, 'node ' + node.classes, true),
|
|
shapeSvg = _labelHelper.shapeSvg,
|
|
bbox = _labelHelper.bbox,
|
|
halfPadding = _labelHelper.halfPadding;
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('Classes = ', node.classes); // add the rect
|
|
|
|
var rect = shapeSvg.insert('rect', ':first-child');
|
|
rect.attr('rx', node.rx).attr('ry', node.ry).attr('x', -bbox.width / 2 - halfPadding).attr('y', -bbox.height / 2 - halfPadding).attr('width', bbox.width + node.padding).attr('height', bbox.height + node.padding);
|
|
Object(_util__WEBPACK_IMPORTED_MODULE_0__["updateNodeBounds"])(node, rect);
|
|
|
|
node.intersect = function (point) {
|
|
return _intersect_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].rect(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (note);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/dagre-wrapper/shapes/util.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/dagre-wrapper/shapes/util.js ***!
|
|
\******************************************/
|
|
/*! exports provided: labelHelper, updateNodeBounds, insertPolygonShape */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "labelHelper", function() { return labelHelper; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateNodeBounds", function() { return updateNodeBounds; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertPolygonShape", function() { return insertPolygonShape; });
|
|
/* harmony import */ var _createLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLabel */ "./src/dagre-wrapper/createLabel.js");
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_2__);
|
|
|
|
|
|
|
|
var labelHelper = function labelHelper(parent, node, _classes, isNode) {
|
|
var classes;
|
|
|
|
if (!_classes) {
|
|
classes = 'node default';
|
|
} else {
|
|
classes = _classes;
|
|
} // Add outer g element
|
|
|
|
|
|
var shapeSvg = parent.insert('g').attr('class', classes).attr('id', node.id); // Create the label and insert it after the rect
|
|
|
|
var label = shapeSvg.insert('g').attr('class', 'label');
|
|
var text = label.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_0__["default"])(node.labelText, node.labelStyle, false, isNode)); // Get the size of the label
|
|
|
|
var bbox = text.getBBox();
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_1__["getConfig"])().flowchart.htmlLabels) {
|
|
var div = text.children[0];
|
|
var dv = Object(d3__WEBPACK_IMPORTED_MODULE_2__["select"])(text);
|
|
bbox = div.getBoundingClientRect();
|
|
dv.attr('width', bbox.width);
|
|
dv.attr('height', bbox.height);
|
|
}
|
|
|
|
var halfPadding = node.padding / 2; // Center the label
|
|
|
|
label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');
|
|
return {
|
|
shapeSvg: shapeSvg,
|
|
bbox: bbox,
|
|
halfPadding: halfPadding,
|
|
label: label
|
|
};
|
|
};
|
|
var updateNodeBounds = function updateNodeBounds(node, element) {
|
|
var bbox = element.node().getBBox();
|
|
node.width = bbox.width;
|
|
node.height = bbox.height;
|
|
};
|
|
function insertPolygonShape(parent, w, h, points) {
|
|
return parent.insert('polygon', ':first-child').attr('points', points.map(function (d) {
|
|
return d.x + ',' + d.y;
|
|
}).join(' ')).attr('class', 'label-container').attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/class/classDb.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/diagrams/class/classDb.js ***!
|
|
\***************************************/
|
|
/*! exports provided: addClass, lookUpDomId, clear, getClass, getClasses, getRelations, addRelation, addAnnotation, addMember, addMembers, cleanupLabel, setCssClass, setLink, setClickEvent, bindFunctions, lineType, relationType, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addClass", function() { return addClass; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lookUpDomId", function() { return lookUpDomId; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClass", function() { return getClass; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClasses", function() { return getClasses; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRelations", function() { return getRelations; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addRelation", function() { return addRelation; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addAnnotation", function() { return addAnnotation; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addMember", function() { return addMember; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addMembers", function() { return addMembers; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cleanupLabel", function() { return cleanupLabel; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setCssClass", function() { return setCssClass; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLink", function() { return setLink; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setClickEvent", function() { return setClickEvent; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindFunctions", function() { return bindFunctions; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lineType", function() { return lineType; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relationType", function() { return relationType; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
|
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
|
|
|
|
|
|
|
|
|
|
|
|
var MERMAID_DOM_ID_PREFIX = 'classid-';
|
|
var config = Object(_config__WEBPACK_IMPORTED_MODULE_2__["getConfig"])();
|
|
var relations = [];
|
|
var classes = {};
|
|
var classCounter = 0;
|
|
var funs = [];
|
|
|
|
var splitClassNameAndType = function splitClassNameAndType(id) {
|
|
var genericType = '';
|
|
var className = id;
|
|
|
|
if (id.indexOf('~') > 0) {
|
|
var split = id.split('~');
|
|
className = split[0];
|
|
genericType = split[1];
|
|
}
|
|
|
|
return {
|
|
className: className,
|
|
type: genericType
|
|
};
|
|
};
|
|
/**
|
|
* Function called by parser when a node definition has been found.
|
|
* @param id
|
|
* @public
|
|
*/
|
|
|
|
|
|
var addClass = function addClass(id) {
|
|
var classId = splitClassNameAndType(id); // Only add class if not exists
|
|
|
|
if (typeof classes[classId.className] !== 'undefined') return;
|
|
classes[classId.className] = {
|
|
id: classId.className,
|
|
type: classId.type,
|
|
cssClasses: [],
|
|
methods: [],
|
|
members: [],
|
|
annotations: [],
|
|
domId: MERMAID_DOM_ID_PREFIX + classId.className + '-' + classCounter
|
|
};
|
|
classCounter++;
|
|
};
|
|
/**
|
|
* Function to lookup domId from id in the graph definition.
|
|
* @param id
|
|
* @public
|
|
*/
|
|
|
|
var lookUpDomId = function lookUpDomId(id) {
|
|
var classKeys = Object.keys(classes);
|
|
|
|
for (var i = 0; i < classKeys.length; i++) {
|
|
if (classes[classKeys[i]].id === id) {
|
|
return classes[classKeys[i]].domId;
|
|
}
|
|
}
|
|
};
|
|
var clear = function clear() {
|
|
relations = [];
|
|
classes = {};
|
|
funs = [];
|
|
funs.push(setupToolTips);
|
|
};
|
|
var getClass = function getClass(id) {
|
|
return classes[id];
|
|
};
|
|
var getClasses = function getClasses() {
|
|
return classes;
|
|
};
|
|
var getRelations = function getRelations() {
|
|
return relations;
|
|
};
|
|
var addRelation = function addRelation(relation) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].debug('Adding relation: ' + JSON.stringify(relation));
|
|
addClass(relation.id1);
|
|
addClass(relation.id2);
|
|
relation.id1 = splitClassNameAndType(relation.id1).className;
|
|
relation.id2 = splitClassNameAndType(relation.id2).className;
|
|
relations.push(relation);
|
|
};
|
|
/**
|
|
* Adds an annotation to the specified class
|
|
* Annotations mark special properties of the given type (like 'interface' or 'service')
|
|
* @param className The class name
|
|
* @param annotation The name of the annotation without any brackets
|
|
* @public
|
|
*/
|
|
|
|
var addAnnotation = function addAnnotation(className, annotation) {
|
|
var validatedClassName = splitClassNameAndType(className).className;
|
|
classes[validatedClassName].annotations.push(annotation);
|
|
};
|
|
/**
|
|
* Adds a member to the specified class
|
|
* @param className The class name
|
|
* @param member The full name of the member.
|
|
* If the member is enclosed in <<brackets>> it is treated as an annotation
|
|
* If the member is ending with a closing bracket ) it is treated as a method
|
|
* Otherwise the member will be treated as a normal property
|
|
* @public
|
|
*/
|
|
|
|
var addMember = function addMember(className, member) {
|
|
var validatedClassName = splitClassNameAndType(className).className;
|
|
var theClass = classes[validatedClassName];
|
|
|
|
if (typeof member === 'string') {
|
|
// Member can contain white spaces, we trim them out
|
|
var memberString = member.trim();
|
|
|
|
if (memberString.startsWith('<<') && memberString.endsWith('>>')) {
|
|
// Remove leading and trailing brackets
|
|
theClass.annotations.push(memberString.substring(2, memberString.length - 2));
|
|
} else if (memberString.indexOf(')') > 0) {
|
|
theClass.methods.push(memberString);
|
|
} else if (memberString) {
|
|
theClass.members.push(memberString);
|
|
}
|
|
}
|
|
};
|
|
var addMembers = function addMembers(className, members) {
|
|
if (Array.isArray(members)) {
|
|
members.reverse();
|
|
members.forEach(function (member) {
|
|
return addMember(className, member);
|
|
});
|
|
}
|
|
};
|
|
var cleanupLabel = function cleanupLabel(label) {
|
|
if (label.substring(0, 1) === ':') {
|
|
return label.substr(1).trim();
|
|
} else {
|
|
return label.trim();
|
|
}
|
|
};
|
|
/**
|
|
* Called by parser when a special node is found, e.g. a clickable element.
|
|
* @param ids Comma separated list of ids
|
|
* @param className Class to add
|
|
*/
|
|
|
|
var setCssClass = function setCssClass(ids, className) {
|
|
ids.split(',').forEach(function (_id) {
|
|
var id = _id;
|
|
if (_id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
|
|
|
|
if (typeof classes[id] !== 'undefined') {
|
|
classes[id].cssClasses.push(className);
|
|
}
|
|
});
|
|
};
|
|
/**
|
|
* Called by parser when a link is found. Adds the URL to the vertex data.
|
|
* @param ids Comma separated list of ids
|
|
* @param linkStr URL to create a link for
|
|
* @param tooltip Tooltip for the clickable element
|
|
*/
|
|
|
|
var setLink = function setLink(ids, linkStr, tooltip) {
|
|
ids.split(',').forEach(function (_id) {
|
|
var id = _id;
|
|
if (_id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
|
|
|
|
if (typeof classes[id] !== 'undefined') {
|
|
classes[id].link = _utils__WEBPACK_IMPORTED_MODULE_4__["default"].formatUrl(linkStr, config);
|
|
|
|
if (tooltip) {
|
|
classes[id].tooltip = _common_common__WEBPACK_IMPORTED_MODULE_3__["default"].sanitizeText(tooltip, config);
|
|
}
|
|
}
|
|
});
|
|
setCssClass(ids, 'clickable');
|
|
};
|
|
/**
|
|
* Called by parser when a click definition is found. Registers an event handler.
|
|
* @param ids Comma separated list of ids
|
|
* @param functionName Function to be called on click
|
|
* @param tooltip Tooltip for the clickable element
|
|
*/
|
|
|
|
var setClickEvent = function setClickEvent(ids, functionName, tooltip) {
|
|
ids.split(',').forEach(function (id) {
|
|
setClickFunc(id, functionName, tooltip);
|
|
});
|
|
setCssClass(ids, 'clickable');
|
|
};
|
|
|
|
var setClickFunc = function setClickFunc(domId, functionName, tooltip) {
|
|
var id = domId;
|
|
var elemId = lookUpDomId(id);
|
|
|
|
if (config.securityLevel !== 'loose') {
|
|
return;
|
|
}
|
|
|
|
if (typeof functionName === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
if (typeof classes[id] !== 'undefined') {
|
|
if (tooltip) {
|
|
classes[id].tooltip = _common_common__WEBPACK_IMPORTED_MODULE_3__["default"].sanitizeText(tooltip, config);
|
|
}
|
|
|
|
funs.push(function () {
|
|
var elem = document.querySelector("[id=\"".concat(elemId, "\"]"));
|
|
|
|
if (elem !== null) {
|
|
elem.addEventListener('click', function () {
|
|
window[functionName](elemId);
|
|
}, false);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
var bindFunctions = function bindFunctions(element) {
|
|
funs.forEach(function (fun) {
|
|
fun(element);
|
|
});
|
|
};
|
|
var lineType = {
|
|
LINE: 0,
|
|
DOTTED_LINE: 1
|
|
};
|
|
var relationType = {
|
|
AGGREGATION: 0,
|
|
EXTENSION: 1,
|
|
COMPOSITION: 2,
|
|
DEPENDENCY: 3
|
|
};
|
|
|
|
var setupToolTips = function setupToolTips(element) {
|
|
var tooltipElem = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('.mermaidTooltip');
|
|
|
|
if ((tooltipElem._groups || tooltipElem)[0][0] === null) {
|
|
tooltipElem = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('body').append('div').attr('class', 'mermaidTooltip').style('opacity', 0);
|
|
}
|
|
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(element).select('svg');
|
|
var nodes = svg.selectAll('g.node');
|
|
nodes.on('mouseover', function () {
|
|
var el = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(this);
|
|
var title = el.attr('title'); // Dont try to draw a tooltip if no data is provided
|
|
|
|
if (title === null) {
|
|
return;
|
|
}
|
|
|
|
var rect = this.getBoundingClientRect();
|
|
tooltipElem.transition().duration(200).style('opacity', '.9');
|
|
tooltipElem.html(el.attr('title')).style('left', rect.left + (rect.right - rect.left) / 2 + 'px').style('top', rect.top - 14 + document.body.scrollTop + 'px');
|
|
el.classed('hover', true);
|
|
}).on('mouseout', function () {
|
|
tooltipElem.transition().duration(500).style('opacity', 0);
|
|
var el = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(this);
|
|
el.classed('hover', false);
|
|
});
|
|
};
|
|
|
|
funs.push(setupToolTips);
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
addClass: addClass,
|
|
bindFunctions: bindFunctions,
|
|
clear: clear,
|
|
getClass: getClass,
|
|
getClasses: getClasses,
|
|
addAnnotation: addAnnotation,
|
|
getRelations: getRelations,
|
|
addRelation: addRelation,
|
|
addMember: addMember,
|
|
addMembers: addMembers,
|
|
cleanupLabel: cleanupLabel,
|
|
lineType: lineType,
|
|
relationType: relationType,
|
|
setClickEvent: setClickEvent,
|
|
setCssClass: setCssClass,
|
|
setLink: setLink,
|
|
lookUpDomId: lookUpDomId
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/class/classRenderer.js":
|
|
/*!*********************************************!*\
|
|
!*** ./src/diagrams/class/classRenderer.js ***!
|
|
\*********************************************/
|
|
/*! exports provided: setConf, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dagre */ "dagre");
|
|
/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dagre__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! graphlib */ "graphlib");
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _classDb__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./classDb */ "./src/diagrams/class/classDb.js");
|
|
/* harmony import */ var _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./parser/classDiagram */ "./src/diagrams/class/parser/classDiagram.jison");
|
|
/* harmony import */ var _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _svgDraw__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./svgDraw */ "./src/diagrams/class/svgDraw.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__["parser"].yy = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"];
|
|
var idCache = {};
|
|
var padding = 20;
|
|
var conf = {
|
|
dividerMargin: 10,
|
|
padding: 5,
|
|
textHeight: 10
|
|
}; // Todo optimize
|
|
|
|
var getGraphId = function getGraphId(label) {
|
|
var keys = Object.keys(idCache);
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
if (idCache[keys[i]].label === label) {
|
|
return keys[i];
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
};
|
|
/**
|
|
* Setup arrow head and define the marker. The result is appended to the svg.
|
|
*/
|
|
|
|
|
|
var insertMarkers = function insertMarkers(elem) {
|
|
elem.append('defs').append('marker').attr('id', 'extensionStart').attr('class', 'extension').attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 1,7 L18,13 V 1 Z');
|
|
elem.append('defs').append('marker').attr('id', 'extensionEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead
|
|
|
|
elem.append('defs').append('marker').attr('id', 'compositionStart').attr('class', 'extension').attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
elem.append('defs').append('marker').attr('id', 'compositionEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
elem.append('defs').append('marker').attr('id', 'aggregationStart').attr('class', 'extension').attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
elem.append('defs').append('marker').attr('id', 'aggregationEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
elem.append('defs').append('marker').attr('id', 'dependencyStart').attr('class', 'extension').attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');
|
|
elem.append('defs').append('marker').attr('id', 'dependencyEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');
|
|
};
|
|
|
|
var setConf = function setConf(cnf) {
|
|
var keys = Object.keys(cnf);
|
|
keys.forEach(function (key) {
|
|
conf[key] = cnf[key];
|
|
});
|
|
};
|
|
/**
|
|
* Draws a flowchart in the tag with id: id based on the graph definition in text.
|
|
* @param text
|
|
* @param id
|
|
*/
|
|
|
|
var draw = function draw(text, id) {
|
|
idCache = {};
|
|
_parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__["parser"].yy.clear();
|
|
_parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__["parser"].parse(text);
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Rendering diagram ' + text); // Fetch the default direction, use TD if none was found
|
|
|
|
var diagram = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id='".concat(id, "']"));
|
|
insertMarkers(diagram); // Layout graph, Create a new directed graph
|
|
|
|
var g = new graphlib__WEBPACK_IMPORTED_MODULE_2___default.a.Graph({
|
|
multigraph: true
|
|
}); // Set an object for the graph label
|
|
|
|
g.setGraph({
|
|
isMultiGraph: true
|
|
}); // Default to assigning a new object as a label for each new edge.
|
|
|
|
g.setDefaultEdgeLabel(function () {
|
|
return {};
|
|
});
|
|
var classes = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"].getClasses();
|
|
var keys = Object.keys(classes);
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var classDef = classes[keys[i]];
|
|
var node = _svgDraw__WEBPACK_IMPORTED_MODULE_6__["default"].drawClass(diagram, classDef, conf);
|
|
idCache[node.id] = node; // Add nodes to the graph. The first argument is the node id. The second is
|
|
// metadata about the node. In this case we're going to add labels to each of
|
|
// our nodes.
|
|
|
|
g.setNode(node.id, node);
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Org height: ' + node.height);
|
|
}
|
|
|
|
var relations = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"].getRelations();
|
|
relations.forEach(function (relation) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('tjoho' + getGraphId(relation.id1) + getGraphId(relation.id2) + JSON.stringify(relation));
|
|
g.setEdge(getGraphId(relation.id1), getGraphId(relation.id2), {
|
|
relation: relation
|
|
}, relation.title || 'DEFAULT');
|
|
});
|
|
dagre__WEBPACK_IMPORTED_MODULE_1___default.a.layout(g);
|
|
g.nodes().forEach(function (v) {
|
|
if (typeof v !== 'undefined' && typeof g.node(v) !== 'undefined') {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Node ' + v + ': ' + JSON.stringify(g.node(v)));
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + Object(_classDb__WEBPACK_IMPORTED_MODULE_4__["lookUpDomId"])(v)).attr('transform', 'translate(' + (g.node(v).x - g.node(v).width / 2) + ',' + (g.node(v).y - g.node(v).height / 2) + ' )');
|
|
}
|
|
});
|
|
g.edges().forEach(function (e) {
|
|
if (typeof e !== 'undefined' && typeof g.edge(e) !== 'undefined') {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(g.edge(e)));
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_6__["default"].drawEdge(diagram, g.edge(e), g.edge(e).relation, conf);
|
|
}
|
|
});
|
|
var svgBounds = diagram.node().getBBox();
|
|
var width = svgBounds.width + padding * 2;
|
|
var height = svgBounds.height + padding * 2;
|
|
|
|
if (conf.useMaxWidth) {
|
|
diagram.attr('width', '100%');
|
|
diagram.attr('style', "max-width: ".concat(width, "px;"));
|
|
} else {
|
|
diagram.attr('height', height);
|
|
diagram.attr('width', width);
|
|
} // Ensure the viewBox includes the whole svgBounds area with extra space for padding
|
|
|
|
|
|
var vBox = "".concat(svgBounds.x - padding, " ").concat(svgBounds.y - padding, " ").concat(width, " ").concat(height);
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug("viewBox ".concat(vBox));
|
|
diagram.attr('viewBox', vBox);
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/class/parser/classDiagram.jison":
|
|
/*!******************************************************!*\
|
|
!*** ./src/diagrams/class/parser/classDiagram.jison ***!
|
|
\******************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
|
|
/*
|
|
Returns a Parser object of the following structure:
|
|
|
|
Parser: {
|
|
yy: {}
|
|
}
|
|
|
|
Parser.prototype: {
|
|
yy: {},
|
|
trace: function(),
|
|
symbols_: {associative list: name ==> number},
|
|
terminals_: {associative list: number ==> name},
|
|
productions_: [...],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
|
table: [...],
|
|
defaultActions: {...},
|
|
parseError: function(str, hash),
|
|
parse: function(input),
|
|
|
|
lexer: {
|
|
EOF: 1,
|
|
parseError: function(str, hash),
|
|
setInput: function(input),
|
|
input: function(),
|
|
unput: function(str),
|
|
more: function(),
|
|
less: function(n),
|
|
pastInput: function(),
|
|
upcomingInput: function(),
|
|
showPosition: function(),
|
|
test_match: function(regex_match_array, rule_index),
|
|
next: function(),
|
|
lex: function(),
|
|
begin: function(condition),
|
|
popState: function(),
|
|
_currentRules: function(),
|
|
topState: function(),
|
|
pushState: function(condition),
|
|
|
|
options: {
|
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
|
},
|
|
|
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
|
rules: [...],
|
|
conditions: {associative list: name ==> set},
|
|
}
|
|
}
|
|
|
|
|
|
token location info (@$, _$, etc.): {
|
|
first_line: n,
|
|
last_line: n,
|
|
first_column: n,
|
|
last_column: n,
|
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
|
}
|
|
|
|
|
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
|
text: (matched text)
|
|
token: (the produced terminal token, if any)
|
|
line: (yylineno)
|
|
}
|
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
|
loc: (yylloc)
|
|
expected: (string describing the set of expected tokens)
|
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
|
}
|
|
*/
|
|
var parser = (function(){
|
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,13],$V1=[1,16],$V2=[1,14],$V3=[1,15],$V4=[1,17],$V5=[1,18],$V6=[1,20],$V7=[1,21],$V8=[1,22],$V9=[6,8],$Va=[1,31],$Vb=[1,32],$Vc=[1,33],$Vd=[1,34],$Ve=[1,35],$Vf=[1,36],$Vg=[6,8,14,20,28,31,32,33,34,35,36],$Vh=[6,8,12,14,20,24,28,31,32,33,34,35,36,52,53,54],$Vi=[28,52,53,54],$Vj=[28,35,36,52,53,54],$Vk=[28,31,32,33,34,52,53,54],$Vl=[6,8,14],$Vm=[1,59];
|
|
var parser = {trace: function trace () { },
|
|
yy: {},
|
|
symbols_: {"error":2,"mermaidDoc":3,"graphConfig":4,"CLASS_DIAGRAM":5,"NEWLINE":6,"statements":7,"EOF":8,"statement":9,"className":10,"alphaNumToken":11,"GENERICTYPE":12,"relationStatement":13,"LABEL":14,"classStatement":15,"methodStatement":16,"annotationStatement":17,"clickStatement":18,"CLASS":19,"STRUCT_START":20,"members":21,"STRUCT_STOP":22,"ANNOTATION_START":23,"ANNOTATION_END":24,"MEMBER":25,"SEPARATOR":26,"relation":27,"STR":28,"relationType":29,"lineType":30,"AGGREGATION":31,"EXTENSION":32,"COMPOSITION":33,"DEPENDENCY":34,"LINE":35,"DOTTED_LINE":36,"CALLBACK":37,"LINK":38,"commentToken":39,"textToken":40,"graphCodeTokens":41,"textNoTagsToken":42,"TAGSTART":43,"TAGEND":44,"==":45,"--":46,"PCT":47,"DEFAULT":48,"SPACE":49,"MINUS":50,"keywords":51,"UNICODE_TEXT":52,"NUM":53,"ALPHA":54,"$accept":0,"$end":1},
|
|
terminals_: {2:"error",5:"CLASS_DIAGRAM",6:"NEWLINE",8:"EOF",12:"GENERICTYPE",14:"LABEL",19:"CLASS",20:"STRUCT_START",22:"STRUCT_STOP",23:"ANNOTATION_START",24:"ANNOTATION_END",25:"MEMBER",26:"SEPARATOR",28:"STR",31:"AGGREGATION",32:"EXTENSION",33:"COMPOSITION",34:"DEPENDENCY",35:"LINE",36:"DOTTED_LINE",37:"CALLBACK",38:"LINK",41:"graphCodeTokens",43:"TAGSTART",44:"TAGEND",45:"==",46:"--",47:"PCT",48:"DEFAULT",49:"SPACE",50:"MINUS",51:"keywords",52:"UNICODE_TEXT",53:"NUM",54:"ALPHA"},
|
|
productions_: [0,[3,1],[4,4],[7,1],[7,2],[7,3],[10,2],[10,1],[10,3],[10,2],[9,1],[9,2],[9,1],[9,1],[9,1],[9,1],[15,2],[15,5],[17,4],[21,1],[21,2],[16,1],[16,2],[16,1],[16,1],[13,3],[13,4],[13,4],[13,5],[27,3],[27,2],[27,2],[27,1],[29,1],[29,1],[29,1],[29,1],[30,1],[30,1],[18,3],[18,4],[18,3],[18,4],[39,1],[39,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[42,1],[42,1],[42,1],[42,1],[11,1],[11,1],[11,1]],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
|
/* this == yyval */
|
|
|
|
var $0 = $$.length - 1;
|
|
switch (yystate) {
|
|
case 6:
|
|
this.$=$$[$0-1]+$$[$0];
|
|
break;
|
|
case 7:
|
|
this.$=$$[$0];
|
|
break;
|
|
case 8:
|
|
this.$=$$[$0-2]+'~'+$$[$0-1]+$$[$0];
|
|
break;
|
|
case 9:
|
|
this.$=$$[$0-1]+'~'+$$[$0];
|
|
break;
|
|
case 10:
|
|
yy.addRelation($$[$0]);
|
|
break;
|
|
case 11:
|
|
$$[$0-1].title = yy.cleanupLabel($$[$0]); yy.addRelation($$[$0-1]);
|
|
break;
|
|
case 16:
|
|
yy.addClass($$[$0]);
|
|
break;
|
|
case 17:
|
|
/*console.log($$[$0-3],JSON.stringify($$[$0-1]));*/yy.addClass($$[$0-3]);yy.addMembers($$[$0-3],$$[$0-1]);
|
|
break;
|
|
case 18:
|
|
yy.addAnnotation($$[$0],$$[$0-2]);
|
|
break;
|
|
case 19:
|
|
this.$ = [$$[$0]];
|
|
break;
|
|
case 20:
|
|
$$[$0].push($$[$0-1]);this.$=$$[$0];
|
|
break;
|
|
case 21:
|
|
/*console.log('Rel found',$$[$0]);*/
|
|
break;
|
|
case 22:
|
|
yy.addMember($$[$0-1],yy.cleanupLabel($$[$0]));
|
|
break;
|
|
case 23:
|
|
/*console.warn('Member',$$[$0]);*/
|
|
break;
|
|
case 24:
|
|
/*console.log('sep found',$$[$0]);*/
|
|
break;
|
|
case 25:
|
|
this.$ = {'id1':$$[$0-2],'id2':$$[$0], relation:$$[$0-1], relationTitle1:'none', relationTitle2:'none'};
|
|
break;
|
|
case 26:
|
|
this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-1], relationTitle1:$$[$0-2], relationTitle2:'none'}
|
|
break;
|
|
case 27:
|
|
this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-2], relationTitle1:'none', relationTitle2:$$[$0-1]};
|
|
break;
|
|
case 28:
|
|
this.$ = {id1:$$[$0-4], id2:$$[$0], relation:$$[$0-2], relationTitle1:$$[$0-3], relationTitle2:$$[$0-1]}
|
|
break;
|
|
case 29:
|
|
this.$={type1:$$[$0-2],type2:$$[$0],lineType:$$[$0-1]};
|
|
break;
|
|
case 30:
|
|
this.$={type1:'none',type2:$$[$0],lineType:$$[$0-1]};
|
|
break;
|
|
case 31:
|
|
this.$={type1:$$[$0-1],type2:'none',lineType:$$[$0]};
|
|
break;
|
|
case 32:
|
|
this.$={type1:'none',type2:'none',lineType:$$[$0]};
|
|
break;
|
|
case 33:
|
|
this.$=yy.relationType.AGGREGATION;
|
|
break;
|
|
case 34:
|
|
this.$=yy.relationType.EXTENSION;
|
|
break;
|
|
case 35:
|
|
this.$=yy.relationType.COMPOSITION;
|
|
break;
|
|
case 36:
|
|
this.$=yy.relationType.DEPENDENCY;
|
|
break;
|
|
case 37:
|
|
this.$=yy.lineType.LINE;
|
|
break;
|
|
case 38:
|
|
this.$=yy.lineType.DOTTED_LINE;
|
|
break;
|
|
case 39:
|
|
this.$ = $$[$0-2];yy.setClickEvent($$[$0-1], $$[$0], undefined);
|
|
break;
|
|
case 40:
|
|
this.$ = $$[$0-3];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);
|
|
break;
|
|
case 41:
|
|
this.$ = $$[$0-2];yy.setLink($$[$0-1], $$[$0], undefined);
|
|
break;
|
|
case 42:
|
|
this.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0-1], $$[$0]);
|
|
break;
|
|
}
|
|
},
|
|
table: [{3:1,4:2,5:[1,3]},{1:[3]},{1:[2,1]},{6:[1,4]},{7:5,9:6,10:12,11:19,13:7,15:8,16:9,17:10,18:11,19:$V0,23:$V1,25:$V2,26:$V3,37:$V4,38:$V5,52:$V6,53:$V7,54:$V8},{8:[1,23]},{6:[1,24],8:[2,3]},o($V9,[2,10],{14:[1,25]}),o($V9,[2,12]),o($V9,[2,13]),o($V9,[2,14]),o($V9,[2,15]),o($V9,[2,21],{27:26,29:29,30:30,14:[1,28],28:[1,27],31:$Va,32:$Vb,33:$Vc,34:$Vd,35:$Ve,36:$Vf}),{10:37,11:19,52:$V6,53:$V7,54:$V8},o($V9,[2,23]),o($V9,[2,24]),{11:38,52:$V6,53:$V7,54:$V8},{10:39,11:19,52:$V6,53:$V7,54:$V8},{10:40,11:19,52:$V6,53:$V7,54:$V8},o($Vg,[2,7],{11:19,10:41,12:[1,42],52:$V6,53:$V7,54:$V8}),o($Vh,[2,56]),o($Vh,[2,57]),o($Vh,[2,58]),{1:[2,2]},{7:43,8:[2,4],9:6,10:12,11:19,13:7,15:8,16:9,17:10,18:11,19:$V0,23:$V1,25:$V2,26:$V3,37:$V4,38:$V5,52:$V6,53:$V7,54:$V8},o($V9,[2,11]),{10:44,11:19,28:[1,45],52:$V6,53:$V7,54:$V8},{27:46,29:29,30:30,31:$Va,32:$Vb,33:$Vc,34:$Vd,35:$Ve,36:$Vf},o($V9,[2,22]),{30:47,35:$Ve,36:$Vf},o($Vi,[2,32],{29:48,31:$Va,32:$Vb,33:$Vc,34:$Vd}),o($Vj,[2,33]),o($Vj,[2,34]),o($Vj,[2,35]),o($Vj,[2,36]),o($Vk,[2,37]),o($Vk,[2,38]),o($V9,[2,16],{20:[1,49]}),{24:[1,50]},{28:[1,51]},{28:[1,52]},o($Vg,[2,6]),o($Vg,[2,9],{11:19,10:53,52:$V6,53:$V7,54:$V8}),{8:[2,5]},o($Vl,[2,25]),{10:54,11:19,52:$V6,53:$V7,54:$V8},{10:55,11:19,28:[1,56],52:$V6,53:$V7,54:$V8},o($Vi,[2,31],{29:57,31:$Va,32:$Vb,33:$Vc,34:$Vd}),o($Vi,[2,30]),{21:58,25:$Vm},{10:60,11:19,52:$V6,53:$V7,54:$V8},o($V9,[2,39],{28:[1,61]}),o($V9,[2,41],{28:[1,62]}),o($Vg,[2,8]),o($Vl,[2,27]),o($Vl,[2,26]),{10:63,11:19,52:$V6,53:$V7,54:$V8},o($Vi,[2,29]),{22:[1,64]},{21:65,22:[2,19],25:$Vm},o($V9,[2,18]),o($V9,[2,40]),o($V9,[2,42]),o($Vl,[2,28]),o($V9,[2,17]),{22:[2,20]}],
|
|
defaultActions: {2:[2,1],23:[2,2],43:[2,5],65:[2,20]},
|
|
parseError: function parseError (str, hash) {
|
|
if (hash.recoverable) {
|
|
this.trace(str);
|
|
} else {
|
|
var error = new Error(str);
|
|
error.hash = hash;
|
|
throw error;
|
|
}
|
|
},
|
|
parse: function parse(input) {
|
|
var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
var args = lstack.slice.call(arguments, 1);
|
|
var lexer = Object.create(this.lexer);
|
|
var sharedState = { yy: {} };
|
|
for (var k in this.yy) {
|
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
|
sharedState.yy[k] = this.yy[k];
|
|
}
|
|
}
|
|
lexer.setInput(input, sharedState.yy);
|
|
sharedState.yy.lexer = lexer;
|
|
sharedState.yy.parser = this;
|
|
if (typeof lexer.yylloc == 'undefined') {
|
|
lexer.yylloc = {};
|
|
}
|
|
var yyloc = lexer.yylloc;
|
|
lstack.push(yyloc);
|
|
var ranges = lexer.options && lexer.options.ranges;
|
|
if (typeof sharedState.yy.parseError === 'function') {
|
|
this.parseError = sharedState.yy.parseError;
|
|
} else {
|
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
|
}
|
|
function popStack(n) {
|
|
stack.length = stack.length - 2 * n;
|
|
vstack.length = vstack.length - n;
|
|
lstack.length = lstack.length - n;
|
|
}
|
|
function lex() {
|
|
var token;
|
|
token = tstack.pop() || lexer.lex() || EOF;
|
|
if (typeof token !== 'number') {
|
|
if (token instanceof Array) {
|
|
tstack = token;
|
|
token = tstack.pop();
|
|
}
|
|
token = self.symbols_[token] || token;
|
|
}
|
|
return token;
|
|
}
|
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
|
while (true) {
|
|
state = stack[stack.length - 1];
|
|
if (this.defaultActions[state]) {
|
|
action = this.defaultActions[state];
|
|
} else {
|
|
if (symbol === null || typeof symbol == 'undefined') {
|
|
symbol = lex();
|
|
}
|
|
action = table[state] && table[state][symbol];
|
|
}
|
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
|
var errStr = '';
|
|
expected = [];
|
|
for (p in table[state]) {
|
|
if (this.terminals_[p] && p > TERROR) {
|
|
expected.push('\'' + this.terminals_[p] + '\'');
|
|
}
|
|
}
|
|
if (lexer.showPosition) {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
|
|
} else {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
|
|
}
|
|
this.parseError(errStr, {
|
|
text: lexer.match,
|
|
token: this.terminals_[symbol] || symbol,
|
|
line: lexer.yylineno,
|
|
loc: yyloc,
|
|
expected: expected
|
|
});
|
|
}
|
|
if (action[0] instanceof Array && action.length > 1) {
|
|
throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
|
|
}
|
|
switch (action[0]) {
|
|
case 1:
|
|
stack.push(symbol);
|
|
vstack.push(lexer.yytext);
|
|
lstack.push(lexer.yylloc);
|
|
stack.push(action[1]);
|
|
symbol = null;
|
|
if (!preErrorSymbol) {
|
|
yyleng = lexer.yyleng;
|
|
yytext = lexer.yytext;
|
|
yylineno = lexer.yylineno;
|
|
yyloc = lexer.yylloc;
|
|
if (recovering > 0) {
|
|
recovering--;
|
|
}
|
|
} else {
|
|
symbol = preErrorSymbol;
|
|
preErrorSymbol = null;
|
|
}
|
|
break;
|
|
case 2:
|
|
len = this.productions_[action[1]][1];
|
|
yyval.$ = vstack[vstack.length - len];
|
|
yyval._$ = {
|
|
first_line: lstack[lstack.length - (len || 1)].first_line,
|
|
last_line: lstack[lstack.length - 1].last_line,
|
|
first_column: lstack[lstack.length - (len || 1)].first_column,
|
|
last_column: lstack[lstack.length - 1].last_column
|
|
};
|
|
if (ranges) {
|
|
yyval._$.range = [
|
|
lstack[lstack.length - (len || 1)].range[0],
|
|
lstack[lstack.length - 1].range[1]
|
|
];
|
|
}
|
|
r = this.performAction.apply(yyval, [
|
|
yytext,
|
|
yyleng,
|
|
yylineno,
|
|
sharedState.yy,
|
|
action[1],
|
|
vstack,
|
|
lstack
|
|
].concat(args));
|
|
if (typeof r !== 'undefined') {
|
|
return r;
|
|
}
|
|
if (len) {
|
|
stack = stack.slice(0, -1 * len * 2);
|
|
vstack = vstack.slice(0, -1 * len);
|
|
lstack = lstack.slice(0, -1 * len);
|
|
}
|
|
stack.push(this.productions_[action[1]][0]);
|
|
vstack.push(yyval.$);
|
|
lstack.push(yyval._$);
|
|
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
stack.push(newState);
|
|
break;
|
|
case 3:
|
|
return true;
|
|
}
|
|
}
|
|
return true;
|
|
}};
|
|
|
|
/* generated by jison-lex 0.3.4 */
|
|
var lexer = (function(){
|
|
var lexer = ({
|
|
|
|
EOF:1,
|
|
|
|
parseError:function parseError(str, hash) {
|
|
if (this.yy.parser) {
|
|
this.yy.parser.parseError(str, hash);
|
|
} else {
|
|
throw new Error(str);
|
|
}
|
|
},
|
|
|
|
// resets the lexer, sets new input
|
|
setInput:function (input, yy) {
|
|
this.yy = yy || this.yy || {};
|
|
this._input = input;
|
|
this._more = this._backtrack = this.done = false;
|
|
this.yylineno = this.yyleng = 0;
|
|
this.yytext = this.matched = this.match = '';
|
|
this.conditionStack = ['INITIAL'];
|
|
this.yylloc = {
|
|
first_line: 1,
|
|
first_column: 0,
|
|
last_line: 1,
|
|
last_column: 0
|
|
};
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [0,0];
|
|
}
|
|
this.offset = 0;
|
|
return this;
|
|
},
|
|
|
|
// consumes and returns one char from the input
|
|
input:function () {
|
|
var ch = this._input[0];
|
|
this.yytext += ch;
|
|
this.yyleng++;
|
|
this.offset++;
|
|
this.match += ch;
|
|
this.matched += ch;
|
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno++;
|
|
this.yylloc.last_line++;
|
|
} else {
|
|
this.yylloc.last_column++;
|
|
}
|
|
if (this.options.ranges) {
|
|
this.yylloc.range[1]++;
|
|
}
|
|
|
|
this._input = this._input.slice(1);
|
|
return ch;
|
|
},
|
|
|
|
// unshifts one char (or a string) into the input
|
|
unput:function (ch) {
|
|
var len = ch.length;
|
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
|
|
|
this._input = ch + this._input;
|
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
|
//this.yyleng -= len;
|
|
this.offset -= len;
|
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
|
this.match = this.match.substr(0, this.match.length - 1);
|
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
|
|
|
if (lines.length - 1) {
|
|
this.yylineno -= lines.length - 1;
|
|
}
|
|
var r = this.yylloc.range;
|
|
|
|
this.yylloc = {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: lines ?
|
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
|
this.yylloc.first_column - len
|
|
};
|
|
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
|
}
|
|
this.yyleng = this.yytext.length;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, caches matched text and appends it on next action
|
|
more:function () {
|
|
this._more = true;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
|
reject:function () {
|
|
if (this.options.backtrack_lexer) {
|
|
this._backtrack = true;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
// retain first n characters of the match
|
|
less:function (n) {
|
|
this.unput(this.match.slice(n));
|
|
},
|
|
|
|
// displays already matched input, i.e. for error messages
|
|
pastInput:function () {
|
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays upcoming input, i.e. for error messages
|
|
upcomingInput:function () {
|
|
var next = this.match;
|
|
if (next.length < 20) {
|
|
next += this._input.substr(0, 20-next.length);
|
|
}
|
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
|
showPosition:function () {
|
|
var pre = this.pastInput();
|
|
var c = new Array(pre.length + 1).join("-");
|
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
|
},
|
|
|
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
|
test_match:function(match, indexed_rule) {
|
|
var token,
|
|
lines,
|
|
backup;
|
|
|
|
if (this.options.backtrack_lexer) {
|
|
// save context
|
|
backup = {
|
|
yylineno: this.yylineno,
|
|
yylloc: {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.last_line,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: this.yylloc.last_column
|
|
},
|
|
yytext: this.yytext,
|
|
match: this.match,
|
|
matches: this.matches,
|
|
matched: this.matched,
|
|
yyleng: this.yyleng,
|
|
offset: this.offset,
|
|
_more: this._more,
|
|
_input: this._input,
|
|
yy: this.yy,
|
|
conditionStack: this.conditionStack.slice(0),
|
|
done: this.done
|
|
};
|
|
if (this.options.ranges) {
|
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
|
}
|
|
}
|
|
|
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno += lines.length;
|
|
}
|
|
this.yylloc = {
|
|
first_line: this.yylloc.last_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.last_column,
|
|
last_column: lines ?
|
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
|
this.yylloc.last_column + match[0].length
|
|
};
|
|
this.yytext += match[0];
|
|
this.match += match[0];
|
|
this.matches = match;
|
|
this.yyleng = this.yytext.length;
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
|
}
|
|
this._more = false;
|
|
this._backtrack = false;
|
|
this._input = this._input.slice(match[0].length);
|
|
this.matched += match[0];
|
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
|
if (this.done && this._input) {
|
|
this.done = false;
|
|
}
|
|
if (token) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
// recover context
|
|
for (var k in backup) {
|
|
this[k] = backup[k];
|
|
}
|
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// return next match in input
|
|
next:function () {
|
|
if (this.done) {
|
|
return this.EOF;
|
|
}
|
|
if (!this._input) {
|
|
this.done = true;
|
|
}
|
|
|
|
var token,
|
|
match,
|
|
tempMatch,
|
|
index;
|
|
if (!this._more) {
|
|
this.yytext = '';
|
|
this.match = '';
|
|
}
|
|
var rules = this._currentRules();
|
|
for (var i = 0; i < rules.length; i++) {
|
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
|
match = tempMatch;
|
|
index = i;
|
|
if (this.options.backtrack_lexer) {
|
|
token = this.test_match(tempMatch, rules[i]);
|
|
if (token !== false) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
match = false;
|
|
continue; // rule action called reject() implying a rule MISmatch.
|
|
} else {
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
} else if (!this.options.flex) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (match) {
|
|
token = this.test_match(match, rules[index]);
|
|
if (token !== false) {
|
|
return token;
|
|
}
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
if (this._input === "") {
|
|
return this.EOF;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
}
|
|
},
|
|
|
|
// return next match that has a token
|
|
lex:function lex () {
|
|
var r = this.next();
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return this.lex();
|
|
}
|
|
},
|
|
|
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
|
begin:function begin (condition) {
|
|
this.conditionStack.push(condition);
|
|
},
|
|
|
|
// pop the previously active lexer condition state off the condition stack
|
|
popState:function popState () {
|
|
var n = this.conditionStack.length - 1;
|
|
if (n > 0) {
|
|
return this.conditionStack.pop();
|
|
} else {
|
|
return this.conditionStack[0];
|
|
}
|
|
},
|
|
|
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
|
_currentRules:function _currentRules () {
|
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
|
} else {
|
|
return this.conditions["INITIAL"].rules;
|
|
}
|
|
},
|
|
|
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
|
topState:function topState (n) {
|
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
|
if (n >= 0) {
|
|
return this.conditionStack[n];
|
|
} else {
|
|
return "INITIAL";
|
|
}
|
|
},
|
|
|
|
// alias for begin(condition)
|
|
pushState:function pushState (condition) {
|
|
this.begin(condition);
|
|
},
|
|
|
|
// return the number of states currently on the stack
|
|
stateStackSize:function stateStackSize() {
|
|
return this.conditionStack.length;
|
|
},
|
|
options: {},
|
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
|
var YYSTATE=YY_START;
|
|
switch($avoiding_name_collisions) {
|
|
case 0:/* do nothing */
|
|
break;
|
|
case 1:return 6;
|
|
break;
|
|
case 2:/* skip whitespace */
|
|
break;
|
|
case 3:return 5;
|
|
break;
|
|
case 4: this.begin("struct"); /*console.log('Starting struct');*/return 20;
|
|
break;
|
|
case 5:return "EOF_IN_STRUCT";
|
|
break;
|
|
case 6:return "OPEN_IN_STRUCT";
|
|
break;
|
|
case 7: /*console.log('Ending struct');*/this.popState(); return 22;
|
|
break;
|
|
case 8:/* nothing */
|
|
break;
|
|
case 9: /*console.log('lex-member: ' + yy_.yytext);*/ return "MEMBER";
|
|
break;
|
|
case 10:return 19;
|
|
break;
|
|
case 11:return 37;
|
|
break;
|
|
case 12:return 38;
|
|
break;
|
|
case 13:return 23;
|
|
break;
|
|
case 14:return 24;
|
|
break;
|
|
case 15:this.begin("generic");
|
|
break;
|
|
case 16:this.popState();
|
|
break;
|
|
case 17:return "GENERICTYPE";
|
|
break;
|
|
case 18:this.begin("string");
|
|
break;
|
|
case 19:this.popState();
|
|
break;
|
|
case 20:return "STR";
|
|
break;
|
|
case 21:return 32;
|
|
break;
|
|
case 22:return 32;
|
|
break;
|
|
case 23:return 34;
|
|
break;
|
|
case 24:return 34;
|
|
break;
|
|
case 25:return 33;
|
|
break;
|
|
case 26:return 31;
|
|
break;
|
|
case 27:return 35;
|
|
break;
|
|
case 28:return 36;
|
|
break;
|
|
case 29:return 14;
|
|
break;
|
|
case 30:return 50;
|
|
break;
|
|
case 31:return 'DOT';
|
|
break;
|
|
case 32:return 'PLUS';
|
|
break;
|
|
case 33:return 47;
|
|
break;
|
|
case 34:return 'EQUALS';
|
|
break;
|
|
case 35:return 'EQUALS';
|
|
break;
|
|
case 36:return 54;
|
|
break;
|
|
case 37:return 'PUNCTUATION';
|
|
break;
|
|
case 38:return 53;
|
|
break;
|
|
case 39:return 52;
|
|
break;
|
|
case 40:return 49;
|
|
break;
|
|
case 41:return 8;
|
|
break;
|
|
}
|
|
},
|
|
rules: [/^(?:%%[^\n]*\n*)/,/^(?:\n+)/,/^(?:\s+)/,/^(?:classDiagram\b)/,/^(?:[\{])/,/^(?:$)/,/^(?:[\{])/,/^(?:\})/,/^(?:[\n])/,/^(?:[^\{\}\n]*)/,/^(?:class\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:[~])/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:--)/,/^(?:\.\.)/,/^(?::[^\n;]+)/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:[!"#$%&'*+,-.`?\\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],
|
|
conditions: {"string":{"rules":[19,20],"inclusive":false},"generic":{"rules":[16,17],"inclusive":false},"struct":{"rules":[5,6,7,8,9],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,10,11,12,13,14,15,18,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"inclusive":true}}
|
|
});
|
|
return lexer;
|
|
})();
|
|
parser.lexer = lexer;
|
|
function Parser () {
|
|
this.yy = {};
|
|
}
|
|
Parser.prototype = parser;parser.Parser = Parser;
|
|
return new Parser;
|
|
})();
|
|
|
|
|
|
if (true) {
|
|
exports.parser = parser;
|
|
exports.Parser = parser.Parser;
|
|
exports.parse = function () { return parser.parse.apply(parser, arguments); };
|
|
exports.main = function commonjsMain (args) {
|
|
if (!args[1]) {
|
|
console.log('Usage: '+args[0]+' FILE');
|
|
process.exit(1);
|
|
}
|
|
var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
|
|
return exports.parser.parse(source);
|
|
};
|
|
if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
|
|
exports.main(process.argv.slice(1));
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js?f28c"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/class/svgDraw.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/diagrams/class/svgDraw.js ***!
|
|
\***************************************/
|
|
/*! exports provided: drawEdge, drawClass, parseMember, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawEdge", function() { return drawEdge; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawClass", function() { return drawClass; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseMember", function() { return parseMember; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _classDb__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./classDb */ "./src/diagrams/class/classDb.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
|
|
|
|
|
|
|
|
var edgeCount = 0;
|
|
var drawEdge = function drawEdge(elem, path, relation, conf) {
|
|
var getRelationType = function getRelationType(type) {
|
|
switch (type) {
|
|
case _classDb__WEBPACK_IMPORTED_MODULE_1__["relationType"].AGGREGATION:
|
|
return 'aggregation';
|
|
|
|
case _classDb__WEBPACK_IMPORTED_MODULE_1__["relationType"].EXTENSION:
|
|
return 'extension';
|
|
|
|
case _classDb__WEBPACK_IMPORTED_MODULE_1__["relationType"].COMPOSITION:
|
|
return 'composition';
|
|
|
|
case _classDb__WEBPACK_IMPORTED_MODULE_1__["relationType"].DEPENDENCY:
|
|
return 'dependency';
|
|
}
|
|
};
|
|
|
|
path.points = path.points.filter(function (p) {
|
|
return !Number.isNaN(p.y);
|
|
}); // The data for our line
|
|
|
|
var lineData = path.points; // This is the accessor function we talked about above
|
|
|
|
var lineFunction = Object(d3__WEBPACK_IMPORTED_MODULE_0__["line"])().x(function (d) {
|
|
return d.x;
|
|
}).y(function (d) {
|
|
return d.y;
|
|
}).curve(d3__WEBPACK_IMPORTED_MODULE_0__["curveBasis"]);
|
|
var svgPath = elem.append('path').attr('d', lineFunction(lineData)).attr('id', 'edge' + edgeCount).attr('class', 'relation');
|
|
var url = '';
|
|
|
|
if (conf.arrowMarkerAbsolute) {
|
|
url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
|
|
url = url.replace(/\(/g, '\\(');
|
|
url = url.replace(/\)/g, '\\)');
|
|
}
|
|
|
|
if (relation.relation.lineType == 1) {
|
|
svgPath.attr('class', 'relation dashed-line');
|
|
}
|
|
|
|
if (relation.relation.type1 !== 'none') {
|
|
svgPath.attr('marker-start', 'url(' + url + '#' + getRelationType(relation.relation.type1) + 'Start' + ')');
|
|
}
|
|
|
|
if (relation.relation.type2 !== 'none') {
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + getRelationType(relation.relation.type2) + 'End' + ')');
|
|
}
|
|
|
|
var x, y;
|
|
var l = path.points.length; // Calculate Label position
|
|
|
|
var labelPosition = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].calcLabelPosition(path.points);
|
|
x = labelPosition.x;
|
|
y = labelPosition.y;
|
|
var p1_card_x, p1_card_y;
|
|
var p2_card_x, p2_card_y;
|
|
|
|
if (l % 2 !== 0 && l > 1) {
|
|
var cardinality_1_point = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].calcCardinalityPosition(relation.relation.type1 !== 'none', path.points, path.points[0]);
|
|
var cardinality_2_point = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].calcCardinalityPosition(relation.relation.type2 !== 'none', path.points, path.points[l - 1]);
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('cardinality_1_point ' + JSON.stringify(cardinality_1_point));
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('cardinality_2_point ' + JSON.stringify(cardinality_2_point));
|
|
p1_card_x = cardinality_1_point.x;
|
|
p1_card_y = cardinality_1_point.y;
|
|
p2_card_x = cardinality_2_point.x;
|
|
p2_card_y = cardinality_2_point.y;
|
|
}
|
|
|
|
if (typeof relation.title !== 'undefined') {
|
|
var g = elem.append('g').attr('class', 'classLabel');
|
|
var label = g.append('text').attr('class', 'label').attr('x', x).attr('y', y).attr('fill', 'red').attr('text-anchor', 'middle').text(relation.title);
|
|
window.label = label;
|
|
var bounds = label.node().getBBox();
|
|
g.insert('rect', ':first-child').attr('class', 'box').attr('x', bounds.x - conf.padding / 2).attr('y', bounds.y - conf.padding / 2).attr('width', bounds.width + conf.padding).attr('height', bounds.height + conf.padding);
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Rendering relation ' + JSON.stringify(relation));
|
|
|
|
if (typeof relation.relationTitle1 !== 'undefined' && relation.relationTitle1 !== 'none') {
|
|
var _g = elem.append('g').attr('class', 'cardinality');
|
|
|
|
_g.append('text').attr('class', 'type1').attr('x', p1_card_x).attr('y', p1_card_y).attr('fill', 'black').attr('font-size', '6').text(relation.relationTitle1);
|
|
}
|
|
|
|
if (typeof relation.relationTitle2 !== 'undefined' && relation.relationTitle2 !== 'none') {
|
|
var _g2 = elem.append('g').attr('class', 'cardinality');
|
|
|
|
_g2.append('text').attr('class', 'type2').attr('x', p2_card_x).attr('y', p2_card_y).attr('fill', 'black').attr('font-size', '6').text(relation.relationTitle2);
|
|
}
|
|
|
|
edgeCount++;
|
|
};
|
|
var drawClass = function drawClass(elem, classDef, conf) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Rendering class ' + classDef);
|
|
var cssClassStr = 'classGroup ';
|
|
|
|
if (classDef.cssClasses.length > 0) {
|
|
cssClassStr = cssClassStr + classDef.cssClasses.join(' ');
|
|
}
|
|
|
|
var id = classDef.id;
|
|
var classInfo = {
|
|
id: id,
|
|
label: classDef.id,
|
|
width: 0,
|
|
height: 0
|
|
}; // add class group
|
|
|
|
var g = elem.append('g').attr('id', Object(_classDb__WEBPACK_IMPORTED_MODULE_1__["lookUpDomId"])(id)).attr('class', cssClassStr); // add title
|
|
|
|
var title;
|
|
|
|
if (classDef.link) {
|
|
title = g.append('svg:a').attr('xlink:href', classDef.link).attr('target', '_blank').append('text').attr('y', conf.textHeight + conf.padding).attr('x', 0);
|
|
} else {
|
|
title = g.append('text').attr('y', conf.textHeight + conf.padding).attr('x', 0);
|
|
} // add annotations
|
|
|
|
|
|
var isFirst = true;
|
|
classDef.annotations.forEach(function (member) {
|
|
var titleText2 = title.append('tspan').text('«' + member + '»');
|
|
if (!isFirst) titleText2.attr('dy', conf.textHeight);
|
|
isFirst = false;
|
|
});
|
|
var classTitleString = classDef.id;
|
|
|
|
if (classDef.type !== undefined && classDef.type !== '') {
|
|
classTitleString += '<' + classDef.type + '>';
|
|
}
|
|
|
|
var classTitle = title.append('tspan').text(classTitleString).attr('class', 'title'); // If class has annotations the title needs to have an offset of the text height
|
|
|
|
if (!isFirst) classTitle.attr('dy', conf.textHeight);
|
|
var titleHeight = title.node().getBBox().height;
|
|
var membersLine = g.append('line') // text label for the x axis
|
|
.attr('x1', 0).attr('y1', conf.padding + titleHeight + conf.dividerMargin / 2).attr('y2', conf.padding + titleHeight + conf.dividerMargin / 2);
|
|
var members = g.append('text') // text label for the x axis
|
|
.attr('x', conf.padding).attr('y', titleHeight + conf.dividerMargin + conf.textHeight).attr('fill', 'white').attr('class', 'classText');
|
|
isFirst = true;
|
|
classDef.members.forEach(function (member) {
|
|
addTspan(members, member, isFirst, conf);
|
|
isFirst = false;
|
|
});
|
|
var membersBox = members.node().getBBox();
|
|
var methodsLine = g.append('line') // text label for the x axis
|
|
.attr('x1', 0).attr('y1', conf.padding + titleHeight + conf.dividerMargin + membersBox.height).attr('y2', conf.padding + titleHeight + conf.dividerMargin + membersBox.height);
|
|
var methods = g.append('text') // text label for the x axis
|
|
.attr('x', conf.padding).attr('y', titleHeight + 2 * conf.dividerMargin + membersBox.height + conf.textHeight).attr('fill', 'white').attr('class', 'classText');
|
|
isFirst = true;
|
|
classDef.methods.forEach(function (method) {
|
|
addTspan(methods, method, isFirst, conf);
|
|
isFirst = false;
|
|
});
|
|
var classBox = g.node().getBBox();
|
|
var rect = g.insert('rect', ':first-child').attr('x', 0).attr('y', 0).attr('width', classBox.width + 2 * conf.padding).attr('height', classBox.height + conf.padding + 0.5 * conf.dividerMargin);
|
|
var rectWidth = rect.node().getBBox().width; // Center title
|
|
// We subtract the width of each text element from the class box width and divide it by 2
|
|
|
|
title.node().childNodes.forEach(function (x) {
|
|
x.setAttribute('x', (rectWidth - x.getBBox().width) / 2);
|
|
});
|
|
|
|
if (classDef.tooltip) {
|
|
title.insert('title').text(classDef.tooltip);
|
|
}
|
|
|
|
membersLine.attr('x2', rectWidth);
|
|
methodsLine.attr('x2', rectWidth);
|
|
classInfo.width = rectWidth;
|
|
classInfo.height = classBox.height + conf.padding + 0.5 * conf.dividerMargin;
|
|
return classInfo;
|
|
};
|
|
var parseMember = function parseMember(text) {
|
|
var fieldRegEx = /^(\+|-|~|#)?(\w+)(~\w+~|\[\])?\s+(\w+)$/;
|
|
var methodRegEx = /^(\+|-|~|#)?(\w+)\s?\(\s*(\w+(~\w+~|\[\])?\s*(\w+)?)?\s*\)\s?([*|$])?\s?(\w+(~\w+~|\[\])?)?\s*$/;
|
|
var fieldMatch = text.match(fieldRegEx);
|
|
var methodMatch = text.match(methodRegEx);
|
|
|
|
if (fieldMatch) {
|
|
return buildFieldDisplay(fieldMatch);
|
|
} else if (methodMatch) {
|
|
return buildMethodDisplay(methodMatch);
|
|
} else {
|
|
return buildLegacyDisplay(text);
|
|
}
|
|
};
|
|
|
|
var buildFieldDisplay = function buildFieldDisplay(parsedText) {
|
|
var visibility = parsedText[1] ? parsedText[1].trim() : '';
|
|
var fieldType = parsedText[2] ? parsedText[2].trim() : '';
|
|
var genericType = parsedText[3] ? parseGenericTypes(parsedText[3]) : '';
|
|
var fieldName = parsedText[4] ? parsedText[4].trim() : '';
|
|
return {
|
|
displayText: visibility + fieldType + genericType + ' ' + fieldName,
|
|
cssStyle: ''
|
|
};
|
|
};
|
|
|
|
var buildMethodDisplay = function buildMethodDisplay(parsedText) {
|
|
var cssStyle = '';
|
|
var displayText = parsedText;
|
|
var visibility = parsedText[1] ? parsedText[1].trim() : '';
|
|
var methodName = parsedText[2] ? parsedText[2].trim() : '';
|
|
var parameters = parsedText[3] ? parseGenericTypes(parsedText[3]) : '';
|
|
var classifier = parsedText[6] ? parsedText[6].trim() : '';
|
|
var returnType = parsedText[7] ? ' : ' + parseGenericTypes(parsedText[7]).trim() : '';
|
|
displayText = visibility + methodName + '(' + parameters + ')' + returnType;
|
|
cssStyle = parseClassifier(classifier);
|
|
var member = {
|
|
displayText: displayText,
|
|
cssStyle: cssStyle
|
|
};
|
|
return member;
|
|
};
|
|
|
|
var buildLegacyDisplay = function buildLegacyDisplay(text) {
|
|
// if for some reason we dont have any match, use old format to parse text
|
|
var memberText = '';
|
|
var cssStyle = '';
|
|
var returnType = '';
|
|
var methodStart = text.indexOf('(');
|
|
var methodEnd = text.indexOf(')');
|
|
|
|
if (methodStart > 1 && methodEnd > methodStart && methodEnd <= text.length) {
|
|
var parsedText = text.match(/(\+|-|~|#)?(\w+)/);
|
|
var visibility = parsedText[1] ? parsedText[1].trim() : '';
|
|
var methodName = parsedText[2];
|
|
var parameters = text.substring(methodStart + 1, methodEnd);
|
|
var classifier = text.substring(methodEnd, methodEnd + 1);
|
|
cssStyle = parseClassifier(classifier);
|
|
memberText = visibility + methodName + '(' + parseGenericTypes(parameters.trim()) + ')';
|
|
|
|
if (methodEnd < memberText.length) {
|
|
returnType = text.substring(methodEnd + 2).trim();
|
|
|
|
if (returnType !== '') {
|
|
returnType = ' : ' + parseGenericTypes(returnType);
|
|
}
|
|
}
|
|
} else {
|
|
// finally - if all else fails, just send the text back as written (other than parsing for generic types)
|
|
memberText = parseGenericTypes(text);
|
|
}
|
|
|
|
var member = {
|
|
displayText: memberText + returnType,
|
|
cssStyle: cssStyle
|
|
};
|
|
return member;
|
|
};
|
|
|
|
var addTspan = function addTspan(textEl, txt, isFirst, conf) {
|
|
var member = parseMember(txt);
|
|
var tSpan = textEl.append('tspan').attr('x', conf.padding).text(member.displayText);
|
|
|
|
if (member.cssStyle !== '') {
|
|
tSpan.attr('style', member.cssStyle);
|
|
}
|
|
|
|
if (!isFirst) {
|
|
tSpan.attr('dy', conf.textHeight);
|
|
}
|
|
};
|
|
|
|
var parseGenericTypes = function parseGenericTypes(text) {
|
|
var cleanedText = text;
|
|
|
|
if (text.indexOf('~') != -1) {
|
|
cleanedText = cleanedText.replace('~', '<');
|
|
cleanedText = cleanedText.replace('~', '>');
|
|
return parseGenericTypes(cleanedText);
|
|
} else {
|
|
return cleanedText;
|
|
}
|
|
};
|
|
|
|
var parseClassifier = function parseClassifier(classifier) {
|
|
switch (classifier) {
|
|
case '*':
|
|
return 'font-style:italic;';
|
|
|
|
case '$':
|
|
return 'text-decoration:underline;';
|
|
|
|
default:
|
|
return '';
|
|
}
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
drawClass: drawClass,
|
|
drawEdge: drawEdge,
|
|
parseMember: parseMember
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/common/common.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/diagrams/common/common.js ***!
|
|
\***************************************/
|
|
/*! exports provided: getRows, sanitizeText, lineBreakRegex, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRows", function() { return getRows; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sanitizeText", function() { return sanitizeText; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lineBreakRegex", function() { return lineBreakRegex; });
|
|
var getRows = function getRows(s) {
|
|
if (!s) return 1;
|
|
var str = breakToPlaceholder(s);
|
|
str = str.replace(/\\n/g, '#br#');
|
|
return str.split('#br#');
|
|
};
|
|
var sanitizeText = function sanitizeText(text, config) {
|
|
var txt = text;
|
|
var htmlLabels = true;
|
|
if (config.flowchart && (config.flowchart.htmlLabels === false || config.flowchart.htmlLabels === 'false')) htmlLabels = false;
|
|
|
|
if (config.securityLevel !== 'loose' && htmlLabels) {
|
|
// eslint-disable-line
|
|
txt = breakToPlaceholder(txt);
|
|
txt = txt.replace(/</g, '<').replace(/>/g, '>');
|
|
txt = txt.replace(/=/g, '=');
|
|
txt = placeholderToBreak(txt);
|
|
}
|
|
|
|
return txt;
|
|
};
|
|
var lineBreakRegex = /<br\s*\/?>/gi;
|
|
|
|
var breakToPlaceholder = function breakToPlaceholder(s) {
|
|
return s.replace(lineBreakRegex, '#br#');
|
|
};
|
|
|
|
var placeholderToBreak = function placeholderToBreak(s) {
|
|
return s.replace(/#br#/g, '<br/>');
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
getRows: getRows,
|
|
sanitizeText: sanitizeText,
|
|
lineBreakRegex: lineBreakRegex
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/er/erDb.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/diagrams/er/erDb.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/**
|
|
*
|
|
*/
|
|
|
|
var entities = {};
|
|
var relationships = [];
|
|
var title = '';
|
|
var Cardinality = {
|
|
ZERO_OR_ONE: 'ZERO_OR_ONE',
|
|
ZERO_OR_MORE: 'ZERO_OR_MORE',
|
|
ONE_OR_MORE: 'ONE_OR_MORE',
|
|
ONLY_ONE: 'ONLY_ONE'
|
|
};
|
|
var Identification = {
|
|
NON_IDENTIFYING: 'NON_IDENTIFYING',
|
|
IDENTIFYING: 'IDENTIFYING'
|
|
};
|
|
|
|
var addEntity = function addEntity(name) {
|
|
if (typeof entities[name] === 'undefined') {
|
|
entities[name] = name;
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Added new entity :', name);
|
|
}
|
|
};
|
|
|
|
var getEntities = function getEntities() {
|
|
return entities;
|
|
};
|
|
/**
|
|
* Add a relationship
|
|
* @param entA The first entity in the relationship
|
|
* @param rolA The role played by the first entity in relation to the second
|
|
* @param entB The second entity in the relationship
|
|
* @param rSpec The details of the relationship between the two entities
|
|
*/
|
|
|
|
|
|
var addRelationship = function addRelationship(entA, rolA, entB, rSpec) {
|
|
var rel = {
|
|
entityA: entA,
|
|
roleA: rolA,
|
|
entityB: entB,
|
|
relSpec: rSpec
|
|
};
|
|
relationships.push(rel);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Added new relationship :', rel);
|
|
};
|
|
|
|
var getRelationships = function getRelationships() {
|
|
return relationships;
|
|
}; // Keep this - TODO: revisit...allow the diagram to have a title
|
|
|
|
|
|
var setTitle = function setTitle(txt) {
|
|
title = txt;
|
|
};
|
|
|
|
var getTitle = function getTitle() {
|
|
return title;
|
|
};
|
|
|
|
var clear = function clear() {
|
|
entities = {};
|
|
relationships = [];
|
|
title = '';
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
Cardinality: Cardinality,
|
|
Identification: Identification,
|
|
addEntity: addEntity,
|
|
getEntities: getEntities,
|
|
addRelationship: addRelationship,
|
|
getRelationships: getRelationships,
|
|
clear: clear,
|
|
setTitle: setTitle,
|
|
getTitle: getTitle
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/er/erMarkers.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/diagrams/er/erMarkers.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
var ERMarkers = {
|
|
ONLY_ONE_START: 'ONLY_ONE_START',
|
|
ONLY_ONE_END: 'ONLY_ONE_END',
|
|
ZERO_OR_ONE_START: 'ZERO_OR_ONE_START',
|
|
ZERO_OR_ONE_END: 'ZERO_OR_ONE_END',
|
|
ONE_OR_MORE_START: 'ONE_OR_MORE_START',
|
|
ONE_OR_MORE_END: 'ONE_OR_MORE_END',
|
|
ZERO_OR_MORE_START: 'ZERO_OR_MORE_START',
|
|
ZERO_OR_MORE_END: 'ZERO_OR_MORE_END'
|
|
};
|
|
/**
|
|
* Put the markers into the svg DOM for later use with edge paths
|
|
*/
|
|
|
|
var insertMarkers = function insertMarkers(elem, conf) {
|
|
var marker;
|
|
elem.append('defs').append('marker').attr('id', ERMarkers.ONLY_ONE_START).attr('refX', 0).attr('refY', 9).attr('markerWidth', 18).attr('markerHeight', 18).attr('orient', 'auto').append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M9,0 L9,18 M15,0 L15,18');
|
|
elem.append('defs').append('marker').attr('id', ERMarkers.ONLY_ONE_END).attr('refX', 18).attr('refY', 9).attr('markerWidth', 18).attr('markerHeight', 18).attr('orient', 'auto').append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M3,0 L3,18 M9,0 L9,18');
|
|
marker = elem.append('defs').append('marker').attr('id', ERMarkers.ZERO_OR_ONE_START).attr('refX', 0).attr('refY', 9).attr('markerWidth', 30).attr('markerHeight', 18).attr('orient', 'auto');
|
|
marker.append('circle').attr('stroke', conf.stroke).attr('fill', 'white').attr('cx', 21).attr('cy', 9).attr('r', 6);
|
|
marker.append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M9,0 L9,18');
|
|
marker = elem.append('defs').append('marker').attr('id', ERMarkers.ZERO_OR_ONE_END).attr('refX', 30).attr('refY', 9).attr('markerWidth', 30).attr('markerHeight', 18).attr('orient', 'auto');
|
|
marker.append('circle').attr('stroke', conf.stroke).attr('fill', 'white').attr('cx', 9).attr('cy', 9).attr('r', 6);
|
|
marker.append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M21,0 L21,18');
|
|
elem.append('defs').append('marker').attr('id', ERMarkers.ONE_OR_MORE_START).attr('refX', 18).attr('refY', 18).attr('markerWidth', 45).attr('markerHeight', 36).attr('orient', 'auto').append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27');
|
|
elem.append('defs').append('marker').attr('id', ERMarkers.ONE_OR_MORE_END).attr('refX', 27).attr('refY', 18).attr('markerWidth', 45).attr('markerHeight', 36).attr('orient', 'auto').append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18');
|
|
marker = elem.append('defs').append('marker').attr('id', ERMarkers.ZERO_OR_MORE_START).attr('refX', 18).attr('refY', 18).attr('markerWidth', 57).attr('markerHeight', 36).attr('orient', 'auto');
|
|
marker.append('circle').attr('stroke', conf.stroke).attr('fill', 'white').attr('cx', 48).attr('cy', 18).attr('r', 6);
|
|
marker.append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M0,18 Q18,0 36,18 Q18,36 0,18');
|
|
marker = elem.append('defs').append('marker').attr('id', ERMarkers.ZERO_OR_MORE_END).attr('refX', 39).attr('refY', 18).attr('markerWidth', 57).attr('markerHeight', 36).attr('orient', 'auto');
|
|
marker.append('circle').attr('stroke', conf.stroke).attr('fill', 'white').attr('cx', 9).attr('cy', 18).attr('r', 6);
|
|
marker.append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M21,18 Q39,0 57,18 Q39,36 21,18');
|
|
return;
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
ERMarkers: ERMarkers,
|
|
insertMarkers: insertMarkers
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/er/erRenderer.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/diagrams/er/erRenderer.js ***!
|
|
\***************************************/
|
|
/*! exports provided: setConf, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! graphlib */ "graphlib");
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _erDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./erDb */ "./src/diagrams/er/erDb.js");
|
|
/* harmony import */ var _parser_erDiagram__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser/erDiagram */ "./src/diagrams/er/parser/erDiagram.jison");
|
|
/* harmony import */ var _parser_erDiagram__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser_erDiagram__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! dagre */ "dagre");
|
|
/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(dagre__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _erMarkers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./erMarkers */ "./src/diagrams/er/erMarkers.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var conf = {};
|
|
/**
|
|
* Allows the top-level API module to inject config specific to this renderer,
|
|
* storing it in the local conf object. Note that generic config still needs to be
|
|
* retrieved using getConfig() imported from the config module
|
|
*/
|
|
|
|
var setConf = function setConf(cnf) {
|
|
var keys = Object.keys(cnf);
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
conf[keys[i]] = cnf[keys[i]];
|
|
}
|
|
};
|
|
/**
|
|
* Use D3 to construct the svg elements for the entities
|
|
* @param svgNode the svg node that contains the diagram
|
|
* @param entities The entities to be drawn
|
|
* @param graph The graph that contains the vertex and edge definitions post-layout
|
|
* @return The first entity that was inserted
|
|
*/
|
|
|
|
var drawEntities = function drawEntities(svgNode, entities, graph) {
|
|
var keys = Object.keys(entities);
|
|
var firstOne;
|
|
keys.forEach(function (id) {
|
|
// Create a group for each entity
|
|
var groupNode = svgNode.append('g').attr('id', id);
|
|
firstOne = firstOne === undefined ? id : firstOne; // Label the entity - this is done first so that we can get the bounding box
|
|
// which then determines the size of the rectangle
|
|
|
|
var textId = 'entity-' + id;
|
|
var textNode = groupNode.append('text').attr('id', textId).attr('x', 0).attr('y', 0).attr('dominant-baseline', 'middle').attr('text-anchor', 'middle').attr('style', 'font-family: ' + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().fontFamily + '; font-size: ' + conf.fontSize + 'px').text(id); // Calculate the width and height of the entity
|
|
|
|
var textBBox = textNode.node().getBBox();
|
|
var entityWidth = Math.max(conf.minEntityWidth, textBBox.width + conf.entityPadding * 2);
|
|
var entityHeight = Math.max(conf.minEntityHeight, textBBox.height + conf.entityPadding * 2); // Make sure the text gets centred relative to the entity box
|
|
|
|
textNode.attr('transform', 'translate(' + entityWidth / 2 + ',' + entityHeight / 2 + ')'); // Draw the rectangle - insert it before the text so that the text is not obscured
|
|
|
|
var rectNode = groupNode.insert('rect', '#' + textId).attr('fill', conf.fill).attr('fill-opacity', '100%').attr('stroke', conf.stroke).attr('x', 0).attr('y', 0).attr('width', entityWidth).attr('height', entityHeight);
|
|
var rectBBox = rectNode.node().getBBox(); // Add the entity to the graph
|
|
|
|
graph.setNode(id, {
|
|
width: rectBBox.width,
|
|
height: rectBBox.height,
|
|
shape: 'rect',
|
|
id: id
|
|
});
|
|
});
|
|
return firstOne;
|
|
}; // drawEntities
|
|
|
|
|
|
var adjustEntities = function adjustEntities(svgNode, graph) {
|
|
graph.nodes().forEach(function (v) {
|
|
if (typeof v !== 'undefined' && typeof graph.node(v) !== 'undefined') {
|
|
svgNode.select('#' + v).attr('transform', 'translate(' + (graph.node(v).x - graph.node(v).width / 2) + ',' + (graph.node(v).y - graph.node(v).height / 2) + ' )');
|
|
}
|
|
});
|
|
return;
|
|
};
|
|
|
|
var getEdgeName = function getEdgeName(rel) {
|
|
return (rel.entityA + rel.roleA + rel.entityB).replace(/\s/g, '');
|
|
};
|
|
/**
|
|
* Add each relationship to the graph
|
|
* @param relationships the relationships to be added
|
|
* @param g the graph
|
|
* @return {Array} The array of relationships
|
|
*/
|
|
|
|
|
|
var addRelationships = function addRelationships(relationships, g) {
|
|
relationships.forEach(function (r) {
|
|
g.setEdge(r.entityA, r.entityB, {
|
|
relationship: r
|
|
}, getEdgeName(r));
|
|
});
|
|
return relationships;
|
|
}; // addRelationships
|
|
|
|
|
|
var relCnt = 0;
|
|
/**
|
|
* Draw a relationship using edge information from the graph
|
|
* @param svg the svg node
|
|
* @param rel the relationship to draw in the svg
|
|
* @param g the graph containing the edge information
|
|
* @param insert the insertion point in the svg DOM (because relationships have markers that need to sit 'behind' opaque entity boxes)
|
|
*/
|
|
|
|
var drawRelationshipFromLayout = function drawRelationshipFromLayout(svg, rel, g, insert) {
|
|
relCnt++; // Find the edge relating to this relationship
|
|
|
|
var edge = g.edge(rel.entityA, rel.entityB, getEdgeName(rel)); // Get a function that will generate the line path
|
|
|
|
var lineFunction = Object(d3__WEBPACK_IMPORTED_MODULE_1__["line"])().x(function (d) {
|
|
return d.x;
|
|
}).y(function (d) {
|
|
return d.y;
|
|
}).curve(d3__WEBPACK_IMPORTED_MODULE_1__["curveBasis"]); // Insert the line at the right place
|
|
|
|
var svgPath = svg.insert('path', '#' + insert).attr('d', lineFunction(edge.points)).attr('stroke', conf.stroke).attr('fill', 'none'); // ...and with dashes if necessary
|
|
|
|
if (rel.relSpec.relType === _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Identification.NON_IDENTIFYING) {
|
|
svgPath.attr('stroke-dasharray', '8,8');
|
|
} // TODO: Understand this better
|
|
|
|
|
|
var url = '';
|
|
|
|
if (conf.arrowMarkerAbsolute) {
|
|
url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
|
|
url = url.replace(/\(/g, '\\(');
|
|
url = url.replace(/\)/g, '\\)');
|
|
} // Decide which start and end markers it needs. It may be possible to be more concise here
|
|
// by reversing a start marker to make an end marker...but this will do for now
|
|
// Note that the 'A' entity's marker is at the end of the relationship and the 'B' entity's marker is at the start
|
|
|
|
|
|
switch (rel.relSpec.cardA) {
|
|
case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ZERO_OR_ONE:
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ZERO_OR_ONE_END + ')');
|
|
break;
|
|
|
|
case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ZERO_OR_MORE:
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ZERO_OR_MORE_END + ')');
|
|
break;
|
|
|
|
case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ONE_OR_MORE:
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ONE_OR_MORE_END + ')');
|
|
break;
|
|
|
|
case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ONLY_ONE:
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ONLY_ONE_END + ')');
|
|
break;
|
|
}
|
|
|
|
switch (rel.relSpec.cardB) {
|
|
case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ZERO_OR_ONE:
|
|
svgPath.attr('marker-start', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ZERO_OR_ONE_START + ')');
|
|
break;
|
|
|
|
case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ZERO_OR_MORE:
|
|
svgPath.attr('marker-start', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ZERO_OR_MORE_START + ')');
|
|
break;
|
|
|
|
case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ONE_OR_MORE:
|
|
svgPath.attr('marker-start', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ONE_OR_MORE_START + ')');
|
|
break;
|
|
|
|
case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ONLY_ONE:
|
|
svgPath.attr('marker-start', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ONLY_ONE_START + ')');
|
|
break;
|
|
} // Now label the relationship
|
|
// Find the half-way point
|
|
|
|
|
|
var len = svgPath.node().getTotalLength();
|
|
var labelPoint = svgPath.node().getPointAtLength(len * 0.5); // Append a text node containing the label
|
|
|
|
var labelId = 'rel' + relCnt;
|
|
var labelNode = svg.append('text').attr('id', labelId).attr('x', labelPoint.x).attr('y', labelPoint.y).attr('text-anchor', 'middle').attr('dominant-baseline', 'middle').attr('style', 'font-family: ' + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().fontFamily + '; font-size: ' + conf.fontSize + 'px').text(rel.roleA); // Figure out how big the opaque 'container' rectangle needs to be
|
|
|
|
var labelBBox = labelNode.node().getBBox(); // Insert the opaque rectangle before the text label
|
|
|
|
svg.insert('rect', '#' + labelId).attr('x', labelPoint.x - labelBBox.width / 2).attr('y', labelPoint.y - labelBBox.height / 2).attr('width', labelBBox.width).attr('height', labelBBox.height).attr('fill', 'white').attr('fill-opacity', '85%');
|
|
return;
|
|
};
|
|
/**
|
|
* Draw en E-R diagram in the tag with id: id based on the text definition of the diagram
|
|
* @param text the text of the diagram
|
|
* @param id the unique id of the DOM node that contains the diagram
|
|
*/
|
|
|
|
|
|
var draw = function draw(text, id) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Drawing ER diagram');
|
|
_erDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
|
|
var parser = _parser_erDiagram__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
|
|
parser.yy = _erDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the text to populate erDb
|
|
|
|
try {
|
|
parser.parse(text);
|
|
} catch (err) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].debug('Parsing failed');
|
|
} // Get a reference to the svg node that contains the text
|
|
|
|
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id='".concat(id, "']")); // Add cardinality marker definitions to the svg
|
|
|
|
_erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].insertMarkers(svg, conf); // Now we have to construct the diagram in a specific way:
|
|
// ---
|
|
// 1. Create all the entities in the svg node at 0,0, but with the correct dimensions (allowing for text content)
|
|
// 2. Make sure they are all added to the graph
|
|
// 3. Add all the edges (relationships) to the graph aswell
|
|
// 4. Let dagre do its magic to layout the graph. This assigns:
|
|
// - the centre co-ordinates for each node, bearing in mind the dimensions and edge relationships
|
|
// - the path co-ordinates for each edge
|
|
// But it has no impact on the svg child nodes - the diagram remains with every entity rooted at 0,0
|
|
// 5. Now assign a transform to each entity in the svg node so that it gets drawn in the correct place, as determined by
|
|
// its centre point, which is obtained from the graph, and it's width and height
|
|
// 6. And finally, create all the edges in the svg node using information from the graph
|
|
// ---
|
|
// Create the graph
|
|
|
|
var g; // TODO: Explore directed vs undirected graphs, and how the layout is affected
|
|
// An E-R diagram could be said to be undirected, but there is merit in setting
|
|
// the direction from parent to child in a one-to-many as this influences graphlib to
|
|
// put the parent above the child (does it?), which is intuitive. Most relationships
|
|
// in ER diagrams are one-to-many.
|
|
|
|
g = new graphlib__WEBPACK_IMPORTED_MODULE_0___default.a.Graph({
|
|
multigraph: true,
|
|
directed: true,
|
|
compound: false
|
|
}).setGraph({
|
|
rankdir: conf.layoutDirection,
|
|
marginx: 20,
|
|
marginy: 20,
|
|
nodesep: 100,
|
|
edgesep: 100,
|
|
ranksep: 100
|
|
}).setDefaultEdgeLabel(function () {
|
|
return {};
|
|
}); // Draw the entities (at 0,0), returning the first svg node that got
|
|
// inserted - this represents the insertion point for relationship paths
|
|
|
|
var firstEntity = drawEntities(svg, _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].getEntities(), g); // TODO: externalise the addition of entities to the graph - it's a bit 'buried' in the above
|
|
// Add all the relationships to the graph
|
|
|
|
var relationships = addRelationships(_erDb__WEBPACK_IMPORTED_MODULE_2__["default"].getRelationships(), g);
|
|
dagre__WEBPACK_IMPORTED_MODULE_4___default.a.layout(g); // Node and edge positions will be updated
|
|
// Adjust the positions of the entities so that they adhere to the layout
|
|
|
|
adjustEntities(svg, g); // Draw the relationships
|
|
|
|
relationships.forEach(function (rel) {
|
|
drawRelationshipFromLayout(svg, rel, g, firstEntity);
|
|
});
|
|
var padding = conf.diagramPadding;
|
|
var svgBounds = svg.node().getBBox();
|
|
var width = svgBounds.width + padding * 2;
|
|
var height = svgBounds.height + padding * 2;
|
|
svg.attr('height', height);
|
|
svg.attr('width', '100%');
|
|
svg.attr('style', "max-width: ".concat(width, "px;"));
|
|
svg.attr('viewBox', "".concat(svgBounds.x - padding, " ").concat(svgBounds.y - padding, " ").concat(width, " ").concat(height));
|
|
}; // draw
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/er/parser/erDiagram.jison":
|
|
/*!************************************************!*\
|
|
!*** ./src/diagrams/er/parser/erDiagram.jison ***!
|
|
\************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
|
|
/*
|
|
Returns a Parser object of the following structure:
|
|
|
|
Parser: {
|
|
yy: {}
|
|
}
|
|
|
|
Parser.prototype: {
|
|
yy: {},
|
|
trace: function(),
|
|
symbols_: {associative list: name ==> number},
|
|
terminals_: {associative list: number ==> name},
|
|
productions_: [...],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
|
table: [...],
|
|
defaultActions: {...},
|
|
parseError: function(str, hash),
|
|
parse: function(input),
|
|
|
|
lexer: {
|
|
EOF: 1,
|
|
parseError: function(str, hash),
|
|
setInput: function(input),
|
|
input: function(),
|
|
unput: function(str),
|
|
more: function(),
|
|
less: function(n),
|
|
pastInput: function(),
|
|
upcomingInput: function(),
|
|
showPosition: function(),
|
|
test_match: function(regex_match_array, rule_index),
|
|
next: function(),
|
|
lex: function(),
|
|
begin: function(condition),
|
|
popState: function(),
|
|
_currentRules: function(),
|
|
topState: function(),
|
|
pushState: function(condition),
|
|
|
|
options: {
|
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
|
},
|
|
|
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
|
rules: [...],
|
|
conditions: {associative list: name ==> set},
|
|
}
|
|
}
|
|
|
|
|
|
token location info (@$, _$, etc.): {
|
|
first_line: n,
|
|
last_line: n,
|
|
first_column: n,
|
|
last_column: n,
|
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
|
}
|
|
|
|
|
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
|
text: (matched text)
|
|
token: (the produced terminal token, if any)
|
|
line: (yylineno)
|
|
}
|
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
|
loc: (yylloc)
|
|
expected: (string describing the set of expected tokens)
|
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
|
}
|
|
*/
|
|
var parser = (function(){
|
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,12],$V1=[1,7],$V2=[1,10],$V3=[1,11],$V4=[1,12],$V5=[1,13],$V6=[12,19,20],$V7=[15,16,17,18];
|
|
var parser = {trace: function trace () { },
|
|
yy: {},
|
|
symbols_: {"error":2,"start":3,"ER_DIAGRAM":4,"document":5,"EOF":6,"statement":7,"entityName":8,"relSpec":9,":":10,"role":11,"ALPHANUM":12,"cardinality":13,"relType":14,"ZERO_OR_ONE":15,"ZERO_OR_MORE":16,"ONE_OR_MORE":17,"ONLY_ONE":18,"NON_IDENTIFYING":19,"IDENTIFYING":20,"WORD":21,"$accept":0,"$end":1},
|
|
terminals_: {2:"error",4:"ER_DIAGRAM",6:"EOF",10:":",12:"ALPHANUM",15:"ZERO_OR_ONE",16:"ZERO_OR_MORE",17:"ONE_OR_MORE",18:"ONLY_ONE",19:"NON_IDENTIFYING",20:"IDENTIFYING",21:"WORD"},
|
|
productions_: [0,[3,3],[5,0],[5,2],[7,5],[8,1],[9,3],[13,1],[13,1],[13,1],[13,1],[14,1],[14,1],[11,1],[11,1]],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
|
/* this == yyval */
|
|
|
|
var $0 = $$.length - 1;
|
|
switch (yystate) {
|
|
case 1:
|
|
/*console.log('finished parsing');*/
|
|
break;
|
|
case 4:
|
|
|
|
yy.addEntity($$[$0-4]);
|
|
yy.addEntity($$[$0-2]);
|
|
yy.addRelationship($$[$0-4], $$[$0], $$[$0-2], $$[$0-3]);
|
|
/*console.log($$[$0-4] + $$[$0-3] + $$[$0-2] + ':' + $$[$0]);*/
|
|
|
|
break;
|
|
case 5:
|
|
this.$ = $$[$0]; /*console.log('Entity: ' + $$[$0]);*/
|
|
break;
|
|
case 6:
|
|
|
|
this.$ = { cardA: $$[$0], relType: $$[$0-1], cardB: $$[$0-2] };
|
|
/*console.log('relSpec: ' + $$[$0] + $$[$0-1] + $$[$0-2]);*/
|
|
|
|
break;
|
|
case 7:
|
|
this.$ = yy.Cardinality.ZERO_OR_ONE;
|
|
break;
|
|
case 8:
|
|
this.$ = yy.Cardinality.ZERO_OR_MORE;
|
|
break;
|
|
case 9:
|
|
this.$ = yy.Cardinality.ONE_OR_MORE;
|
|
break;
|
|
case 10:
|
|
this.$ = yy.Cardinality.ONLY_ONE;
|
|
break;
|
|
case 11:
|
|
this.$ = yy.Identification.NON_IDENTIFYING;
|
|
break;
|
|
case 12:
|
|
this.$ = yy.Identification.IDENTIFYING;
|
|
break;
|
|
case 13:
|
|
this.$ = $$[$0].replace(/"/g, '');
|
|
break;
|
|
case 14:
|
|
this.$ = $$[$0];
|
|
break;
|
|
}
|
|
},
|
|
table: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:6,12:$V1},{1:[2,1]},o($V0,[2,3]),{9:8,13:9,15:$V2,16:$V3,17:$V4,18:$V5},o([10,15,16,17,18],[2,5]),{8:14,12:$V1},{14:15,19:[1,16],20:[1,17]},o($V6,[2,7]),o($V6,[2,8]),o($V6,[2,9]),o($V6,[2,10]),{10:[1,18]},{13:19,15:$V2,16:$V3,17:$V4,18:$V5},o($V7,[2,11]),o($V7,[2,12]),{11:20,12:[1,22],21:[1,21]},{12:[2,6]},o($V0,[2,4]),o($V0,[2,13]),o($V0,[2,14])],
|
|
defaultActions: {4:[2,1],19:[2,6]},
|
|
parseError: function parseError (str, hash) {
|
|
if (hash.recoverable) {
|
|
this.trace(str);
|
|
} else {
|
|
var error = new Error(str);
|
|
error.hash = hash;
|
|
throw error;
|
|
}
|
|
},
|
|
parse: function parse(input) {
|
|
var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
var args = lstack.slice.call(arguments, 1);
|
|
var lexer = Object.create(this.lexer);
|
|
var sharedState = { yy: {} };
|
|
for (var k in this.yy) {
|
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
|
sharedState.yy[k] = this.yy[k];
|
|
}
|
|
}
|
|
lexer.setInput(input, sharedState.yy);
|
|
sharedState.yy.lexer = lexer;
|
|
sharedState.yy.parser = this;
|
|
if (typeof lexer.yylloc == 'undefined') {
|
|
lexer.yylloc = {};
|
|
}
|
|
var yyloc = lexer.yylloc;
|
|
lstack.push(yyloc);
|
|
var ranges = lexer.options && lexer.options.ranges;
|
|
if (typeof sharedState.yy.parseError === 'function') {
|
|
this.parseError = sharedState.yy.parseError;
|
|
} else {
|
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
|
}
|
|
function popStack(n) {
|
|
stack.length = stack.length - 2 * n;
|
|
vstack.length = vstack.length - n;
|
|
lstack.length = lstack.length - n;
|
|
}
|
|
function lex() {
|
|
var token;
|
|
token = tstack.pop() || lexer.lex() || EOF;
|
|
if (typeof token !== 'number') {
|
|
if (token instanceof Array) {
|
|
tstack = token;
|
|
token = tstack.pop();
|
|
}
|
|
token = self.symbols_[token] || token;
|
|
}
|
|
return token;
|
|
}
|
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
|
while (true) {
|
|
state = stack[stack.length - 1];
|
|
if (this.defaultActions[state]) {
|
|
action = this.defaultActions[state];
|
|
} else {
|
|
if (symbol === null || typeof symbol == 'undefined') {
|
|
symbol = lex();
|
|
}
|
|
action = table[state] && table[state][symbol];
|
|
}
|
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
|
var errStr = '';
|
|
expected = [];
|
|
for (p in table[state]) {
|
|
if (this.terminals_[p] && p > TERROR) {
|
|
expected.push('\'' + this.terminals_[p] + '\'');
|
|
}
|
|
}
|
|
if (lexer.showPosition) {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
|
|
} else {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
|
|
}
|
|
this.parseError(errStr, {
|
|
text: lexer.match,
|
|
token: this.terminals_[symbol] || symbol,
|
|
line: lexer.yylineno,
|
|
loc: yyloc,
|
|
expected: expected
|
|
});
|
|
}
|
|
if (action[0] instanceof Array && action.length > 1) {
|
|
throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
|
|
}
|
|
switch (action[0]) {
|
|
case 1:
|
|
stack.push(symbol);
|
|
vstack.push(lexer.yytext);
|
|
lstack.push(lexer.yylloc);
|
|
stack.push(action[1]);
|
|
symbol = null;
|
|
if (!preErrorSymbol) {
|
|
yyleng = lexer.yyleng;
|
|
yytext = lexer.yytext;
|
|
yylineno = lexer.yylineno;
|
|
yyloc = lexer.yylloc;
|
|
if (recovering > 0) {
|
|
recovering--;
|
|
}
|
|
} else {
|
|
symbol = preErrorSymbol;
|
|
preErrorSymbol = null;
|
|
}
|
|
break;
|
|
case 2:
|
|
len = this.productions_[action[1]][1];
|
|
yyval.$ = vstack[vstack.length - len];
|
|
yyval._$ = {
|
|
first_line: lstack[lstack.length - (len || 1)].first_line,
|
|
last_line: lstack[lstack.length - 1].last_line,
|
|
first_column: lstack[lstack.length - (len || 1)].first_column,
|
|
last_column: lstack[lstack.length - 1].last_column
|
|
};
|
|
if (ranges) {
|
|
yyval._$.range = [
|
|
lstack[lstack.length - (len || 1)].range[0],
|
|
lstack[lstack.length - 1].range[1]
|
|
];
|
|
}
|
|
r = this.performAction.apply(yyval, [
|
|
yytext,
|
|
yyleng,
|
|
yylineno,
|
|
sharedState.yy,
|
|
action[1],
|
|
vstack,
|
|
lstack
|
|
].concat(args));
|
|
if (typeof r !== 'undefined') {
|
|
return r;
|
|
}
|
|
if (len) {
|
|
stack = stack.slice(0, -1 * len * 2);
|
|
vstack = vstack.slice(0, -1 * len);
|
|
lstack = lstack.slice(0, -1 * len);
|
|
}
|
|
stack.push(this.productions_[action[1]][0]);
|
|
vstack.push(yyval.$);
|
|
lstack.push(yyval._$);
|
|
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
stack.push(newState);
|
|
break;
|
|
case 3:
|
|
return true;
|
|
}
|
|
}
|
|
return true;
|
|
}};
|
|
|
|
/* generated by jison-lex 0.3.4 */
|
|
var lexer = (function(){
|
|
var lexer = ({
|
|
|
|
EOF:1,
|
|
|
|
parseError:function parseError(str, hash) {
|
|
if (this.yy.parser) {
|
|
this.yy.parser.parseError(str, hash);
|
|
} else {
|
|
throw new Error(str);
|
|
}
|
|
},
|
|
|
|
// resets the lexer, sets new input
|
|
setInput:function (input, yy) {
|
|
this.yy = yy || this.yy || {};
|
|
this._input = input;
|
|
this._more = this._backtrack = this.done = false;
|
|
this.yylineno = this.yyleng = 0;
|
|
this.yytext = this.matched = this.match = '';
|
|
this.conditionStack = ['INITIAL'];
|
|
this.yylloc = {
|
|
first_line: 1,
|
|
first_column: 0,
|
|
last_line: 1,
|
|
last_column: 0
|
|
};
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [0,0];
|
|
}
|
|
this.offset = 0;
|
|
return this;
|
|
},
|
|
|
|
// consumes and returns one char from the input
|
|
input:function () {
|
|
var ch = this._input[0];
|
|
this.yytext += ch;
|
|
this.yyleng++;
|
|
this.offset++;
|
|
this.match += ch;
|
|
this.matched += ch;
|
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno++;
|
|
this.yylloc.last_line++;
|
|
} else {
|
|
this.yylloc.last_column++;
|
|
}
|
|
if (this.options.ranges) {
|
|
this.yylloc.range[1]++;
|
|
}
|
|
|
|
this._input = this._input.slice(1);
|
|
return ch;
|
|
},
|
|
|
|
// unshifts one char (or a string) into the input
|
|
unput:function (ch) {
|
|
var len = ch.length;
|
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
|
|
|
this._input = ch + this._input;
|
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
|
//this.yyleng -= len;
|
|
this.offset -= len;
|
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
|
this.match = this.match.substr(0, this.match.length - 1);
|
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
|
|
|
if (lines.length - 1) {
|
|
this.yylineno -= lines.length - 1;
|
|
}
|
|
var r = this.yylloc.range;
|
|
|
|
this.yylloc = {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: lines ?
|
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
|
this.yylloc.first_column - len
|
|
};
|
|
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
|
}
|
|
this.yyleng = this.yytext.length;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, caches matched text and appends it on next action
|
|
more:function () {
|
|
this._more = true;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
|
reject:function () {
|
|
if (this.options.backtrack_lexer) {
|
|
this._backtrack = true;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
// retain first n characters of the match
|
|
less:function (n) {
|
|
this.unput(this.match.slice(n));
|
|
},
|
|
|
|
// displays already matched input, i.e. for error messages
|
|
pastInput:function () {
|
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays upcoming input, i.e. for error messages
|
|
upcomingInput:function () {
|
|
var next = this.match;
|
|
if (next.length < 20) {
|
|
next += this._input.substr(0, 20-next.length);
|
|
}
|
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
|
showPosition:function () {
|
|
var pre = this.pastInput();
|
|
var c = new Array(pre.length + 1).join("-");
|
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
|
},
|
|
|
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
|
test_match:function(match, indexed_rule) {
|
|
var token,
|
|
lines,
|
|
backup;
|
|
|
|
if (this.options.backtrack_lexer) {
|
|
// save context
|
|
backup = {
|
|
yylineno: this.yylineno,
|
|
yylloc: {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.last_line,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: this.yylloc.last_column
|
|
},
|
|
yytext: this.yytext,
|
|
match: this.match,
|
|
matches: this.matches,
|
|
matched: this.matched,
|
|
yyleng: this.yyleng,
|
|
offset: this.offset,
|
|
_more: this._more,
|
|
_input: this._input,
|
|
yy: this.yy,
|
|
conditionStack: this.conditionStack.slice(0),
|
|
done: this.done
|
|
};
|
|
if (this.options.ranges) {
|
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
|
}
|
|
}
|
|
|
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno += lines.length;
|
|
}
|
|
this.yylloc = {
|
|
first_line: this.yylloc.last_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.last_column,
|
|
last_column: lines ?
|
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
|
this.yylloc.last_column + match[0].length
|
|
};
|
|
this.yytext += match[0];
|
|
this.match += match[0];
|
|
this.matches = match;
|
|
this.yyleng = this.yytext.length;
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
|
}
|
|
this._more = false;
|
|
this._backtrack = false;
|
|
this._input = this._input.slice(match[0].length);
|
|
this.matched += match[0];
|
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
|
if (this.done && this._input) {
|
|
this.done = false;
|
|
}
|
|
if (token) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
// recover context
|
|
for (var k in backup) {
|
|
this[k] = backup[k];
|
|
}
|
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// return next match in input
|
|
next:function () {
|
|
if (this.done) {
|
|
return this.EOF;
|
|
}
|
|
if (!this._input) {
|
|
this.done = true;
|
|
}
|
|
|
|
var token,
|
|
match,
|
|
tempMatch,
|
|
index;
|
|
if (!this._more) {
|
|
this.yytext = '';
|
|
this.match = '';
|
|
}
|
|
var rules = this._currentRules();
|
|
for (var i = 0; i < rules.length; i++) {
|
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
|
match = tempMatch;
|
|
index = i;
|
|
if (this.options.backtrack_lexer) {
|
|
token = this.test_match(tempMatch, rules[i]);
|
|
if (token !== false) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
match = false;
|
|
continue; // rule action called reject() implying a rule MISmatch.
|
|
} else {
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
} else if (!this.options.flex) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (match) {
|
|
token = this.test_match(match, rules[index]);
|
|
if (token !== false) {
|
|
return token;
|
|
}
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
if (this._input === "") {
|
|
return this.EOF;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
}
|
|
},
|
|
|
|
// return next match that has a token
|
|
lex:function lex () {
|
|
var r = this.next();
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return this.lex();
|
|
}
|
|
},
|
|
|
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
|
begin:function begin (condition) {
|
|
this.conditionStack.push(condition);
|
|
},
|
|
|
|
// pop the previously active lexer condition state off the condition stack
|
|
popState:function popState () {
|
|
var n = this.conditionStack.length - 1;
|
|
if (n > 0) {
|
|
return this.conditionStack.pop();
|
|
} else {
|
|
return this.conditionStack[0];
|
|
}
|
|
},
|
|
|
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
|
_currentRules:function _currentRules () {
|
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
|
} else {
|
|
return this.conditions["INITIAL"].rules;
|
|
}
|
|
},
|
|
|
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
|
topState:function topState (n) {
|
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
|
if (n >= 0) {
|
|
return this.conditionStack[n];
|
|
} else {
|
|
return "INITIAL";
|
|
}
|
|
},
|
|
|
|
// alias for begin(condition)
|
|
pushState:function pushState (condition) {
|
|
this.begin(condition);
|
|
},
|
|
|
|
// return the number of states currently on the stack
|
|
stateStackSize:function stateStackSize() {
|
|
return this.conditionStack.length;
|
|
},
|
|
options: {"case-insensitive":true},
|
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
|
var YYSTATE=YY_START;
|
|
switch($avoiding_name_collisions) {
|
|
case 0:/* skip whitespace */
|
|
break;
|
|
case 1:return 'SPACE';
|
|
break;
|
|
case 2:return 21;
|
|
break;
|
|
case 3:return 4;
|
|
break;
|
|
case 4:return 15;
|
|
break;
|
|
case 5:return 16;
|
|
break;
|
|
case 6:return 17;
|
|
break;
|
|
case 7:return 18;
|
|
break;
|
|
case 8:return 15;
|
|
break;
|
|
case 9:return 16;
|
|
break;
|
|
case 10:return 17;
|
|
break;
|
|
case 11:return 19;
|
|
break;
|
|
case 12:return 20;
|
|
break;
|
|
case 13:return 19;
|
|
break;
|
|
case 14:return 19;
|
|
break;
|
|
case 15:return 12;
|
|
break;
|
|
case 16:return yy_.yytext[0];
|
|
break;
|
|
case 17:return 6;
|
|
break;
|
|
}
|
|
},
|
|
rules: [/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\|o\b)/i,/^(?:\}o\b)/i,/^(?:\}\|)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z][A-Za-z0-9\-]*)/i,/^(?:.)/i,/^(?:$)/i],
|
|
conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"inclusive":true}}
|
|
});
|
|
return lexer;
|
|
})();
|
|
parser.lexer = lexer;
|
|
function Parser () {
|
|
this.yy = {};
|
|
}
|
|
Parser.prototype = parser;parser.Parser = Parser;
|
|
return new Parser;
|
|
})();
|
|
|
|
|
|
if (true) {
|
|
exports.parser = parser;
|
|
exports.Parser = parser.Parser;
|
|
exports.parse = function () { return parser.parse.apply(parser, arguments); };
|
|
exports.main = function commonjsMain (args) {
|
|
if (!args[1]) {
|
|
console.log('Usage: '+args[0]+' FILE');
|
|
process.exit(1);
|
|
}
|
|
var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
|
|
return exports.parser.parse(source);
|
|
};
|
|
if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
|
|
exports.main(process.argv.slice(1));
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js?f28c"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/flowchart/flowChartShapes.js":
|
|
/*!***************************************************!*\
|
|
!*** ./src/diagrams/flowchart/flowChartShapes.js ***!
|
|
\***************************************************/
|
|
/*! exports provided: addToRender, addToRenderV2, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addToRender", function() { return addToRender; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addToRenderV2", function() { return addToRenderV2; });
|
|
/* harmony import */ var dagre_d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dagre-d3 */ "dagre-d3");
|
|
/* harmony import */ var dagre_d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dagre_d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
|
|
|
|
function question(parent, bbox, node) {
|
|
var w = bbox.width;
|
|
var h = bbox.height;
|
|
var s = (w + h) * 0.9;
|
|
var points = [{
|
|
x: s / 2,
|
|
y: 0
|
|
}, {
|
|
x: s,
|
|
y: -s / 2
|
|
}, {
|
|
x: s / 2,
|
|
y: -s
|
|
}, {
|
|
x: 0,
|
|
y: -s / 2
|
|
}];
|
|
var shapeSvg = insertPolygonShape(parent, s, s, points);
|
|
|
|
node.intersect = function (point) {
|
|
return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function hexagon(parent, bbox, node) {
|
|
var f = 4;
|
|
var h = bbox.height;
|
|
var m = h / f;
|
|
var w = bbox.width + 2 * m;
|
|
var points = [{
|
|
x: m,
|
|
y: 0
|
|
}, {
|
|
x: w - m,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: -h / 2
|
|
}, {
|
|
x: w - m,
|
|
y: -h
|
|
}, {
|
|
x: m,
|
|
y: -h
|
|
}, {
|
|
x: 0,
|
|
y: -h / 2
|
|
}];
|
|
var shapeSvg = insertPolygonShape(parent, w, h, points);
|
|
|
|
node.intersect = function (point) {
|
|
return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function rect_left_inv_arrow(parent, bbox, node) {
|
|
var w = bbox.width;
|
|
var h = bbox.height;
|
|
var points = [{
|
|
x: -h / 2,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: -h
|
|
}, {
|
|
x: -h / 2,
|
|
y: -h
|
|
}, {
|
|
x: 0,
|
|
y: -h / 2
|
|
}];
|
|
var shapeSvg = insertPolygonShape(parent, w, h, points);
|
|
|
|
node.intersect = function (point) {
|
|
return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function lean_right(parent, bbox, node) {
|
|
var w = bbox.width;
|
|
var h = bbox.height;
|
|
var points = [{
|
|
x: -2 * h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w - h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w + 2 * h / 6,
|
|
y: -h
|
|
}, {
|
|
x: h / 6,
|
|
y: -h
|
|
}];
|
|
var shapeSvg = insertPolygonShape(parent, w, h, points);
|
|
|
|
node.intersect = function (point) {
|
|
return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function lean_left(parent, bbox, node) {
|
|
var w = bbox.width;
|
|
var h = bbox.height;
|
|
var points = [{
|
|
x: 2 * h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w + h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w - 2 * h / 6,
|
|
y: -h
|
|
}, {
|
|
x: -h / 6,
|
|
y: -h
|
|
}];
|
|
var shapeSvg = insertPolygonShape(parent, w, h, points);
|
|
|
|
node.intersect = function (point) {
|
|
return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function trapezoid(parent, bbox, node) {
|
|
var w = bbox.width;
|
|
var h = bbox.height;
|
|
var points = [{
|
|
x: -2 * h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w + 2 * h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w - h / 6,
|
|
y: -h
|
|
}, {
|
|
x: h / 6,
|
|
y: -h
|
|
}];
|
|
var shapeSvg = insertPolygonShape(parent, w, h, points);
|
|
|
|
node.intersect = function (point) {
|
|
return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function inv_trapezoid(parent, bbox, node) {
|
|
var w = bbox.width;
|
|
var h = bbox.height;
|
|
var points = [{
|
|
x: h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w - h / 6,
|
|
y: 0
|
|
}, {
|
|
x: w + 2 * h / 6,
|
|
y: -h
|
|
}, {
|
|
x: -2 * h / 6,
|
|
y: -h
|
|
}];
|
|
var shapeSvg = insertPolygonShape(parent, w, h, points);
|
|
|
|
node.intersect = function (point) {
|
|
return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function rect_right_inv_arrow(parent, bbox, node) {
|
|
var w = bbox.width;
|
|
var h = bbox.height;
|
|
var points = [{
|
|
x: 0,
|
|
y: 0
|
|
}, {
|
|
x: w + h / 2,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: -h / 2
|
|
}, {
|
|
x: w + h / 2,
|
|
y: -h
|
|
}, {
|
|
x: 0,
|
|
y: -h
|
|
}];
|
|
var shapeSvg = insertPolygonShape(parent, w, h, points);
|
|
|
|
node.intersect = function (point) {
|
|
return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function stadium(parent, bbox, node) {
|
|
var h = bbox.height;
|
|
var w = bbox.width + h / 4;
|
|
var shapeSvg = parent.insert('rect', ':first-child').attr('rx', h / 2).attr('ry', h / 2).attr('x', -w / 2).attr('y', -h / 2).attr('width', w).attr('height', h);
|
|
|
|
node.intersect = function (point) {
|
|
return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.rect(node, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function subroutine(parent, bbox, node) {
|
|
var w = bbox.width;
|
|
var h = bbox.height;
|
|
var points = [{
|
|
x: 0,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: 0
|
|
}, {
|
|
x: w,
|
|
y: -h
|
|
}, {
|
|
x: 0,
|
|
y: -h
|
|
}, {
|
|
x: 0,
|
|
y: 0
|
|
}, {
|
|
x: -8,
|
|
y: 0
|
|
}, {
|
|
x: w + 8,
|
|
y: 0
|
|
}, {
|
|
x: w + 8,
|
|
y: -h
|
|
}, {
|
|
x: -8,
|
|
y: -h
|
|
}, {
|
|
x: -8,
|
|
y: 0
|
|
}];
|
|
var shapeSvg = insertPolygonShape(parent, w, h, points);
|
|
|
|
node.intersect = function (point) {
|
|
return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function cylinder(parent, bbox, node) {
|
|
var w = bbox.width;
|
|
var rx = w / 2;
|
|
var ry = rx / (2.5 + w / 50);
|
|
var h = bbox.height + ry;
|
|
var shape = 'M 0,' + ry + ' a ' + rx + ',' + ry + ' 0,0,0 ' + w + ' 0 a ' + rx + ',' + ry + ' 0,0,0 ' + -w + ' 0 l 0,' + h + ' a ' + rx + ',' + ry + ' 0,0,0 ' + w + ' 0 l 0,' + -h;
|
|
var shapeSvg = parent.attr('label-offset-y', ry).insert('path', ':first-child').attr('d', shape).attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2 + ry) + ')');
|
|
|
|
node.intersect = function (point) {
|
|
var pos = dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.rect(node, point);
|
|
var x = pos.x - node.x;
|
|
|
|
if (rx != 0 && (Math.abs(x) < node.width / 2 || Math.abs(x) == node.width / 2 && Math.abs(pos.y - node.y) > node.height / 2 - ry)) {
|
|
// ellipsis equation: x*x / a*a + y*y / b*b = 1
|
|
// solve for y to get adjustion value for pos.y
|
|
var y = ry * ry * (1 - x * x / (rx * rx));
|
|
if (y != 0) y = Math.sqrt(y);
|
|
y = ry - y;
|
|
if (point.y - node.y > 0) y = -y;
|
|
pos.y += y;
|
|
}
|
|
|
|
return pos;
|
|
};
|
|
|
|
return shapeSvg;
|
|
}
|
|
|
|
function addToRender(render) {
|
|
render.shapes().question = question;
|
|
render.shapes().hexagon = hexagon;
|
|
render.shapes().stadium = stadium;
|
|
render.shapes().subroutine = subroutine;
|
|
render.shapes().cylinder = cylinder; // Add custom shape for box with inverted arrow on left side
|
|
|
|
render.shapes().rect_left_inv_arrow = rect_left_inv_arrow; // Add custom shape for box with inverted arrow on left side
|
|
|
|
render.shapes().lean_right = lean_right; // Add custom shape for box with inverted arrow on left side
|
|
|
|
render.shapes().lean_left = lean_left; // Add custom shape for box with inverted arrow on left side
|
|
|
|
render.shapes().trapezoid = trapezoid; // Add custom shape for box with inverted arrow on left side
|
|
|
|
render.shapes().inv_trapezoid = inv_trapezoid; // Add custom shape for box with inverted arrow on right side
|
|
|
|
render.shapes().rect_right_inv_arrow = rect_right_inv_arrow;
|
|
}
|
|
function addToRenderV2(addShape) {
|
|
addShape({
|
|
question: question
|
|
});
|
|
addShape({
|
|
hexagon: hexagon
|
|
});
|
|
addShape({
|
|
stadium: stadium
|
|
});
|
|
addShape({
|
|
subroutine: subroutine
|
|
});
|
|
addShape({
|
|
cylinder: cylinder
|
|
}); // Add custom shape for box with inverted arrow on left side
|
|
|
|
addShape({
|
|
rect_left_inv_arrow: rect_left_inv_arrow
|
|
}); // Add custom shape for box with inverted arrow on left side
|
|
|
|
addShape({
|
|
lean_right: lean_right
|
|
}); // Add custom shape for box with inverted arrow on left side
|
|
|
|
addShape({
|
|
lean_left: lean_left
|
|
}); // Add custom shape for box with inverted arrow on left side
|
|
|
|
addShape({
|
|
trapezoid: trapezoid
|
|
}); // Add custom shape for box with inverted arrow on left side
|
|
|
|
addShape({
|
|
inv_trapezoid: inv_trapezoid
|
|
}); // Add custom shape for box with inverted arrow on right side
|
|
|
|
addShape({
|
|
rect_right_inv_arrow: rect_right_inv_arrow
|
|
});
|
|
}
|
|
|
|
function insertPolygonShape(parent, w, h, points) {
|
|
return parent.insert('polygon', ':first-child').attr('points', points.map(function (d) {
|
|
return d.x + ',' + d.y;
|
|
}).join(' ')).attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');
|
|
}
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
addToRender: addToRender,
|
|
addToRenderV2: addToRenderV2
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/flowchart/flowDb.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/diagrams/flowchart/flowDb.js ***!
|
|
\******************************************/
|
|
/*! exports provided: addVertex, addSingleLink, addLink, updateLinkInterpolate, updateLink, addClass, setDirection, setClass, setLink, getTooltip, setClickEvent, bindFunctions, getDirection, getVertices, getEdges, getClasses, clear, defaultStyle, addSubGraph, getDepthFirstPos, indexNodes, getSubGraphs, firstGraph, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addVertex", function() { return addVertex; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSingleLink", function() { return addSingleLink; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addLink", function() { return addLink; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateLinkInterpolate", function() { return updateLinkInterpolate; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateLink", function() { return updateLink; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addClass", function() { return addClass; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setDirection", function() { return setDirection; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setClass", function() { return setClass; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLink", function() { return setLink; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTooltip", function() { return getTooltip; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setClickEvent", function() { return setClickEvent; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindFunctions", function() { return bindFunctions; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDirection", function() { return getDirection; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVertices", function() { return getVertices; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEdges", function() { return getEdges; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClasses", function() { return getClasses; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultStyle", function() { return defaultStyle; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSubGraph", function() { return addSubGraph; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDepthFirstPos", function() { return getDepthFirstPos; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "indexNodes", function() { return indexNodes; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSubGraphs", function() { return getSubGraphs; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "firstGraph", function() { return firstGraph; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
|
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
|
|
|
|
// eslint-disable-line
|
|
|
|
|
|
|
|
// const MERMAID_DOM_ID_PREFIX = 'mermaid-dom-id-';
|
|
|
|
var MERMAID_DOM_ID_PREFIX = '';
|
|
var config = Object(_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"])();
|
|
var vertices = {};
|
|
var edges = [];
|
|
var classes = [];
|
|
var subGraphs = [];
|
|
var subGraphLookup = {};
|
|
var tooltips = {};
|
|
var subCount = 0;
|
|
var firstGraphFlag = true;
|
|
var direction; // Functions to be run after graph rendering
|
|
|
|
var funs = [];
|
|
/**
|
|
* Function called by parser when a node definition has been found
|
|
* @param id
|
|
* @param text
|
|
* @param type
|
|
* @param style
|
|
* @param classes
|
|
*/
|
|
|
|
var addVertex = function addVertex(_id, text, type, style, classes) {
|
|
var txt;
|
|
var id = _id;
|
|
|
|
if (typeof id === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
if (id.trim().length === 0) {
|
|
return;
|
|
}
|
|
|
|
if (id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
|
|
|
|
if (typeof vertices[id] === 'undefined') {
|
|
vertices[id] = {
|
|
id: id,
|
|
styles: [],
|
|
classes: []
|
|
};
|
|
}
|
|
|
|
if (typeof text !== 'undefined') {
|
|
txt = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].sanitizeText(text.trim(), config); // strip quotes if string starts and ends with a quote
|
|
|
|
if (txt[0] === '"' && txt[txt.length - 1] === '"') {
|
|
txt = txt.substring(1, txt.length - 1);
|
|
}
|
|
|
|
vertices[id].text = txt;
|
|
} else {
|
|
if (typeof vertices[id].text === 'undefined') {
|
|
vertices[id].text = _id;
|
|
}
|
|
}
|
|
|
|
if (typeof type !== 'undefined') {
|
|
vertices[id].type = type;
|
|
}
|
|
|
|
if (typeof style !== 'undefined') {
|
|
if (style !== null) {
|
|
style.forEach(function (s) {
|
|
vertices[id].styles.push(s);
|
|
});
|
|
}
|
|
}
|
|
|
|
if (typeof classes !== 'undefined') {
|
|
if (classes !== null) {
|
|
classes.forEach(function (s) {
|
|
vertices[id].classes.push(s);
|
|
});
|
|
}
|
|
}
|
|
};
|
|
/**
|
|
* Function called by parser when a link/edge definition has been found
|
|
* @param start
|
|
* @param end
|
|
* @param type
|
|
* @param linktext
|
|
*/
|
|
|
|
var addSingleLink = function addSingleLink(_start, _end, type, linktext) {
|
|
var start = _start;
|
|
var end = _end;
|
|
if (start[0].match(/\d/)) start = MERMAID_DOM_ID_PREFIX + start;
|
|
if (end[0].match(/\d/)) end = MERMAID_DOM_ID_PREFIX + end; // logger.info('Got edge...', start, end);
|
|
|
|
var edge = {
|
|
start: start,
|
|
end: end,
|
|
type: undefined,
|
|
text: ''
|
|
};
|
|
linktext = type.text;
|
|
|
|
if (typeof linktext !== 'undefined') {
|
|
edge.text = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].sanitizeText(linktext.trim(), config); // strip quotes if string starts and exnds with a quote
|
|
|
|
if (edge.text[0] === '"' && edge.text[edge.text.length - 1] === '"') {
|
|
edge.text = edge.text.substring(1, edge.text.length - 1);
|
|
}
|
|
}
|
|
|
|
if (typeof type !== 'undefined') {
|
|
edge.type = type.type;
|
|
edge.stroke = type.stroke;
|
|
}
|
|
|
|
edges.push(edge);
|
|
};
|
|
var addLink = function addLink(_start, _end, type, linktext) {
|
|
var i, j;
|
|
|
|
for (i = 0; i < _start.length; i++) {
|
|
for (j = 0; j < _end.length; j++) {
|
|
addSingleLink(_start[i], _end[j], type, linktext);
|
|
}
|
|
}
|
|
};
|
|
/**
|
|
* Updates a link's line interpolation algorithm
|
|
* @param pos
|
|
* @param interpolate
|
|
*/
|
|
|
|
var updateLinkInterpolate = function updateLinkInterpolate(positions, interp) {
|
|
positions.forEach(function (pos) {
|
|
if (pos === 'default') {
|
|
edges.defaultInterpolate = interp;
|
|
} else {
|
|
edges[pos].interpolate = interp;
|
|
}
|
|
});
|
|
};
|
|
/**
|
|
* Updates a link with a style
|
|
* @param pos
|
|
* @param style
|
|
*/
|
|
|
|
var updateLink = function updateLink(positions, style) {
|
|
positions.forEach(function (pos) {
|
|
if (pos === 'default') {
|
|
edges.defaultStyle = style;
|
|
} else {
|
|
if (_utils__WEBPACK_IMPORTED_MODULE_2__["default"].isSubstringInArray('fill', style) === -1) {
|
|
style.push('fill:none');
|
|
}
|
|
|
|
edges[pos].style = style;
|
|
}
|
|
});
|
|
};
|
|
var addClass = function addClass(id, style) {
|
|
if (typeof classes[id] === 'undefined') {
|
|
classes[id] = {
|
|
id: id,
|
|
styles: [],
|
|
textStyles: []
|
|
};
|
|
}
|
|
|
|
if (typeof style !== 'undefined') {
|
|
if (style !== null) {
|
|
style.forEach(function (s) {
|
|
if (s.match('color')) {
|
|
var newStyle1 = s.replace('fill', 'bgFill');
|
|
var newStyle2 = newStyle1.replace('color', 'fill');
|
|
classes[id].textStyles.push(newStyle2);
|
|
}
|
|
|
|
classes[id].styles.push(s);
|
|
});
|
|
}
|
|
}
|
|
};
|
|
/**
|
|
* Called by parser when a graph definition is found, stores the direction of the chart.
|
|
* @param dir
|
|
*/
|
|
|
|
var setDirection = function setDirection(dir) {
|
|
direction = dir;
|
|
|
|
if (direction.match(/.*</)) {
|
|
direction = 'RL';
|
|
}
|
|
|
|
if (direction.match(/.*\^/)) {
|
|
direction = 'BT';
|
|
}
|
|
|
|
if (direction.match(/.*>/)) {
|
|
direction = 'LR';
|
|
}
|
|
|
|
if (direction.match(/.*v/)) {
|
|
direction = 'TB';
|
|
}
|
|
};
|
|
/**
|
|
* Called by parser when a special node is found, e.g. a clickable element.
|
|
* @param ids Comma separated list of ids
|
|
* @param className Class to add
|
|
*/
|
|
|
|
var setClass = function setClass(ids, className) {
|
|
ids.split(',').forEach(function (_id) {
|
|
var id = _id;
|
|
if (_id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
|
|
|
|
if (typeof vertices[id] !== 'undefined') {
|
|
vertices[id].classes.push(className);
|
|
}
|
|
|
|
if (typeof subGraphLookup[id] !== 'undefined') {
|
|
subGraphLookup[id].classes.push(className);
|
|
}
|
|
});
|
|
};
|
|
|
|
var setTooltip = function setTooltip(ids, tooltip) {
|
|
ids.split(',').forEach(function (id) {
|
|
if (typeof tooltip !== 'undefined') {
|
|
tooltips[id] = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].sanitizeText(tooltip, config);
|
|
}
|
|
});
|
|
};
|
|
|
|
var setClickFun = function setClickFun(_id, functionName) {
|
|
var id = _id;
|
|
if (_id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
|
|
|
|
if (config.securityLevel !== 'loose') {
|
|
return;
|
|
}
|
|
|
|
if (typeof functionName === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
if (typeof vertices[id] !== 'undefined') {
|
|
funs.push(function () {
|
|
var elem = document.querySelector("[id=\"".concat(id, "\"]"));
|
|
|
|
if (elem !== null) {
|
|
elem.addEventListener('click', function () {
|
|
window[functionName](id);
|
|
}, false);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
/**
|
|
* Called by parser when a link is found. Adds the URL to the vertex data.
|
|
* @param ids Comma separated list of ids
|
|
* @param linkStr URL to create a link for
|
|
* @param tooltip Tooltip for the clickable element
|
|
*/
|
|
|
|
|
|
var setLink = function setLink(ids, linkStr, tooltip) {
|
|
ids.split(',').forEach(function (_id) {
|
|
var id = _id;
|
|
if (_id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
|
|
|
|
if (typeof vertices[id] !== 'undefined') {
|
|
vertices[id].link = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].formatUrl(linkStr, config);
|
|
}
|
|
});
|
|
setTooltip(ids, tooltip);
|
|
setClass(ids, 'clickable');
|
|
};
|
|
var getTooltip = function getTooltip(id) {
|
|
return tooltips[id];
|
|
};
|
|
/**
|
|
* Called by parser when a click definition is found. Registers an event handler.
|
|
* @param ids Comma separated list of ids
|
|
* @param functionName Function to be called on click
|
|
* @param tooltip Tooltip for the clickable element
|
|
*/
|
|
|
|
var setClickEvent = function setClickEvent(ids, functionName, tooltip) {
|
|
ids.split(',').forEach(function (id) {
|
|
setClickFun(id, functionName);
|
|
});
|
|
setTooltip(ids, tooltip);
|
|
setClass(ids, 'clickable');
|
|
};
|
|
var bindFunctions = function bindFunctions(element) {
|
|
funs.forEach(function (fun) {
|
|
fun(element);
|
|
});
|
|
};
|
|
var getDirection = function getDirection() {
|
|
return direction.trim();
|
|
};
|
|
/**
|
|
* Retrieval function for fetching the found nodes after parsing has completed.
|
|
* @returns {{}|*|vertices}
|
|
*/
|
|
|
|
var getVertices = function getVertices() {
|
|
return vertices;
|
|
};
|
|
/**
|
|
* Retrieval function for fetching the found links after parsing has completed.
|
|
* @returns {{}|*|edges}
|
|
*/
|
|
|
|
var getEdges = function getEdges() {
|
|
return edges;
|
|
};
|
|
/**
|
|
* Retrieval function for fetching the found class definitions after parsing has completed.
|
|
* @returns {{}|*|classes}
|
|
*/
|
|
|
|
var getClasses = function getClasses() {
|
|
return classes;
|
|
};
|
|
|
|
var setupToolTips = function setupToolTips(element) {
|
|
var tooltipElem = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('.mermaidTooltip');
|
|
|
|
if ((tooltipElem._groups || tooltipElem)[0][0] === null) {
|
|
tooltipElem = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('body').append('div').attr('class', 'mermaidTooltip').style('opacity', 0);
|
|
}
|
|
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(element).select('svg');
|
|
var nodes = svg.selectAll('g.node');
|
|
nodes.on('mouseover', function () {
|
|
var el = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(this);
|
|
var title = el.attr('title'); // Dont try to draw a tooltip if no data is provided
|
|
|
|
if (title === null) {
|
|
return;
|
|
}
|
|
|
|
var rect = this.getBoundingClientRect();
|
|
tooltipElem.transition().duration(200).style('opacity', '.9');
|
|
tooltipElem.html(el.attr('title')).style('left', rect.left + (rect.right - rect.left) / 2 + 'px').style('top', rect.top - 14 + document.body.scrollTop + 'px');
|
|
el.classed('hover', true);
|
|
}).on('mouseout', function () {
|
|
tooltipElem.transition().duration(500).style('opacity', 0);
|
|
var el = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(this);
|
|
el.classed('hover', false);
|
|
});
|
|
};
|
|
|
|
funs.push(setupToolTips);
|
|
/**
|
|
* Clears the internal graph db so that a new graph can be parsed.
|
|
*/
|
|
|
|
var clear = function clear() {
|
|
vertices = {};
|
|
classes = {};
|
|
edges = [];
|
|
funs = [];
|
|
funs.push(setupToolTips);
|
|
subGraphs = [];
|
|
subGraphLookup = {};
|
|
subCount = 0;
|
|
tooltips = [];
|
|
firstGraphFlag = true;
|
|
};
|
|
/**
|
|
*
|
|
* @returns {string}
|
|
*/
|
|
|
|
var defaultStyle = function defaultStyle() {
|
|
return 'fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;';
|
|
};
|
|
/**
|
|
* Clears the internal graph db so that a new graph can be parsed.
|
|
*/
|
|
|
|
var addSubGraph = function addSubGraph(_id, list, _title) {
|
|
var id = _id.trim();
|
|
|
|
var title = _title;
|
|
|
|
if (_id === _title && _title.match(/\s/)) {
|
|
id = undefined;
|
|
}
|
|
|
|
function uniq(a) {
|
|
var prims = {
|
|
boolean: {},
|
|
number: {},
|
|
string: {}
|
|
};
|
|
var objs = [];
|
|
return a.filter(function (item) {
|
|
var type = _typeof(item);
|
|
|
|
if (item.trim() === '') {
|
|
return false;
|
|
}
|
|
|
|
if (type in prims) {
|
|
return prims[type].hasOwnProperty(item) ? false : prims[type][item] = true; // eslint-disable-line
|
|
} else {
|
|
return objs.indexOf(item) >= 0 ? false : objs.push(item);
|
|
}
|
|
});
|
|
}
|
|
|
|
var nodeList = [];
|
|
nodeList = uniq(nodeList.concat.apply(nodeList, list));
|
|
|
|
for (var i = 0; i < nodeList.length; i++) {
|
|
if (nodeList[i][0].match(/\d/)) nodeList[i] = MERMAID_DOM_ID_PREFIX + nodeList[i];
|
|
}
|
|
|
|
id = id || 'subGraph' + subCount;
|
|
if (id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
|
|
title = title || '';
|
|
title = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].sanitizeText(title, config);
|
|
subCount = subCount + 1;
|
|
var subGraph = {
|
|
id: id,
|
|
nodes: nodeList,
|
|
title: title.trim(),
|
|
classes: []
|
|
};
|
|
subGraphs.push(subGraph);
|
|
subGraphLookup[id] = subGraph;
|
|
return id;
|
|
};
|
|
|
|
var getPosForId = function getPosForId(id) {
|
|
for (var i = 0; i < subGraphs.length; i++) {
|
|
if (subGraphs[i].id === id) {
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
};
|
|
|
|
var secCount = -1;
|
|
var posCrossRef = [];
|
|
|
|
var indexNodes2 = function indexNodes2(id, pos) {
|
|
var nodes = subGraphs[pos].nodes;
|
|
secCount = secCount + 1;
|
|
|
|
if (secCount > 2000) {
|
|
return;
|
|
}
|
|
|
|
posCrossRef[secCount] = pos; // Check if match
|
|
|
|
if (subGraphs[pos].id === id) {
|
|
return {
|
|
result: true,
|
|
count: 0
|
|
};
|
|
}
|
|
|
|
var count = 0;
|
|
var posCount = 1;
|
|
|
|
while (count < nodes.length) {
|
|
var childPos = getPosForId(nodes[count]); // Ignore regular nodes (pos will be -1)
|
|
|
|
if (childPos >= 0) {
|
|
var res = indexNodes2(id, childPos);
|
|
|
|
if (res.result) {
|
|
return {
|
|
result: true,
|
|
count: posCount + res.count
|
|
};
|
|
} else {
|
|
posCount = posCount + res.count;
|
|
}
|
|
}
|
|
|
|
count = count + 1;
|
|
}
|
|
|
|
return {
|
|
result: false,
|
|
count: posCount
|
|
};
|
|
};
|
|
|
|
var getDepthFirstPos = function getDepthFirstPos(pos) {
|
|
return posCrossRef[pos];
|
|
};
|
|
var indexNodes = function indexNodes() {
|
|
secCount = -1;
|
|
|
|
if (subGraphs.length > 0) {
|
|
indexNodes2('none', subGraphs.length - 1, 0);
|
|
}
|
|
};
|
|
var getSubGraphs = function getSubGraphs() {
|
|
return subGraphs;
|
|
};
|
|
var firstGraph = function firstGraph() {
|
|
if (firstGraphFlag) {
|
|
firstGraphFlag = false;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
var destructStartLink = function destructStartLink(_str) {
|
|
var str = _str.trim();
|
|
|
|
switch (str) {
|
|
case '<--':
|
|
return {
|
|
type: 'arrow_point',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case 'x--':
|
|
return {
|
|
type: 'arrow_cross',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case 'o--':
|
|
return {
|
|
type: 'arrow_circle',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case '<-.':
|
|
return {
|
|
type: 'arrow_point',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case 'x-.':
|
|
return {
|
|
type: 'arrow_cross',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case 'o-.':
|
|
return {
|
|
type: 'arrow_circle',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '<==':
|
|
return {
|
|
type: 'arrow_point',
|
|
stroke: 'thick'
|
|
};
|
|
|
|
case 'x==':
|
|
return {
|
|
type: 'arrow_cross',
|
|
stroke: 'thick'
|
|
};
|
|
|
|
case 'o==':
|
|
return {
|
|
type: 'arrow_circle',
|
|
stroke: 'thick'
|
|
};
|
|
|
|
case '--':
|
|
return {
|
|
type: 'arrow_open',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case '==':
|
|
return {
|
|
type: 'arrow_open',
|
|
stroke: 'thick'
|
|
};
|
|
|
|
case '-.':
|
|
return {
|
|
type: 'arrow_open',
|
|
stroke: 'dotted'
|
|
};
|
|
}
|
|
};
|
|
|
|
var destructEndLink = function destructEndLink(_str) {
|
|
var str = _str.trim();
|
|
|
|
switch (str) {
|
|
case '--x':
|
|
return {
|
|
type: 'arrow_cross',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case '-->':
|
|
return {
|
|
type: 'arrow_point',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case '<-->':
|
|
return {
|
|
type: 'double_arrow_point',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case 'x--x':
|
|
return {
|
|
type: 'double_arrow_cross',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case 'o--o':
|
|
return {
|
|
type: 'double_arrow_circle',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case 'o.-o':
|
|
return {
|
|
type: 'double_arrow_circle',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '<==>':
|
|
return {
|
|
type: 'double_arrow_point',
|
|
stroke: 'thick'
|
|
};
|
|
|
|
case 'o==o':
|
|
return {
|
|
type: 'double_arrow_circle',
|
|
stroke: 'thick'
|
|
};
|
|
|
|
case 'x==x':
|
|
return {
|
|
type: 'double_arrow_cross',
|
|
stroke: 'thick'
|
|
};
|
|
|
|
case 'x.-x':
|
|
return {
|
|
type: 'double_arrow_cross',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case 'x-.-x':
|
|
return {
|
|
type: 'double_arrow_cross',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '<.->':
|
|
return {
|
|
type: 'double_arrow_point',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '<-.->':
|
|
return {
|
|
type: 'double_arrow_point',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case 'o-.-o':
|
|
return {
|
|
type: 'double_arrow_circle',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '--o':
|
|
return {
|
|
type: 'arrow_circle',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case '---':
|
|
return {
|
|
type: 'arrow_open',
|
|
stroke: 'normal'
|
|
};
|
|
|
|
case '-.-x':
|
|
return {
|
|
type: 'arrow_cross',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '-.->':
|
|
return {
|
|
type: 'arrow_point',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '-.-o':
|
|
return {
|
|
type: 'arrow_circle',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '-.-':
|
|
return {
|
|
type: 'arrow_open',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '.-x':
|
|
return {
|
|
type: 'arrow_cross',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '.->':
|
|
return {
|
|
type: 'arrow_point',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '.-o':
|
|
return {
|
|
type: 'arrow_circle',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '.-':
|
|
return {
|
|
type: 'arrow_open',
|
|
stroke: 'dotted'
|
|
};
|
|
|
|
case '==x':
|
|
return {
|
|
type: 'arrow_cross',
|
|
stroke: 'thick'
|
|
};
|
|
|
|
case '==>':
|
|
return {
|
|
type: 'arrow_point',
|
|
stroke: 'thick'
|
|
};
|
|
|
|
case '==o':
|
|
return {
|
|
type: 'arrow_circle',
|
|
stroke: 'thick'
|
|
};
|
|
|
|
case '===':
|
|
return {
|
|
type: 'arrow_open',
|
|
stroke: 'thick'
|
|
};
|
|
}
|
|
};
|
|
|
|
var destructLink = function destructLink(_str, _startStr) {
|
|
var info = destructEndLink(_str);
|
|
var startInfo;
|
|
|
|
if (_startStr) {
|
|
startInfo = destructStartLink(_startStr);
|
|
|
|
if (startInfo.stroke !== info.stroke) {
|
|
return {
|
|
type: 'INVALID',
|
|
stroke: 'INVALID'
|
|
};
|
|
}
|
|
|
|
if (startInfo.type === 'arrow_open') {
|
|
// -- xyz --> - take arrow type form ending
|
|
startInfo.type = info.type;
|
|
} else {
|
|
// x-- xyz --> - not supported
|
|
if (startInfo.type !== info.type) return {
|
|
type: 'INVALID',
|
|
stroke: 'INVALID'
|
|
};
|
|
startInfo.type = 'double_' + startInfo.type;
|
|
}
|
|
|
|
if (startInfo.type === 'double_arrow') {
|
|
startInfo.type = 'double_arrow_point';
|
|
}
|
|
|
|
return startInfo;
|
|
}
|
|
|
|
return info;
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
addVertex: addVertex,
|
|
addLink: addLink,
|
|
updateLinkInterpolate: updateLinkInterpolate,
|
|
updateLink: updateLink,
|
|
addClass: addClass,
|
|
setDirection: setDirection,
|
|
setClass: setClass,
|
|
getTooltip: getTooltip,
|
|
setClickEvent: setClickEvent,
|
|
setLink: setLink,
|
|
bindFunctions: bindFunctions,
|
|
getDirection: getDirection,
|
|
getVertices: getVertices,
|
|
getEdges: getEdges,
|
|
getClasses: getClasses,
|
|
clear: clear,
|
|
defaultStyle: defaultStyle,
|
|
addSubGraph: addSubGraph,
|
|
getDepthFirstPos: getDepthFirstPos,
|
|
indexNodes: indexNodes,
|
|
getSubGraphs: getSubGraphs,
|
|
destructLink: destructLink,
|
|
lex: {
|
|
firstGraph: firstGraph
|
|
}
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/flowchart/flowRenderer-v2.js":
|
|
/*!***************************************************!*\
|
|
!*** ./src/diagrams/flowchart/flowRenderer-v2.js ***!
|
|
\***************************************************/
|
|
/*! exports provided: setConf, addVertices, addEdges, getClasses, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addVertices", function() { return addVertices; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addEdges", function() { return addEdges; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClasses", function() { return getClasses; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! graphlib */ "graphlib");
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _flowDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./flowDb */ "./src/diagrams/flowchart/flowDb.js");
|
|
/* harmony import */ var _parser_flow__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser/flow */ "./src/diagrams/flowchart/parser/flow.jison");
|
|
/* harmony import */ var _parser_flow__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser_flow__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
|
/* harmony import */ var _dagre_wrapper_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../dagre-wrapper/index.js */ "./src/dagre-wrapper/index.js");
|
|
/* harmony import */ var dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! dagre-d3/lib/label/add-html-label.js */ "dagre-d3/lib/label/add-html-label.js");
|
|
/* harmony import */ var dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var conf = {};
|
|
var setConf = function setConf(cnf) {
|
|
var keys = Object.keys(cnf);
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
conf[keys[i]] = cnf[keys[i]];
|
|
}
|
|
};
|
|
/**
|
|
* Function that adds the vertices found during parsing to the graph to be rendered.
|
|
* @param vert Object containing the vertices.
|
|
* @param g The graph that is to be drawn.
|
|
*/
|
|
|
|
var addVertices = function addVertices(vert, g, svgId) {
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(svgId, "\"]"));
|
|
var keys = Object.keys(vert); // Iterate through each item in the vertex object (containing all the vertices found) in the graph definition
|
|
|
|
keys.forEach(function (id) {
|
|
var vertex = vert[id];
|
|
/**
|
|
* Variable for storing the classes for the vertex
|
|
* @type {string}
|
|
*/
|
|
|
|
var classStr = 'default';
|
|
|
|
if (vertex.classes.length > 0) {
|
|
classStr = vertex.classes.join(' ');
|
|
}
|
|
|
|
var styles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(vertex.styles); // Use vertex id as text in the box if no text is provided by the graph definition
|
|
|
|
var vertexText = vertex.text !== undefined ? vertex.text : vertex.id; // We create a SVG label, either by delegating to addHtmlLabel or manually
|
|
|
|
var vertexNode;
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
|
|
// TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?
|
|
var node = {
|
|
label: vertexText.replace(/fa[lrsb]?:fa-[\w-]+/g, function (s) {
|
|
return "<i class='".concat(s.replace(':', ' '), "'></i>");
|
|
})
|
|
};
|
|
vertexNode = dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6___default()(svg, node).node();
|
|
vertexNode.parentNode.removeChild(vertexNode);
|
|
} else {
|
|
var svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));
|
|
var rows = vertexText.split(_common_common__WEBPACK_IMPORTED_MODULE_8__["default"].lineBreakRegex);
|
|
|
|
for (var j = 0; j < rows.length; j++) {
|
|
var tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
|
|
tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
|
|
tspan.setAttribute('dy', '1em');
|
|
tspan.setAttribute('x', '1');
|
|
tspan.textContent = rows[j];
|
|
svgLabel.appendChild(tspan);
|
|
}
|
|
|
|
vertexNode = svgLabel;
|
|
}
|
|
|
|
var radious = 0;
|
|
var _shape = ''; // Set the shape based parameters
|
|
|
|
switch (vertex.type) {
|
|
case 'round':
|
|
radious = 5;
|
|
_shape = 'rect';
|
|
break;
|
|
|
|
case 'square':
|
|
_shape = 'rect';
|
|
break;
|
|
|
|
case 'diamond':
|
|
_shape = 'question';
|
|
break;
|
|
|
|
case 'hexagon':
|
|
_shape = 'hexagon';
|
|
break;
|
|
|
|
case 'odd':
|
|
_shape = 'rect_left_inv_arrow';
|
|
break;
|
|
|
|
case 'lean_right':
|
|
_shape = 'lean_right';
|
|
break;
|
|
|
|
case 'lean_left':
|
|
_shape = 'lean_left';
|
|
break;
|
|
|
|
case 'trapezoid':
|
|
_shape = 'trapezoid';
|
|
break;
|
|
|
|
case 'inv_trapezoid':
|
|
_shape = 'inv_trapezoid';
|
|
break;
|
|
|
|
case 'odd_right':
|
|
_shape = 'rect_left_inv_arrow';
|
|
break;
|
|
|
|
case 'circle':
|
|
_shape = 'circle';
|
|
break;
|
|
|
|
case 'ellipse':
|
|
_shape = 'ellipse';
|
|
break;
|
|
|
|
case 'stadium':
|
|
_shape = 'stadium';
|
|
break;
|
|
|
|
case 'subroutine':
|
|
_shape = 'subroutine';
|
|
break;
|
|
|
|
case 'cylinder':
|
|
_shape = 'cylinder';
|
|
break;
|
|
|
|
case 'group':
|
|
_shape = 'rect';
|
|
break;
|
|
|
|
default:
|
|
_shape = 'rect';
|
|
} // Add the node
|
|
|
|
|
|
g.setNode(vertex.id, {
|
|
labelStyle: styles.labelStyle,
|
|
shape: _shape,
|
|
labelText: vertexText,
|
|
rx: radious,
|
|
ry: radious,
|
|
class: classStr,
|
|
style: styles.style,
|
|
id: vertex.id,
|
|
width: vertex.type === 'group' ? 500 : undefined,
|
|
type: vertex.type,
|
|
padding: Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.padding
|
|
});
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('setNode', {
|
|
labelStyle: styles.labelStyle,
|
|
shape: _shape,
|
|
labelText: vertexText,
|
|
rx: radious,
|
|
ry: radious,
|
|
class: classStr,
|
|
style: styles.style,
|
|
id: vertex.id,
|
|
width: vertex.type === 'group' ? 500 : undefined,
|
|
type: vertex.type,
|
|
padding: Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.padding
|
|
});
|
|
});
|
|
};
|
|
/**
|
|
* Add edges to graph based on parsed graph defninition
|
|
* @param {Object} edges The edges to add to the graph
|
|
* @param {Object} g The graph object
|
|
*/
|
|
|
|
var addEdges = function addEdges(edges, g) {
|
|
var cnt = 0;
|
|
var defaultStyle;
|
|
var defaultLabelStyle;
|
|
|
|
if (typeof edges.defaultStyle !== 'undefined') {
|
|
var defaultStyles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(edges.defaultStyle);
|
|
defaultStyle = defaultStyles.style;
|
|
defaultLabelStyle = defaultStyles.labelStyle;
|
|
}
|
|
|
|
edges.forEach(function (edge) {
|
|
cnt++;
|
|
var edgeData = {};
|
|
edgeData.id = 'id' + cnt; // Set link type for rendering
|
|
|
|
if (edge.type === 'arrow_open') {
|
|
edgeData.arrowhead = 'none';
|
|
} else {
|
|
edgeData.arrowhead = 'normal';
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info(edgeData, edge);
|
|
edgeData.arrowType = edge.type;
|
|
var style = '';
|
|
var labelStyle = '';
|
|
|
|
if (typeof edge.style !== 'undefined') {
|
|
var styles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(edge.style);
|
|
style = styles.style;
|
|
labelStyle = styles.labelStyle;
|
|
} else {
|
|
switch (edge.stroke) {
|
|
case 'normal':
|
|
style = 'fill:none';
|
|
|
|
if (typeof defaultStyle !== 'undefined') {
|
|
style = defaultStyle;
|
|
}
|
|
|
|
if (typeof defaultLabelStyle !== 'undefined') {
|
|
labelStyle = defaultLabelStyle;
|
|
}
|
|
|
|
break;
|
|
|
|
case 'dotted':
|
|
style = 'fill:none;stroke-width:2px;stroke-dasharray:3;';
|
|
break;
|
|
|
|
case 'thick':
|
|
style = ' stroke-width: 3.5px;fill:none';
|
|
break;
|
|
}
|
|
}
|
|
|
|
edgeData.style = style;
|
|
edgeData.labelStyle = labelStyle;
|
|
|
|
if (typeof edge.interpolate !== 'undefined') {
|
|
edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(edge.interpolate, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
|
|
} else if (typeof edges.defaultInterpolate !== 'undefined') {
|
|
edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(edges.defaultInterpolate, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
|
|
} else {
|
|
edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(conf.curve, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
|
|
}
|
|
|
|
if (typeof edge.text === 'undefined') {
|
|
if (typeof edge.style !== 'undefined') {
|
|
edgeData.arrowheadStyle = 'fill: #333';
|
|
}
|
|
} else {
|
|
edgeData.arrowheadStyle = 'fill: #333';
|
|
edgeData.labelpos = 'c';
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels && false) {
|
|
// eslint-disable-line
|
|
edgeData.labelType = 'html';
|
|
edgeData.label = '<span class="edgeLabel">' + edge.text + '</span>';
|
|
} else {
|
|
edgeData.labelType = 'text';
|
|
edgeData.label = edge.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_8__["default"].lineBreakRegex, '\n');
|
|
|
|
if (typeof edge.style === 'undefined') {
|
|
edgeData.style = edgeData.style || 'stroke: #333; stroke-width: 1.5px;fill:none';
|
|
}
|
|
|
|
edgeData.labelStyle = edgeData.labelStyle.replace('color:', 'fill:');
|
|
}
|
|
} // Add the edge to the graph
|
|
|
|
|
|
g.setEdge(edge.start, edge.end, edgeData, cnt);
|
|
});
|
|
};
|
|
/**
|
|
* Returns the all the styles from classDef statements in the graph definition.
|
|
* @returns {object} classDef styles
|
|
*/
|
|
|
|
var getClasses = function getClasses(text) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Extracting classes');
|
|
_flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
|
|
var parser = _parser_flow__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
|
|
parser.yy = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
|
|
|
|
parser.parse(text);
|
|
return _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getClasses();
|
|
};
|
|
/**
|
|
* Draws a flowchart in the tag with id: id based on the graph definition in text.
|
|
* @param text
|
|
* @param id
|
|
*/
|
|
|
|
var draw = function draw(text, id) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Drawing flowchart');
|
|
_flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
|
|
var parser = _parser_flow__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
|
|
parser.yy = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
|
|
|
|
try {
|
|
parser.parse(text);
|
|
} catch (err) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].debug('Parsing failed');
|
|
} // Fetch the default direction, use TD if none was found
|
|
|
|
|
|
var dir = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getDirection();
|
|
|
|
if (typeof dir === 'undefined') {
|
|
dir = 'TD';
|
|
}
|
|
|
|
var conf = Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart;
|
|
var nodeSpacing = conf.nodeSpacing || 50;
|
|
var rankSpacing = conf.rankSpacing || 50; // Create the input mermaid.graph
|
|
|
|
var g = new graphlib__WEBPACK_IMPORTED_MODULE_0___default.a.Graph({
|
|
multigraph: true,
|
|
compound: true
|
|
}).setGraph({
|
|
rankdir: dir,
|
|
nodesep: nodeSpacing,
|
|
ranksep: rankSpacing,
|
|
marginx: 8,
|
|
marginy: 8
|
|
}).setDefaultEdgeLabel(function () {
|
|
return {};
|
|
});
|
|
var subG;
|
|
var subGraphs = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getSubGraphs();
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Subgraphs - ', subGraphs);
|
|
|
|
for (var _i = subGraphs.length - 1; _i >= 0; _i--) {
|
|
subG = subGraphs[_i];
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Subgraph - ', subG);
|
|
_flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].addVertex(subG.id, subG.title, 'group', undefined, subG.classes);
|
|
} // Fetch the verices/nodes and edges/links from the parsed graph definition
|
|
|
|
|
|
var vert = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getVertices();
|
|
var edges = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getEdges();
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info(edges);
|
|
var i = 0;
|
|
|
|
for (i = subGraphs.length - 1; i >= 0; i--) {
|
|
subG = subGraphs[i];
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_1__["selectAll"])('cluster').append('text');
|
|
|
|
for (var j = 0; j < subG.nodes.length; j++) {
|
|
g.setParent(subG.nodes[j], subG.id);
|
|
}
|
|
}
|
|
|
|
addVertices(vert, g, id);
|
|
addEdges(edges, g); // Add custom shapes
|
|
// flowChartShapes.addToRenderV2(addShape);
|
|
// Set up an SVG group so that we can translate the final graph.
|
|
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(id, "\"]")); // Run the renderer. This is what draws the final graph.
|
|
|
|
var element = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#' + id + ' g');
|
|
Object(_dagre_wrapper_index_js__WEBPACK_IMPORTED_MODULE_5__["render"])(element, g, ['point', 'circle', 'cross'], 'flowchart', id); // dagre.layout(g);
|
|
|
|
element.selectAll('g.node').attr('title', function () {
|
|
return _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getTooltip(this.id);
|
|
});
|
|
var padding = 8;
|
|
var svgBounds = svg.node().getBBox();
|
|
var width = svgBounds.width + padding * 2;
|
|
var height = svgBounds.height + padding * 2;
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].debug("new ViewBox 0 0 ".concat(width, " ").concat(height), "translate(".concat(padding - g._label.marginx, ", ").concat(padding - g._label.marginy, ")"));
|
|
|
|
if (conf.useMaxWidth) {
|
|
svg.attr('width', '100%');
|
|
svg.attr('style', "max-width: ".concat(width, "px;"));
|
|
} else {
|
|
svg.attr('height', height);
|
|
svg.attr('width', width);
|
|
}
|
|
|
|
svg.attr('viewBox', "0 0 ".concat(width, " ").concat(height));
|
|
svg.select('g').attr('transform', "translate(".concat(padding - g._label.marginx, ", ").concat(padding - svgBounds.y, ")")); // Index nodes
|
|
|
|
_flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].indexNodes('subGraph' + i); // // reposition labels
|
|
// for (i = 0; i < subGraphs.length; i++) {
|
|
// subG = subGraphs[i];
|
|
// if (subG.title !== 'undefined') {
|
|
// const clusterRects = document.querySelectorAll('#' + id + ' [id="' + subG.id + '"] rect');
|
|
// const clusterEl = document.querySelectorAll('#' + id + ' [id="' + subG.id + '"]');
|
|
// const xPos = clusterRects[0].x.baseVal.value;
|
|
// const yPos = clusterRects[0].y.baseVal.value;
|
|
// const width = clusterRects[0].width.baseVal.value;
|
|
// const cluster = d3.select(clusterEl[0]);
|
|
// const te = cluster.select('.label');
|
|
// te.attr('transform', `translate(${xPos + width / 2}, ${yPos + 14})`);
|
|
// te.attr('id', id + 'Text');
|
|
// for (let j = 0; j < subG.classes.length; j++) {
|
|
// clusterEl[0].classList.add(subG.classes[j]);
|
|
// }
|
|
// }
|
|
// }
|
|
// Add label rects for non html labels
|
|
|
|
if (!conf.htmlLabels) {
|
|
var labels = document.querySelectorAll('[id="' + id + '"] .edgeLabel .label');
|
|
|
|
for (var k = 0; k < labels.length; k++) {
|
|
var label = labels[k]; // Get dimensions of label
|
|
|
|
var dim = label.getBBox();
|
|
var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
rect.setAttribute('rx', 0);
|
|
rect.setAttribute('ry', 0);
|
|
rect.setAttribute('width', dim.width);
|
|
rect.setAttribute('height', dim.height);
|
|
rect.setAttribute('style', 'fill:#e8e8e8;');
|
|
label.insertBefore(rect, label.firstChild);
|
|
}
|
|
} // If node has a link, wrap it in an anchor SVG object.
|
|
|
|
|
|
var keys = Object.keys(vert);
|
|
keys.forEach(function (key) {
|
|
var vertex = vert[key];
|
|
|
|
if (vertex.link) {
|
|
var node = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#' + id + ' [id="' + key + '"]');
|
|
|
|
if (node) {
|
|
var link = document.createElementNS('http://www.w3.org/2000/svg', 'a');
|
|
link.setAttributeNS('http://www.w3.org/2000/svg', 'class', vertex.classes.join(' '));
|
|
link.setAttributeNS('http://www.w3.org/2000/svg', 'href', vertex.link);
|
|
link.setAttributeNS('http://www.w3.org/2000/svg', 'rel', 'noopener');
|
|
var linkNode = node.insert(function () {
|
|
return link;
|
|
}, ':first-child');
|
|
var shape = node.select('.label-container');
|
|
|
|
if (shape) {
|
|
linkNode.append(function () {
|
|
return shape.node();
|
|
});
|
|
}
|
|
|
|
var _label = node.select('.label');
|
|
|
|
if (_label) {
|
|
linkNode.append(function () {
|
|
return _label.node();
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
addVertices: addVertices,
|
|
addEdges: addEdges,
|
|
getClasses: getClasses,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/flowchart/flowRenderer.js":
|
|
/*!************************************************!*\
|
|
!*** ./src/diagrams/flowchart/flowRenderer.js ***!
|
|
\************************************************/
|
|
/*! exports provided: setConf, addVertices, addEdges, getClasses, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addVertices", function() { return addVertices; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addEdges", function() { return addEdges; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClasses", function() { return getClasses; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! graphlib */ "graphlib");
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _flowDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./flowDb */ "./src/diagrams/flowchart/flowDb.js");
|
|
/* harmony import */ var _parser_flow__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser/flow */ "./src/diagrams/flowchart/parser/flow.jison");
|
|
/* harmony import */ var _parser_flow__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser_flow__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
|
/* harmony import */ var dagre_d3__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! dagre-d3 */ "dagre-d3");
|
|
/* harmony import */ var dagre_d3__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(dagre_d3__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! dagre-d3/lib/label/add-html-label.js */ "dagre-d3/lib/label/add-html-label.js");
|
|
/* harmony import */ var dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
|
|
/* harmony import */ var _flowChartShapes__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./flowChartShapes */ "./src/diagrams/flowchart/flowChartShapes.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var conf = {};
|
|
var setConf = function setConf(cnf) {
|
|
var keys = Object.keys(cnf);
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
conf[keys[i]] = cnf[keys[i]];
|
|
}
|
|
};
|
|
/**
|
|
* Function that adds the vertices found in the graph definition to the graph to be rendered.
|
|
* @param vert Object containing the vertices.
|
|
* @param g The graph that is to be drawn.
|
|
*/
|
|
|
|
var addVertices = function addVertices(vert, g, svgId) {
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(svgId, "\"]"));
|
|
var keys = Object.keys(vert); // Iterate through each item in the vertex object (containing all the vertices found) in the graph definition
|
|
|
|
keys.forEach(function (id) {
|
|
var vertex = vert[id];
|
|
/**
|
|
* Variable for storing the classes for the vertex
|
|
* @type {string}
|
|
*/
|
|
|
|
var classStr = 'default';
|
|
|
|
if (vertex.classes.length > 0) {
|
|
classStr = vertex.classes.join(' ');
|
|
}
|
|
|
|
var styles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(vertex.styles); // Use vertex id as text in the box if no text is provided by the graph definition
|
|
|
|
var vertexText = vertex.text !== undefined ? vertex.text : vertex.id; // We create a SVG label, either by delegating to addHtmlLabel or manually
|
|
|
|
var vertexNode;
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
|
|
// TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?
|
|
var node = {
|
|
label: vertexText.replace(/fa[lrsb]?:fa-[\w-]+/g, function (s) {
|
|
return "<i class='".concat(s.replace(':', ' '), "'></i>");
|
|
})
|
|
};
|
|
vertexNode = dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6___default()(svg, node).node();
|
|
vertexNode.parentNode.removeChild(vertexNode);
|
|
} else {
|
|
var svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));
|
|
var rows = vertexText.split(_common_common__WEBPACK_IMPORTED_MODULE_8__["default"].lineBreakRegex);
|
|
|
|
for (var j = 0; j < rows.length; j++) {
|
|
var tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
|
|
tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
|
|
tspan.setAttribute('dy', '1em');
|
|
tspan.setAttribute('x', '1');
|
|
tspan.textContent = rows[j];
|
|
svgLabel.appendChild(tspan);
|
|
}
|
|
|
|
vertexNode = svgLabel;
|
|
}
|
|
|
|
var radious = 0;
|
|
var _shape = ''; // Set the shape based parameters
|
|
|
|
switch (vertex.type) {
|
|
case 'round':
|
|
radious = 5;
|
|
_shape = 'rect';
|
|
break;
|
|
|
|
case 'square':
|
|
_shape = 'rect';
|
|
break;
|
|
|
|
case 'diamond':
|
|
_shape = 'question';
|
|
break;
|
|
|
|
case 'hexagon':
|
|
_shape = 'hexagon';
|
|
break;
|
|
|
|
case 'odd':
|
|
_shape = 'rect_left_inv_arrow';
|
|
break;
|
|
|
|
case 'lean_right':
|
|
_shape = 'lean_right';
|
|
break;
|
|
|
|
case 'lean_left':
|
|
_shape = 'lean_left';
|
|
break;
|
|
|
|
case 'trapezoid':
|
|
_shape = 'trapezoid';
|
|
break;
|
|
|
|
case 'inv_trapezoid':
|
|
_shape = 'inv_trapezoid';
|
|
break;
|
|
|
|
case 'odd_right':
|
|
_shape = 'rect_left_inv_arrow';
|
|
break;
|
|
|
|
case 'circle':
|
|
_shape = 'circle';
|
|
break;
|
|
|
|
case 'ellipse':
|
|
_shape = 'ellipse';
|
|
break;
|
|
|
|
case 'stadium':
|
|
_shape = 'stadium';
|
|
break;
|
|
|
|
case 'subroutine':
|
|
_shape = 'subroutine';
|
|
break;
|
|
|
|
case 'cylinder':
|
|
_shape = 'cylinder';
|
|
break;
|
|
|
|
case 'group':
|
|
_shape = 'rect';
|
|
break;
|
|
|
|
default:
|
|
_shape = 'rect';
|
|
} // Add the node
|
|
|
|
|
|
g.setNode(vertex.id, {
|
|
labelType: 'svg',
|
|
labelStyle: styles.labelStyle,
|
|
shape: _shape,
|
|
label: vertexNode,
|
|
rx: radious,
|
|
ry: radious,
|
|
class: classStr,
|
|
style: styles.style,
|
|
id: vertex.id
|
|
});
|
|
});
|
|
};
|
|
/**
|
|
* Add edges to graph based on parsed graph defninition
|
|
* @param {Object} edges The edges to add to the graph
|
|
* @param {Object} g The graph object
|
|
*/
|
|
|
|
var addEdges = function addEdges(edges, g) {
|
|
var cnt = 0;
|
|
var defaultStyle;
|
|
var defaultLabelStyle;
|
|
|
|
if (typeof edges.defaultStyle !== 'undefined') {
|
|
var defaultStyles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(edges.defaultStyle);
|
|
defaultStyle = defaultStyles.style;
|
|
defaultLabelStyle = defaultStyles.labelStyle;
|
|
}
|
|
|
|
edges.forEach(function (edge) {
|
|
cnt++;
|
|
var edgeData = {}; // Set link type for rendering
|
|
|
|
if (edge.type === 'arrow_open') {
|
|
edgeData.arrowhead = 'none';
|
|
} else {
|
|
edgeData.arrowhead = 'normal';
|
|
}
|
|
|
|
var style = '';
|
|
var labelStyle = '';
|
|
|
|
if (typeof edge.style !== 'undefined') {
|
|
var styles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(edge.style);
|
|
style = styles.style;
|
|
labelStyle = styles.labelStyle;
|
|
} else {
|
|
switch (edge.stroke) {
|
|
case 'normal':
|
|
style = 'fill:none';
|
|
|
|
if (typeof defaultStyle !== 'undefined') {
|
|
style = defaultStyle;
|
|
}
|
|
|
|
if (typeof defaultLabelStyle !== 'undefined') {
|
|
labelStyle = defaultLabelStyle;
|
|
}
|
|
|
|
break;
|
|
|
|
case 'dotted':
|
|
style = 'fill:none;stroke-width:2px;stroke-dasharray:3;';
|
|
break;
|
|
|
|
case 'thick':
|
|
style = ' stroke-width: 3.5px;fill:none';
|
|
break;
|
|
}
|
|
}
|
|
|
|
edgeData.style = style;
|
|
edgeData.labelStyle = labelStyle;
|
|
|
|
if (typeof edge.interpolate !== 'undefined') {
|
|
edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(edge.interpolate, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
|
|
} else if (typeof edges.defaultInterpolate !== 'undefined') {
|
|
edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(edges.defaultInterpolate, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
|
|
} else {
|
|
edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(conf.curve, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
|
|
}
|
|
|
|
if (typeof edge.text === 'undefined') {
|
|
if (typeof edge.style !== 'undefined') {
|
|
edgeData.arrowheadStyle = 'fill: #333';
|
|
}
|
|
} else {
|
|
edgeData.arrowheadStyle = 'fill: #333';
|
|
edgeData.labelpos = 'c';
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
|
|
edgeData.labelType = 'html';
|
|
edgeData.label = '<span class="edgeLabel">' + edge.text + '</span>';
|
|
} else {
|
|
edgeData.labelType = 'text';
|
|
edgeData.label = edge.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_8__["default"].lineBreakRegex, '\n');
|
|
|
|
if (typeof edge.style === 'undefined') {
|
|
edgeData.style = edgeData.style || 'stroke: #333; stroke-width: 1.5px;fill:none';
|
|
}
|
|
|
|
edgeData.labelStyle = edgeData.labelStyle.replace('color:', 'fill:');
|
|
}
|
|
} // Add the edge to the graph
|
|
|
|
|
|
g.setEdge(edge.start, edge.end, edgeData, cnt);
|
|
});
|
|
};
|
|
/**
|
|
* Returns the all the styles from classDef statements in the graph definition.
|
|
* @returns {object} classDef styles
|
|
*/
|
|
|
|
var getClasses = function getClasses(text) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Extracting classes');
|
|
_flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
|
|
var parser = _parser_flow__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
|
|
parser.yy = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
|
|
|
|
parser.parse(text);
|
|
return _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getClasses();
|
|
};
|
|
/**
|
|
* Draws a flowchart in the tag with id: id based on the graph definition in text.
|
|
* @param text
|
|
* @param id
|
|
*/
|
|
|
|
var draw = function draw(text, id) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Drawing flowchart');
|
|
_flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
|
|
var parser = _parser_flow__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
|
|
parser.yy = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
|
|
|
|
try {
|
|
parser.parse(text);
|
|
} catch (err) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].debug('Parsing failed');
|
|
} // Fetch the default direction, use TD if none was found
|
|
|
|
|
|
var dir = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getDirection();
|
|
|
|
if (typeof dir === 'undefined') {
|
|
dir = 'TD';
|
|
}
|
|
|
|
var conf = Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart;
|
|
var nodeSpacing = conf.nodeSpacing || 50;
|
|
var rankSpacing = conf.rankSpacing || 50; // Create the input mermaid.graph
|
|
|
|
var g = new graphlib__WEBPACK_IMPORTED_MODULE_0___default.a.Graph({
|
|
multigraph: true,
|
|
compound: true
|
|
}).setGraph({
|
|
rankdir: dir,
|
|
nodesep: nodeSpacing,
|
|
ranksep: rankSpacing,
|
|
marginx: 8,
|
|
marginy: 8
|
|
}).setDefaultEdgeLabel(function () {
|
|
return {};
|
|
});
|
|
var subG;
|
|
var subGraphs = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getSubGraphs();
|
|
|
|
for (var _i = subGraphs.length - 1; _i >= 0; _i--) {
|
|
subG = subGraphs[_i];
|
|
_flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].addVertex(subG.id, subG.title, 'group', undefined, subG.classes);
|
|
} // Fetch the verices/nodes and edges/links from the parsed graph definition
|
|
|
|
|
|
var vert = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getVertices();
|
|
var edges = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getEdges();
|
|
var i = 0;
|
|
|
|
for (i = subGraphs.length - 1; i >= 0; i--) {
|
|
subG = subGraphs[i];
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_1__["selectAll"])('cluster').append('text');
|
|
|
|
for (var j = 0; j < subG.nodes.length; j++) {
|
|
g.setParent(subG.nodes[j], subG.id);
|
|
}
|
|
}
|
|
|
|
addVertices(vert, g, id);
|
|
addEdges(edges, g); // Create the renderer
|
|
|
|
var Render = dagre_d3__WEBPACK_IMPORTED_MODULE_5___default.a.render;
|
|
var render = new Render(); // Add custom shapes
|
|
|
|
_flowChartShapes__WEBPACK_IMPORTED_MODULE_10__["default"].addToRender(render); // Add our custom arrow - an empty arrowhead
|
|
|
|
render.arrows().none = function normal(parent, id, edge, type) {
|
|
var marker = parent.append('marker').attr('id', id).attr('viewBox', '0 0 10 10').attr('refX', 9).attr('refY', 5).attr('markerUnits', 'strokeWidth').attr('markerWidth', 8).attr('markerHeight', 6).attr('orient', 'auto');
|
|
var path = marker.append('path').attr('d', 'M 0 0 L 0 0 L 0 0 z');
|
|
dagre_d3__WEBPACK_IMPORTED_MODULE_5___default.a.util.applyStyle(path, edge[type + 'Style']);
|
|
}; // Override normal arrowhead defined in d3. Remove style & add class to allow css styling.
|
|
|
|
|
|
render.arrows().normal = function normal(parent, id) {
|
|
var marker = parent.append('marker').attr('id', id).attr('viewBox', '0 0 10 10').attr('refX', 9).attr('refY', 5).attr('markerUnits', 'strokeWidth').attr('markerWidth', 8).attr('markerHeight', 6).attr('orient', 'auto');
|
|
marker.append('path').attr('d', 'M 0 0 L 10 5 L 0 10 z').attr('class', 'arrowheadPath').style('stroke-width', 1).style('stroke-dasharray', '1,0');
|
|
}; // Set up an SVG group so that we can translate the final graph.
|
|
|
|
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(id, "\"]")); // Run the renderer. This is what draws the final graph.
|
|
|
|
var element = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#' + id + ' g');
|
|
render(element, g);
|
|
element.selectAll('g.node').attr('title', function () {
|
|
return _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getTooltip(this.id);
|
|
});
|
|
var padding = 8;
|
|
var svgBounds = svg.node().getBBox();
|
|
var width = svgBounds.width + padding * 2;
|
|
var height = svgBounds.height + padding * 2;
|
|
|
|
if (conf.useMaxWidth) {
|
|
svg.attr('width', '100%');
|
|
svg.attr('style', "max-width: ".concat(width, "px;"));
|
|
} else {
|
|
svg.attr('height', height);
|
|
svg.attr('width', width);
|
|
} // Ensure the viewBox includes the whole svgBounds area with extra space for padding
|
|
|
|
|
|
var vBox = "".concat(svgBounds.x - padding, " ").concat(svgBounds.y - padding, " ").concat(width, " ").concat(height);
|
|
_logger__WEBPACK_IMPORTED_MODULE_7__["logger"].debug("viewBox ".concat(vBox));
|
|
svg.attr('viewBox', vBox); // Index nodes
|
|
|
|
_flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].indexNodes('subGraph' + i); // reposition labels
|
|
|
|
for (i = 0; i < subGraphs.length; i++) {
|
|
subG = subGraphs[i];
|
|
|
|
if (subG.title !== 'undefined') {
|
|
var clusterRects = document.querySelectorAll('#' + id + ' [id="' + subG.id + '"] rect');
|
|
var clusterEl = document.querySelectorAll('#' + id + ' [id="' + subG.id + '"]');
|
|
var xPos = clusterRects[0].x.baseVal.value;
|
|
var yPos = clusterRects[0].y.baseVal.value;
|
|
var _width = clusterRects[0].width.baseVal.value;
|
|
var cluster = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])(clusterEl[0]);
|
|
var te = cluster.select('.label');
|
|
te.attr('transform', "translate(".concat(xPos + _width / 2, ", ").concat(yPos + 14, ")"));
|
|
te.attr('id', id + 'Text');
|
|
|
|
for (var _j = 0; _j < subG.classes.length; _j++) {
|
|
clusterEl[0].classList.add(subG.classes[_j]);
|
|
}
|
|
}
|
|
} // Add label rects for non html labels
|
|
|
|
|
|
if (!conf.htmlLabels || true) {
|
|
// eslint-disable-line
|
|
var labels = document.querySelectorAll('[id="' + id + '"] .edgeLabel .label');
|
|
|
|
for (var k = 0; k < labels.length; k++) {
|
|
var label = labels[k]; // Get dimensions of label
|
|
|
|
var dim = label.getBBox();
|
|
var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
rect.setAttribute('rx', 0);
|
|
rect.setAttribute('ry', 0);
|
|
rect.setAttribute('width', dim.width);
|
|
rect.setAttribute('height', dim.height);
|
|
rect.setAttribute('style', 'fill:#e8e8e8;');
|
|
label.insertBefore(rect, label.firstChild);
|
|
}
|
|
} // If node has a link, wrap it in an anchor SVG object.
|
|
|
|
|
|
var keys = Object.keys(vert);
|
|
keys.forEach(function (key) {
|
|
var vertex = vert[key];
|
|
|
|
if (vertex.link) {
|
|
var node = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#' + id + ' [id="' + key + '"]');
|
|
|
|
if (node) {
|
|
var link = document.createElementNS('http://www.w3.org/2000/svg', 'a');
|
|
link.setAttributeNS('http://www.w3.org/2000/svg', 'class', vertex.classes.join(' '));
|
|
link.setAttributeNS('http://www.w3.org/2000/svg', 'href', vertex.link);
|
|
link.setAttributeNS('http://www.w3.org/2000/svg', 'rel', 'noopener');
|
|
var linkNode = node.insert(function () {
|
|
return link;
|
|
}, ':first-child');
|
|
var shape = node.select('.label-container');
|
|
|
|
if (shape) {
|
|
linkNode.append(function () {
|
|
return shape.node();
|
|
});
|
|
}
|
|
|
|
var _label = node.select('.label');
|
|
|
|
if (_label) {
|
|
linkNode.append(function () {
|
|
return _label.node();
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
addVertices: addVertices,
|
|
addEdges: addEdges,
|
|
getClasses: getClasses,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/flowchart/parser/flow.jison":
|
|
/*!**************************************************!*\
|
|
!*** ./src/diagrams/flowchart/parser/flow.jison ***!
|
|
\**************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
|
|
/*
|
|
Returns a Parser object of the following structure:
|
|
|
|
Parser: {
|
|
yy: {}
|
|
}
|
|
|
|
Parser.prototype: {
|
|
yy: {},
|
|
trace: function(),
|
|
symbols_: {associative list: name ==> number},
|
|
terminals_: {associative list: number ==> name},
|
|
productions_: [...],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
|
table: [...],
|
|
defaultActions: {...},
|
|
parseError: function(str, hash),
|
|
parse: function(input),
|
|
|
|
lexer: {
|
|
EOF: 1,
|
|
parseError: function(str, hash),
|
|
setInput: function(input),
|
|
input: function(),
|
|
unput: function(str),
|
|
more: function(),
|
|
less: function(n),
|
|
pastInput: function(),
|
|
upcomingInput: function(),
|
|
showPosition: function(),
|
|
test_match: function(regex_match_array, rule_index),
|
|
next: function(),
|
|
lex: function(),
|
|
begin: function(condition),
|
|
popState: function(),
|
|
_currentRules: function(),
|
|
topState: function(),
|
|
pushState: function(condition),
|
|
|
|
options: {
|
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
|
},
|
|
|
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
|
rules: [...],
|
|
conditions: {associative list: name ==> set},
|
|
}
|
|
}
|
|
|
|
|
|
token location info (@$, _$, etc.): {
|
|
first_line: n,
|
|
last_line: n,
|
|
first_column: n,
|
|
last_column: n,
|
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
|
}
|
|
|
|
|
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
|
text: (matched text)
|
|
token: (the produced terminal token, if any)
|
|
line: (yylineno)
|
|
}
|
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
|
loc: (yylloc)
|
|
expected: (string describing the set of expected tokens)
|
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
|
}
|
|
*/
|
|
var parser = (function(){
|
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,4],$V1=[1,3],$V2=[1,5],$V3=[1,8,9,10,11,26,34,63,64,65,66,67,68,78,79,82,83,84,86,87,93,94,95,96,97,98],$V4=[2,2],$V5=[1,12],$V6=[1,13],$V7=[1,14],$V8=[1,15],$V9=[1,22],$Va=[1,46],$Vb=[1,24],$Vc=[1,25],$Vd=[1,26],$Ve=[1,27],$Vf=[1,28],$Vg=[1,40],$Vh=[1,35],$Vi=[1,37],$Vj=[1,32],$Vk=[1,36],$Vl=[1,39],$Vm=[1,43],$Vn=[1,44],$Vo=[1,45],$Vp=[1,34],$Vq=[1,38],$Vr=[1,41],$Vs=[1,42],$Vt=[1,33],$Vu=[1,51],$Vv=[1,8,9,10,11,26,30,34,63,64,65,66,67,68,78,79,82,83,84,86,87,93,94,95,96,97,98],$Vw=[1,55],$Vx=[1,54],$Vy=[1,56],$Vz=[8,9,11,57,58],$VA=[8,9,10,11,57,58],$VB=[8,9,10,11,35,57,58],$VC=[8,9,10,11,28,34,35,37,39,41,43,45,47,49,50,52,57,58,68,78,79,82,83,84,86,87,93,94,95,96,97,98],$VD=[8,9,11,34,57,58,68,78,79,82,83,84,86,87,93,94,95,96,97,98],$VE=[34,68,78,79,82,83,84,86,87,93,94,95,96,97,98],$VF=[1,101],$VG=[1,122],$VH=[1,123],$VI=[1,124],$VJ=[1,125],$VK=[1,105],$VL=[1,96],$VM=[1,97],$VN=[1,93],$VO=[1,117],$VP=[1,118],$VQ=[1,119],$VR=[1,120],$VS=[1,121],$VT=[1,126],$VU=[1,127],$VV=[1,99],$VW=[1,107],$VX=[1,110],$VY=[1,108],$VZ=[1,109],$V_=[1,102],$V$=[1,115],$V01=[1,114],$V11=[1,98],$V21=[1,95],$V31=[1,104],$V41=[1,106],$V51=[1,111],$V61=[1,112],$V71=[1,113],$V81=[1,116],$V91=[8,9,10,11,26,30,34,63,64,65,66,67,68,78,79,82,83,84,86,87,93,94,95,96,97,98],$Va1=[1,130],$Vb1=[1,134],$Vc1=[1,136],$Vd1=[1,137],$Ve1=[8,9,10,11,12,13,26,28,29,30,34,38,40,42,44,46,48,49,51,53,57,58,59,63,64,65,66,67,68,69,72,78,79,82,83,84,86,87,88,89,93,94,95,96,97,98],$Vf1=[8,9,10,11,13,34,68,78,79,82,83,84,86,87,93,94,95,96,97,98],$Vg1=[10,79],$Vh1=[1,204],$Vi1=[1,208],$Vj1=[1,205],$Vk1=[1,202],$Vl1=[1,199],$Vm1=[1,200],$Vn1=[1,201],$Vo1=[1,203],$Vp1=[1,206],$Vq1=[1,207],$Vr1=[1,209],$Vs1=[8,9,11],$Vt1=[1,225],$Vu1=[8,9,11,79],$Vv1=[8,9,10,11,63,75,78,79,82,83,84,85,86,87,88];
|
|
var parser = {trace: function trace () { },
|
|
yy: {},
|
|
symbols_: {"error":2,"mermaidDoc":3,"graphConfig":4,"document":5,"line":6,"statement":7,"SEMI":8,"NEWLINE":9,"SPACE":10,"EOF":11,"GRAPH":12,"DIR":13,"FirstStmtSeperator":14,"ending":15,"endToken":16,"spaceList":17,"spaceListNewline":18,"verticeStatement":19,"separator":20,"styleStatement":21,"linkStyleStatement":22,"classDefStatement":23,"classStatement":24,"clickStatement":25,"subgraph":26,"text":27,"SQS":28,"SQE":29,"end":30,"link":31,"node":32,"vertex":33,"AMP":34,"STYLE_SEPARATOR":35,"idString":36,"PS":37,"PE":38,"(-":39,"-)":40,"STADIUMSTART":41,"STADIUMEND":42,"SUBROUTINESTART":43,"SUBROUTINEEND":44,"CYLINDERSTART":45,"CYLINDEREND":46,"DIAMOND_START":47,"DIAMOND_STOP":48,"TAGEND":49,"TRAPSTART":50,"TRAPEND":51,"INVTRAPSTART":52,"INVTRAPEND":53,"linkStatement":54,"arrowText":55,"TESTSTR":56,"START_LINK":57,"LINK":58,"PIPE":59,"textToken":60,"STR":61,"keywords":62,"STYLE":63,"LINKSTYLE":64,"CLASSDEF":65,"CLASS":66,"CLICK":67,"DOWN":68,"UP":69,"textNoTags":70,"textNoTagsToken":71,"DEFAULT":72,"stylesOpt":73,"alphaNum":74,"HEX":75,"numList":76,"INTERPOLATE":77,"NUM":78,"COMMA":79,"style":80,"styleComponent":81,"ALPHA":82,"COLON":83,"MINUS":84,"UNIT":85,"BRKT":86,"DOT":87,"PCT":88,"TAGSTART":89,"alphaNumToken":90,"idStringToken":91,"alphaNumStatement":92,"PUNCTUATION":93,"UNICODE_TEXT":94,"PLUS":95,"EQUALS":96,"MULT":97,"UNDERSCORE":98,"graphCodeTokens":99,"ARROW_CROSS":100,"ARROW_POINT":101,"ARROW_CIRCLE":102,"ARROW_OPEN":103,"QUOTE":104,"$accept":0,"$end":1},
|
|
terminals_: {2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"DIR",26:"subgraph",28:"SQS",29:"SQE",30:"end",34:"AMP",35:"STYLE_SEPARATOR",37:"PS",38:"PE",39:"(-",40:"-)",41:"STADIUMSTART",42:"STADIUMEND",43:"SUBROUTINESTART",44:"SUBROUTINEEND",45:"CYLINDERSTART",46:"CYLINDEREND",47:"DIAMOND_START",48:"DIAMOND_STOP",49:"TAGEND",50:"TRAPSTART",51:"TRAPEND",52:"INVTRAPSTART",53:"INVTRAPEND",56:"TESTSTR",57:"START_LINK",58:"LINK",59:"PIPE",61:"STR",63:"STYLE",64:"LINKSTYLE",65:"CLASSDEF",66:"CLASS",67:"CLICK",68:"DOWN",69:"UP",72:"DEFAULT",75:"HEX",77:"INTERPOLATE",78:"NUM",79:"COMMA",82:"ALPHA",83:"COLON",84:"MINUS",85:"UNIT",86:"BRKT",87:"DOT",88:"PCT",89:"TAGSTART",93:"PUNCTUATION",94:"UNICODE_TEXT",95:"PLUS",96:"EQUALS",97:"MULT",98:"UNDERSCORE",100:"ARROW_CROSS",101:"ARROW_POINT",102:"ARROW_CIRCLE",103:"ARROW_OPEN",104:"QUOTE"},
|
|
productions_: [0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,3],[15,2],[15,1],[16,1],[16,1],[16,1],[14,1],[14,1],[14,2],[18,2],[18,2],[18,1],[18,1],[17,2],[17,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[20,1],[20,1],[20,1],[19,3],[19,4],[19,2],[19,1],[32,1],[32,5],[32,3],[33,4],[33,6],[33,4],[33,4],[33,4],[33,4],[33,4],[33,4],[33,6],[33,4],[33,4],[33,4],[33,4],[33,4],[33,1],[31,2],[31,3],[31,3],[31,1],[31,3],[54,1],[55,3],[27,1],[27,2],[27,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[70,1],[70,2],[23,5],[23,5],[24,5],[25,5],[25,7],[25,5],[25,7],[21,5],[21,5],[22,5],[22,5],[22,9],[22,9],[22,7],[22,7],[76,1],[76,3],[73,1],[73,3],[80,1],[80,2],[81,1],[81,1],[81,1],[81,1],[81,1],[81,1],[81,1],[81,1],[81,1],[81,1],[81,1],[60,1],[60,1],[60,1],[60,1],[60,1],[60,1],[71,1],[71,1],[71,1],[71,1],[36,1],[36,2],[74,1],[74,2],[92,1],[92,1],[92,1],[92,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1],[99,1]],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
|
/* this == yyval */
|
|
|
|
var $0 = $$.length - 1;
|
|
switch (yystate) {
|
|
case 2:
|
|
this.$ = [];
|
|
break;
|
|
case 3:
|
|
|
|
if($$[$0] !== []){
|
|
$$[$0-1].push($$[$0]);
|
|
}
|
|
this.$=$$[$0-1];
|
|
break;
|
|
case 4: case 67: case 69: case 81: case 127: case 129: case 130:
|
|
this.$=$$[$0];
|
|
break;
|
|
case 11:
|
|
yy.setDirection($$[$0-1]);this.$ = $$[$0-1];
|
|
break;
|
|
case 26:
|
|
/* console.warn('finat vs', $$[$0-1].nodes); */ this.$=$$[$0-1].nodes
|
|
break;
|
|
case 27: case 28: case 29: case 30: case 31:
|
|
this.$=[];
|
|
break;
|
|
case 32:
|
|
this.$=yy.addSubGraph($$[$0-6],$$[$0-1],$$[$0-4]);
|
|
break;
|
|
case 33:
|
|
this.$=yy.addSubGraph($$[$0-3],$$[$0-1],$$[$0-3]);
|
|
break;
|
|
case 34:
|
|
this.$=yy.addSubGraph(undefined,$$[$0-1],undefined);
|
|
break;
|
|
case 38:
|
|
/* console.warn('vs',$$[$0-2].stmt,$$[$0]); */ yy.addLink($$[$0-2].stmt,$$[$0],$$[$0-1]); this.$ = { stmt: $$[$0], nodes: $$[$0].concat($$[$0-2].nodes) }
|
|
break;
|
|
case 39:
|
|
/* console.warn('vs',$$[$0-3].stmt,$$[$0-1]); */ yy.addLink($$[$0-3].stmt,$$[$0-1],$$[$0-2]); this.$ = { stmt: $$[$0-1], nodes: $$[$0-1].concat($$[$0-3].nodes) }
|
|
break;
|
|
case 40:
|
|
/*console.warn('noda', $$[$0-1]);*/ this.$ = {stmt: $$[$0-1], nodes:$$[$0-1] }
|
|
break;
|
|
case 41:
|
|
/*console.warn('noda', $$[$0]);*/ this.$ = {stmt: $$[$0], nodes:$$[$0] }
|
|
break;
|
|
case 42:
|
|
/* console.warn('nod', $$[$0]); */ this.$ = [$$[$0]];
|
|
break;
|
|
case 43:
|
|
this.$ = $$[$0-4].concat($$[$0]); /* console.warn('pip', $$[$0-4][0], $$[$0], this.$); */
|
|
break;
|
|
case 44:
|
|
this.$ = [$$[$0-2]];yy.setClass($$[$0-2],$$[$0])
|
|
break;
|
|
case 45:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'square');
|
|
break;
|
|
case 46:
|
|
this.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'circle');
|
|
break;
|
|
case 47:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'ellipse');
|
|
break;
|
|
case 48:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'stadium');
|
|
break;
|
|
case 49:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'subroutine');
|
|
break;
|
|
case 50:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'cylinder');
|
|
break;
|
|
case 51:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'round');
|
|
break;
|
|
case 52:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'diamond');
|
|
break;
|
|
case 53:
|
|
this.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'hexagon');
|
|
break;
|
|
case 54:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'odd');
|
|
break;
|
|
case 55:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'trapezoid');
|
|
break;
|
|
case 56:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'inv_trapezoid');
|
|
break;
|
|
case 57:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'lean_right');
|
|
break;
|
|
case 58:
|
|
this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'lean_left');
|
|
break;
|
|
case 59:
|
|
/*console.warn('h: ', $$[$0]);*/this.$ = $$[$0];yy.addVertex($$[$0]);
|
|
break;
|
|
case 60:
|
|
$$[$0-1].text = $$[$0];this.$ = $$[$0-1];
|
|
break;
|
|
case 61: case 62:
|
|
$$[$0-2].text = $$[$0-1];this.$ = $$[$0-2];
|
|
break;
|
|
case 63:
|
|
this.$ = $$[$0];
|
|
break;
|
|
case 64:
|
|
var inf = yy.destructLink($$[$0], $$[$0-2]); this.$ = {"type":inf.type,"stroke":inf.stroke,"text":$$[$0-1]};
|
|
break;
|
|
case 65:
|
|
var inf = yy.destructLink($$[$0]);this.$ = {"type":inf.type,"stroke":inf.stroke};
|
|
break;
|
|
case 66:
|
|
this.$ = $$[$0-1];
|
|
break;
|
|
case 68: case 82: case 128:
|
|
this.$=$$[$0-1]+''+$$[$0];
|
|
break;
|
|
case 83: case 84:
|
|
this.$ = $$[$0-4];yy.addClass($$[$0-2],$$[$0]);
|
|
break;
|
|
case 85:
|
|
this.$ = $$[$0-4];yy.setClass($$[$0-2], $$[$0]);
|
|
break;
|
|
case 86:
|
|
this.$ = $$[$0-4];yy.setClickEvent($$[$0-2], $$[$0], undefined);
|
|
break;
|
|
case 87:
|
|
this.$ = $$[$0-6];yy.setClickEvent($$[$0-4], $$[$0-2], $$[$0]) ;
|
|
break;
|
|
case 88:
|
|
this.$ = $$[$0-4];yy.setLink($$[$0-2], $$[$0], undefined);
|
|
break;
|
|
case 89:
|
|
this.$ = $$[$0-6];yy.setLink($$[$0-4], $$[$0-2], $$[$0] );
|
|
break;
|
|
case 90:
|
|
this.$ = $$[$0-4];yy.addVertex($$[$0-2],undefined,undefined,$$[$0]);
|
|
break;
|
|
case 91: case 93:
|
|
this.$ = $$[$0-4];yy.updateLink($$[$0-2],$$[$0]);
|
|
break;
|
|
case 92:
|
|
this.$ = $$[$0-4];yy.updateLink([$$[$0-2]],$$[$0]);
|
|
break;
|
|
case 94:
|
|
this.$ = $$[$0-8];yy.updateLinkInterpolate([$$[$0-6]],$$[$0-2]);yy.updateLink([$$[$0-6]],$$[$0]);
|
|
break;
|
|
case 95:
|
|
this.$ = $$[$0-8];yy.updateLinkInterpolate($$[$0-6],$$[$0-2]);yy.updateLink($$[$0-6],$$[$0]);
|
|
break;
|
|
case 96:
|
|
this.$ = $$[$0-6];yy.updateLinkInterpolate([$$[$0-4]],$$[$0]);
|
|
break;
|
|
case 97:
|
|
this.$ = $$[$0-6];yy.updateLinkInterpolate($$[$0-4],$$[$0]);
|
|
break;
|
|
case 98: case 100:
|
|
this.$ = [$$[$0]]
|
|
break;
|
|
case 99: case 101:
|
|
$$[$0-2].push($$[$0]);this.$ = $$[$0-2];
|
|
break;
|
|
case 103:
|
|
this.$ = $$[$0-1] + $$[$0];
|
|
break;
|
|
case 125:
|
|
this.$=$$[$0]
|
|
break;
|
|
case 126:
|
|
this.$=$$[$0-1]+''+$$[$0]
|
|
break;
|
|
case 131:
|
|
this.$='v';
|
|
break;
|
|
case 132:
|
|
this.$='-';
|
|
break;
|
|
}
|
|
},
|
|
table: [{3:1,4:2,9:$V0,10:$V1,12:$V2},{1:[3]},o($V3,$V4,{5:6}),{4:7,9:$V0,10:$V1,12:$V2},{4:8,9:$V0,10:$V1,12:$V2},{13:[1,9]},{1:[2,1],6:10,7:11,8:$V5,9:$V6,10:$V7,11:$V8,19:16,21:17,22:18,23:19,24:20,25:21,26:$V9,32:23,33:29,34:$Va,36:30,63:$Vb,64:$Vc,65:$Vd,66:$Ve,67:$Vf,68:$Vg,78:$Vh,79:$Vi,82:$Vj,83:$Vk,84:$Vl,86:$Vm,87:$Vn,91:31,93:$Vo,94:$Vp,95:$Vq,96:$Vr,97:$Vs,98:$Vt},o($V3,[2,9]),o($V3,[2,10]),{8:[1,48],9:[1,49],10:$Vu,14:47,17:50},o($Vv,[2,3]),o($Vv,[2,4]),o($Vv,[2,5]),o($Vv,[2,6]),o($Vv,[2,7]),o($Vv,[2,8]),{8:$Vw,9:$Vx,11:$Vy,20:52,31:53,54:57,57:[1,58],58:[1,59]},{8:$Vw,9:$Vx,11:$Vy,20:60},{8:$Vw,9:$Vx,11:$Vy,20:61},{8:$Vw,9:$Vx,11:$Vy,20:62},{8:$Vw,9:$Vx,11:$Vy,20:63},{8:$Vw,9:$Vx,11:$Vy,20:64},{8:$Vw,9:$Vx,10:[1,65],11:$Vy,20:66},o($Vz,[2,41],{17:67,10:$Vu}),{10:[1,68]},{10:[1,69]},{10:[1,70]},{10:[1,71]},{10:[1,72]},o($VA,[2,42],{35:[1,73]}),o($VB,[2,59],{91:84,28:[1,74],34:$Va,37:[1,75],39:[1,76],41:[1,77],43:[1,78],45:[1,79],47:[1,80],49:[1,81],50:[1,82],52:[1,83],68:$Vg,78:$Vh,79:$Vi,82:$Vj,83:$Vk,84:$Vl,86:$Vm,87:$Vn,93:$Vo,94:$Vp,95:$Vq,96:$Vr,97:$Vs,98:$Vt}),o($VC,[2,125]),o($VC,[2,146]),o($VC,[2,147]),o($VC,[2,148]),o($VC,[2,149]),o($VC,[2,150]),o($VC,[2,151]),o($VC,[2,152]),o($VC,[2,153]),o($VC,[2,154]),o($VC,[2,155]),o($VC,[2,156]),o($VC,[2,157]),o($VC,[2,158]),o($VC,[2,159]),o($VC,[2,160]),o($V3,[2,11]),o($V3,[2,17]),o($V3,[2,18]),{9:[1,85]},o($VD,[2,25],{17:86,10:$Vu}),o($Vv,[2,26]),{32:87,33:29,34:$Va,36:30,68:$Vg,78:$Vh,79:$Vi,82:$Vj,83:$Vk,84:$Vl,86:$Vm,87:$Vn,91:31,93:$Vo,94:$Vp,95:$Vq,96:$Vr,97:$Vs,98:$Vt},o($Vv,[2,35]),o($Vv,[2,36]),o($Vv,[2,37]),o($VE,[2,63],{55:88,56:[1,89],59:[1,90]}),{10:$VF,12:$VG,13:$VH,26:$VI,27:91,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o([34,56,59,68,78,79,82,83,84,86,87,93,94,95,96,97,98],[2,65]),o($Vv,[2,27]),o($Vv,[2,28]),o($Vv,[2,29]),o($Vv,[2,30]),o($Vv,[2,31]),{10:$VF,12:$VG,13:$VH,26:$VI,27:128,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o($V91,$V4,{5:129}),o($Vz,[2,40],{34:$Va1}),{13:$Vb1,34:$VK,68:$Vc1,74:131,75:[1,132],78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:133,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{72:[1,138],76:139,78:[1,140]},{13:$Vb1,34:$VK,68:$Vc1,72:[1,141],74:142,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:133,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{13:$Vb1,34:$VK,68:$Vc1,74:143,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:133,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{13:$Vb1,34:$VK,68:$Vc1,74:144,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:133,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{34:$Va,36:145,68:$Vg,78:$Vh,79:$Vi,82:$Vj,83:$Vk,84:$Vl,86:$Vm,87:$Vn,91:31,93:$Vo,94:$Vp,95:$Vq,96:$Vr,97:$Vs,98:$Vt},{10:$VF,12:$VG,13:$VH,26:$VI,27:146,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:148,30:$VJ,34:$VK,37:[1,147],49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:149,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:150,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:151,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:152,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:153,30:$VJ,34:$VK,47:[1,154],49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:155,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:156,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:157,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o($VC,[2,126]),o($V3,[2,19]),o($VD,[2,24]),o($Vz,[2,38],{17:158,10:$Vu}),o($VE,[2,60],{10:[1,159]}),{10:[1,160]},{10:$VF,12:$VG,13:$VH,26:$VI,27:161,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,49:$VL,57:$VM,58:[1,162],60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o($Ve1,[2,67]),o($Ve1,[2,69]),o($Ve1,[2,115]),o($Ve1,[2,116]),o($Ve1,[2,117]),o($Ve1,[2,118]),o($Ve1,[2,119]),o($Ve1,[2,120]),o($Ve1,[2,121]),o($Ve1,[2,122]),o($Ve1,[2,123]),o($Ve1,[2,124]),o($Ve1,[2,133]),o($Ve1,[2,134]),o($Ve1,[2,135]),o($Ve1,[2,136]),o($Ve1,[2,137]),o($Ve1,[2,138]),o($Ve1,[2,139]),o($Ve1,[2,140]),o($Ve1,[2,141]),o($Ve1,[2,142]),o($Ve1,[2,143]),o($Ve1,[2,144]),o($Ve1,[2,145]),o($Ve1,[2,70]),o($Ve1,[2,71]),o($Ve1,[2,72]),o($Ve1,[2,73]),o($Ve1,[2,74]),o($Ve1,[2,75]),o($Ve1,[2,76]),o($Ve1,[2,77]),o($Ve1,[2,78]),o($Ve1,[2,79]),o($Ve1,[2,80]),{8:$Vw,9:$Vx,10:$VF,11:$Vy,12:$VG,13:$VH,20:165,26:$VI,28:[1,164],30:$VJ,34:$VK,49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{6:10,7:11,8:$V5,9:$V6,10:$V7,11:$V8,19:16,21:17,22:18,23:19,24:20,25:21,26:$V9,30:[1,166],32:23,33:29,34:$Va,36:30,63:$Vb,64:$Vc,65:$Vd,66:$Ve,67:$Vf,68:$Vg,78:$Vh,79:$Vi,82:$Vj,83:$Vk,84:$Vl,86:$Vm,87:$Vn,91:31,93:$Vo,94:$Vp,95:$Vq,96:$Vr,97:$Vs,98:$Vt},{10:$Vu,17:167},{10:[1,168],13:$Vb1,34:$VK,68:$Vc1,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:169,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:[1,170]},o($Vf1,[2,127]),o($Vf1,[2,129]),o($Vf1,[2,130]),o($Vf1,[2,131]),o($Vf1,[2,132]),{10:[1,171]},{10:[1,172],79:[1,173]},o($Vg1,[2,98]),{10:[1,174]},{10:[1,175],13:$Vb1,34:$VK,68:$Vc1,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:169,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:[1,176],13:$Vb1,34:$VK,68:$Vc1,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:169,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:[1,177],13:$Vb1,34:$VK,68:$Vc1,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:169,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o($VA,[2,44],{91:84,34:$Va,68:$Vg,78:$Vh,79:$Vi,82:$Vj,83:$Vk,84:$Vl,86:$Vm,87:$Vn,93:$Vo,94:$Vp,95:$Vq,96:$Vr,97:$Vs,98:$Vt}),{10:$VF,12:$VG,13:$VH,26:$VI,29:[1,178],30:$VJ,34:$VK,49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:179,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,38:[1,180],49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,40:[1,181],49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,42:[1,182],49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,44:[1,183],49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,46:[1,184],49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,48:[1,185],49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,27:186,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,29:[1,187],30:$VJ,34:$VK,49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,49:$VL,51:[1,188],53:[1,189],57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,49:$VL,51:[1,191],53:[1,190],57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o($Vz,[2,39],{34:$Va1}),o($VE,[2,62]),o($VE,[2,61]),{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,49:$VL,57:$VM,59:[1,192],60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o($VE,[2,64]),o($Ve1,[2,68]),{10:$VF,12:$VG,13:$VH,26:$VI,27:193,30:$VJ,34:$VK,49:$VL,57:$VM,60:92,61:$VN,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o($V91,$V4,{5:194}),o($Vv,[2,34]),{33:195,34:$Va,36:30,68:$Vg,78:$Vh,79:$Vi,82:$Vj,83:$Vk,84:$Vl,86:$Vm,87:$Vn,91:31,93:$Vo,94:$Vp,95:$Vq,96:$Vr,97:$Vs,98:$Vt},{10:$Vh1,63:$Vi1,73:196,75:$Vj1,78:$Vk1,80:197,81:198,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1},o($Vf1,[2,128]),{10:$Vh1,63:$Vi1,73:210,75:$Vj1,78:$Vk1,80:197,81:198,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1},{10:$Vh1,63:$Vi1,73:211,75:$Vj1,77:[1,212],78:$Vk1,80:197,81:198,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1},{10:$Vh1,63:$Vi1,73:213,75:$Vj1,77:[1,214],78:$Vk1,80:197,81:198,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1},{78:[1,215]},{10:$Vh1,63:$Vi1,73:216,75:$Vj1,78:$Vk1,80:197,81:198,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1},{10:$Vh1,63:$Vi1,73:217,75:$Vj1,78:$Vk1,80:197,81:198,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1},{13:$Vb1,34:$VK,68:$Vc1,74:218,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:133,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{13:$Vb1,34:$VK,61:[1,220],68:$Vc1,74:219,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:133,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o($VB,[2,45]),{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,38:[1,221],49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o($VB,[2,51]),o($VB,[2,47]),o($VB,[2,48]),o($VB,[2,49]),o($VB,[2,50]),o($VB,[2,52]),{10:$VF,12:$VG,13:$VH,26:$VI,30:$VJ,34:$VK,48:[1,222],49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},o($VB,[2,54]),o($VB,[2,55]),o($VB,[2,57]),o($VB,[2,56]),o($VB,[2,58]),o([10,34,68,78,79,82,83,84,86,87,93,94,95,96,97,98],[2,66]),{10:$VF,12:$VG,13:$VH,26:$VI,29:[1,223],30:$VJ,34:$VK,49:$VL,57:$VM,60:163,62:103,63:$VO,64:$VP,65:$VQ,66:$VR,67:$VS,68:$VT,69:$VU,71:94,72:$VV,78:$VW,79:$VX,82:$VY,83:$VZ,84:$V_,86:$V$,87:$V01,88:$V11,89:$V21,90:100,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{6:10,7:11,8:$V5,9:$V6,10:$V7,11:$V8,19:16,21:17,22:18,23:19,24:20,25:21,26:$V9,30:[1,224],32:23,33:29,34:$Va,36:30,63:$Vb,64:$Vc,65:$Vd,66:$Ve,67:$Vf,68:$Vg,78:$Vh,79:$Vi,82:$Vj,83:$Vk,84:$Vl,86:$Vm,87:$Vn,91:31,93:$Vo,94:$Vp,95:$Vq,96:$Vr,97:$Vs,98:$Vt},o($VA,[2,43]),o($Vs1,[2,90],{79:$Vt1}),o($Vu1,[2,100],{81:226,10:$Vh1,63:$Vi1,75:$Vj1,78:$Vk1,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1}),o($Vv1,[2,102]),o($Vv1,[2,104]),o($Vv1,[2,105]),o($Vv1,[2,106]),o($Vv1,[2,107]),o($Vv1,[2,108]),o($Vv1,[2,109]),o($Vv1,[2,110]),o($Vv1,[2,111]),o($Vv1,[2,112]),o($Vv1,[2,113]),o($Vv1,[2,114]),o($Vs1,[2,91],{79:$Vt1}),o($Vs1,[2,92],{79:$Vt1}),{10:[1,227]},o($Vs1,[2,93],{79:$Vt1}),{10:[1,228]},o($Vg1,[2,99]),o($Vs1,[2,83],{79:$Vt1}),o($Vs1,[2,84],{79:$Vt1}),o($Vs1,[2,85],{90:135,92:169,13:$Vb1,34:$VK,68:$Vc1,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81}),o($Vs1,[2,86],{90:135,92:169,10:[1,229],13:$Vb1,34:$VK,68:$Vc1,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81}),o($Vs1,[2,88],{10:[1,230]}),{38:[1,231]},{48:[1,232]},{8:$Vw,9:$Vx,11:$Vy,20:233},o($Vv,[2,33]),{10:$Vh1,63:$Vi1,75:$Vj1,78:$Vk1,80:234,81:198,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1},o($Vv1,[2,103]),{13:$Vb1,34:$VK,68:$Vc1,74:235,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:133,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{13:$Vb1,34:$VK,68:$Vc1,74:236,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,90:135,92:133,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81},{61:[1,237]},{61:[1,238]},o($VB,[2,46]),o($VB,[2,53]),o($V91,$V4,{5:239}),o($Vu1,[2,101],{81:226,10:$Vh1,63:$Vi1,75:$Vj1,78:$Vk1,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1}),o($Vs1,[2,96],{90:135,92:169,10:[1,240],13:$Vb1,34:$VK,68:$Vc1,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81}),o($Vs1,[2,97],{90:135,92:169,10:[1,241],13:$Vb1,34:$VK,68:$Vc1,78:$VW,79:$VX,82:$VY,83:$VZ,84:$Vd1,86:$V$,87:$V01,93:$V31,94:$V41,95:$V51,96:$V61,97:$V71,98:$V81}),o($Vs1,[2,87]),o($Vs1,[2,89]),{6:10,7:11,8:$V5,9:$V6,10:$V7,11:$V8,19:16,21:17,22:18,23:19,24:20,25:21,26:$V9,30:[1,242],32:23,33:29,34:$Va,36:30,63:$Vb,64:$Vc,65:$Vd,66:$Ve,67:$Vf,68:$Vg,78:$Vh,79:$Vi,82:$Vj,83:$Vk,84:$Vl,86:$Vm,87:$Vn,91:31,93:$Vo,94:$Vp,95:$Vq,96:$Vr,97:$Vs,98:$Vt},{10:$Vh1,63:$Vi1,73:243,75:$Vj1,78:$Vk1,80:197,81:198,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1},{10:$Vh1,63:$Vi1,73:244,75:$Vj1,78:$Vk1,80:197,81:198,82:$Vl1,83:$Vm1,84:$Vn1,85:$Vo1,86:$Vp1,87:$Vq1,88:$Vr1},o($Vv,[2,32]),o($Vs1,[2,94],{79:$Vt1}),o($Vs1,[2,95],{79:$Vt1})],
|
|
defaultActions: {},
|
|
parseError: function parseError (str, hash) {
|
|
if (hash.recoverable) {
|
|
this.trace(str);
|
|
} else {
|
|
var error = new Error(str);
|
|
error.hash = hash;
|
|
throw error;
|
|
}
|
|
},
|
|
parse: function parse(input) {
|
|
var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
var args = lstack.slice.call(arguments, 1);
|
|
var lexer = Object.create(this.lexer);
|
|
var sharedState = { yy: {} };
|
|
for (var k in this.yy) {
|
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
|
sharedState.yy[k] = this.yy[k];
|
|
}
|
|
}
|
|
lexer.setInput(input, sharedState.yy);
|
|
sharedState.yy.lexer = lexer;
|
|
sharedState.yy.parser = this;
|
|
if (typeof lexer.yylloc == 'undefined') {
|
|
lexer.yylloc = {};
|
|
}
|
|
var yyloc = lexer.yylloc;
|
|
lstack.push(yyloc);
|
|
var ranges = lexer.options && lexer.options.ranges;
|
|
if (typeof sharedState.yy.parseError === 'function') {
|
|
this.parseError = sharedState.yy.parseError;
|
|
} else {
|
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
|
}
|
|
function popStack(n) {
|
|
stack.length = stack.length - 2 * n;
|
|
vstack.length = vstack.length - n;
|
|
lstack.length = lstack.length - n;
|
|
}
|
|
function lex() {
|
|
var token;
|
|
token = tstack.pop() || lexer.lex() || EOF;
|
|
if (typeof token !== 'number') {
|
|
if (token instanceof Array) {
|
|
tstack = token;
|
|
token = tstack.pop();
|
|
}
|
|
token = self.symbols_[token] || token;
|
|
}
|
|
return token;
|
|
}
|
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
|
while (true) {
|
|
state = stack[stack.length - 1];
|
|
if (this.defaultActions[state]) {
|
|
action = this.defaultActions[state];
|
|
} else {
|
|
if (symbol === null || typeof symbol == 'undefined') {
|
|
symbol = lex();
|
|
}
|
|
action = table[state] && table[state][symbol];
|
|
}
|
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
|
var errStr = '';
|
|
expected = [];
|
|
for (p in table[state]) {
|
|
if (this.terminals_[p] && p > TERROR) {
|
|
expected.push('\'' + this.terminals_[p] + '\'');
|
|
}
|
|
}
|
|
if (lexer.showPosition) {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
|
|
} else {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
|
|
}
|
|
this.parseError(errStr, {
|
|
text: lexer.match,
|
|
token: this.terminals_[symbol] || symbol,
|
|
line: lexer.yylineno,
|
|
loc: yyloc,
|
|
expected: expected
|
|
});
|
|
}
|
|
if (action[0] instanceof Array && action.length > 1) {
|
|
throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
|
|
}
|
|
switch (action[0]) {
|
|
case 1:
|
|
stack.push(symbol);
|
|
vstack.push(lexer.yytext);
|
|
lstack.push(lexer.yylloc);
|
|
stack.push(action[1]);
|
|
symbol = null;
|
|
if (!preErrorSymbol) {
|
|
yyleng = lexer.yyleng;
|
|
yytext = lexer.yytext;
|
|
yylineno = lexer.yylineno;
|
|
yyloc = lexer.yylloc;
|
|
if (recovering > 0) {
|
|
recovering--;
|
|
}
|
|
} else {
|
|
symbol = preErrorSymbol;
|
|
preErrorSymbol = null;
|
|
}
|
|
break;
|
|
case 2:
|
|
len = this.productions_[action[1]][1];
|
|
yyval.$ = vstack[vstack.length - len];
|
|
yyval._$ = {
|
|
first_line: lstack[lstack.length - (len || 1)].first_line,
|
|
last_line: lstack[lstack.length - 1].last_line,
|
|
first_column: lstack[lstack.length - (len || 1)].first_column,
|
|
last_column: lstack[lstack.length - 1].last_column
|
|
};
|
|
if (ranges) {
|
|
yyval._$.range = [
|
|
lstack[lstack.length - (len || 1)].range[0],
|
|
lstack[lstack.length - 1].range[1]
|
|
];
|
|
}
|
|
r = this.performAction.apply(yyval, [
|
|
yytext,
|
|
yyleng,
|
|
yylineno,
|
|
sharedState.yy,
|
|
action[1],
|
|
vstack,
|
|
lstack
|
|
].concat(args));
|
|
if (typeof r !== 'undefined') {
|
|
return r;
|
|
}
|
|
if (len) {
|
|
stack = stack.slice(0, -1 * len * 2);
|
|
vstack = vstack.slice(0, -1 * len);
|
|
lstack = lstack.slice(0, -1 * len);
|
|
}
|
|
stack.push(this.productions_[action[1]][0]);
|
|
vstack.push(yyval.$);
|
|
lstack.push(yyval._$);
|
|
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
stack.push(newState);
|
|
break;
|
|
case 3:
|
|
return true;
|
|
}
|
|
}
|
|
return true;
|
|
}};
|
|
|
|
/* generated by jison-lex 0.3.4 */
|
|
var lexer = (function(){
|
|
var lexer = ({
|
|
|
|
EOF:1,
|
|
|
|
parseError:function parseError(str, hash) {
|
|
if (this.yy.parser) {
|
|
this.yy.parser.parseError(str, hash);
|
|
} else {
|
|
throw new Error(str);
|
|
}
|
|
},
|
|
|
|
// resets the lexer, sets new input
|
|
setInput:function (input, yy) {
|
|
this.yy = yy || this.yy || {};
|
|
this._input = input;
|
|
this._more = this._backtrack = this.done = false;
|
|
this.yylineno = this.yyleng = 0;
|
|
this.yytext = this.matched = this.match = '';
|
|
this.conditionStack = ['INITIAL'];
|
|
this.yylloc = {
|
|
first_line: 1,
|
|
first_column: 0,
|
|
last_line: 1,
|
|
last_column: 0
|
|
};
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [0,0];
|
|
}
|
|
this.offset = 0;
|
|
return this;
|
|
},
|
|
|
|
// consumes and returns one char from the input
|
|
input:function () {
|
|
var ch = this._input[0];
|
|
this.yytext += ch;
|
|
this.yyleng++;
|
|
this.offset++;
|
|
this.match += ch;
|
|
this.matched += ch;
|
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno++;
|
|
this.yylloc.last_line++;
|
|
} else {
|
|
this.yylloc.last_column++;
|
|
}
|
|
if (this.options.ranges) {
|
|
this.yylloc.range[1]++;
|
|
}
|
|
|
|
this._input = this._input.slice(1);
|
|
return ch;
|
|
},
|
|
|
|
// unshifts one char (or a string) into the input
|
|
unput:function (ch) {
|
|
var len = ch.length;
|
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
|
|
|
this._input = ch + this._input;
|
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
|
//this.yyleng -= len;
|
|
this.offset -= len;
|
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
|
this.match = this.match.substr(0, this.match.length - 1);
|
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
|
|
|
if (lines.length - 1) {
|
|
this.yylineno -= lines.length - 1;
|
|
}
|
|
var r = this.yylloc.range;
|
|
|
|
this.yylloc = {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: lines ?
|
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
|
this.yylloc.first_column - len
|
|
};
|
|
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
|
}
|
|
this.yyleng = this.yytext.length;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, caches matched text and appends it on next action
|
|
more:function () {
|
|
this._more = true;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
|
reject:function () {
|
|
if (this.options.backtrack_lexer) {
|
|
this._backtrack = true;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
// retain first n characters of the match
|
|
less:function (n) {
|
|
this.unput(this.match.slice(n));
|
|
},
|
|
|
|
// displays already matched input, i.e. for error messages
|
|
pastInput:function () {
|
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays upcoming input, i.e. for error messages
|
|
upcomingInput:function () {
|
|
var next = this.match;
|
|
if (next.length < 20) {
|
|
next += this._input.substr(0, 20-next.length);
|
|
}
|
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
|
showPosition:function () {
|
|
var pre = this.pastInput();
|
|
var c = new Array(pre.length + 1).join("-");
|
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
|
},
|
|
|
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
|
test_match:function(match, indexed_rule) {
|
|
var token,
|
|
lines,
|
|
backup;
|
|
|
|
if (this.options.backtrack_lexer) {
|
|
// save context
|
|
backup = {
|
|
yylineno: this.yylineno,
|
|
yylloc: {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.last_line,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: this.yylloc.last_column
|
|
},
|
|
yytext: this.yytext,
|
|
match: this.match,
|
|
matches: this.matches,
|
|
matched: this.matched,
|
|
yyleng: this.yyleng,
|
|
offset: this.offset,
|
|
_more: this._more,
|
|
_input: this._input,
|
|
yy: this.yy,
|
|
conditionStack: this.conditionStack.slice(0),
|
|
done: this.done
|
|
};
|
|
if (this.options.ranges) {
|
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
|
}
|
|
}
|
|
|
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno += lines.length;
|
|
}
|
|
this.yylloc = {
|
|
first_line: this.yylloc.last_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.last_column,
|
|
last_column: lines ?
|
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
|
this.yylloc.last_column + match[0].length
|
|
};
|
|
this.yytext += match[0];
|
|
this.match += match[0];
|
|
this.matches = match;
|
|
this.yyleng = this.yytext.length;
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
|
}
|
|
this._more = false;
|
|
this._backtrack = false;
|
|
this._input = this._input.slice(match[0].length);
|
|
this.matched += match[0];
|
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
|
if (this.done && this._input) {
|
|
this.done = false;
|
|
}
|
|
if (token) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
// recover context
|
|
for (var k in backup) {
|
|
this[k] = backup[k];
|
|
}
|
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// return next match in input
|
|
next:function () {
|
|
if (this.done) {
|
|
return this.EOF;
|
|
}
|
|
if (!this._input) {
|
|
this.done = true;
|
|
}
|
|
|
|
var token,
|
|
match,
|
|
tempMatch,
|
|
index;
|
|
if (!this._more) {
|
|
this.yytext = '';
|
|
this.match = '';
|
|
}
|
|
var rules = this._currentRules();
|
|
for (var i = 0; i < rules.length; i++) {
|
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
|
match = tempMatch;
|
|
index = i;
|
|
if (this.options.backtrack_lexer) {
|
|
token = this.test_match(tempMatch, rules[i]);
|
|
if (token !== false) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
match = false;
|
|
continue; // rule action called reject() implying a rule MISmatch.
|
|
} else {
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
} else if (!this.options.flex) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (match) {
|
|
token = this.test_match(match, rules[index]);
|
|
if (token !== false) {
|
|
return token;
|
|
}
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
if (this._input === "") {
|
|
return this.EOF;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
}
|
|
},
|
|
|
|
// return next match that has a token
|
|
lex:function lex () {
|
|
var r = this.next();
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return this.lex();
|
|
}
|
|
},
|
|
|
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
|
begin:function begin (condition) {
|
|
this.conditionStack.push(condition);
|
|
},
|
|
|
|
// pop the previously active lexer condition state off the condition stack
|
|
popState:function popState () {
|
|
var n = this.conditionStack.length - 1;
|
|
if (n > 0) {
|
|
return this.conditionStack.pop();
|
|
} else {
|
|
return this.conditionStack[0];
|
|
}
|
|
},
|
|
|
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
|
_currentRules:function _currentRules () {
|
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
|
} else {
|
|
return this.conditions["INITIAL"].rules;
|
|
}
|
|
},
|
|
|
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
|
topState:function topState (n) {
|
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
|
if (n >= 0) {
|
|
return this.conditionStack[n];
|
|
} else {
|
|
return "INITIAL";
|
|
}
|
|
},
|
|
|
|
// alias for begin(condition)
|
|
pushState:function pushState (condition) {
|
|
this.begin(condition);
|
|
},
|
|
|
|
// return the number of states currently on the stack
|
|
stateStackSize:function stateStackSize() {
|
|
return this.conditionStack.length;
|
|
},
|
|
options: {},
|
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
|
var YYSTATE=YY_START;
|
|
switch($avoiding_name_collisions) {
|
|
case 0:/* do nothing */
|
|
break;
|
|
case 1:this.begin("string");
|
|
break;
|
|
case 2:this.popState();
|
|
break;
|
|
case 3:return "STR";
|
|
break;
|
|
case 4:return 63;
|
|
break;
|
|
case 5:return 72;
|
|
break;
|
|
case 6:return 64;
|
|
break;
|
|
case 7:return 77;
|
|
break;
|
|
case 8:return 65;
|
|
break;
|
|
case 9:return 66;
|
|
break;
|
|
case 10:return 67;
|
|
break;
|
|
case 11:if(yy.lex.firstGraph()){this.begin("dir");} return 12;
|
|
break;
|
|
case 12:if(yy.lex.firstGraph()){this.begin("dir");} return 12;
|
|
break;
|
|
case 13:return 26;
|
|
break;
|
|
case 14:return 30;
|
|
break;
|
|
case 15: this.popState(); return 13;
|
|
break;
|
|
case 16: this.popState(); return 13;
|
|
break;
|
|
case 17: this.popState(); return 13;
|
|
break;
|
|
case 18: this.popState(); return 13;
|
|
break;
|
|
case 19: this.popState(); return 13;
|
|
break;
|
|
case 20: this.popState(); return 13;
|
|
break;
|
|
case 21: this.popState(); return 13;
|
|
break;
|
|
case 22: this.popState(); return 13;
|
|
break;
|
|
case 23: this.popState(); return 13;
|
|
break;
|
|
case 24: this.popState(); return 13;
|
|
break;
|
|
case 25: return 78;
|
|
break;
|
|
case 26:return 86;
|
|
break;
|
|
case 27:return 35;
|
|
break;
|
|
case 28:return 83;
|
|
break;
|
|
case 29:return 34;
|
|
break;
|
|
case 30:return 8;
|
|
break;
|
|
case 31:return 79;
|
|
break;
|
|
case 32:return 97;
|
|
break;
|
|
case 33:return 58;
|
|
break;
|
|
case 34:return 58;
|
|
break;
|
|
case 35:return 58;
|
|
break;
|
|
case 36:return 58;
|
|
break;
|
|
case 37:return 58;
|
|
break;
|
|
case 38:return 58;
|
|
break;
|
|
case 39:return 58;
|
|
break;
|
|
case 40:return 58;
|
|
break;
|
|
case 41:return 58;
|
|
break;
|
|
case 42:return 58;
|
|
break;
|
|
case 43:return 58;
|
|
break;
|
|
case 44:return 58;
|
|
break;
|
|
case 45:return 58;
|
|
break;
|
|
case 46:return 58;
|
|
break;
|
|
case 47:return 58;
|
|
break;
|
|
case 48:return 58;
|
|
break;
|
|
case 49:return 58;
|
|
break;
|
|
case 50:return 58;
|
|
break;
|
|
case 51:return 58;
|
|
break;
|
|
case 52:return 58;
|
|
break;
|
|
case 53:return 58;
|
|
break;
|
|
case 54:return 58;
|
|
break;
|
|
case 55:return 58;
|
|
break;
|
|
case 56:return 58;
|
|
break;
|
|
case 57:return 58;
|
|
break;
|
|
case 58:return 58;
|
|
break;
|
|
case 59:return 58;
|
|
break;
|
|
case 60:return 58;
|
|
break;
|
|
case 61:return 57;
|
|
break;
|
|
case 62:return 57;
|
|
break;
|
|
case 63:return 57;
|
|
break;
|
|
case 64:return 57;
|
|
break;
|
|
case 65:return 57;
|
|
break;
|
|
case 66:return 57;
|
|
break;
|
|
case 67:return 57;
|
|
break;
|
|
case 68:return 57;
|
|
break;
|
|
case 69:return 57;
|
|
break;
|
|
case 70:return 57;
|
|
break;
|
|
case 71:return 57;
|
|
break;
|
|
case 72:return 57;
|
|
break;
|
|
case 73:return 39;
|
|
break;
|
|
case 74:return 40;
|
|
break;
|
|
case 75:return 41;
|
|
break;
|
|
case 76:return 42;
|
|
break;
|
|
case 77:return 43;
|
|
break;
|
|
case 78:return 44;
|
|
break;
|
|
case 79:return 45;
|
|
break;
|
|
case 80:return 46;
|
|
break;
|
|
case 81:return 84;
|
|
break;
|
|
case 82:return 87;
|
|
break;
|
|
case 83:return 98;
|
|
break;
|
|
case 84:return 95;
|
|
break;
|
|
case 85:return 88;
|
|
break;
|
|
case 86:return 96;
|
|
break;
|
|
case 87:return 96;
|
|
break;
|
|
case 88:return 89;
|
|
break;
|
|
case 89:return 49;
|
|
break;
|
|
case 90:return 69;
|
|
break;
|
|
case 91:return 'SEP';
|
|
break;
|
|
case 92:return 68;
|
|
break;
|
|
case 93:return 82;
|
|
break;
|
|
case 94:return 51;
|
|
break;
|
|
case 95:return 50;
|
|
break;
|
|
case 96:return 53;
|
|
break;
|
|
case 97:return 52;
|
|
break;
|
|
case 98:return 93;
|
|
break;
|
|
case 99:return 94;
|
|
break;
|
|
case 100:return 59;
|
|
break;
|
|
case 101:return 37;
|
|
break;
|
|
case 102:return 38;
|
|
break;
|
|
case 103:return 28;
|
|
break;
|
|
case 104:return 29;
|
|
break;
|
|
case 105:return 47
|
|
break;
|
|
case 106:return 48
|
|
break;
|
|
case 107:return 104;
|
|
break;
|
|
case 108:return 9;
|
|
break;
|
|
case 109:return 10;
|
|
break;
|
|
case 110:return 11;
|
|
break;
|
|
}
|
|
},
|
|
rules: [/^(?:%%[^\n]*\n*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:click\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*--[x]\s*)/,/^(?:\s*-->\s*)/,/^(?:\s*<-->\s*)/,/^(?:\s*[x]--[x]\s*)/,/^(?:\s*[o]--[o]\s*)/,/^(?:\s*[o]\.-[o]\s*)/,/^(?:\s*<==>\s*)/,/^(?:\s*[o]==[o]\s*)/,/^(?:\s*[x]==[x]\s*)/,/^(?:\s*[x].-[x]\s*)/,/^(?:\s*[x]-\.-[x]\s*)/,/^(?:\s*<\.->\s*)/,/^(?:\s*<-\.->\s*)/,/^(?:\s*[o]-\.-[o]\s*)/,/^(?:\s*--[o]\s*)/,/^(?:\s*---\s*)/,/^(?:\s*-\.-[x]\s*)/,/^(?:\s*-\.->\s*)/,/^(?:\s*-\.-[o]\s*)/,/^(?:\s*-\.-\s*)/,/^(?:\s*.-[x]\s*)/,/^(?:\s*\.->\s*)/,/^(?:\s*\.-[o]\s*)/,/^(?:\s*\.-\s*)/,/^(?:\s*==[x]\s*)/,/^(?:\s*==>\s*)/,/^(?:\s*==[o]\s*)/,/^(?:\s*==[\=]\s*)/,/^(?:\s*<--\s*)/,/^(?:\s*[x]--\s*)/,/^(?:\s*[o]--\s*)/,/^(?:\s*<-\.\s*)/,/^(?:\s*[x]-\.\s*)/,/^(?:\s*[o]-\.\s*)/,/^(?:\s*<==\s*)/,/^(?:\s*[x]==\s*)/,/^(?:\s*[o]==\s*)/,/^(?:\s*--\s*)/,/^(?:\s*-\.\s*)/,/^(?:\s*==\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\[)/,/^(?:\]\))/,/^(?:\[\[)/,/^(?:\]\])/,/^(?:\[\()/,/^(?:\)\])/,/^(?:-)/,/^(?:\.)/,/^(?:[\_])/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:[A-Za-z]+)/,/^(?:\\\])/,/^(?:\[\/)/,/^(?:\/\])/,/^(?:\[\\)/,/^(?:[!"#$%&'*+,-.`?\\_\/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:(\r|\n|\r\n)+)/,/^(?:\s)/,/^(?:$)/],
|
|
conditions: {"vertex":{"rules":[],"inclusive":false},"dir":{"rules":[15,16,17,18,19,20,21,22,23,24],"inclusive":false},"string":{"rules":[2,3],"inclusive":false},"INITIAL":{"rules":[0,1,4,5,6,7,8,9,10,11,12,13,14,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110],"inclusive":true}}
|
|
});
|
|
return lexer;
|
|
})();
|
|
parser.lexer = lexer;
|
|
function Parser () {
|
|
this.yy = {};
|
|
}
|
|
Parser.prototype = parser;parser.Parser = Parser;
|
|
return new Parser;
|
|
})();
|
|
|
|
|
|
if (true) {
|
|
exports.parser = parser;
|
|
exports.Parser = parser.Parser;
|
|
exports.parse = function () { return parser.parse.apply(parser, arguments); };
|
|
exports.main = function commonjsMain (args) {
|
|
if (!args[1]) {
|
|
console.log('Usage: '+args[0]+' FILE');
|
|
process.exit(1);
|
|
}
|
|
var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
|
|
return exports.parser.parse(source);
|
|
};
|
|
if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
|
|
exports.main(process.argv.slice(1));
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js?f28c"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/gantt/ganttDb.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/diagrams/gantt/ganttDb.js ***!
|
|
\***************************************/
|
|
/*! exports provided: clear, setAxisFormat, getAxisFormat, setTodayMarker, getTodayMarker, setDateFormat, enableInclusiveEndDates, endDatesAreInclusive, getDateFormat, setExcludes, getExcludes, setTitle, getTitle, addSection, getSections, getTasks, addTask, findTaskById, addTaskOrg, setLink, setClass, setClickEvent, bindFunctions, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAxisFormat", function() { return setAxisFormat; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAxisFormat", function() { return getAxisFormat; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTodayMarker", function() { return setTodayMarker; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTodayMarker", function() { return getTodayMarker; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setDateFormat", function() { return setDateFormat; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableInclusiveEndDates", function() { return enableInclusiveEndDates; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endDatesAreInclusive", function() { return endDatesAreInclusive; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDateFormat", function() { return getDateFormat; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setExcludes", function() { return setExcludes; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getExcludes", function() { return getExcludes; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTitle", function() { return setTitle; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTitle", function() { return getTitle; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSection", function() { return addSection; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSections", function() { return getSections; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTasks", function() { return getTasks; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTask", function() { return addTask; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findTaskById", function() { return findTaskById; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTaskOrg", function() { return addTaskOrg; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLink", function() { return setLink; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setClass", function() { return setClass; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setClickEvent", function() { return setClickEvent; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindFunctions", function() { return bindFunctions; });
|
|
/* harmony import */ var moment_mini__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment-mini */ "moment-mini");
|
|
/* harmony import */ var moment_mini__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment_mini__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @braintree/sanitize-url */ "@braintree/sanitize-url");
|
|
/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
|
|
|
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
|
|
|
|
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
|
|
|
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
|
|
|
|
|
|
|
|
|
|
|
|
var config = Object(_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"])();
|
|
var dateFormat = '';
|
|
var axisFormat = '';
|
|
var todayMarker = '';
|
|
var excludes = [];
|
|
var title = '';
|
|
var sections = [];
|
|
var tasks = [];
|
|
var currentSection = '';
|
|
var tags = ['active', 'done', 'crit', 'milestone'];
|
|
var funs = [];
|
|
var inclusiveEndDates = false;
|
|
var clear = function clear() {
|
|
sections = [];
|
|
tasks = [];
|
|
currentSection = '';
|
|
funs = [];
|
|
title = '';
|
|
taskCnt = 0;
|
|
lastTask = undefined;
|
|
lastTaskID = undefined;
|
|
rawTasks = [];
|
|
dateFormat = '';
|
|
axisFormat = '';
|
|
todayMarker = '';
|
|
excludes = [];
|
|
inclusiveEndDates = false;
|
|
};
|
|
var setAxisFormat = function setAxisFormat(txt) {
|
|
axisFormat = txt;
|
|
};
|
|
var getAxisFormat = function getAxisFormat() {
|
|
return axisFormat;
|
|
};
|
|
var setTodayMarker = function setTodayMarker(txt) {
|
|
todayMarker = txt;
|
|
};
|
|
var getTodayMarker = function getTodayMarker() {
|
|
return todayMarker;
|
|
};
|
|
var setDateFormat = function setDateFormat(txt) {
|
|
dateFormat = txt;
|
|
};
|
|
var enableInclusiveEndDates = function enableInclusiveEndDates() {
|
|
inclusiveEndDates = true;
|
|
};
|
|
var endDatesAreInclusive = function endDatesAreInclusive() {
|
|
return inclusiveEndDates;
|
|
};
|
|
var getDateFormat = function getDateFormat() {
|
|
return dateFormat;
|
|
};
|
|
var setExcludes = function setExcludes(txt) {
|
|
excludes = txt.toLowerCase().split(/[\s,]+/);
|
|
};
|
|
var getExcludes = function getExcludes() {
|
|
return excludes;
|
|
};
|
|
var setTitle = function setTitle(txt) {
|
|
title = txt;
|
|
};
|
|
var getTitle = function getTitle() {
|
|
return title;
|
|
};
|
|
var addSection = function addSection(txt) {
|
|
currentSection = txt;
|
|
sections.push(txt);
|
|
};
|
|
var getSections = function getSections() {
|
|
return sections;
|
|
};
|
|
var getTasks = function getTasks() {
|
|
var allItemsPricessed = compileTasks();
|
|
var maxDepth = 10;
|
|
var iterationCount = 0;
|
|
|
|
while (!allItemsPricessed && iterationCount < maxDepth) {
|
|
allItemsPricessed = compileTasks();
|
|
iterationCount++;
|
|
}
|
|
|
|
tasks = rawTasks;
|
|
return tasks;
|
|
};
|
|
|
|
var isInvalidDate = function isInvalidDate(date, dateFormat, excludes) {
|
|
if (date.isoWeekday() >= 6 && excludes.indexOf('weekends') >= 0) {
|
|
return true;
|
|
}
|
|
|
|
if (excludes.indexOf(date.format('dddd').toLowerCase()) >= 0) {
|
|
return true;
|
|
}
|
|
|
|
return excludes.indexOf(date.format(dateFormat.trim())) >= 0;
|
|
};
|
|
|
|
var checkTaskDates = function checkTaskDates(task, dateFormat, excludes) {
|
|
if (!excludes.length || task.manualEndTime) return;
|
|
var startTime = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(task.startTime, dateFormat, true);
|
|
startTime.add(1, 'd');
|
|
var endTime = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(task.endTime, dateFormat, true);
|
|
var renderEndTime = fixTaskDates(startTime, endTime, dateFormat, excludes);
|
|
task.endTime = endTime.toDate();
|
|
task.renderEndTime = renderEndTime;
|
|
};
|
|
|
|
var fixTaskDates = function fixTaskDates(startTime, endTime, dateFormat, excludes) {
|
|
var invalid = false;
|
|
var renderEndTime = null;
|
|
|
|
while (startTime <= endTime) {
|
|
if (!invalid) {
|
|
renderEndTime = endTime.toDate();
|
|
}
|
|
|
|
invalid = isInvalidDate(startTime, dateFormat, excludes);
|
|
|
|
if (invalid) {
|
|
endTime.add(1, 'd');
|
|
}
|
|
|
|
startTime.add(1, 'd');
|
|
}
|
|
|
|
return renderEndTime;
|
|
};
|
|
|
|
var getStartDate = function getStartDate(prevTime, dateFormat, str) {
|
|
str = str.trim(); // Test for after
|
|
|
|
var re = /^after\s+([\d\w- ]+)/;
|
|
var afterStatement = re.exec(str.trim());
|
|
|
|
if (afterStatement !== null) {
|
|
// check all after ids and take the latest
|
|
var latestEndingTask = null;
|
|
afterStatement[1].split(' ').forEach(function (id) {
|
|
var task = findTaskById(id);
|
|
|
|
if (typeof task !== 'undefined') {
|
|
if (!latestEndingTask) {
|
|
latestEndingTask = task;
|
|
} else {
|
|
if (task.endTime > latestEndingTask.endTime) {
|
|
latestEndingTask = task;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
if (!latestEndingTask) {
|
|
var dt = new Date();
|
|
dt.setHours(0, 0, 0, 0);
|
|
return dt;
|
|
} else {
|
|
return latestEndingTask.endTime;
|
|
}
|
|
} // Check for actual date set
|
|
|
|
|
|
var mDate = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(str, dateFormat.trim(), true);
|
|
|
|
if (mDate.isValid()) {
|
|
return mDate.toDate();
|
|
} else {
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Invalid date:' + str);
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('With date format:' + dateFormat.trim());
|
|
} // Default date - now
|
|
|
|
|
|
return new Date();
|
|
};
|
|
|
|
var durationToDate = function durationToDate(durationStatement, relativeTime) {
|
|
if (durationStatement !== null) {
|
|
switch (durationStatement[2]) {
|
|
case 's':
|
|
relativeTime.add(durationStatement[1], 'seconds');
|
|
break;
|
|
|
|
case 'm':
|
|
relativeTime.add(durationStatement[1], 'minutes');
|
|
break;
|
|
|
|
case 'h':
|
|
relativeTime.add(durationStatement[1], 'hours');
|
|
break;
|
|
|
|
case 'd':
|
|
relativeTime.add(durationStatement[1], 'days');
|
|
break;
|
|
|
|
case 'w':
|
|
relativeTime.add(durationStatement[1], 'weeks');
|
|
break;
|
|
}
|
|
} // Default date - now
|
|
|
|
|
|
return relativeTime.toDate();
|
|
};
|
|
|
|
var getEndDate = function getEndDate(prevTime, dateFormat, str, inclusive) {
|
|
inclusive = inclusive || false;
|
|
str = str.trim(); // Check for actual date
|
|
|
|
var mDate = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(str, dateFormat.trim(), true);
|
|
|
|
if (mDate.isValid()) {
|
|
if (inclusive) {
|
|
mDate.add(1, 'd');
|
|
}
|
|
|
|
return mDate.toDate();
|
|
}
|
|
|
|
return durationToDate(/^([\d]+)([wdhms])/.exec(str.trim()), moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(prevTime));
|
|
};
|
|
|
|
var taskCnt = 0;
|
|
|
|
var parseId = function parseId(idStr) {
|
|
if (typeof idStr === 'undefined') {
|
|
taskCnt = taskCnt + 1;
|
|
return 'task' + taskCnt;
|
|
}
|
|
|
|
return idStr;
|
|
}; // id, startDate, endDate
|
|
// id, startDate, length
|
|
// id, after x, endDate
|
|
// id, after x, length
|
|
// startDate, endDate
|
|
// startDate, length
|
|
// after x, endDate
|
|
// after x, length
|
|
// endDate
|
|
// length
|
|
|
|
|
|
var compileData = function compileData(prevTask, dataStr) {
|
|
var ds;
|
|
|
|
if (dataStr.substr(0, 1) === ':') {
|
|
ds = dataStr.substr(1, dataStr.length);
|
|
} else {
|
|
ds = dataStr;
|
|
}
|
|
|
|
var data = ds.split(',');
|
|
var task = {}; // Get tags like active, done, crit and milestone
|
|
|
|
getTaskTags(data, task, tags);
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
data[i] = data[i].trim();
|
|
}
|
|
|
|
var endTimeData = '';
|
|
|
|
switch (data.length) {
|
|
case 1:
|
|
task.id = parseId();
|
|
task.startTime = prevTask.endTime;
|
|
endTimeData = data[0];
|
|
break;
|
|
|
|
case 2:
|
|
task.id = parseId();
|
|
task.startTime = getStartDate(undefined, dateFormat, data[0]);
|
|
endTimeData = data[1];
|
|
break;
|
|
|
|
case 3:
|
|
task.id = parseId(data[0]);
|
|
task.startTime = getStartDate(undefined, dateFormat, data[1]);
|
|
endTimeData = data[2];
|
|
break;
|
|
|
|
default:
|
|
}
|
|
|
|
if (endTimeData) {
|
|
task.endTime = getEndDate(task.startTime, dateFormat, endTimeData, inclusiveEndDates);
|
|
task.manualEndTime = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(endTimeData, 'YYYY-MM-DD', true).isValid();
|
|
checkTaskDates(task, dateFormat, excludes);
|
|
}
|
|
|
|
return task;
|
|
};
|
|
|
|
var parseData = function parseData(prevTaskId, dataStr) {
|
|
var ds;
|
|
|
|
if (dataStr.substr(0, 1) === ':') {
|
|
ds = dataStr.substr(1, dataStr.length);
|
|
} else {
|
|
ds = dataStr;
|
|
}
|
|
|
|
var data = ds.split(',');
|
|
var task = {}; // Get tags like active, done, crit and milestone
|
|
|
|
getTaskTags(data, task, tags);
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
data[i] = data[i].trim();
|
|
}
|
|
|
|
switch (data.length) {
|
|
case 1:
|
|
task.id = parseId();
|
|
task.startTime = {
|
|
type: 'prevTaskEnd',
|
|
id: prevTaskId
|
|
};
|
|
task.endTime = {
|
|
data: data[0]
|
|
};
|
|
break;
|
|
|
|
case 2:
|
|
task.id = parseId();
|
|
task.startTime = {
|
|
type: 'getStartDate',
|
|
startData: data[0]
|
|
};
|
|
task.endTime = {
|
|
data: data[1]
|
|
};
|
|
break;
|
|
|
|
case 3:
|
|
task.id = parseId(data[0]);
|
|
task.startTime = {
|
|
type: 'getStartDate',
|
|
startData: data[1]
|
|
};
|
|
task.endTime = {
|
|
data: data[2]
|
|
};
|
|
break;
|
|
|
|
default:
|
|
}
|
|
|
|
return task;
|
|
};
|
|
|
|
var lastTask;
|
|
var lastTaskID;
|
|
var rawTasks = [];
|
|
var taskDb = {};
|
|
var addTask = function addTask(descr, data) {
|
|
var rawTask = {
|
|
section: currentSection,
|
|
type: currentSection,
|
|
processed: false,
|
|
manualEndTime: false,
|
|
renderEndTime: null,
|
|
raw: {
|
|
data: data
|
|
},
|
|
task: descr,
|
|
classes: []
|
|
};
|
|
var taskInfo = parseData(lastTaskID, data);
|
|
rawTask.raw.startTime = taskInfo.startTime;
|
|
rawTask.raw.endTime = taskInfo.endTime;
|
|
rawTask.id = taskInfo.id;
|
|
rawTask.prevTaskId = lastTaskID;
|
|
rawTask.active = taskInfo.active;
|
|
rawTask.done = taskInfo.done;
|
|
rawTask.crit = taskInfo.crit;
|
|
rawTask.milestone = taskInfo.milestone;
|
|
var pos = rawTasks.push(rawTask);
|
|
lastTaskID = rawTask.id; // Store cross ref
|
|
|
|
taskDb[rawTask.id] = pos - 1;
|
|
};
|
|
var findTaskById = function findTaskById(id) {
|
|
var pos = taskDb[id];
|
|
return rawTasks[pos];
|
|
};
|
|
var addTaskOrg = function addTaskOrg(descr, data) {
|
|
var newTask = {
|
|
section: currentSection,
|
|
type: currentSection,
|
|
description: descr,
|
|
task: descr,
|
|
classes: []
|
|
};
|
|
var taskInfo = compileData(lastTask, data);
|
|
newTask.startTime = taskInfo.startTime;
|
|
newTask.endTime = taskInfo.endTime;
|
|
newTask.id = taskInfo.id;
|
|
newTask.active = taskInfo.active;
|
|
newTask.done = taskInfo.done;
|
|
newTask.crit = taskInfo.crit;
|
|
newTask.milestone = taskInfo.milestone;
|
|
lastTask = newTask;
|
|
tasks.push(newTask);
|
|
};
|
|
|
|
var compileTasks = function compileTasks() {
|
|
var compileTask = function compileTask(pos) {
|
|
var task = rawTasks[pos];
|
|
var startTime = '';
|
|
|
|
switch (rawTasks[pos].raw.startTime.type) {
|
|
case 'prevTaskEnd':
|
|
{
|
|
var prevTask = findTaskById(task.prevTaskId);
|
|
task.startTime = prevTask.endTime;
|
|
break;
|
|
}
|
|
|
|
case 'getStartDate':
|
|
startTime = getStartDate(undefined, dateFormat, rawTasks[pos].raw.startTime.startData);
|
|
|
|
if (startTime) {
|
|
rawTasks[pos].startTime = startTime;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
if (rawTasks[pos].startTime) {
|
|
rawTasks[pos].endTime = getEndDate(rawTasks[pos].startTime, dateFormat, rawTasks[pos].raw.endTime.data, inclusiveEndDates);
|
|
|
|
if (rawTasks[pos].endTime) {
|
|
rawTasks[pos].processed = true;
|
|
rawTasks[pos].manualEndTime = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(rawTasks[pos].raw.endTime.data, 'YYYY-MM-DD', true).isValid();
|
|
checkTaskDates(rawTasks[pos], dateFormat, excludes);
|
|
}
|
|
}
|
|
|
|
return rawTasks[pos].processed;
|
|
};
|
|
|
|
var allProcessed = true;
|
|
|
|
for (var i = 0; i < rawTasks.length; i++) {
|
|
compileTask(i);
|
|
allProcessed = allProcessed && rawTasks[i].processed;
|
|
}
|
|
|
|
return allProcessed;
|
|
};
|
|
/**
|
|
* Called by parser when a link is found. Adds the URL to the vertex data.
|
|
* @param ids Comma separated list of ids
|
|
* @param linkStr URL to create a link for
|
|
*/
|
|
|
|
|
|
var setLink = function setLink(ids, _linkStr) {
|
|
var linkStr = _linkStr;
|
|
|
|
if (config.securityLevel !== 'loose') {
|
|
linkStr = Object(_braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_1__["sanitizeUrl"])(_linkStr);
|
|
}
|
|
|
|
ids.split(',').forEach(function (id) {
|
|
var rawTask = findTaskById(id);
|
|
|
|
if (typeof rawTask !== 'undefined') {
|
|
pushFun(id, function () {
|
|
window.open(linkStr, '_self');
|
|
});
|
|
}
|
|
});
|
|
setClass(ids, 'clickable');
|
|
};
|
|
/**
|
|
* Called by parser when a special node is found, e.g. a clickable element.
|
|
* @param ids Comma separated list of ids
|
|
* @param className Class to add
|
|
*/
|
|
|
|
var setClass = function setClass(ids, className) {
|
|
ids.split(',').forEach(function (id) {
|
|
var rawTask = findTaskById(id);
|
|
|
|
if (typeof rawTask !== 'undefined') {
|
|
rawTask.classes.push(className);
|
|
}
|
|
});
|
|
};
|
|
|
|
var setClickFun = function setClickFun(id, functionName, functionArgs) {
|
|
if (config.securityLevel !== 'loose') {
|
|
return;
|
|
}
|
|
|
|
if (typeof functionName === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
var argList = [];
|
|
|
|
if (typeof functionArgs === 'string') {
|
|
/* Splits functionArgs by ',', ignoring all ',' in double quoted strings */
|
|
argList = functionArgs.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);
|
|
|
|
for (var i = 0; i < argList.length; i++) {
|
|
var item = argList[i].trim();
|
|
/* Removes all double quotes at the start and end of an argument */
|
|
|
|
/* This preserves all starting and ending whitespace inside */
|
|
|
|
if (item.charAt(0) === '"' && item.charAt(item.length - 1) === '"') {
|
|
item = item.substr(1, item.length - 2);
|
|
}
|
|
|
|
argList[i] = item;
|
|
}
|
|
}
|
|
/* if no arguments passed into callback, default to passing in id */
|
|
|
|
|
|
if (argList.length === 0) {
|
|
argList.push(id);
|
|
}
|
|
|
|
var rawTask = findTaskById(id);
|
|
|
|
if (typeof rawTask !== 'undefined') {
|
|
pushFun(id, function () {
|
|
var _window;
|
|
|
|
(_window = window)[functionName].apply(_window, _toConsumableArray(argList));
|
|
});
|
|
}
|
|
};
|
|
/**
|
|
* The callbackFunction is executed in a click event bound to the task with the specified id or the task's assigned text
|
|
* @param id The task's id
|
|
* @param callbackFunction A function to be executed when clicked on the task or the task's text
|
|
*/
|
|
|
|
|
|
var pushFun = function pushFun(id, callbackFunction) {
|
|
funs.push(function () {
|
|
// const elem = d3.select(element).select(`[id="${id}"]`)
|
|
var elem = document.querySelector("[id=\"".concat(id, "\"]"));
|
|
|
|
if (elem !== null) {
|
|
elem.addEventListener('click', function () {
|
|
callbackFunction();
|
|
});
|
|
}
|
|
});
|
|
funs.push(function () {
|
|
// const elem = d3.select(element).select(`[id="${id}-text"]`)
|
|
var elem = document.querySelector("[id=\"".concat(id, "-text\"]"));
|
|
|
|
if (elem !== null) {
|
|
elem.addEventListener('click', function () {
|
|
callbackFunction();
|
|
});
|
|
}
|
|
});
|
|
};
|
|
/**
|
|
* Called by parser when a click definition is found. Registers an event handler.
|
|
* @param ids Comma separated list of ids
|
|
* @param functionName Function to be called on click
|
|
* @param functionArgs Function args the function should be called with
|
|
*/
|
|
|
|
|
|
var setClickEvent = function setClickEvent(ids, functionName, functionArgs) {
|
|
ids.split(',').forEach(function (id) {
|
|
setClickFun(id, functionName, functionArgs);
|
|
});
|
|
setClass(ids, 'clickable');
|
|
};
|
|
/**
|
|
* Binds all functions previously added to fun (specified through click) to the element
|
|
* @param element
|
|
*/
|
|
|
|
var bindFunctions = function bindFunctions(element) {
|
|
funs.forEach(function (fun) {
|
|
fun(element);
|
|
});
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
clear: clear,
|
|
setDateFormat: setDateFormat,
|
|
getDateFormat: getDateFormat,
|
|
enableInclusiveEndDates: enableInclusiveEndDates,
|
|
endDatesAreInclusive: endDatesAreInclusive,
|
|
setAxisFormat: setAxisFormat,
|
|
getAxisFormat: getAxisFormat,
|
|
setTodayMarker: setTodayMarker,
|
|
getTodayMarker: getTodayMarker,
|
|
setTitle: setTitle,
|
|
getTitle: getTitle,
|
|
addSection: addSection,
|
|
getSections: getSections,
|
|
getTasks: getTasks,
|
|
addTask: addTask,
|
|
findTaskById: findTaskById,
|
|
addTaskOrg: addTaskOrg,
|
|
setExcludes: setExcludes,
|
|
getExcludes: getExcludes,
|
|
setClickEvent: setClickEvent,
|
|
setLink: setLink,
|
|
bindFunctions: bindFunctions,
|
|
durationToDate: durationToDate
|
|
});
|
|
|
|
function getTaskTags(data, task, tags) {
|
|
var matchFound = true;
|
|
|
|
while (matchFound) {
|
|
matchFound = false;
|
|
tags.forEach(function (t) {
|
|
var pattern = '^\\s*' + t + '\\s*$';
|
|
var regex = new RegExp(pattern);
|
|
|
|
if (data[0].match(regex)) {
|
|
task[t] = true;
|
|
data.shift(1);
|
|
matchFound = true;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/gantt/ganttRenderer.js":
|
|
/*!*********************************************!*\
|
|
!*** ./src/diagrams/gantt/ganttRenderer.js ***!
|
|
\*********************************************/
|
|
/*! exports provided: setConf, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _parser_gantt__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parser/gantt */ "./src/diagrams/gantt/parser/gantt.jison");
|
|
/* harmony import */ var _parser_gantt__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_parser_gantt__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
|
/* harmony import */ var _ganttDb__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ganttDb */ "./src/diagrams/gantt/ganttDb.js");
|
|
|
|
|
|
|
|
|
|
_parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].yy = _ganttDb__WEBPACK_IMPORTED_MODULE_3__["default"];
|
|
var conf = {
|
|
titleTopMargin: 25,
|
|
barHeight: 20,
|
|
barGap: 4,
|
|
topPadding: 50,
|
|
rightPadding: 75,
|
|
leftPadding: 75,
|
|
gridLineStartPadding: 35,
|
|
fontSize: 11,
|
|
fontFamily: '"Open-Sans", "sans-serif"'
|
|
};
|
|
var setConf = function setConf(cnf) {
|
|
var keys = Object.keys(cnf);
|
|
keys.forEach(function (key) {
|
|
conf[key] = cnf[key];
|
|
});
|
|
};
|
|
var w;
|
|
var draw = function draw(text, id) {
|
|
_parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.clear();
|
|
_parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].parse(text);
|
|
var elem = document.getElementById(id);
|
|
w = elem.parentElement.offsetWidth;
|
|
|
|
if (typeof w === 'undefined') {
|
|
w = 1200;
|
|
}
|
|
|
|
if (typeof conf.useWidth !== 'undefined') {
|
|
w = conf.useWidth;
|
|
}
|
|
|
|
var taskArray = _parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getTasks(); // Set height based on number of tasks
|
|
|
|
var h = taskArray.length * (conf.barHeight + conf.barGap) + 2 * conf.topPadding;
|
|
elem.setAttribute('height', '100%'); // Set viewBox
|
|
|
|
elem.setAttribute('viewBox', '0 0 ' + w + ' ' + h);
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id=\"".concat(id, "\"]")); // Set timescale
|
|
|
|
var timeScale = Object(d3__WEBPACK_IMPORTED_MODULE_0__["scaleTime"])().domain([Object(d3__WEBPACK_IMPORTED_MODULE_0__["min"])(taskArray, function (d) {
|
|
return d.startTime;
|
|
}), Object(d3__WEBPACK_IMPORTED_MODULE_0__["max"])(taskArray, function (d) {
|
|
return d.endTime;
|
|
})]).rangeRound([0, w - conf.leftPadding - conf.rightPadding]);
|
|
var categories = [];
|
|
|
|
for (var i = 0; i < taskArray.length; i++) {
|
|
categories.push(taskArray[i].type);
|
|
}
|
|
|
|
var catsUnfiltered = categories; // for vert labels
|
|
|
|
categories = checkUnique(categories);
|
|
makeGant(taskArray, w, h);
|
|
|
|
if (typeof conf.useWidth !== 'undefined') {
|
|
elem.setAttribute('width', w);
|
|
}
|
|
|
|
svg.append('text').text(_parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getTitle()).attr('x', w / 2).attr('y', conf.titleTopMargin).attr('class', 'titleText');
|
|
|
|
function makeGant(tasks, pageWidth, pageHeight) {
|
|
var barHeight = conf.barHeight;
|
|
var gap = barHeight + conf.barGap;
|
|
var topPadding = conf.topPadding;
|
|
var leftPadding = conf.leftPadding;
|
|
var colorScale = Object(d3__WEBPACK_IMPORTED_MODULE_0__["scaleLinear"])().domain([0, categories.length]).range(['#00B9FA', '#F95002']).interpolate(d3__WEBPACK_IMPORTED_MODULE_0__["interpolateHcl"]);
|
|
makeGrid(leftPadding, topPadding, pageWidth, pageHeight);
|
|
drawRects(tasks, gap, topPadding, leftPadding, barHeight, colorScale, pageWidth, pageHeight);
|
|
vertLabels(gap, topPadding, leftPadding, barHeight, colorScale);
|
|
drawToday(leftPadding, topPadding, pageWidth, pageHeight);
|
|
}
|
|
|
|
function drawRects(theArray, theGap, theTopPad, theSidePad, theBarHeight, theColorScale, w) {
|
|
// Draw background rects covering the entire width of the graph, these form the section rows.
|
|
svg.append('g').selectAll('rect').data(theArray).enter().append('rect').attr('x', 0).attr('y', function (d, i) {
|
|
return i * theGap + theTopPad - 2;
|
|
}).attr('width', function () {
|
|
return w - conf.rightPadding / 2;
|
|
}).attr('height', theGap).attr('class', function (d) {
|
|
for (var _i = 0; _i < categories.length; _i++) {
|
|
if (d.type === categories[_i]) {
|
|
return 'section section' + _i % conf.numberSectionStyles;
|
|
}
|
|
}
|
|
|
|
return 'section section0';
|
|
}); // Draw the rects representing the tasks
|
|
|
|
var rectangles = svg.append('g').selectAll('rect').data(theArray).enter();
|
|
rectangles.append('rect').attr('id', function (d) {
|
|
return d.id;
|
|
}).attr('rx', 3).attr('ry', 3).attr('x', function (d) {
|
|
if (d.milestone) {
|
|
return timeScale(d.startTime) + theSidePad + 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) - 0.5 * theBarHeight;
|
|
}
|
|
|
|
return timeScale(d.startTime) + theSidePad;
|
|
}).attr('y', function (d, i) {
|
|
return i * theGap + theTopPad;
|
|
}).attr('width', function (d) {
|
|
if (d.milestone) {
|
|
return theBarHeight;
|
|
}
|
|
|
|
return timeScale(d.renderEndTime || d.endTime) - timeScale(d.startTime);
|
|
}).attr('height', theBarHeight).attr('transform-origin', function (d, i) {
|
|
return (timeScale(d.startTime) + theSidePad + 0.5 * (timeScale(d.endTime) - timeScale(d.startTime))).toString() + 'px ' + (i * theGap + theTopPad + 0.5 * theBarHeight).toString() + 'px';
|
|
}).attr('class', function (d) {
|
|
var res = 'task';
|
|
var classStr = '';
|
|
|
|
if (d.classes.length > 0) {
|
|
classStr = d.classes.join(' ');
|
|
}
|
|
|
|
var secNum = 0;
|
|
|
|
for (var _i2 = 0; _i2 < categories.length; _i2++) {
|
|
if (d.type === categories[_i2]) {
|
|
secNum = _i2 % conf.numberSectionStyles;
|
|
}
|
|
}
|
|
|
|
var taskClass = '';
|
|
|
|
if (d.active) {
|
|
if (d.crit) {
|
|
taskClass += ' activeCrit';
|
|
} else {
|
|
taskClass = ' active';
|
|
}
|
|
} else if (d.done) {
|
|
if (d.crit) {
|
|
taskClass = ' doneCrit';
|
|
} else {
|
|
taskClass = ' done';
|
|
}
|
|
} else {
|
|
if (d.crit) {
|
|
taskClass += ' crit';
|
|
}
|
|
}
|
|
|
|
if (taskClass.length === 0) {
|
|
taskClass = ' task';
|
|
}
|
|
|
|
if (d.milestone) {
|
|
taskClass = ' milestone ' + taskClass;
|
|
}
|
|
|
|
taskClass += secNum;
|
|
taskClass += ' ' + classStr;
|
|
return res + taskClass;
|
|
}); // Append task labels
|
|
|
|
rectangles.append('text').attr('id', function (d) {
|
|
return d.id + '-text';
|
|
}).text(function (d) {
|
|
return d.task;
|
|
}).attr('font-size', conf.fontSize).attr('x', function (d) {
|
|
var startX = timeScale(d.startTime);
|
|
var endX = timeScale(d.renderEndTime || d.endTime);
|
|
|
|
if (d.milestone) {
|
|
startX += 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) - 0.5 * theBarHeight;
|
|
}
|
|
|
|
if (d.milestone) {
|
|
endX = startX + theBarHeight;
|
|
}
|
|
|
|
var textWidth = this.getBBox().width; // Check id text width > width of rectangle
|
|
|
|
if (textWidth > endX - startX) {
|
|
if (endX + textWidth + 1.5 * conf.leftPadding > w) {
|
|
return startX + theSidePad - 5;
|
|
} else {
|
|
return endX + theSidePad + 5;
|
|
}
|
|
} else {
|
|
return (endX - startX) / 2 + startX + theSidePad;
|
|
}
|
|
}).attr('y', function (d, i) {
|
|
return i * theGap + conf.barHeight / 2 + (conf.fontSize / 2 - 2) + theTopPad;
|
|
}).attr('text-height', theBarHeight).attr('class', function (d) {
|
|
var startX = timeScale(d.startTime);
|
|
var endX = timeScale(d.endTime);
|
|
|
|
if (d.milestone) {
|
|
endX = startX + theBarHeight;
|
|
}
|
|
|
|
var textWidth = this.getBBox().width;
|
|
var classStr = '';
|
|
|
|
if (d.classes.length > 0) {
|
|
classStr = d.classes.join(' ');
|
|
}
|
|
|
|
var secNum = 0;
|
|
|
|
for (var _i3 = 0; _i3 < categories.length; _i3++) {
|
|
if (d.type === categories[_i3]) {
|
|
secNum = _i3 % conf.numberSectionStyles;
|
|
}
|
|
}
|
|
|
|
var taskType = '';
|
|
|
|
if (d.active) {
|
|
if (d.crit) {
|
|
taskType = 'activeCritText' + secNum;
|
|
} else {
|
|
taskType = 'activeText' + secNum;
|
|
}
|
|
}
|
|
|
|
if (d.done) {
|
|
if (d.crit) {
|
|
taskType = taskType + ' doneCritText' + secNum;
|
|
} else {
|
|
taskType = taskType + ' doneText' + secNum;
|
|
}
|
|
} else {
|
|
if (d.crit) {
|
|
taskType = taskType + ' critText' + secNum;
|
|
}
|
|
}
|
|
|
|
if (d.milestone) {
|
|
taskType += ' milestoneText';
|
|
} // Check id text width > width of rectangle
|
|
|
|
|
|
if (textWidth > endX - startX) {
|
|
if (endX + textWidth + 1.5 * conf.leftPadding > w) {
|
|
return classStr + ' taskTextOutsideLeft taskTextOutside' + secNum + ' ' + taskType;
|
|
} else {
|
|
return classStr + ' taskTextOutsideRight taskTextOutside' + secNum + ' ' + taskType + ' width-' + textWidth;
|
|
}
|
|
} else {
|
|
return classStr + ' taskText taskText' + secNum + ' ' + taskType + ' width-' + textWidth;
|
|
}
|
|
});
|
|
}
|
|
|
|
function makeGrid(theSidePad, theTopPad, w, h) {
|
|
var xAxis = Object(d3__WEBPACK_IMPORTED_MODULE_0__["axisBottom"])(timeScale).tickSize(-h + theTopPad + conf.gridLineStartPadding).tickFormat(Object(d3__WEBPACK_IMPORTED_MODULE_0__["timeFormat"])(_parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getAxisFormat() || conf.axisFormat || '%Y-%m-%d'));
|
|
svg.append('g').attr('class', 'grid').attr('transform', 'translate(' + theSidePad + ', ' + (h - 50) + ')').call(xAxis).selectAll('text').style('text-anchor', 'middle').attr('fill', '#000').attr('stroke', 'none').attr('font-size', 10).attr('dy', '1em');
|
|
}
|
|
|
|
function vertLabels(theGap, theTopPad) {
|
|
var numOccurances = [];
|
|
var prevGap = 0;
|
|
|
|
for (var _i4 = 0; _i4 < categories.length; _i4++) {
|
|
numOccurances[_i4] = [categories[_i4], getCount(categories[_i4], catsUnfiltered)];
|
|
}
|
|
|
|
svg.append('g') // without doing this, impossible to put grid lines behind text
|
|
.selectAll('text').data(numOccurances).enter().append(function (d) {
|
|
var rows = d[0].split(_common_common__WEBPACK_IMPORTED_MODULE_2__["default"].lineBreakRegex);
|
|
var dy = -(rows.length - 1) / 2;
|
|
var svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
|
svgLabel.setAttribute('dy', dy + 'em');
|
|
|
|
for (var j = 0; j < rows.length; j++) {
|
|
var tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
|
|
tspan.setAttribute('alignment-baseline', 'central');
|
|
tspan.setAttribute('x', '10');
|
|
if (j > 0) tspan.setAttribute('dy', '1em');
|
|
tspan.textContent = rows[j];
|
|
svgLabel.appendChild(tspan);
|
|
}
|
|
|
|
return svgLabel;
|
|
}).attr('x', 10).attr('y', function (d, i) {
|
|
if (i > 0) {
|
|
for (var j = 0; j < i; j++) {
|
|
prevGap += numOccurances[i - 1][1];
|
|
return d[1] * theGap / 2 + prevGap * theGap + theTopPad;
|
|
}
|
|
} else {
|
|
return d[1] * theGap / 2 + theTopPad;
|
|
}
|
|
}).attr('class', function (d) {
|
|
for (var _i5 = 0; _i5 < categories.length; _i5++) {
|
|
if (d[0] === categories[_i5]) {
|
|
return 'sectionTitle sectionTitle' + _i5 % conf.numberSectionStyles;
|
|
}
|
|
}
|
|
|
|
return 'sectionTitle';
|
|
});
|
|
}
|
|
|
|
function drawToday(theSidePad, theTopPad, w, h) {
|
|
var todayMarker = _ganttDb__WEBPACK_IMPORTED_MODULE_3__["default"].getTodayMarker();
|
|
|
|
if (todayMarker === 'off') {
|
|
return;
|
|
}
|
|
|
|
var todayG = svg.append('g').attr('class', 'today');
|
|
var today = new Date();
|
|
var todayLine = todayG.append('line');
|
|
todayLine.attr('x1', timeScale(today) + theSidePad).attr('x2', timeScale(today) + theSidePad).attr('y1', conf.titleTopMargin).attr('y2', h - conf.titleTopMargin).attr('class', 'today');
|
|
|
|
if (todayMarker !== '') {
|
|
todayLine.attr('style', todayMarker.replace(/,/g, ';'));
|
|
}
|
|
} // from this stackexchange question: http://stackoverflow.com/questions/1890203/unique-for-arrays-in-javascript
|
|
|
|
|
|
function checkUnique(arr) {
|
|
var hash = {};
|
|
var result = [];
|
|
|
|
for (var _i6 = 0, l = arr.length; _i6 < l; ++_i6) {
|
|
if (!hash.hasOwnProperty(arr[_i6])) {
|
|
// eslint-disable-line
|
|
// it works with objects! in FF, at least
|
|
hash[arr[_i6]] = true;
|
|
result.push(arr[_i6]);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
} // from this stackexchange question: http://stackoverflow.com/questions/14227981/count-how-many-strings-in-an-array-have-duplicates-in-the-same-array
|
|
|
|
|
|
function getCounts(arr) {
|
|
var i = arr.length; // const to loop over
|
|
|
|
var obj = {}; // obj to store results
|
|
|
|
while (i) {
|
|
obj[arr[--i]] = (obj[arr[i]] || 0) + 1; // count occurrences
|
|
}
|
|
|
|
return obj;
|
|
} // get specific from everything
|
|
|
|
|
|
function getCount(word, arr) {
|
|
return getCounts(arr)[word] || 0;
|
|
}
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/gantt/parser/gantt.jison":
|
|
/*!***********************************************!*\
|
|
!*** ./src/diagrams/gantt/parser/gantt.jison ***!
|
|
\***********************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
|
|
/*
|
|
Returns a Parser object of the following structure:
|
|
|
|
Parser: {
|
|
yy: {}
|
|
}
|
|
|
|
Parser.prototype: {
|
|
yy: {},
|
|
trace: function(),
|
|
symbols_: {associative list: name ==> number},
|
|
terminals_: {associative list: number ==> name},
|
|
productions_: [...],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
|
table: [...],
|
|
defaultActions: {...},
|
|
parseError: function(str, hash),
|
|
parse: function(input),
|
|
|
|
lexer: {
|
|
EOF: 1,
|
|
parseError: function(str, hash),
|
|
setInput: function(input),
|
|
input: function(),
|
|
unput: function(str),
|
|
more: function(),
|
|
less: function(n),
|
|
pastInput: function(),
|
|
upcomingInput: function(),
|
|
showPosition: function(),
|
|
test_match: function(regex_match_array, rule_index),
|
|
next: function(),
|
|
lex: function(),
|
|
begin: function(condition),
|
|
popState: function(),
|
|
_currentRules: function(),
|
|
topState: function(),
|
|
pushState: function(condition),
|
|
|
|
options: {
|
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
|
},
|
|
|
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
|
rules: [...],
|
|
conditions: {associative list: name ==> set},
|
|
}
|
|
}
|
|
|
|
|
|
token location info (@$, _$, etc.): {
|
|
first_line: n,
|
|
last_line: n,
|
|
first_column: n,
|
|
last_column: n,
|
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
|
}
|
|
|
|
|
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
|
text: (matched text)
|
|
token: (the produced terminal token, if any)
|
|
line: (yylineno)
|
|
}
|
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
|
loc: (yylloc)
|
|
expected: (string describing the set of expected tokens)
|
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
|
}
|
|
*/
|
|
var parser = (function(){
|
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,10,11,12,13,14,15,16,17,19,21],$V1=[1,9],$V2=[1,10],$V3=[1,11],$V4=[1,12],$V5=[1,13],$V6=[1,14],$V7=[1,15],$V8=[1,17],$V9=[1,18];
|
|
var parser = {trace: function trace () { },
|
|
yy: {},
|
|
symbols_: {"error":2,"start":3,"gantt":4,"document":5,"EOF":6,"line":7,"SPACE":8,"statement":9,"NL":10,"dateFormat":11,"inclusiveEndDates":12,"axisFormat":13,"excludes":14,"todayMarker":15,"title":16,"section":17,"clickStatement":18,"taskTxt":19,"taskData":20,"click":21,"callbackname":22,"callbackargs":23,"href":24,"clickStatementDebug":25,"$accept":0,"$end":1},
|
|
terminals_: {2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",11:"dateFormat",12:"inclusiveEndDates",13:"axisFormat",14:"excludes",15:"todayMarker",16:"title",17:"section",19:"taskTxt",20:"taskData",21:"click",22:"callbackname",23:"callbackargs",24:"href"},
|
|
productions_: [0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[18,2],[18,3],[18,3],[18,4],[18,3],[18,4],[18,2],[25,2],[25,3],[25,3],[25,4],[25,3],[25,4],[25,2]],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
|
/* this == yyval */
|
|
|
|
var $0 = $$.length - 1;
|
|
switch (yystate) {
|
|
case 1:
|
|
return $$[$0-1];
|
|
break;
|
|
case 2:
|
|
this.$ = []
|
|
break;
|
|
case 3:
|
|
$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
|
|
break;
|
|
case 4: case 5:
|
|
this.$ = $$[$0]
|
|
break;
|
|
case 6: case 7:
|
|
this.$=[];
|
|
break;
|
|
case 8:
|
|
yy.setDateFormat($$[$0].substr(11));this.$=$$[$0].substr(11);
|
|
break;
|
|
case 9:
|
|
yy.enableInclusiveEndDates();this.$=$$[$0].substr(18);
|
|
break;
|
|
case 10:
|
|
yy.setAxisFormat($$[$0].substr(11));this.$=$$[$0].substr(11);
|
|
break;
|
|
case 11:
|
|
yy.setExcludes($$[$0].substr(9));this.$=$$[$0].substr(9);
|
|
break;
|
|
case 12:
|
|
yy.setTodayMarker($$[$0].substr(12));this.$=$$[$0].substr(12);
|
|
break;
|
|
case 13:
|
|
yy.setTitle($$[$0].substr(6));this.$=$$[$0].substr(6);
|
|
break;
|
|
case 14:
|
|
yy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);
|
|
break;
|
|
case 16:
|
|
yy.addTask($$[$0-1],$$[$0]);this.$='task';
|
|
break;
|
|
case 17:
|
|
this.$ = $$[$0-1];yy.setClickEvent($$[$0-1], $$[$0], null);
|
|
break;
|
|
case 18:
|
|
this.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);
|
|
break;
|
|
case 19:
|
|
this.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], null);yy.setLink($$[$0-2],$$[$0]);
|
|
break;
|
|
case 20:
|
|
this.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-2], $$[$0-1]);yy.setLink($$[$0-3],$$[$0]);
|
|
break;
|
|
case 21:
|
|
this.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0], null);yy.setLink($$[$0-2],$$[$0-1]);
|
|
break;
|
|
case 22:
|
|
this.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-1], $$[$0]);yy.setLink($$[$0-3],$$[$0-2]);
|
|
break;
|
|
case 23:
|
|
this.$ = $$[$0-1];yy.setLink($$[$0-1], $$[$0]);
|
|
break;
|
|
case 24: case 30:
|
|
this.$=$$[$0-1] + ' ' + $$[$0];
|
|
break;
|
|
case 25: case 26: case 28:
|
|
this.$=$$[$0-2] + ' ' + $$[$0-1] + ' ' + $$[$0];
|
|
break;
|
|
case 27: case 29:
|
|
this.$=$$[$0-3] + ' ' + $$[$0-2] + ' ' + $$[$0-1] + ' ' + $$[$0];
|
|
break;
|
|
}
|
|
},
|
|
table: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:$V1,12:$V2,13:$V3,14:$V4,15:$V5,16:$V6,17:$V7,18:16,19:$V8,21:$V9},o($V0,[2,7],{1:[2,1]}),o($V0,[2,3]),{9:19,11:$V1,12:$V2,13:$V3,14:$V4,15:$V5,16:$V6,17:$V7,18:16,19:$V8,21:$V9},o($V0,[2,5]),o($V0,[2,6]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),o($V0,[2,15]),{20:[1,20]},{22:[1,21],24:[1,22]},o($V0,[2,4]),o($V0,[2,16]),o($V0,[2,17],{23:[1,23],24:[1,24]}),o($V0,[2,23],{22:[1,25]}),o($V0,[2,18],{24:[1,26]}),o($V0,[2,19]),o($V0,[2,21],{23:[1,27]}),o($V0,[2,20]),o($V0,[2,22])],
|
|
defaultActions: {},
|
|
parseError: function parseError (str, hash) {
|
|
if (hash.recoverable) {
|
|
this.trace(str);
|
|
} else {
|
|
var error = new Error(str);
|
|
error.hash = hash;
|
|
throw error;
|
|
}
|
|
},
|
|
parse: function parse(input) {
|
|
var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
var args = lstack.slice.call(arguments, 1);
|
|
var lexer = Object.create(this.lexer);
|
|
var sharedState = { yy: {} };
|
|
for (var k in this.yy) {
|
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
|
sharedState.yy[k] = this.yy[k];
|
|
}
|
|
}
|
|
lexer.setInput(input, sharedState.yy);
|
|
sharedState.yy.lexer = lexer;
|
|
sharedState.yy.parser = this;
|
|
if (typeof lexer.yylloc == 'undefined') {
|
|
lexer.yylloc = {};
|
|
}
|
|
var yyloc = lexer.yylloc;
|
|
lstack.push(yyloc);
|
|
var ranges = lexer.options && lexer.options.ranges;
|
|
if (typeof sharedState.yy.parseError === 'function') {
|
|
this.parseError = sharedState.yy.parseError;
|
|
} else {
|
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
|
}
|
|
function popStack(n) {
|
|
stack.length = stack.length - 2 * n;
|
|
vstack.length = vstack.length - n;
|
|
lstack.length = lstack.length - n;
|
|
}
|
|
function lex() {
|
|
var token;
|
|
token = tstack.pop() || lexer.lex() || EOF;
|
|
if (typeof token !== 'number') {
|
|
if (token instanceof Array) {
|
|
tstack = token;
|
|
token = tstack.pop();
|
|
}
|
|
token = self.symbols_[token] || token;
|
|
}
|
|
return token;
|
|
}
|
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
|
while (true) {
|
|
state = stack[stack.length - 1];
|
|
if (this.defaultActions[state]) {
|
|
action = this.defaultActions[state];
|
|
} else {
|
|
if (symbol === null || typeof symbol == 'undefined') {
|
|
symbol = lex();
|
|
}
|
|
action = table[state] && table[state][symbol];
|
|
}
|
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
|
var errStr = '';
|
|
expected = [];
|
|
for (p in table[state]) {
|
|
if (this.terminals_[p] && p > TERROR) {
|
|
expected.push('\'' + this.terminals_[p] + '\'');
|
|
}
|
|
}
|
|
if (lexer.showPosition) {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
|
|
} else {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
|
|
}
|
|
this.parseError(errStr, {
|
|
text: lexer.match,
|
|
token: this.terminals_[symbol] || symbol,
|
|
line: lexer.yylineno,
|
|
loc: yyloc,
|
|
expected: expected
|
|
});
|
|
}
|
|
if (action[0] instanceof Array && action.length > 1) {
|
|
throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
|
|
}
|
|
switch (action[0]) {
|
|
case 1:
|
|
stack.push(symbol);
|
|
vstack.push(lexer.yytext);
|
|
lstack.push(lexer.yylloc);
|
|
stack.push(action[1]);
|
|
symbol = null;
|
|
if (!preErrorSymbol) {
|
|
yyleng = lexer.yyleng;
|
|
yytext = lexer.yytext;
|
|
yylineno = lexer.yylineno;
|
|
yyloc = lexer.yylloc;
|
|
if (recovering > 0) {
|
|
recovering--;
|
|
}
|
|
} else {
|
|
symbol = preErrorSymbol;
|
|
preErrorSymbol = null;
|
|
}
|
|
break;
|
|
case 2:
|
|
len = this.productions_[action[1]][1];
|
|
yyval.$ = vstack[vstack.length - len];
|
|
yyval._$ = {
|
|
first_line: lstack[lstack.length - (len || 1)].first_line,
|
|
last_line: lstack[lstack.length - 1].last_line,
|
|
first_column: lstack[lstack.length - (len || 1)].first_column,
|
|
last_column: lstack[lstack.length - 1].last_column
|
|
};
|
|
if (ranges) {
|
|
yyval._$.range = [
|
|
lstack[lstack.length - (len || 1)].range[0],
|
|
lstack[lstack.length - 1].range[1]
|
|
];
|
|
}
|
|
r = this.performAction.apply(yyval, [
|
|
yytext,
|
|
yyleng,
|
|
yylineno,
|
|
sharedState.yy,
|
|
action[1],
|
|
vstack,
|
|
lstack
|
|
].concat(args));
|
|
if (typeof r !== 'undefined') {
|
|
return r;
|
|
}
|
|
if (len) {
|
|
stack = stack.slice(0, -1 * len * 2);
|
|
vstack = vstack.slice(0, -1 * len);
|
|
lstack = lstack.slice(0, -1 * len);
|
|
}
|
|
stack.push(this.productions_[action[1]][0]);
|
|
vstack.push(yyval.$);
|
|
lstack.push(yyval._$);
|
|
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
stack.push(newState);
|
|
break;
|
|
case 3:
|
|
return true;
|
|
}
|
|
}
|
|
return true;
|
|
}};
|
|
|
|
/* generated by jison-lex 0.3.4 */
|
|
var lexer = (function(){
|
|
var lexer = ({
|
|
|
|
EOF:1,
|
|
|
|
parseError:function parseError(str, hash) {
|
|
if (this.yy.parser) {
|
|
this.yy.parser.parseError(str, hash);
|
|
} else {
|
|
throw new Error(str);
|
|
}
|
|
},
|
|
|
|
// resets the lexer, sets new input
|
|
setInput:function (input, yy) {
|
|
this.yy = yy || this.yy || {};
|
|
this._input = input;
|
|
this._more = this._backtrack = this.done = false;
|
|
this.yylineno = this.yyleng = 0;
|
|
this.yytext = this.matched = this.match = '';
|
|
this.conditionStack = ['INITIAL'];
|
|
this.yylloc = {
|
|
first_line: 1,
|
|
first_column: 0,
|
|
last_line: 1,
|
|
last_column: 0
|
|
};
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [0,0];
|
|
}
|
|
this.offset = 0;
|
|
return this;
|
|
},
|
|
|
|
// consumes and returns one char from the input
|
|
input:function () {
|
|
var ch = this._input[0];
|
|
this.yytext += ch;
|
|
this.yyleng++;
|
|
this.offset++;
|
|
this.match += ch;
|
|
this.matched += ch;
|
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno++;
|
|
this.yylloc.last_line++;
|
|
} else {
|
|
this.yylloc.last_column++;
|
|
}
|
|
if (this.options.ranges) {
|
|
this.yylloc.range[1]++;
|
|
}
|
|
|
|
this._input = this._input.slice(1);
|
|
return ch;
|
|
},
|
|
|
|
// unshifts one char (or a string) into the input
|
|
unput:function (ch) {
|
|
var len = ch.length;
|
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
|
|
|
this._input = ch + this._input;
|
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
|
//this.yyleng -= len;
|
|
this.offset -= len;
|
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
|
this.match = this.match.substr(0, this.match.length - 1);
|
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
|
|
|
if (lines.length - 1) {
|
|
this.yylineno -= lines.length - 1;
|
|
}
|
|
var r = this.yylloc.range;
|
|
|
|
this.yylloc = {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: lines ?
|
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
|
this.yylloc.first_column - len
|
|
};
|
|
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
|
}
|
|
this.yyleng = this.yytext.length;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, caches matched text and appends it on next action
|
|
more:function () {
|
|
this._more = true;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
|
reject:function () {
|
|
if (this.options.backtrack_lexer) {
|
|
this._backtrack = true;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
// retain first n characters of the match
|
|
less:function (n) {
|
|
this.unput(this.match.slice(n));
|
|
},
|
|
|
|
// displays already matched input, i.e. for error messages
|
|
pastInput:function () {
|
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays upcoming input, i.e. for error messages
|
|
upcomingInput:function () {
|
|
var next = this.match;
|
|
if (next.length < 20) {
|
|
next += this._input.substr(0, 20-next.length);
|
|
}
|
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
|
showPosition:function () {
|
|
var pre = this.pastInput();
|
|
var c = new Array(pre.length + 1).join("-");
|
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
|
},
|
|
|
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
|
test_match:function(match, indexed_rule) {
|
|
var token,
|
|
lines,
|
|
backup;
|
|
|
|
if (this.options.backtrack_lexer) {
|
|
// save context
|
|
backup = {
|
|
yylineno: this.yylineno,
|
|
yylloc: {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.last_line,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: this.yylloc.last_column
|
|
},
|
|
yytext: this.yytext,
|
|
match: this.match,
|
|
matches: this.matches,
|
|
matched: this.matched,
|
|
yyleng: this.yyleng,
|
|
offset: this.offset,
|
|
_more: this._more,
|
|
_input: this._input,
|
|
yy: this.yy,
|
|
conditionStack: this.conditionStack.slice(0),
|
|
done: this.done
|
|
};
|
|
if (this.options.ranges) {
|
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
|
}
|
|
}
|
|
|
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno += lines.length;
|
|
}
|
|
this.yylloc = {
|
|
first_line: this.yylloc.last_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.last_column,
|
|
last_column: lines ?
|
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
|
this.yylloc.last_column + match[0].length
|
|
};
|
|
this.yytext += match[0];
|
|
this.match += match[0];
|
|
this.matches = match;
|
|
this.yyleng = this.yytext.length;
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
|
}
|
|
this._more = false;
|
|
this._backtrack = false;
|
|
this._input = this._input.slice(match[0].length);
|
|
this.matched += match[0];
|
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
|
if (this.done && this._input) {
|
|
this.done = false;
|
|
}
|
|
if (token) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
// recover context
|
|
for (var k in backup) {
|
|
this[k] = backup[k];
|
|
}
|
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// return next match in input
|
|
next:function () {
|
|
if (this.done) {
|
|
return this.EOF;
|
|
}
|
|
if (!this._input) {
|
|
this.done = true;
|
|
}
|
|
|
|
var token,
|
|
match,
|
|
tempMatch,
|
|
index;
|
|
if (!this._more) {
|
|
this.yytext = '';
|
|
this.match = '';
|
|
}
|
|
var rules = this._currentRules();
|
|
for (var i = 0; i < rules.length; i++) {
|
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
|
match = tempMatch;
|
|
index = i;
|
|
if (this.options.backtrack_lexer) {
|
|
token = this.test_match(tempMatch, rules[i]);
|
|
if (token !== false) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
match = false;
|
|
continue; // rule action called reject() implying a rule MISmatch.
|
|
} else {
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
} else if (!this.options.flex) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (match) {
|
|
token = this.test_match(match, rules[index]);
|
|
if (token !== false) {
|
|
return token;
|
|
}
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
if (this._input === "") {
|
|
return this.EOF;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
}
|
|
},
|
|
|
|
// return next match that has a token
|
|
lex:function lex () {
|
|
var r = this.next();
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return this.lex();
|
|
}
|
|
},
|
|
|
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
|
begin:function begin (condition) {
|
|
this.conditionStack.push(condition);
|
|
},
|
|
|
|
// pop the previously active lexer condition state off the condition stack
|
|
popState:function popState () {
|
|
var n = this.conditionStack.length - 1;
|
|
if (n > 0) {
|
|
return this.conditionStack.pop();
|
|
} else {
|
|
return this.conditionStack[0];
|
|
}
|
|
},
|
|
|
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
|
_currentRules:function _currentRules () {
|
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
|
} else {
|
|
return this.conditions["INITIAL"].rules;
|
|
}
|
|
},
|
|
|
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
|
topState:function topState (n) {
|
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
|
if (n >= 0) {
|
|
return this.conditionStack[n];
|
|
} else {
|
|
return "INITIAL";
|
|
}
|
|
},
|
|
|
|
// alias for begin(condition)
|
|
pushState:function pushState (condition) {
|
|
this.begin(condition);
|
|
},
|
|
|
|
// return the number of states currently on the stack
|
|
stateStackSize:function stateStackSize() {
|
|
return this.conditionStack.length;
|
|
},
|
|
options: {"case-insensitive":true},
|
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
|
var YYSTATE=YY_START;
|
|
switch($avoiding_name_collisions) {
|
|
case 0:return 10;
|
|
break;
|
|
case 1:/* skip whitespace */
|
|
break;
|
|
case 2:/* skip comments */
|
|
break;
|
|
case 3:/* skip comments */
|
|
break;
|
|
case 4:this.begin("href");
|
|
break;
|
|
case 5:this.popState();
|
|
break;
|
|
case 6:return 24;
|
|
break;
|
|
case 7:this.begin("callbackname");
|
|
break;
|
|
case 8:this.popState();
|
|
break;
|
|
case 9:this.popState(); this.begin("callbackargs");
|
|
break;
|
|
case 10:return 22;
|
|
break;
|
|
case 11:this.popState();
|
|
break;
|
|
case 12:return 23;
|
|
break;
|
|
case 13:this.begin("click");
|
|
break;
|
|
case 14:this.popState();
|
|
break;
|
|
case 15:return 21;
|
|
break;
|
|
case 16:return 4;
|
|
break;
|
|
case 17:return 11;
|
|
break;
|
|
case 18:return 12;
|
|
break;
|
|
case 19:return 13;
|
|
break;
|
|
case 20:return 14;
|
|
break;
|
|
case 21:return 15;
|
|
break;
|
|
case 22:return 'date';
|
|
break;
|
|
case 23:return 16;
|
|
break;
|
|
case 24:return 17;
|
|
break;
|
|
case 25:return 19;
|
|
break;
|
|
case 26:return 20;
|
|
break;
|
|
case 27:return ':';
|
|
break;
|
|
case 28:return 6;
|
|
break;
|
|
case 29:return 'INVALID';
|
|
break;
|
|
}
|
|
},
|
|
rules: [/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],
|
|
conditions: {"callbackargs":{"rules":[11,12],"inclusive":false},"callbackname":{"rules":[8,9,10],"inclusive":false},"href":{"rules":[5,6],"inclusive":false},"click":{"rules":[14,15],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,7,13,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"inclusive":true}}
|
|
});
|
|
return lexer;
|
|
})();
|
|
parser.lexer = lexer;
|
|
function Parser () {
|
|
this.yy = {};
|
|
}
|
|
Parser.prototype = parser;parser.Parser = Parser;
|
|
return new Parser;
|
|
})();
|
|
|
|
|
|
if (true) {
|
|
exports.parser = parser;
|
|
exports.Parser = parser.Parser;
|
|
exports.parse = function () { return parser.parse.apply(parser, arguments); };
|
|
exports.main = function commonjsMain (args) {
|
|
if (!args[1]) {
|
|
console.log('Usage: '+args[0]+' FILE');
|
|
process.exit(1);
|
|
}
|
|
var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
|
|
return exports.parser.parse(source);
|
|
};
|
|
if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
|
|
exports.main(process.argv.slice(1));
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js?f28c"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/git/gitGraphAst.js":
|
|
/*!*****************************************!*\
|
|
!*** ./src/diagrams/git/gitGraphAst.js ***!
|
|
\*****************************************/
|
|
/*! exports provided: setDirection, setOptions, getOptions, commit, branch, merge, checkout, reset, prettyPrint, clear, getBranchesAsObjArray, getBranches, getCommits, getCommitsArray, getCurrentBranch, getDirection, getHead, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setDirection", function() { return setDirection; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setOptions", function() { return setOptions; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getOptions", function() { return getOptions; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commit", function() { return commit; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "branch", function() { return branch; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkout", function() { return checkout; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reset", function() { return reset; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prettyPrint", function() { return prettyPrint; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBranchesAsObjArray", function() { return getBranchesAsObjArray; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBranches", function() { return getBranches; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCommits", function() { return getCommits; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCommitsArray", function() { return getCommitsArray; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCurrentBranch", function() { return getCurrentBranch; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDirection", function() { return getDirection; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getHead", function() { return getHead; });
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
|
|
var commits = {};
|
|
var head = null;
|
|
var branches = {
|
|
master: head
|
|
};
|
|
var curBranch = 'master';
|
|
var direction = 'LR';
|
|
var seq = 0;
|
|
|
|
function makeid(length) {
|
|
var result = '';
|
|
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
var charactersLength = characters.length;
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
function getId() {
|
|
return makeid(7);
|
|
}
|
|
|
|
function isfastforwardable(currentCommit, otherCommit) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Entering isfastforwardable:', currentCommit.id, otherCommit.id);
|
|
|
|
while (currentCommit.seq <= otherCommit.seq && currentCommit !== otherCommit) {
|
|
// only if other branch has more commits
|
|
if (otherCommit.parent == null) break;
|
|
|
|
if (Array.isArray(otherCommit.parent)) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('In merge commit:', otherCommit.parent);
|
|
return isfastforwardable(currentCommit, commits[otherCommit.parent[0]]) || isfastforwardable(currentCommit, commits[otherCommit.parent[1]]);
|
|
} else {
|
|
otherCommit = commits[otherCommit.parent];
|
|
}
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(currentCommit.id, otherCommit.id);
|
|
return currentCommit.id === otherCommit.id;
|
|
}
|
|
|
|
function isReachableFrom(currentCommit, otherCommit) {
|
|
var currentSeq = currentCommit.seq;
|
|
var otherSeq = otherCommit.seq;
|
|
if (currentSeq > otherSeq) return isfastforwardable(otherCommit, currentCommit);
|
|
return false;
|
|
}
|
|
|
|
function uniqBy(list, fn) {
|
|
var recordMap = Object.create(null);
|
|
return list.reduce(function (out, item) {
|
|
var key = fn(item);
|
|
|
|
if (!recordMap[key]) {
|
|
recordMap[key] = true;
|
|
out.push(item);
|
|
}
|
|
|
|
return out;
|
|
}, []);
|
|
}
|
|
|
|
var setDirection = function setDirection(dir) {
|
|
direction = dir;
|
|
};
|
|
var options = {};
|
|
var setOptions = function setOptions(rawOptString) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('options str', rawOptString);
|
|
rawOptString = rawOptString && rawOptString.trim();
|
|
rawOptString = rawOptString || '{}';
|
|
|
|
try {
|
|
options = JSON.parse(rawOptString);
|
|
} catch (e) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].error('error while parsing gitGraph options', e.message);
|
|
}
|
|
};
|
|
var getOptions = function getOptions() {
|
|
return options;
|
|
};
|
|
var commit = function commit(msg) {
|
|
var commit = {
|
|
id: getId(),
|
|
message: msg,
|
|
seq: seq++,
|
|
parent: head == null ? null : head.id
|
|
};
|
|
head = commit;
|
|
commits[commit.id] = commit;
|
|
branches[curBranch] = commit.id;
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('in pushCommit ' + commit.id);
|
|
};
|
|
var branch = function branch(name) {
|
|
branches[name] = head != null ? head.id : null;
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('in createBranch');
|
|
};
|
|
var merge = function merge(otherBranch) {
|
|
var currentCommit = commits[branches[curBranch]];
|
|
var otherCommit = commits[branches[otherBranch]];
|
|
|
|
if (isReachableFrom(currentCommit, otherCommit)) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Already merged');
|
|
return;
|
|
}
|
|
|
|
if (isfastforwardable(currentCommit, otherCommit)) {
|
|
branches[curBranch] = branches[otherBranch];
|
|
head = commits[branches[curBranch]];
|
|
} else {
|
|
// create merge commit
|
|
var _commit = {
|
|
id: getId(),
|
|
message: 'merged branch ' + otherBranch + ' into ' + curBranch,
|
|
seq: seq++,
|
|
parent: [head == null ? null : head.id, branches[otherBranch]]
|
|
};
|
|
head = _commit;
|
|
commits[_commit.id] = _commit;
|
|
branches[curBranch] = _commit.id;
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(branches);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('in mergeBranch');
|
|
};
|
|
var checkout = function checkout(branch) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('in checkout');
|
|
curBranch = branch;
|
|
var id = branches[curBranch];
|
|
head = commits[id];
|
|
};
|
|
var reset = function reset(commitRef) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('in reset', commitRef);
|
|
var ref = commitRef.split(':')[0];
|
|
var parentCount = parseInt(commitRef.split(':')[1]);
|
|
var commit = ref === 'HEAD' ? head : commits[branches[ref]];
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(commit, parentCount);
|
|
|
|
while (parentCount > 0) {
|
|
commit = commits[commit.parent];
|
|
parentCount--;
|
|
|
|
if (!commit) {
|
|
var err = 'Critical error - unique parent commit not found during reset';
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].error(err);
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
head = commit;
|
|
branches[curBranch] = commit.id;
|
|
};
|
|
|
|
function upsert(arr, key, newval) {
|
|
var index = arr.indexOf(key);
|
|
|
|
if (index === -1) {
|
|
arr.push(newval);
|
|
} else {
|
|
arr.splice(index, 1, newval);
|
|
}
|
|
}
|
|
|
|
function prettyPrintCommitHistory(commitArr) {
|
|
var commit = commitArr.reduce(function (out, commit) {
|
|
if (out.seq > commit.seq) return out;
|
|
return commit;
|
|
}, commitArr[0]);
|
|
var line = '';
|
|
commitArr.forEach(function (c) {
|
|
if (c === commit) {
|
|
line += '\t*';
|
|
} else {
|
|
line += '\t|';
|
|
}
|
|
});
|
|
var label = [line, commit.id, commit.seq];
|
|
|
|
for (var _branch in branches) {
|
|
if (branches[_branch] === commit.id) label.push(_branch);
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(label.join(' '));
|
|
|
|
if (Array.isArray(commit.parent)) {
|
|
var newCommit = commits[commit.parent[0]];
|
|
upsert(commitArr, commit, newCommit);
|
|
commitArr.push(commits[commit.parent[1]]);
|
|
} else if (commit.parent == null) {
|
|
return;
|
|
} else {
|
|
var nextCommit = commits[commit.parent];
|
|
upsert(commitArr, commit, nextCommit);
|
|
}
|
|
|
|
commitArr = uniqBy(commitArr, function (c) {
|
|
return c.id;
|
|
});
|
|
prettyPrintCommitHistory(commitArr);
|
|
}
|
|
|
|
var prettyPrint = function prettyPrint() {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(commits);
|
|
var node = getCommitsArray()[0];
|
|
prettyPrintCommitHistory([node]);
|
|
};
|
|
var clear = function clear() {
|
|
commits = {};
|
|
head = null;
|
|
branches = {
|
|
master: head
|
|
};
|
|
curBranch = 'master';
|
|
seq = 0;
|
|
};
|
|
var getBranchesAsObjArray = function getBranchesAsObjArray() {
|
|
var branchArr = [];
|
|
|
|
for (var _branch2 in branches) {
|
|
branchArr.push({
|
|
name: _branch2,
|
|
commit: commits[branches[_branch2]]
|
|
});
|
|
}
|
|
|
|
return branchArr;
|
|
};
|
|
var getBranches = function getBranches() {
|
|
return branches;
|
|
};
|
|
var getCommits = function getCommits() {
|
|
return commits;
|
|
};
|
|
var getCommitsArray = function getCommitsArray() {
|
|
var commitArr = Object.keys(commits).map(function (key) {
|
|
return commits[key];
|
|
});
|
|
commitArr.forEach(function (o) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(o.id);
|
|
});
|
|
commitArr.sort(function (a, b) {
|
|
return b.seq - a.seq;
|
|
});
|
|
return commitArr;
|
|
};
|
|
var getCurrentBranch = function getCurrentBranch() {
|
|
return curBranch;
|
|
};
|
|
var getDirection = function getDirection() {
|
|
return direction;
|
|
};
|
|
var getHead = function getHead() {
|
|
return head;
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setDirection: setDirection,
|
|
setOptions: setOptions,
|
|
getOptions: getOptions,
|
|
commit: commit,
|
|
branch: branch,
|
|
merge: merge,
|
|
checkout: checkout,
|
|
reset: reset,
|
|
prettyPrint: prettyPrint,
|
|
clear: clear,
|
|
getBranchesAsObjArray: getBranchesAsObjArray,
|
|
getBranches: getBranches,
|
|
getCommits: getCommits,
|
|
getCommitsArray: getCommitsArray,
|
|
getCurrentBranch: getCurrentBranch,
|
|
getDirection: getDirection,
|
|
getHead: getHead
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/git/gitGraphRenderer.js":
|
|
/*!**********************************************!*\
|
|
!*** ./src/diagrams/git/gitGraphRenderer.js ***!
|
|
\**********************************************/
|
|
/*! exports provided: setConf, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gitGraphAst */ "./src/diagrams/git/gitGraphAst.js");
|
|
/* harmony import */ var _parser_gitGraph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./parser/gitGraph */ "./src/diagrams/git/parser/gitGraph.jison");
|
|
/* harmony import */ var _parser_gitGraph__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_parser_gitGraph__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
|
|
|
|
|
|
|
|
|
|
|
|
var allCommitsDict = {};
|
|
var branchNum;
|
|
var config = {
|
|
nodeSpacing: 150,
|
|
nodeFillColor: 'yellow',
|
|
nodeStrokeWidth: 2,
|
|
nodeStrokeColor: 'grey',
|
|
lineStrokeWidth: 4,
|
|
branchOffset: 50,
|
|
lineColor: 'grey',
|
|
leftMargin: 50,
|
|
branchColors: ['#442f74', '#983351', '#609732', '#AA9A39'],
|
|
nodeRadius: 10,
|
|
nodeLabel: {
|
|
width: 75,
|
|
height: 100,
|
|
x: -25,
|
|
y: 0
|
|
}
|
|
};
|
|
var apiConfig = {};
|
|
var setConf = function setConf(c) {
|
|
apiConfig = c;
|
|
};
|
|
|
|
function svgCreateDefs(svg) {
|
|
svg.append('defs').append('g').attr('id', 'def-commit').append('circle').attr('r', config.nodeRadius).attr('cx', 0).attr('cy', 0);
|
|
svg.select('#def-commit').append('foreignObject').attr('width', config.nodeLabel.width).attr('height', config.nodeLabel.height).attr('x', config.nodeLabel.x).attr('y', config.nodeLabel.y).attr('class', 'node-label').attr('requiredFeatures', 'http://www.w3.org/TR/SVG11/feature#Extensibility').append('p').html('');
|
|
}
|
|
|
|
function svgDrawLine(svg, points, colorIdx, interpolate) {
|
|
var curve = Object(_utils__WEBPACK_IMPORTED_MODULE_4__["interpolateToCurve"])(interpolate, d3__WEBPACK_IMPORTED_MODULE_0__["curveBasis"]);
|
|
var color = config.branchColors[colorIdx % config.branchColors.length];
|
|
var lineGen = Object(d3__WEBPACK_IMPORTED_MODULE_0__["line"])().x(function (d) {
|
|
return Math.round(d.x);
|
|
}).y(function (d) {
|
|
return Math.round(d.y);
|
|
}).curve(curve);
|
|
svg.append('svg:path').attr('d', lineGen(points)).style('stroke', color).style('stroke-width', config.lineStrokeWidth).style('fill', 'none');
|
|
} // Pass in the element and its pre-transform coords
|
|
|
|
|
|
function getElementCoords(element, coords) {
|
|
coords = coords || element.node().getBBox();
|
|
var ctm = element.node().getCTM();
|
|
var xn = ctm.e + coords.x * ctm.a;
|
|
var yn = ctm.f + coords.y * ctm.d;
|
|
return {
|
|
left: xn,
|
|
top: yn,
|
|
width: coords.width,
|
|
height: coords.height
|
|
};
|
|
}
|
|
|
|
function svgDrawLineForCommits(svg, fromId, toId, direction, color) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('svgDrawLineForCommits: ', fromId, toId);
|
|
var fromBbox = getElementCoords(svg.select('#node-' + fromId + ' circle'));
|
|
var toBbox = getElementCoords(svg.select('#node-' + toId + ' circle'));
|
|
|
|
switch (direction) {
|
|
case 'LR':
|
|
// (toBbox)
|
|
// +--------
|
|
// + (fromBbox)
|
|
if (fromBbox.left - toBbox.left > config.nodeSpacing) {
|
|
var lineStart = {
|
|
x: fromBbox.left - config.nodeSpacing,
|
|
y: toBbox.top + toBbox.height / 2
|
|
};
|
|
var lineEnd = {
|
|
x: toBbox.left + toBbox.width,
|
|
y: toBbox.top + toBbox.height / 2
|
|
};
|
|
svgDrawLine(svg, [lineStart, lineEnd], color, 'linear');
|
|
svgDrawLine(svg, [{
|
|
x: fromBbox.left,
|
|
y: fromBbox.top + fromBbox.height / 2
|
|
}, {
|
|
x: fromBbox.left - config.nodeSpacing / 2,
|
|
y: fromBbox.top + fromBbox.height / 2
|
|
}, {
|
|
x: fromBbox.left - config.nodeSpacing / 2,
|
|
y: lineStart.y
|
|
}, lineStart], color);
|
|
} else {
|
|
svgDrawLine(svg, [{
|
|
x: fromBbox.left,
|
|
y: fromBbox.top + fromBbox.height / 2
|
|
}, {
|
|
x: fromBbox.left - config.nodeSpacing / 2,
|
|
y: fromBbox.top + fromBbox.height / 2
|
|
}, {
|
|
x: fromBbox.left - config.nodeSpacing / 2,
|
|
y: toBbox.top + toBbox.height / 2
|
|
}, {
|
|
x: toBbox.left + toBbox.width,
|
|
y: toBbox.top + toBbox.height / 2
|
|
}], color);
|
|
}
|
|
|
|
break;
|
|
|
|
case 'BT':
|
|
// + (fromBbox)
|
|
// |
|
|
// |
|
|
// + (toBbox)
|
|
if (toBbox.top - fromBbox.top > config.nodeSpacing) {
|
|
var _lineStart = {
|
|
x: toBbox.left + toBbox.width / 2,
|
|
y: fromBbox.top + fromBbox.height + config.nodeSpacing
|
|
};
|
|
var _lineEnd = {
|
|
x: toBbox.left + toBbox.width / 2,
|
|
y: toBbox.top
|
|
};
|
|
svgDrawLine(svg, [_lineStart, _lineEnd], color, 'linear');
|
|
svgDrawLine(svg, [{
|
|
x: fromBbox.left + fromBbox.width / 2,
|
|
y: fromBbox.top + fromBbox.height
|
|
}, {
|
|
x: fromBbox.left + fromBbox.width / 2,
|
|
y: fromBbox.top + fromBbox.height + config.nodeSpacing / 2
|
|
}, {
|
|
x: toBbox.left + toBbox.width / 2,
|
|
y: _lineStart.y - config.nodeSpacing / 2
|
|
}, _lineStart], color);
|
|
} else {
|
|
svgDrawLine(svg, [{
|
|
x: fromBbox.left + fromBbox.width / 2,
|
|
y: fromBbox.top + fromBbox.height
|
|
}, {
|
|
x: fromBbox.left + fromBbox.width / 2,
|
|
y: fromBbox.top + config.nodeSpacing / 2
|
|
}, {
|
|
x: toBbox.left + toBbox.width / 2,
|
|
y: toBbox.top - config.nodeSpacing / 2
|
|
}, {
|
|
x: toBbox.left + toBbox.width / 2,
|
|
y: toBbox.top
|
|
}], color);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
function cloneNode(svg, selector) {
|
|
return svg.select(selector).node().cloneNode(true);
|
|
}
|
|
|
|
function renderCommitHistory(svg, commitid, branches, direction) {
|
|
var commit;
|
|
var numCommits = Object.keys(allCommitsDict).length;
|
|
|
|
if (typeof commitid === 'string') {
|
|
do {
|
|
commit = allCommitsDict[commitid];
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('in renderCommitHistory', commit.id, commit.seq);
|
|
|
|
if (svg.select('#node-' + commitid).size() > 0) {
|
|
return;
|
|
}
|
|
|
|
svg.append(function () {
|
|
return cloneNode(svg, '#def-commit');
|
|
}).attr('class', 'commit').attr('id', function () {
|
|
return 'node-' + commit.id;
|
|
}).attr('transform', function () {
|
|
switch (direction) {
|
|
case 'LR':
|
|
return 'translate(' + (commit.seq * config.nodeSpacing + config.leftMargin) + ', ' + branchNum * config.branchOffset + ')';
|
|
|
|
case 'BT':
|
|
return 'translate(' + (branchNum * config.branchOffset + config.leftMargin) + ', ' + (numCommits - commit.seq) * config.nodeSpacing + ')';
|
|
}
|
|
}).attr('fill', config.nodeFillColor).attr('stroke', config.nodeStrokeColor).attr('stroke-width', config.nodeStrokeWidth);
|
|
var branch = void 0;
|
|
|
|
for (var branchName in branches) {
|
|
if (branches[branchName].commit === commit) {
|
|
branch = branches[branchName];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (branch) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('found branch ', branch.name);
|
|
svg.select('#node-' + commit.id + ' p').append('xhtml:span').attr('class', 'branch-label').text(branch.name + ', ');
|
|
}
|
|
|
|
svg.select('#node-' + commit.id + ' p').append('xhtml:span').attr('class', 'commit-id').text(commit.id);
|
|
|
|
if (commit.message !== '' && direction === 'BT') {
|
|
svg.select('#node-' + commit.id + ' p').append('xhtml:span').attr('class', 'commit-msg').text(', ' + commit.message);
|
|
}
|
|
|
|
commitid = commit.parent;
|
|
} while (commitid && allCommitsDict[commitid]);
|
|
}
|
|
|
|
if (Array.isArray(commitid)) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('found merge commmit', commitid);
|
|
renderCommitHistory(svg, commitid[0], branches, direction);
|
|
branchNum++;
|
|
renderCommitHistory(svg, commitid[1], branches, direction);
|
|
branchNum--;
|
|
}
|
|
}
|
|
|
|
function renderLines(svg, commit, direction, branchColor) {
|
|
branchColor = branchColor || 0;
|
|
|
|
while (commit.seq > 0 && !commit.lineDrawn) {
|
|
if (typeof commit.parent === 'string') {
|
|
svgDrawLineForCommits(svg, commit.id, commit.parent, direction, branchColor);
|
|
commit.lineDrawn = true;
|
|
commit = allCommitsDict[commit.parent];
|
|
} else if (Array.isArray(commit.parent)) {
|
|
svgDrawLineForCommits(svg, commit.id, commit.parent[0], direction, branchColor);
|
|
svgDrawLineForCommits(svg, commit.id, commit.parent[1], direction, branchColor + 1);
|
|
renderLines(svg, allCommitsDict[commit.parent[1]], direction, branchColor + 1);
|
|
commit.lineDrawn = true;
|
|
commit = allCommitsDict[commit.parent[0]];
|
|
}
|
|
}
|
|
}
|
|
|
|
var draw = function draw(txt, id, ver) {
|
|
try {
|
|
var parser = _parser_gitGraph__WEBPACK_IMPORTED_MODULE_2___default.a.parser;
|
|
parser.yy = _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__["default"];
|
|
parser.yy.clear();
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('in gitgraph renderer', txt + '\n', 'id:', id, ver); // Parse the graph definition
|
|
|
|
parser.parse(txt + '\n');
|
|
config = Object.assign(config, apiConfig, _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__["default"].getOptions());
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('effective options', config);
|
|
var direction = _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__["default"].getDirection();
|
|
allCommitsDict = _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__["default"].getCommits();
|
|
var branches = _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__["default"].getBranchesAsObjArray();
|
|
|
|
if (direction === 'BT') {
|
|
config.nodeLabel.x = branches.length * config.branchOffset;
|
|
config.nodeLabel.width = '100%';
|
|
config.nodeLabel.y = -1 * 2 * config.nodeRadius;
|
|
}
|
|
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id=\"".concat(id, "\"]"));
|
|
svgCreateDefs(svg);
|
|
branchNum = 1;
|
|
|
|
for (var branch in branches) {
|
|
var v = branches[branch];
|
|
renderCommitHistory(svg, v.commit.id, branches, direction);
|
|
renderLines(svg, v.commit, direction);
|
|
branchNum++;
|
|
}
|
|
|
|
svg.attr('height', function () {
|
|
if (direction === 'BT') return Object.keys(allCommitsDict).length * config.nodeSpacing;
|
|
return (branches.length + 1) * config.branchOffset;
|
|
});
|
|
} catch (e) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error('Error while rendering gitgraph');
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error(e.message);
|
|
}
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/git/parser/gitGraph.jison":
|
|
/*!************************************************!*\
|
|
!*** ./src/diagrams/git/parser/gitGraph.jison ***!
|
|
\************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
|
|
/*
|
|
Returns a Parser object of the following structure:
|
|
|
|
Parser: {
|
|
yy: {}
|
|
}
|
|
|
|
Parser.prototype: {
|
|
yy: {},
|
|
trace: function(),
|
|
symbols_: {associative list: name ==> number},
|
|
terminals_: {associative list: number ==> name},
|
|
productions_: [...],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
|
table: [...],
|
|
defaultActions: {...},
|
|
parseError: function(str, hash),
|
|
parse: function(input),
|
|
|
|
lexer: {
|
|
EOF: 1,
|
|
parseError: function(str, hash),
|
|
setInput: function(input),
|
|
input: function(),
|
|
unput: function(str),
|
|
more: function(),
|
|
less: function(n),
|
|
pastInput: function(),
|
|
upcomingInput: function(),
|
|
showPosition: function(),
|
|
test_match: function(regex_match_array, rule_index),
|
|
next: function(),
|
|
lex: function(),
|
|
begin: function(condition),
|
|
popState: function(),
|
|
_currentRules: function(),
|
|
topState: function(),
|
|
pushState: function(condition),
|
|
|
|
options: {
|
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
|
},
|
|
|
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
|
rules: [...],
|
|
conditions: {associative list: name ==> set},
|
|
}
|
|
}
|
|
|
|
|
|
token location info (@$, _$, etc.): {
|
|
first_line: n,
|
|
last_line: n,
|
|
first_column: n,
|
|
last_column: n,
|
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
|
}
|
|
|
|
|
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
|
text: (matched text)
|
|
token: (the produced terminal token, if any)
|
|
line: (yylineno)
|
|
}
|
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
|
loc: (yylloc)
|
|
expected: (string describing the set of expected tokens)
|
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
|
}
|
|
*/
|
|
var parser = (function(){
|
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[2,3],$V1=[1,7],$V2=[7,12,15,17,19,20,21],$V3=[7,11,12,15,17,19,20,21],$V4=[2,20],$V5=[1,32];
|
|
var parser = {trace: function trace () { },
|
|
yy: {},
|
|
symbols_: {"error":2,"start":3,"GG":4,":":5,"document":6,"EOF":7,"DIR":8,"options":9,"body":10,"OPT":11,"NL":12,"line":13,"statement":14,"COMMIT":15,"commit_arg":16,"BRANCH":17,"ID":18,"CHECKOUT":19,"MERGE":20,"RESET":21,"reset_arg":22,"STR":23,"HEAD":24,"reset_parents":25,"CARET":26,"$accept":0,"$end":1},
|
|
terminals_: {2:"error",4:"GG",5:":",7:"EOF",8:"DIR",11:"OPT",12:"NL",15:"COMMIT",17:"BRANCH",18:"ID",19:"CHECKOUT",20:"MERGE",21:"RESET",23:"STR",24:"HEAD",26:"CARET"},
|
|
productions_: [0,[3,4],[3,5],[6,0],[6,2],[9,2],[9,1],[10,0],[10,2],[13,2],[13,1],[14,2],[14,2],[14,2],[14,2],[14,2],[16,0],[16,1],[22,2],[22,2],[25,0],[25,2]],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
|
/* this == yyval */
|
|
|
|
var $0 = $$.length - 1;
|
|
switch (yystate) {
|
|
case 1:
|
|
return $$[$0-1];
|
|
break;
|
|
case 2:
|
|
yy.setDirection($$[$0-3]); return $$[$0-1];
|
|
break;
|
|
case 4:
|
|
yy.setOptions($$[$0-1]); this.$ = $$[$0]
|
|
break;
|
|
case 5:
|
|
$$[$0-1] +=$$[$0]; this.$=$$[$0-1]
|
|
break;
|
|
case 7:
|
|
this.$ = []
|
|
break;
|
|
case 8:
|
|
$$[$0-1].push($$[$0]); this.$=$$[$0-1];
|
|
break;
|
|
case 9:
|
|
this.$ =$$[$0-1]
|
|
break;
|
|
case 11:
|
|
yy.commit($$[$0])
|
|
break;
|
|
case 12:
|
|
yy.branch($$[$0])
|
|
break;
|
|
case 13:
|
|
yy.checkout($$[$0])
|
|
break;
|
|
case 14:
|
|
yy.merge($$[$0])
|
|
break;
|
|
case 15:
|
|
yy.reset($$[$0])
|
|
break;
|
|
case 16:
|
|
this.$ = ""
|
|
break;
|
|
case 17:
|
|
this.$=$$[$0]
|
|
break;
|
|
case 18:
|
|
this.$ = $$[$0-1]+ ":" + $$[$0]
|
|
break;
|
|
case 19:
|
|
this.$ = $$[$0-1]+ ":" + yy.count; yy.count = 0
|
|
break;
|
|
case 20:
|
|
yy.count = 0
|
|
break;
|
|
case 21:
|
|
yy.count += 1
|
|
break;
|
|
}
|
|
},
|
|
table: [{3:1,4:[1,2]},{1:[3]},{5:[1,3],8:[1,4]},{6:5,7:$V0,9:6,12:$V1},{5:[1,8]},{7:[1,9]},o($V2,[2,7],{10:10,11:[1,11]}),o($V3,[2,6]),{6:12,7:$V0,9:6,12:$V1},{1:[2,1]},{7:[2,4],12:[1,15],13:13,14:14,15:[1,16],17:[1,17],19:[1,18],20:[1,19],21:[1,20]},o($V3,[2,5]),{7:[1,21]},o($V2,[2,8]),{12:[1,22]},o($V2,[2,10]),{12:[2,16],16:23,23:[1,24]},{18:[1,25]},{18:[1,26]},{18:[1,27]},{18:[1,30],22:28,24:[1,29]},{1:[2,2]},o($V2,[2,9]),{12:[2,11]},{12:[2,17]},{12:[2,12]},{12:[2,13]},{12:[2,14]},{12:[2,15]},{12:$V4,25:31,26:$V5},{12:$V4,25:33,26:$V5},{12:[2,18]},{12:$V4,25:34,26:$V5},{12:[2,19]},{12:[2,21]}],
|
|
defaultActions: {9:[2,1],21:[2,2],23:[2,11],24:[2,17],25:[2,12],26:[2,13],27:[2,14],28:[2,15],31:[2,18],33:[2,19],34:[2,21]},
|
|
parseError: function parseError (str, hash) {
|
|
if (hash.recoverable) {
|
|
this.trace(str);
|
|
} else {
|
|
var error = new Error(str);
|
|
error.hash = hash;
|
|
throw error;
|
|
}
|
|
},
|
|
parse: function parse(input) {
|
|
var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
var args = lstack.slice.call(arguments, 1);
|
|
var lexer = Object.create(this.lexer);
|
|
var sharedState = { yy: {} };
|
|
for (var k in this.yy) {
|
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
|
sharedState.yy[k] = this.yy[k];
|
|
}
|
|
}
|
|
lexer.setInput(input, sharedState.yy);
|
|
sharedState.yy.lexer = lexer;
|
|
sharedState.yy.parser = this;
|
|
if (typeof lexer.yylloc == 'undefined') {
|
|
lexer.yylloc = {};
|
|
}
|
|
var yyloc = lexer.yylloc;
|
|
lstack.push(yyloc);
|
|
var ranges = lexer.options && lexer.options.ranges;
|
|
if (typeof sharedState.yy.parseError === 'function') {
|
|
this.parseError = sharedState.yy.parseError;
|
|
} else {
|
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
|
}
|
|
function popStack(n) {
|
|
stack.length = stack.length - 2 * n;
|
|
vstack.length = vstack.length - n;
|
|
lstack.length = lstack.length - n;
|
|
}
|
|
function lex() {
|
|
var token;
|
|
token = tstack.pop() || lexer.lex() || EOF;
|
|
if (typeof token !== 'number') {
|
|
if (token instanceof Array) {
|
|
tstack = token;
|
|
token = tstack.pop();
|
|
}
|
|
token = self.symbols_[token] || token;
|
|
}
|
|
return token;
|
|
}
|
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
|
while (true) {
|
|
state = stack[stack.length - 1];
|
|
if (this.defaultActions[state]) {
|
|
action = this.defaultActions[state];
|
|
} else {
|
|
if (symbol === null || typeof symbol == 'undefined') {
|
|
symbol = lex();
|
|
}
|
|
action = table[state] && table[state][symbol];
|
|
}
|
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
|
var errStr = '';
|
|
expected = [];
|
|
for (p in table[state]) {
|
|
if (this.terminals_[p] && p > TERROR) {
|
|
expected.push('\'' + this.terminals_[p] + '\'');
|
|
}
|
|
}
|
|
if (lexer.showPosition) {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
|
|
} else {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
|
|
}
|
|
this.parseError(errStr, {
|
|
text: lexer.match,
|
|
token: this.terminals_[symbol] || symbol,
|
|
line: lexer.yylineno,
|
|
loc: yyloc,
|
|
expected: expected
|
|
});
|
|
}
|
|
if (action[0] instanceof Array && action.length > 1) {
|
|
throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
|
|
}
|
|
switch (action[0]) {
|
|
case 1:
|
|
stack.push(symbol);
|
|
vstack.push(lexer.yytext);
|
|
lstack.push(lexer.yylloc);
|
|
stack.push(action[1]);
|
|
symbol = null;
|
|
if (!preErrorSymbol) {
|
|
yyleng = lexer.yyleng;
|
|
yytext = lexer.yytext;
|
|
yylineno = lexer.yylineno;
|
|
yyloc = lexer.yylloc;
|
|
if (recovering > 0) {
|
|
recovering--;
|
|
}
|
|
} else {
|
|
symbol = preErrorSymbol;
|
|
preErrorSymbol = null;
|
|
}
|
|
break;
|
|
case 2:
|
|
len = this.productions_[action[1]][1];
|
|
yyval.$ = vstack[vstack.length - len];
|
|
yyval._$ = {
|
|
first_line: lstack[lstack.length - (len || 1)].first_line,
|
|
last_line: lstack[lstack.length - 1].last_line,
|
|
first_column: lstack[lstack.length - (len || 1)].first_column,
|
|
last_column: lstack[lstack.length - 1].last_column
|
|
};
|
|
if (ranges) {
|
|
yyval._$.range = [
|
|
lstack[lstack.length - (len || 1)].range[0],
|
|
lstack[lstack.length - 1].range[1]
|
|
];
|
|
}
|
|
r = this.performAction.apply(yyval, [
|
|
yytext,
|
|
yyleng,
|
|
yylineno,
|
|
sharedState.yy,
|
|
action[1],
|
|
vstack,
|
|
lstack
|
|
].concat(args));
|
|
if (typeof r !== 'undefined') {
|
|
return r;
|
|
}
|
|
if (len) {
|
|
stack = stack.slice(0, -1 * len * 2);
|
|
vstack = vstack.slice(0, -1 * len);
|
|
lstack = lstack.slice(0, -1 * len);
|
|
}
|
|
stack.push(this.productions_[action[1]][0]);
|
|
vstack.push(yyval.$);
|
|
lstack.push(yyval._$);
|
|
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
stack.push(newState);
|
|
break;
|
|
case 3:
|
|
return true;
|
|
}
|
|
}
|
|
return true;
|
|
}};
|
|
/* generated by jison-lex 0.3.4 */
|
|
var lexer = (function(){
|
|
var lexer = ({
|
|
|
|
EOF:1,
|
|
|
|
parseError:function parseError(str, hash) {
|
|
if (this.yy.parser) {
|
|
this.yy.parser.parseError(str, hash);
|
|
} else {
|
|
throw new Error(str);
|
|
}
|
|
},
|
|
|
|
// resets the lexer, sets new input
|
|
setInput:function (input, yy) {
|
|
this.yy = yy || this.yy || {};
|
|
this._input = input;
|
|
this._more = this._backtrack = this.done = false;
|
|
this.yylineno = this.yyleng = 0;
|
|
this.yytext = this.matched = this.match = '';
|
|
this.conditionStack = ['INITIAL'];
|
|
this.yylloc = {
|
|
first_line: 1,
|
|
first_column: 0,
|
|
last_line: 1,
|
|
last_column: 0
|
|
};
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [0,0];
|
|
}
|
|
this.offset = 0;
|
|
return this;
|
|
},
|
|
|
|
// consumes and returns one char from the input
|
|
input:function () {
|
|
var ch = this._input[0];
|
|
this.yytext += ch;
|
|
this.yyleng++;
|
|
this.offset++;
|
|
this.match += ch;
|
|
this.matched += ch;
|
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno++;
|
|
this.yylloc.last_line++;
|
|
} else {
|
|
this.yylloc.last_column++;
|
|
}
|
|
if (this.options.ranges) {
|
|
this.yylloc.range[1]++;
|
|
}
|
|
|
|
this._input = this._input.slice(1);
|
|
return ch;
|
|
},
|
|
|
|
// unshifts one char (or a string) into the input
|
|
unput:function (ch) {
|
|
var len = ch.length;
|
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
|
|
|
this._input = ch + this._input;
|
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
|
//this.yyleng -= len;
|
|
this.offset -= len;
|
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
|
this.match = this.match.substr(0, this.match.length - 1);
|
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
|
|
|
if (lines.length - 1) {
|
|
this.yylineno -= lines.length - 1;
|
|
}
|
|
var r = this.yylloc.range;
|
|
|
|
this.yylloc = {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: lines ?
|
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
|
this.yylloc.first_column - len
|
|
};
|
|
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
|
}
|
|
this.yyleng = this.yytext.length;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, caches matched text and appends it on next action
|
|
more:function () {
|
|
this._more = true;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
|
reject:function () {
|
|
if (this.options.backtrack_lexer) {
|
|
this._backtrack = true;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
// retain first n characters of the match
|
|
less:function (n) {
|
|
this.unput(this.match.slice(n));
|
|
},
|
|
|
|
// displays already matched input, i.e. for error messages
|
|
pastInput:function () {
|
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays upcoming input, i.e. for error messages
|
|
upcomingInput:function () {
|
|
var next = this.match;
|
|
if (next.length < 20) {
|
|
next += this._input.substr(0, 20-next.length);
|
|
}
|
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
|
showPosition:function () {
|
|
var pre = this.pastInput();
|
|
var c = new Array(pre.length + 1).join("-");
|
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
|
},
|
|
|
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
|
test_match:function(match, indexed_rule) {
|
|
var token,
|
|
lines,
|
|
backup;
|
|
|
|
if (this.options.backtrack_lexer) {
|
|
// save context
|
|
backup = {
|
|
yylineno: this.yylineno,
|
|
yylloc: {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.last_line,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: this.yylloc.last_column
|
|
},
|
|
yytext: this.yytext,
|
|
match: this.match,
|
|
matches: this.matches,
|
|
matched: this.matched,
|
|
yyleng: this.yyleng,
|
|
offset: this.offset,
|
|
_more: this._more,
|
|
_input: this._input,
|
|
yy: this.yy,
|
|
conditionStack: this.conditionStack.slice(0),
|
|
done: this.done
|
|
};
|
|
if (this.options.ranges) {
|
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
|
}
|
|
}
|
|
|
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno += lines.length;
|
|
}
|
|
this.yylloc = {
|
|
first_line: this.yylloc.last_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.last_column,
|
|
last_column: lines ?
|
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
|
this.yylloc.last_column + match[0].length
|
|
};
|
|
this.yytext += match[0];
|
|
this.match += match[0];
|
|
this.matches = match;
|
|
this.yyleng = this.yytext.length;
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
|
}
|
|
this._more = false;
|
|
this._backtrack = false;
|
|
this._input = this._input.slice(match[0].length);
|
|
this.matched += match[0];
|
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
|
if (this.done && this._input) {
|
|
this.done = false;
|
|
}
|
|
if (token) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
// recover context
|
|
for (var k in backup) {
|
|
this[k] = backup[k];
|
|
}
|
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// return next match in input
|
|
next:function () {
|
|
if (this.done) {
|
|
return this.EOF;
|
|
}
|
|
if (!this._input) {
|
|
this.done = true;
|
|
}
|
|
|
|
var token,
|
|
match,
|
|
tempMatch,
|
|
index;
|
|
if (!this._more) {
|
|
this.yytext = '';
|
|
this.match = '';
|
|
}
|
|
var rules = this._currentRules();
|
|
for (var i = 0; i < rules.length; i++) {
|
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
|
match = tempMatch;
|
|
index = i;
|
|
if (this.options.backtrack_lexer) {
|
|
token = this.test_match(tempMatch, rules[i]);
|
|
if (token !== false) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
match = false;
|
|
continue; // rule action called reject() implying a rule MISmatch.
|
|
} else {
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
} else if (!this.options.flex) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (match) {
|
|
token = this.test_match(match, rules[index]);
|
|
if (token !== false) {
|
|
return token;
|
|
}
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
if (this._input === "") {
|
|
return this.EOF;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
}
|
|
},
|
|
|
|
// return next match that has a token
|
|
lex:function lex () {
|
|
var r = this.next();
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return this.lex();
|
|
}
|
|
},
|
|
|
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
|
begin:function begin (condition) {
|
|
this.conditionStack.push(condition);
|
|
},
|
|
|
|
// pop the previously active lexer condition state off the condition stack
|
|
popState:function popState () {
|
|
var n = this.conditionStack.length - 1;
|
|
if (n > 0) {
|
|
return this.conditionStack.pop();
|
|
} else {
|
|
return this.conditionStack[0];
|
|
}
|
|
},
|
|
|
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
|
_currentRules:function _currentRules () {
|
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
|
} else {
|
|
return this.conditions["INITIAL"].rules;
|
|
}
|
|
},
|
|
|
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
|
topState:function topState (n) {
|
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
|
if (n >= 0) {
|
|
return this.conditionStack[n];
|
|
} else {
|
|
return "INITIAL";
|
|
}
|
|
},
|
|
|
|
// alias for begin(condition)
|
|
pushState:function pushState (condition) {
|
|
this.begin(condition);
|
|
},
|
|
|
|
// return the number of states currently on the stack
|
|
stateStackSize:function stateStackSize() {
|
|
return this.conditionStack.length;
|
|
},
|
|
options: {"case-insensitive":true},
|
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
|
var YYSTATE=YY_START;
|
|
switch($avoiding_name_collisions) {
|
|
case 0:return 12;
|
|
break;
|
|
case 1:/* skip all whitespace */
|
|
break;
|
|
case 2:/* skip comments */
|
|
break;
|
|
case 3:/* skip comments */
|
|
break;
|
|
case 4:return 4;
|
|
break;
|
|
case 5:return 15;
|
|
break;
|
|
case 6:return 17;
|
|
break;
|
|
case 7:return 20;
|
|
break;
|
|
case 8:return 21;
|
|
break;
|
|
case 9:return 19;
|
|
break;
|
|
case 10:return 8;
|
|
break;
|
|
case 11:return 8;
|
|
break;
|
|
case 12:return 5;
|
|
break;
|
|
case 13:return 26
|
|
break;
|
|
case 14:this.begin("options");
|
|
break;
|
|
case 15:this.popState();
|
|
break;
|
|
case 16:return 11;
|
|
break;
|
|
case 17:this.begin("string");
|
|
break;
|
|
case 18:this.popState();
|
|
break;
|
|
case 19:return 23;
|
|
break;
|
|
case 20:return 18;
|
|
break;
|
|
case 21:return 7;
|
|
break;
|
|
}
|
|
},
|
|
rules: [/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit\b)/i,/^(?:branch\b)/i,/^(?:merge\b)/i,/^(?:reset\b)/i,/^(?:checkout\b)/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:end\r?\n)/i,/^(?:[^\n]+\r?\n)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[a-zA-Z][a-zA-Z0-9_]+)/i,/^(?:$)/i],
|
|
conditions: {"options":{"rules":[15,16],"inclusive":false},"string":{"rules":[18,19],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,20,21],"inclusive":true}}
|
|
});
|
|
return lexer;
|
|
})();
|
|
parser.lexer = lexer;
|
|
function Parser () {
|
|
this.yy = {};
|
|
}
|
|
Parser.prototype = parser;parser.Parser = Parser;
|
|
return new Parser;
|
|
})();
|
|
|
|
|
|
if (true) {
|
|
exports.parser = parser;
|
|
exports.Parser = parser.Parser;
|
|
exports.parse = function () { return parser.parse.apply(parser, arguments); };
|
|
exports.main = function commonjsMain (args) {
|
|
if (!args[1]) {
|
|
console.log('Usage: '+args[0]+' FILE');
|
|
process.exit(1);
|
|
}
|
|
var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
|
|
return exports.parser.parse(source);
|
|
};
|
|
if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
|
|
exports.main(process.argv.slice(1));
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js?f28c"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/info/infoDb.js":
|
|
/*!*************************************!*\
|
|
!*** ./src/diagrams/info/infoDb.js ***!
|
|
\*************************************/
|
|
/*! exports provided: setMessage, getMessage, setInfo, getInfo, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setMessage", function() { return setMessage; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMessage", function() { return getMessage; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setInfo", function() { return setInfo; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getInfo", function() { return getInfo; });
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/**
|
|
* Created by knut on 15-01-14.
|
|
*/
|
|
|
|
var message = '';
|
|
var info = false;
|
|
var setMessage = function setMessage(txt) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Setting message to: ' + txt);
|
|
message = txt;
|
|
};
|
|
var getMessage = function getMessage() {
|
|
return message;
|
|
};
|
|
var setInfo = function setInfo(inf) {
|
|
info = inf;
|
|
};
|
|
var getInfo = function getInfo() {
|
|
return info;
|
|
}; // export const parseError = (err, hash) => {
|
|
// global.mermaidAPI.parseError(err, hash)
|
|
// }
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setMessage: setMessage,
|
|
getMessage: getMessage,
|
|
setInfo: setInfo,
|
|
getInfo: getInfo // parseError
|
|
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/info/infoRenderer.js":
|
|
/*!*******************************************!*\
|
|
!*** ./src/diagrams/info/infoRenderer.js ***!
|
|
\*******************************************/
|
|
/*! exports provided: setConf, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _infoDb__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./infoDb */ "./src/diagrams/info/infoDb.js");
|
|
/* harmony import */ var _parser_info__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./parser/info */ "./src/diagrams/info/parser/info.jison");
|
|
/* harmony import */ var _parser_info__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_parser_info__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/**
|
|
* Created by knut on 14-12-11.
|
|
*/
|
|
|
|
|
|
|
|
|
|
var conf = {};
|
|
var setConf = function setConf(cnf) {
|
|
var keys = Object.keys(cnf);
|
|
keys.forEach(function (key) {
|
|
conf[key] = cnf[key];
|
|
});
|
|
};
|
|
/**
|
|
* Draws a an info picture in the tag with id: id based on the graph definition in text.
|
|
* @param text
|
|
* @param id
|
|
*/
|
|
|
|
var draw = function draw(txt, id, ver) {
|
|
try {
|
|
var parser = _parser_info__WEBPACK_IMPORTED_MODULE_2___default.a.parser;
|
|
parser.yy = _infoDb__WEBPACK_IMPORTED_MODULE_1__["default"];
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Renering info diagram\n' + txt); // Parse the graph definition
|
|
|
|
parser.parse(txt);
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Parsed info diagram'); // Fetch the default direction, use TD if none was found
|
|
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + id);
|
|
var g = svg.append('g');
|
|
g.append('text') // text label for the x axis
|
|
.attr('x', 100).attr('y', 40).attr('class', 'version').attr('font-size', '32px').style('text-anchor', 'middle').text('v ' + ver);
|
|
svg.attr('height', 100);
|
|
svg.attr('width', 400); // svg.attr('viewBox', '0 0 300 150');
|
|
} catch (e) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error('Error while rendering info diagram');
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error(e.message);
|
|
}
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/info/parser/info.jison":
|
|
/*!*********************************************!*\
|
|
!*** ./src/diagrams/info/parser/info.jison ***!
|
|
\*********************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
|
|
/*
|
|
Returns a Parser object of the following structure:
|
|
|
|
Parser: {
|
|
yy: {}
|
|
}
|
|
|
|
Parser.prototype: {
|
|
yy: {},
|
|
trace: function(),
|
|
symbols_: {associative list: name ==> number},
|
|
terminals_: {associative list: number ==> name},
|
|
productions_: [...],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
|
table: [...],
|
|
defaultActions: {...},
|
|
parseError: function(str, hash),
|
|
parse: function(input),
|
|
|
|
lexer: {
|
|
EOF: 1,
|
|
parseError: function(str, hash),
|
|
setInput: function(input),
|
|
input: function(),
|
|
unput: function(str),
|
|
more: function(),
|
|
less: function(n),
|
|
pastInput: function(),
|
|
upcomingInput: function(),
|
|
showPosition: function(),
|
|
test_match: function(regex_match_array, rule_index),
|
|
next: function(),
|
|
lex: function(),
|
|
begin: function(condition),
|
|
popState: function(),
|
|
_currentRules: function(),
|
|
topState: function(),
|
|
pushState: function(condition),
|
|
|
|
options: {
|
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
|
},
|
|
|
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
|
rules: [...],
|
|
conditions: {associative list: name ==> set},
|
|
}
|
|
}
|
|
|
|
|
|
token location info (@$, _$, etc.): {
|
|
first_line: n,
|
|
last_line: n,
|
|
first_column: n,
|
|
last_column: n,
|
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
|
}
|
|
|
|
|
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
|
text: (matched text)
|
|
token: (the produced terminal token, if any)
|
|
line: (yylineno)
|
|
}
|
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
|
loc: (yylloc)
|
|
expected: (string describing the set of expected tokens)
|
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
|
}
|
|
*/
|
|
var parser = (function(){
|
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,9,10];
|
|
var parser = {trace: function trace () { },
|
|
yy: {},
|
|
symbols_: {"error":2,"start":3,"info":4,"document":5,"EOF":6,"line":7,"statement":8,"NL":9,"showInfo":10,"$accept":0,"$end":1},
|
|
terminals_: {2:"error",4:"info",6:"EOF",9:"NL",10:"showInfo"},
|
|
productions_: [0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
|
/* this == yyval */
|
|
|
|
var $0 = $$.length - 1;
|
|
switch (yystate) {
|
|
case 1:
|
|
return yy;
|
|
break;
|
|
case 4:
|
|
|
|
break;
|
|
case 6:
|
|
yy.setInfo(true);
|
|
break;
|
|
}
|
|
},
|
|
table: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},o($V0,[2,3]),o($V0,[2,4]),o($V0,[2,5]),o($V0,[2,6])],
|
|
defaultActions: {4:[2,1]},
|
|
parseError: function parseError (str, hash) {
|
|
if (hash.recoverable) {
|
|
this.trace(str);
|
|
} else {
|
|
var error = new Error(str);
|
|
error.hash = hash;
|
|
throw error;
|
|
}
|
|
},
|
|
parse: function parse(input) {
|
|
var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
var args = lstack.slice.call(arguments, 1);
|
|
var lexer = Object.create(this.lexer);
|
|
var sharedState = { yy: {} };
|
|
for (var k in this.yy) {
|
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
|
sharedState.yy[k] = this.yy[k];
|
|
}
|
|
}
|
|
lexer.setInput(input, sharedState.yy);
|
|
sharedState.yy.lexer = lexer;
|
|
sharedState.yy.parser = this;
|
|
if (typeof lexer.yylloc == 'undefined') {
|
|
lexer.yylloc = {};
|
|
}
|
|
var yyloc = lexer.yylloc;
|
|
lstack.push(yyloc);
|
|
var ranges = lexer.options && lexer.options.ranges;
|
|
if (typeof sharedState.yy.parseError === 'function') {
|
|
this.parseError = sharedState.yy.parseError;
|
|
} else {
|
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
|
}
|
|
function popStack(n) {
|
|
stack.length = stack.length - 2 * n;
|
|
vstack.length = vstack.length - n;
|
|
lstack.length = lstack.length - n;
|
|
}
|
|
function lex() {
|
|
var token;
|
|
token = tstack.pop() || lexer.lex() || EOF;
|
|
if (typeof token !== 'number') {
|
|
if (token instanceof Array) {
|
|
tstack = token;
|
|
token = tstack.pop();
|
|
}
|
|
token = self.symbols_[token] || token;
|
|
}
|
|
return token;
|
|
}
|
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
|
while (true) {
|
|
state = stack[stack.length - 1];
|
|
if (this.defaultActions[state]) {
|
|
action = this.defaultActions[state];
|
|
} else {
|
|
if (symbol === null || typeof symbol == 'undefined') {
|
|
symbol = lex();
|
|
}
|
|
action = table[state] && table[state][symbol];
|
|
}
|
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
|
var errStr = '';
|
|
expected = [];
|
|
for (p in table[state]) {
|
|
if (this.terminals_[p] && p > TERROR) {
|
|
expected.push('\'' + this.terminals_[p] + '\'');
|
|
}
|
|
}
|
|
if (lexer.showPosition) {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
|
|
} else {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
|
|
}
|
|
this.parseError(errStr, {
|
|
text: lexer.match,
|
|
token: this.terminals_[symbol] || symbol,
|
|
line: lexer.yylineno,
|
|
loc: yyloc,
|
|
expected: expected
|
|
});
|
|
}
|
|
if (action[0] instanceof Array && action.length > 1) {
|
|
throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
|
|
}
|
|
switch (action[0]) {
|
|
case 1:
|
|
stack.push(symbol);
|
|
vstack.push(lexer.yytext);
|
|
lstack.push(lexer.yylloc);
|
|
stack.push(action[1]);
|
|
symbol = null;
|
|
if (!preErrorSymbol) {
|
|
yyleng = lexer.yyleng;
|
|
yytext = lexer.yytext;
|
|
yylineno = lexer.yylineno;
|
|
yyloc = lexer.yylloc;
|
|
if (recovering > 0) {
|
|
recovering--;
|
|
}
|
|
} else {
|
|
symbol = preErrorSymbol;
|
|
preErrorSymbol = null;
|
|
}
|
|
break;
|
|
case 2:
|
|
len = this.productions_[action[1]][1];
|
|
yyval.$ = vstack[vstack.length - len];
|
|
yyval._$ = {
|
|
first_line: lstack[lstack.length - (len || 1)].first_line,
|
|
last_line: lstack[lstack.length - 1].last_line,
|
|
first_column: lstack[lstack.length - (len || 1)].first_column,
|
|
last_column: lstack[lstack.length - 1].last_column
|
|
};
|
|
if (ranges) {
|
|
yyval._$.range = [
|
|
lstack[lstack.length - (len || 1)].range[0],
|
|
lstack[lstack.length - 1].range[1]
|
|
];
|
|
}
|
|
r = this.performAction.apply(yyval, [
|
|
yytext,
|
|
yyleng,
|
|
yylineno,
|
|
sharedState.yy,
|
|
action[1],
|
|
vstack,
|
|
lstack
|
|
].concat(args));
|
|
if (typeof r !== 'undefined') {
|
|
return r;
|
|
}
|
|
if (len) {
|
|
stack = stack.slice(0, -1 * len * 2);
|
|
vstack = vstack.slice(0, -1 * len);
|
|
lstack = lstack.slice(0, -1 * len);
|
|
}
|
|
stack.push(this.productions_[action[1]][0]);
|
|
vstack.push(yyval.$);
|
|
lstack.push(yyval._$);
|
|
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
stack.push(newState);
|
|
break;
|
|
case 3:
|
|
return true;
|
|
}
|
|
}
|
|
return true;
|
|
}};
|
|
|
|
/* generated by jison-lex 0.3.4 */
|
|
var lexer = (function(){
|
|
var lexer = ({
|
|
|
|
EOF:1,
|
|
|
|
parseError:function parseError(str, hash) {
|
|
if (this.yy.parser) {
|
|
this.yy.parser.parseError(str, hash);
|
|
} else {
|
|
throw new Error(str);
|
|
}
|
|
},
|
|
|
|
// resets the lexer, sets new input
|
|
setInput:function (input, yy) {
|
|
this.yy = yy || this.yy || {};
|
|
this._input = input;
|
|
this._more = this._backtrack = this.done = false;
|
|
this.yylineno = this.yyleng = 0;
|
|
this.yytext = this.matched = this.match = '';
|
|
this.conditionStack = ['INITIAL'];
|
|
this.yylloc = {
|
|
first_line: 1,
|
|
first_column: 0,
|
|
last_line: 1,
|
|
last_column: 0
|
|
};
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [0,0];
|
|
}
|
|
this.offset = 0;
|
|
return this;
|
|
},
|
|
|
|
// consumes and returns one char from the input
|
|
input:function () {
|
|
var ch = this._input[0];
|
|
this.yytext += ch;
|
|
this.yyleng++;
|
|
this.offset++;
|
|
this.match += ch;
|
|
this.matched += ch;
|
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno++;
|
|
this.yylloc.last_line++;
|
|
} else {
|
|
this.yylloc.last_column++;
|
|
}
|
|
if (this.options.ranges) {
|
|
this.yylloc.range[1]++;
|
|
}
|
|
|
|
this._input = this._input.slice(1);
|
|
return ch;
|
|
},
|
|
|
|
// unshifts one char (or a string) into the input
|
|
unput:function (ch) {
|
|
var len = ch.length;
|
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
|
|
|
this._input = ch + this._input;
|
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
|
//this.yyleng -= len;
|
|
this.offset -= len;
|
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
|
this.match = this.match.substr(0, this.match.length - 1);
|
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
|
|
|
if (lines.length - 1) {
|
|
this.yylineno -= lines.length - 1;
|
|
}
|
|
var r = this.yylloc.range;
|
|
|
|
this.yylloc = {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: lines ?
|
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
|
this.yylloc.first_column - len
|
|
};
|
|
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
|
}
|
|
this.yyleng = this.yytext.length;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, caches matched text and appends it on next action
|
|
more:function () {
|
|
this._more = true;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
|
reject:function () {
|
|
if (this.options.backtrack_lexer) {
|
|
this._backtrack = true;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
// retain first n characters of the match
|
|
less:function (n) {
|
|
this.unput(this.match.slice(n));
|
|
},
|
|
|
|
// displays already matched input, i.e. for error messages
|
|
pastInput:function () {
|
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays upcoming input, i.e. for error messages
|
|
upcomingInput:function () {
|
|
var next = this.match;
|
|
if (next.length < 20) {
|
|
next += this._input.substr(0, 20-next.length);
|
|
}
|
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
|
showPosition:function () {
|
|
var pre = this.pastInput();
|
|
var c = new Array(pre.length + 1).join("-");
|
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
|
},
|
|
|
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
|
test_match:function(match, indexed_rule) {
|
|
var token,
|
|
lines,
|
|
backup;
|
|
|
|
if (this.options.backtrack_lexer) {
|
|
// save context
|
|
backup = {
|
|
yylineno: this.yylineno,
|
|
yylloc: {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.last_line,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: this.yylloc.last_column
|
|
},
|
|
yytext: this.yytext,
|
|
match: this.match,
|
|
matches: this.matches,
|
|
matched: this.matched,
|
|
yyleng: this.yyleng,
|
|
offset: this.offset,
|
|
_more: this._more,
|
|
_input: this._input,
|
|
yy: this.yy,
|
|
conditionStack: this.conditionStack.slice(0),
|
|
done: this.done
|
|
};
|
|
if (this.options.ranges) {
|
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
|
}
|
|
}
|
|
|
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno += lines.length;
|
|
}
|
|
this.yylloc = {
|
|
first_line: this.yylloc.last_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.last_column,
|
|
last_column: lines ?
|
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
|
this.yylloc.last_column + match[0].length
|
|
};
|
|
this.yytext += match[0];
|
|
this.match += match[0];
|
|
this.matches = match;
|
|
this.yyleng = this.yytext.length;
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
|
}
|
|
this._more = false;
|
|
this._backtrack = false;
|
|
this._input = this._input.slice(match[0].length);
|
|
this.matched += match[0];
|
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
|
if (this.done && this._input) {
|
|
this.done = false;
|
|
}
|
|
if (token) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
// recover context
|
|
for (var k in backup) {
|
|
this[k] = backup[k];
|
|
}
|
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// return next match in input
|
|
next:function () {
|
|
if (this.done) {
|
|
return this.EOF;
|
|
}
|
|
if (!this._input) {
|
|
this.done = true;
|
|
}
|
|
|
|
var token,
|
|
match,
|
|
tempMatch,
|
|
index;
|
|
if (!this._more) {
|
|
this.yytext = '';
|
|
this.match = '';
|
|
}
|
|
var rules = this._currentRules();
|
|
for (var i = 0; i < rules.length; i++) {
|
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
|
match = tempMatch;
|
|
index = i;
|
|
if (this.options.backtrack_lexer) {
|
|
token = this.test_match(tempMatch, rules[i]);
|
|
if (token !== false) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
match = false;
|
|
continue; // rule action called reject() implying a rule MISmatch.
|
|
} else {
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
} else if (!this.options.flex) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (match) {
|
|
token = this.test_match(match, rules[index]);
|
|
if (token !== false) {
|
|
return token;
|
|
}
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
if (this._input === "") {
|
|
return this.EOF;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
}
|
|
},
|
|
|
|
// return next match that has a token
|
|
lex:function lex () {
|
|
var r = this.next();
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return this.lex();
|
|
}
|
|
},
|
|
|
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
|
begin:function begin (condition) {
|
|
this.conditionStack.push(condition);
|
|
},
|
|
|
|
// pop the previously active lexer condition state off the condition stack
|
|
popState:function popState () {
|
|
var n = this.conditionStack.length - 1;
|
|
if (n > 0) {
|
|
return this.conditionStack.pop();
|
|
} else {
|
|
return this.conditionStack[0];
|
|
}
|
|
},
|
|
|
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
|
_currentRules:function _currentRules () {
|
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
|
} else {
|
|
return this.conditions["INITIAL"].rules;
|
|
}
|
|
},
|
|
|
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
|
topState:function topState (n) {
|
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
|
if (n >= 0) {
|
|
return this.conditionStack[n];
|
|
} else {
|
|
return "INITIAL";
|
|
}
|
|
},
|
|
|
|
// alias for begin(condition)
|
|
pushState:function pushState (condition) {
|
|
this.begin(condition);
|
|
},
|
|
|
|
// return the number of states currently on the stack
|
|
stateStackSize:function stateStackSize() {
|
|
return this.conditionStack.length;
|
|
},
|
|
options: {"case-insensitive":true},
|
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
|
// Pre-lexer code can go here
|
|
|
|
var YYSTATE=YY_START;
|
|
switch($avoiding_name_collisions) {
|
|
case 0:return 4 ;
|
|
break;
|
|
case 1:return 9 ;
|
|
break;
|
|
case 2:return 'space';
|
|
break;
|
|
case 3:return 10;
|
|
break;
|
|
case 4:return 6 ;
|
|
break;
|
|
case 5:return 'TXT' ;
|
|
break;
|
|
}
|
|
},
|
|
rules: [/^(?:info\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:showInfo\b)/i,/^(?:$)/i,/^(?:.)/i],
|
|
conditions: {"INITIAL":{"rules":[0,1,2,3,4,5],"inclusive":true}}
|
|
});
|
|
return lexer;
|
|
})();
|
|
parser.lexer = lexer;
|
|
function Parser () {
|
|
this.yy = {};
|
|
}
|
|
Parser.prototype = parser;parser.Parser = Parser;
|
|
return new Parser;
|
|
})();
|
|
|
|
|
|
if (true) {
|
|
exports.parser = parser;
|
|
exports.Parser = parser.Parser;
|
|
exports.parse = function () { return parser.parse.apply(parser, arguments); };
|
|
exports.main = function commonjsMain (args) {
|
|
if (!args[1]) {
|
|
console.log('Usage: '+args[0]+' FILE');
|
|
process.exit(1);
|
|
}
|
|
var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
|
|
return exports.parser.parse(source);
|
|
};
|
|
if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
|
|
exports.main(process.argv.slice(1));
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js?f28c"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/pie/parser/pie.jison":
|
|
/*!*******************************************!*\
|
|
!*** ./src/diagrams/pie/parser/pie.jison ***!
|
|
\*******************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
|
|
/*
|
|
Returns a Parser object of the following structure:
|
|
|
|
Parser: {
|
|
yy: {}
|
|
}
|
|
|
|
Parser.prototype: {
|
|
yy: {},
|
|
trace: function(),
|
|
symbols_: {associative list: name ==> number},
|
|
terminals_: {associative list: number ==> name},
|
|
productions_: [...],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
|
table: [...],
|
|
defaultActions: {...},
|
|
parseError: function(str, hash),
|
|
parse: function(input),
|
|
|
|
lexer: {
|
|
EOF: 1,
|
|
parseError: function(str, hash),
|
|
setInput: function(input),
|
|
input: function(),
|
|
unput: function(str),
|
|
more: function(),
|
|
less: function(n),
|
|
pastInput: function(),
|
|
upcomingInput: function(),
|
|
showPosition: function(),
|
|
test_match: function(regex_match_array, rule_index),
|
|
next: function(),
|
|
lex: function(),
|
|
begin: function(condition),
|
|
popState: function(),
|
|
_currentRules: function(),
|
|
topState: function(),
|
|
pushState: function(condition),
|
|
|
|
options: {
|
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
|
},
|
|
|
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
|
rules: [...],
|
|
conditions: {associative list: name ==> set},
|
|
}
|
|
}
|
|
|
|
|
|
token location info (@$, _$, etc.): {
|
|
first_line: n,
|
|
last_line: n,
|
|
first_column: n,
|
|
last_column: n,
|
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
|
}
|
|
|
|
|
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
|
text: (matched text)
|
|
token: (the produced terminal token, if any)
|
|
line: (yylineno)
|
|
}
|
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
|
loc: (yylloc)
|
|
expected: (string describing the set of expected tokens)
|
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
|
}
|
|
*/
|
|
var parser = (function(){
|
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,9,10,12];
|
|
var parser = {trace: function trace () { },
|
|
yy: {},
|
|
symbols_: {"error":2,"start":3,"pie":4,"document":5,"EOF":6,"line":7,"statement":8,"NL":9,"STR":10,"VALUE":11,"title":12,"$accept":0,"$end":1},
|
|
terminals_: {2:"error",4:"pie",6:"EOF",9:"NL",10:"STR",11:"VALUE",12:"title"},
|
|
productions_: [0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,2],[8,1]],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
|
/* this == yyval */
|
|
|
|
var $0 = $$.length - 1;
|
|
switch (yystate) {
|
|
case 4:
|
|
|
|
break;
|
|
case 6:
|
|
|
|
/*console.log('str:'+$$[$0-1]+' value: '+$$[$0])*/
|
|
yy.addSection($$[$0-1],yy.cleanupValue($$[$0]));
|
|
break;
|
|
case 7:
|
|
yy.setTitle($$[$0].substr(6));this.$=$$[$0].substr(6);
|
|
break;
|
|
}
|
|
},
|
|
table: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8],12:[1,9]},{1:[2,1]},o($V0,[2,3]),o($V0,[2,4]),o($V0,[2,5]),{11:[1,10]},o($V0,[2,7]),o($V0,[2,6])],
|
|
defaultActions: {4:[2,1]},
|
|
parseError: function parseError (str, hash) {
|
|
if (hash.recoverable) {
|
|
this.trace(str);
|
|
} else {
|
|
var error = new Error(str);
|
|
error.hash = hash;
|
|
throw error;
|
|
}
|
|
},
|
|
parse: function parse(input) {
|
|
var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
var args = lstack.slice.call(arguments, 1);
|
|
var lexer = Object.create(this.lexer);
|
|
var sharedState = { yy: {} };
|
|
for (var k in this.yy) {
|
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
|
sharedState.yy[k] = this.yy[k];
|
|
}
|
|
}
|
|
lexer.setInput(input, sharedState.yy);
|
|
sharedState.yy.lexer = lexer;
|
|
sharedState.yy.parser = this;
|
|
if (typeof lexer.yylloc == 'undefined') {
|
|
lexer.yylloc = {};
|
|
}
|
|
var yyloc = lexer.yylloc;
|
|
lstack.push(yyloc);
|
|
var ranges = lexer.options && lexer.options.ranges;
|
|
if (typeof sharedState.yy.parseError === 'function') {
|
|
this.parseError = sharedState.yy.parseError;
|
|
} else {
|
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
|
}
|
|
function popStack(n) {
|
|
stack.length = stack.length - 2 * n;
|
|
vstack.length = vstack.length - n;
|
|
lstack.length = lstack.length - n;
|
|
}
|
|
function lex() {
|
|
var token;
|
|
token = tstack.pop() || lexer.lex() || EOF;
|
|
if (typeof token !== 'number') {
|
|
if (token instanceof Array) {
|
|
tstack = token;
|
|
token = tstack.pop();
|
|
}
|
|
token = self.symbols_[token] || token;
|
|
}
|
|
return token;
|
|
}
|
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
|
while (true) {
|
|
state = stack[stack.length - 1];
|
|
if (this.defaultActions[state]) {
|
|
action = this.defaultActions[state];
|
|
} else {
|
|
if (symbol === null || typeof symbol == 'undefined') {
|
|
symbol = lex();
|
|
}
|
|
action = table[state] && table[state][symbol];
|
|
}
|
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
|
var errStr = '';
|
|
expected = [];
|
|
for (p in table[state]) {
|
|
if (this.terminals_[p] && p > TERROR) {
|
|
expected.push('\'' + this.terminals_[p] + '\'');
|
|
}
|
|
}
|
|
if (lexer.showPosition) {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
|
|
} else {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
|
|
}
|
|
this.parseError(errStr, {
|
|
text: lexer.match,
|
|
token: this.terminals_[symbol] || symbol,
|
|
line: lexer.yylineno,
|
|
loc: yyloc,
|
|
expected: expected
|
|
});
|
|
}
|
|
if (action[0] instanceof Array && action.length > 1) {
|
|
throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
|
|
}
|
|
switch (action[0]) {
|
|
case 1:
|
|
stack.push(symbol);
|
|
vstack.push(lexer.yytext);
|
|
lstack.push(lexer.yylloc);
|
|
stack.push(action[1]);
|
|
symbol = null;
|
|
if (!preErrorSymbol) {
|
|
yyleng = lexer.yyleng;
|
|
yytext = lexer.yytext;
|
|
yylineno = lexer.yylineno;
|
|
yyloc = lexer.yylloc;
|
|
if (recovering > 0) {
|
|
recovering--;
|
|
}
|
|
} else {
|
|
symbol = preErrorSymbol;
|
|
preErrorSymbol = null;
|
|
}
|
|
break;
|
|
case 2:
|
|
len = this.productions_[action[1]][1];
|
|
yyval.$ = vstack[vstack.length - len];
|
|
yyval._$ = {
|
|
first_line: lstack[lstack.length - (len || 1)].first_line,
|
|
last_line: lstack[lstack.length - 1].last_line,
|
|
first_column: lstack[lstack.length - (len || 1)].first_column,
|
|
last_column: lstack[lstack.length - 1].last_column
|
|
};
|
|
if (ranges) {
|
|
yyval._$.range = [
|
|
lstack[lstack.length - (len || 1)].range[0],
|
|
lstack[lstack.length - 1].range[1]
|
|
];
|
|
}
|
|
r = this.performAction.apply(yyval, [
|
|
yytext,
|
|
yyleng,
|
|
yylineno,
|
|
sharedState.yy,
|
|
action[1],
|
|
vstack,
|
|
lstack
|
|
].concat(args));
|
|
if (typeof r !== 'undefined') {
|
|
return r;
|
|
}
|
|
if (len) {
|
|
stack = stack.slice(0, -1 * len * 2);
|
|
vstack = vstack.slice(0, -1 * len);
|
|
lstack = lstack.slice(0, -1 * len);
|
|
}
|
|
stack.push(this.productions_[action[1]][0]);
|
|
vstack.push(yyval.$);
|
|
lstack.push(yyval._$);
|
|
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
stack.push(newState);
|
|
break;
|
|
case 3:
|
|
return true;
|
|
}
|
|
}
|
|
return true;
|
|
}};
|
|
|
|
/* generated by jison-lex 0.3.4 */
|
|
var lexer = (function(){
|
|
var lexer = ({
|
|
|
|
EOF:1,
|
|
|
|
parseError:function parseError(str, hash) {
|
|
if (this.yy.parser) {
|
|
this.yy.parser.parseError(str, hash);
|
|
} else {
|
|
throw new Error(str);
|
|
}
|
|
},
|
|
|
|
// resets the lexer, sets new input
|
|
setInput:function (input, yy) {
|
|
this.yy = yy || this.yy || {};
|
|
this._input = input;
|
|
this._more = this._backtrack = this.done = false;
|
|
this.yylineno = this.yyleng = 0;
|
|
this.yytext = this.matched = this.match = '';
|
|
this.conditionStack = ['INITIAL'];
|
|
this.yylloc = {
|
|
first_line: 1,
|
|
first_column: 0,
|
|
last_line: 1,
|
|
last_column: 0
|
|
};
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [0,0];
|
|
}
|
|
this.offset = 0;
|
|
return this;
|
|
},
|
|
|
|
// consumes and returns one char from the input
|
|
input:function () {
|
|
var ch = this._input[0];
|
|
this.yytext += ch;
|
|
this.yyleng++;
|
|
this.offset++;
|
|
this.match += ch;
|
|
this.matched += ch;
|
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno++;
|
|
this.yylloc.last_line++;
|
|
} else {
|
|
this.yylloc.last_column++;
|
|
}
|
|
if (this.options.ranges) {
|
|
this.yylloc.range[1]++;
|
|
}
|
|
|
|
this._input = this._input.slice(1);
|
|
return ch;
|
|
},
|
|
|
|
// unshifts one char (or a string) into the input
|
|
unput:function (ch) {
|
|
var len = ch.length;
|
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
|
|
|
this._input = ch + this._input;
|
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
|
//this.yyleng -= len;
|
|
this.offset -= len;
|
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
|
this.match = this.match.substr(0, this.match.length - 1);
|
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
|
|
|
if (lines.length - 1) {
|
|
this.yylineno -= lines.length - 1;
|
|
}
|
|
var r = this.yylloc.range;
|
|
|
|
this.yylloc = {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: lines ?
|
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
|
this.yylloc.first_column - len
|
|
};
|
|
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
|
}
|
|
this.yyleng = this.yytext.length;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, caches matched text and appends it on next action
|
|
more:function () {
|
|
this._more = true;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
|
reject:function () {
|
|
if (this.options.backtrack_lexer) {
|
|
this._backtrack = true;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
// retain first n characters of the match
|
|
less:function (n) {
|
|
this.unput(this.match.slice(n));
|
|
},
|
|
|
|
// displays already matched input, i.e. for error messages
|
|
pastInput:function () {
|
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays upcoming input, i.e. for error messages
|
|
upcomingInput:function () {
|
|
var next = this.match;
|
|
if (next.length < 20) {
|
|
next += this._input.substr(0, 20-next.length);
|
|
}
|
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
|
showPosition:function () {
|
|
var pre = this.pastInput();
|
|
var c = new Array(pre.length + 1).join("-");
|
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
|
},
|
|
|
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
|
test_match:function(match, indexed_rule) {
|
|
var token,
|
|
lines,
|
|
backup;
|
|
|
|
if (this.options.backtrack_lexer) {
|
|
// save context
|
|
backup = {
|
|
yylineno: this.yylineno,
|
|
yylloc: {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.last_line,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: this.yylloc.last_column
|
|
},
|
|
yytext: this.yytext,
|
|
match: this.match,
|
|
matches: this.matches,
|
|
matched: this.matched,
|
|
yyleng: this.yyleng,
|
|
offset: this.offset,
|
|
_more: this._more,
|
|
_input: this._input,
|
|
yy: this.yy,
|
|
conditionStack: this.conditionStack.slice(0),
|
|
done: this.done
|
|
};
|
|
if (this.options.ranges) {
|
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
|
}
|
|
}
|
|
|
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno += lines.length;
|
|
}
|
|
this.yylloc = {
|
|
first_line: this.yylloc.last_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.last_column,
|
|
last_column: lines ?
|
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
|
this.yylloc.last_column + match[0].length
|
|
};
|
|
this.yytext += match[0];
|
|
this.match += match[0];
|
|
this.matches = match;
|
|
this.yyleng = this.yytext.length;
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
|
}
|
|
this._more = false;
|
|
this._backtrack = false;
|
|
this._input = this._input.slice(match[0].length);
|
|
this.matched += match[0];
|
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
|
if (this.done && this._input) {
|
|
this.done = false;
|
|
}
|
|
if (token) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
// recover context
|
|
for (var k in backup) {
|
|
this[k] = backup[k];
|
|
}
|
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// return next match in input
|
|
next:function () {
|
|
if (this.done) {
|
|
return this.EOF;
|
|
}
|
|
if (!this._input) {
|
|
this.done = true;
|
|
}
|
|
|
|
var token,
|
|
match,
|
|
tempMatch,
|
|
index;
|
|
if (!this._more) {
|
|
this.yytext = '';
|
|
this.match = '';
|
|
}
|
|
var rules = this._currentRules();
|
|
for (var i = 0; i < rules.length; i++) {
|
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
|
match = tempMatch;
|
|
index = i;
|
|
if (this.options.backtrack_lexer) {
|
|
token = this.test_match(tempMatch, rules[i]);
|
|
if (token !== false) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
match = false;
|
|
continue; // rule action called reject() implying a rule MISmatch.
|
|
} else {
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
} else if (!this.options.flex) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (match) {
|
|
token = this.test_match(match, rules[index]);
|
|
if (token !== false) {
|
|
return token;
|
|
}
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
if (this._input === "") {
|
|
return this.EOF;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
}
|
|
},
|
|
|
|
// return next match that has a token
|
|
lex:function lex () {
|
|
var r = this.next();
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return this.lex();
|
|
}
|
|
},
|
|
|
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
|
begin:function begin (condition) {
|
|
this.conditionStack.push(condition);
|
|
},
|
|
|
|
// pop the previously active lexer condition state off the condition stack
|
|
popState:function popState () {
|
|
var n = this.conditionStack.length - 1;
|
|
if (n > 0) {
|
|
return this.conditionStack.pop();
|
|
} else {
|
|
return this.conditionStack[0];
|
|
}
|
|
},
|
|
|
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
|
_currentRules:function _currentRules () {
|
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
|
} else {
|
|
return this.conditions["INITIAL"].rules;
|
|
}
|
|
},
|
|
|
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
|
topState:function topState (n) {
|
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
|
if (n >= 0) {
|
|
return this.conditionStack[n];
|
|
} else {
|
|
return "INITIAL";
|
|
}
|
|
},
|
|
|
|
// alias for begin(condition)
|
|
pushState:function pushState (condition) {
|
|
this.begin(condition);
|
|
},
|
|
|
|
// return the number of states currently on the stack
|
|
stateStackSize:function stateStackSize() {
|
|
return this.conditionStack.length;
|
|
},
|
|
options: {"case-insensitive":true},
|
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
|
// Pre-lexer code can go here
|
|
|
|
var YYSTATE=YY_START;
|
|
switch($avoiding_name_collisions) {
|
|
case 0:/* do nothing */
|
|
break;
|
|
case 1:/* skip whitespace */
|
|
break;
|
|
case 2:return 4 ;
|
|
break;
|
|
case 3:return 9 ;
|
|
break;
|
|
case 4:return 'space';
|
|
break;
|
|
case 5:return 12;
|
|
break;
|
|
case 6:/*console.log('begin str');*/this.begin("string");
|
|
break;
|
|
case 7:/*console.log('pop-state');*/this.popState();
|
|
break;
|
|
case 8:/*console.log('ending string')*/return "STR";
|
|
break;
|
|
case 9:return "VALUE";
|
|
break;
|
|
case 10:return 6 ;
|
|
break;
|
|
}
|
|
},
|
|
rules: [/^(?:%%[^\n]*)/i,/^(?:\s+)/i,/^(?:pie\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:title\s[^#\n;]+)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::[\s]*[\d]+(?:\.[\d]+)?)/i,/^(?:$)/i],
|
|
conditions: {"string":{"rules":[7,8],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,5,6,9,10],"inclusive":true}}
|
|
});
|
|
return lexer;
|
|
})();
|
|
parser.lexer = lexer;
|
|
function Parser () {
|
|
this.yy = {};
|
|
}
|
|
Parser.prototype = parser;parser.Parser = Parser;
|
|
return new Parser;
|
|
})();
|
|
|
|
|
|
if (true) {
|
|
exports.parser = parser;
|
|
exports.Parser = parser.Parser;
|
|
exports.parse = function () { return parser.parse.apply(parser, arguments); };
|
|
exports.main = function commonjsMain (args) {
|
|
if (!args[1]) {
|
|
console.log('Usage: '+args[0]+' FILE');
|
|
process.exit(1);
|
|
}
|
|
var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
|
|
return exports.parser.parse(source);
|
|
};
|
|
if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
|
|
exports.main(process.argv.slice(1));
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js?f28c"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/pie/pieDb.js":
|
|
/*!***********************************!*\
|
|
!*** ./src/diagrams/pie/pieDb.js ***!
|
|
\***********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/**
|
|
*
|
|
*/
|
|
|
|
var sections = {};
|
|
var title = '';
|
|
|
|
var addSection = function addSection(id, value) {
|
|
if (typeof sections[id] === 'undefined') {
|
|
sections[id] = value;
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Added new section :', id);
|
|
}
|
|
};
|
|
|
|
var getSections = function getSections() {
|
|
return sections;
|
|
};
|
|
|
|
var setTitle = function setTitle(txt) {
|
|
title = txt;
|
|
};
|
|
|
|
var getTitle = function getTitle() {
|
|
return title;
|
|
};
|
|
|
|
var cleanupValue = function cleanupValue(value) {
|
|
if (value.substring(0, 1) === ':') {
|
|
value = value.substring(1).trim();
|
|
return Number(value.trim());
|
|
} else {
|
|
return Number(value.trim());
|
|
}
|
|
};
|
|
|
|
var clear = function clear() {
|
|
sections = {};
|
|
title = '';
|
|
}; // export const parseError = (err, hash) => {
|
|
// global.mermaidAPI.parseError(err, hash)
|
|
// }
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
addSection: addSection,
|
|
getSections: getSections,
|
|
cleanupValue: cleanupValue,
|
|
clear: clear,
|
|
setTitle: setTitle,
|
|
getTitle: getTitle // parseError
|
|
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/pie/pieRenderer.js":
|
|
/*!*****************************************!*\
|
|
!*** ./src/diagrams/pie/pieRenderer.js ***!
|
|
\*****************************************/
|
|
/*! exports provided: setConf, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _pieDb__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pieDb */ "./src/diagrams/pie/pieDb.js");
|
|
/* harmony import */ var _parser_pie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./parser/pie */ "./src/diagrams/pie/parser/pie.jison");
|
|
/* harmony import */ var _parser_pie__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_parser_pie__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/**
|
|
* Created by AshishJ on 11-09-2019.
|
|
*/
|
|
|
|
|
|
|
|
|
|
var conf = {};
|
|
var setConf = function setConf(cnf) {
|
|
var keys = Object.keys(cnf);
|
|
keys.forEach(function (key) {
|
|
conf[key] = cnf[key];
|
|
});
|
|
};
|
|
/**
|
|
* Draws a Pie Chart with the data given in text.
|
|
* @param text
|
|
* @param id
|
|
*/
|
|
|
|
var w;
|
|
var draw = function draw(txt, id) {
|
|
try {
|
|
var parser = _parser_pie__WEBPACK_IMPORTED_MODULE_2___default.a.parser;
|
|
parser.yy = _pieDb__WEBPACK_IMPORTED_MODULE_1__["default"];
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Rendering info diagram\n' + txt); // Parse the Pie Chart definition
|
|
|
|
parser.yy.clear();
|
|
parser.parse(txt);
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Parsed info diagram');
|
|
var elem = document.getElementById(id);
|
|
w = elem.parentElement.offsetWidth;
|
|
|
|
if (typeof w === 'undefined') {
|
|
w = 1200;
|
|
}
|
|
|
|
if (typeof conf.useWidth !== 'undefined') {
|
|
w = conf.useWidth;
|
|
}
|
|
|
|
var h = 450;
|
|
elem.setAttribute('height', '100%'); // Set viewBox
|
|
|
|
elem.setAttribute('viewBox', '0 0 ' + w + ' ' + h); // Fetch the default direction, use TD if none was found
|
|
|
|
var width = w; // 450
|
|
|
|
var height = 450;
|
|
var margin = 40;
|
|
var legendRectSize = 18;
|
|
var legendSpacing = 4;
|
|
var radius = Math.min(width, height) / 2 - margin;
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + id).append('svg').attr('width', width).attr('height', height).append('g').attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');
|
|
var data = _pieDb__WEBPACK_IMPORTED_MODULE_1__["default"].getSections();
|
|
var sum = 0;
|
|
Object.keys(data).forEach(function (key) {
|
|
sum += data[key];
|
|
});
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info(data); // set the color scale
|
|
|
|
var color = Object(d3__WEBPACK_IMPORTED_MODULE_0__["scaleOrdinal"])().domain(data).range(d3__WEBPACK_IMPORTED_MODULE_0__["schemeSet2"]); // Compute the position of each group on the pie:
|
|
|
|
var pie = Object(d3__WEBPACK_IMPORTED_MODULE_0__["pie"])().value(function (d) {
|
|
return d.value;
|
|
});
|
|
var dataReady = pie(Object(d3__WEBPACK_IMPORTED_MODULE_0__["entries"])(data)); // shape helper to build arcs:
|
|
|
|
var arcGenerator = Object(d3__WEBPACK_IMPORTED_MODULE_0__["arc"])().innerRadius(0).outerRadius(radius); // Build the pie chart: Basically, each part of the pie is a path that we build using the arc function.
|
|
|
|
svg.selectAll('mySlices').data(dataReady).enter().append('path').attr('d', arcGenerator).attr('fill', function (d) {
|
|
return color(d.data.key);
|
|
}).attr('stroke', 'black').style('stroke-width', '2px').style('opacity', 0.7); // Now add the Percentage. Use the centroid method to get the best coordinates
|
|
|
|
svg.selectAll('mySlices').data(dataReady).enter().append('text').text(function (d) {
|
|
return (d.data.value / sum * 100).toFixed(0) + '%';
|
|
}).attr('transform', function (d) {
|
|
return 'translate(' + arcGenerator.centroid(d) + ')';
|
|
}).style('text-anchor', 'middle').attr('class', 'slice').style('font-size', 17);
|
|
svg.append('text').text(parser.yy.getTitle()).attr('x', 0).attr('y', -(h - 50) / 2).attr('class', 'pieTitleText'); //Add the slegend/annotations for each section
|
|
|
|
var legend = svg.selectAll('.legend').data(color.domain()).enter().append('g').attr('class', 'legend').attr('transform', function (d, i) {
|
|
var height = legendRectSize + legendSpacing;
|
|
var offset = height * color.domain().length / 2;
|
|
var horz = 12 * legendRectSize;
|
|
var vert = i * height - offset;
|
|
return 'translate(' + horz + ',' + vert + ')';
|
|
});
|
|
legend.append('rect').attr('width', legendRectSize).attr('height', legendRectSize).style('fill', color).style('stroke', color);
|
|
legend.append('text').attr('x', legendRectSize + legendSpacing).attr('y', legendRectSize - legendSpacing).text(function (d) {
|
|
return d;
|
|
});
|
|
} catch (e) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error('Error while rendering info diagram');
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error(e.message);
|
|
}
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/sequence/parser/sequenceDiagram.jison":
|
|
/*!************************************************************!*\
|
|
!*** ./src/diagrams/sequence/parser/sequenceDiagram.jison ***!
|
|
\************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
|
|
/*
|
|
Returns a Parser object of the following structure:
|
|
|
|
Parser: {
|
|
yy: {}
|
|
}
|
|
|
|
Parser.prototype: {
|
|
yy: {},
|
|
trace: function(),
|
|
symbols_: {associative list: name ==> number},
|
|
terminals_: {associative list: number ==> name},
|
|
productions_: [...],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
|
table: [...],
|
|
defaultActions: {...},
|
|
parseError: function(str, hash),
|
|
parse: function(input),
|
|
|
|
lexer: {
|
|
EOF: 1,
|
|
parseError: function(str, hash),
|
|
setInput: function(input),
|
|
input: function(),
|
|
unput: function(str),
|
|
more: function(),
|
|
less: function(n),
|
|
pastInput: function(),
|
|
upcomingInput: function(),
|
|
showPosition: function(),
|
|
test_match: function(regex_match_array, rule_index),
|
|
next: function(),
|
|
lex: function(),
|
|
begin: function(condition),
|
|
popState: function(),
|
|
_currentRules: function(),
|
|
topState: function(),
|
|
pushState: function(condition),
|
|
|
|
options: {
|
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
|
},
|
|
|
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
|
rules: [...],
|
|
conditions: {associative list: name ==> set},
|
|
}
|
|
}
|
|
|
|
|
|
token location info (@$, _$, etc.): {
|
|
first_line: n,
|
|
last_line: n,
|
|
first_column: n,
|
|
last_column: n,
|
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
|
}
|
|
|
|
|
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
|
text: (matched text)
|
|
token: (the produced terminal token, if any)
|
|
line: (yylineno)
|
|
}
|
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
|
loc: (yylloc)
|
|
expected: (string describing the set of expected tokens)
|
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
|
}
|
|
*/
|
|
var parser = (function(){
|
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,3],$V2=[1,4],$V3=[2,4],$V4=[1,9],$V5=[1,11],$V6=[1,12],$V7=[1,14],$V8=[1,15],$V9=[1,16],$Va=[1,18],$Vb=[1,19],$Vc=[1,20],$Vd=[1,21],$Ve=[1,22],$Vf=[1,23],$Vg=[1,25],$Vh=[1,26],$Vi=[1,4,5,10,15,16,17,19,21,22,23,24,25,27,29,30,31,42],$Vj=[1,34],$Vk=[4,5,10,15,16,17,19,21,22,23,24,25,27,31,42],$Vl=[4,5,10,15,16,17,19,21,22,23,24,25,27,30,31,42],$Vm=[4,5,10,15,16,17,19,21,22,23,24,25,27,29,31,42],$Vn=[40,41,42];
|
|
var parser = {trace: function trace () { },
|
|
yy: {},
|
|
symbols_: {"error":2,"start":3,"SPACE":4,"NL":5,"SD":6,"document":7,"line":8,"statement":9,"participant":10,"actor":11,"AS":12,"restOfLine":13,"signal":14,"autonumber":15,"activate":16,"deactivate":17,"note_statement":18,"title":19,"text2":20,"loop":21,"end":22,"rect":23,"opt":24,"alt":25,"else_sections":26,"par":27,"par_sections":28,"and":29,"else":30,"note":31,"placement":32,"over":33,"actor_pair":34,"spaceList":35,",":36,"left_of":37,"right_of":38,"signaltype":39,"+":40,"-":41,"ACTOR":42,"SOLID_OPEN_ARROW":43,"DOTTED_OPEN_ARROW":44,"SOLID_ARROW":45,"DOTTED_ARROW":46,"SOLID_CROSS":47,"DOTTED_CROSS":48,"TXT":49,"$accept":0,"$end":1},
|
|
terminals_: {2:"error",4:"SPACE",5:"NL",6:"SD",10:"participant",12:"AS",13:"restOfLine",15:"autonumber",16:"activate",17:"deactivate",19:"title",21:"loop",22:"end",23:"rect",24:"opt",25:"alt",27:"par",29:"and",30:"else",31:"note",33:"over",36:",",37:"left_of",38:"right_of",40:"+",41:"-",42:"ACTOR",43:"SOLID_OPEN_ARROW",44:"DOTTED_OPEN_ARROW",45:"SOLID_ARROW",46:"DOTTED_ARROW",47:"SOLID_CROSS",48:"DOTTED_CROSS",49:"TXT"},
|
|
productions_: [0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,5],[9,3],[9,2],[9,1],[9,3],[9,3],[9,2],[9,3],[9,4],[9,4],[9,4],[9,4],[9,4],[28,1],[28,4],[26,1],[26,4],[18,4],[18,4],[35,2],[35,1],[34,3],[34,1],[32,1],[32,1],[14,5],[14,5],[14,4],[11,1],[39,1],[39,1],[39,1],[39,1],[39,1],[39,1],[20,1]],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
|
/* this == yyval */
|
|
|
|
var $0 = $$.length - 1;
|
|
switch (yystate) {
|
|
case 3:
|
|
yy.apply($$[$0]);return $$[$0];
|
|
break;
|
|
case 4:
|
|
this.$ = []
|
|
break;
|
|
case 5:
|
|
$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
|
|
break;
|
|
case 6: case 7:
|
|
this.$ = $$[$0]
|
|
break;
|
|
case 8:
|
|
this.$=[];
|
|
break;
|
|
case 9:
|
|
$$[$0-3].description=$$[$0-1]; this.$=$$[$0-3];
|
|
break;
|
|
case 10:
|
|
this.$=$$[$0-1];
|
|
break;
|
|
case 12:
|
|
yy.enableSequenceNumbers()
|
|
break;
|
|
case 13:
|
|
this.$={type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]};
|
|
break;
|
|
case 14:
|
|
this.$={type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-1]};
|
|
break;
|
|
case 16:
|
|
this.$=[{type:'setTitle', text:$$[$0-1]}]
|
|
break;
|
|
case 17:
|
|
|
|
$$[$0-1].unshift({type: 'loopStart', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_START});
|
|
$$[$0-1].push({type: 'loopEnd', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_END});
|
|
this.$=$$[$0-1];
|
|
break;
|
|
case 18:
|
|
|
|
$$[$0-1].unshift({type: 'rectStart', color:$$[$0-2], signalType: yy.LINETYPE.RECT_START });
|
|
$$[$0-1].push({type: 'rectEnd', color:$$[$0-2], signalType: yy.LINETYPE.RECT_END });
|
|
this.$=$$[$0-1];
|
|
break;
|
|
case 19:
|
|
|
|
$$[$0-1].unshift({type: 'optStart', optText:$$[$0-2], signalType: yy.LINETYPE.OPT_START});
|
|
$$[$0-1].push({type: 'optEnd', optText:$$[$0-2], signalType: yy.LINETYPE.OPT_END});
|
|
this.$=$$[$0-1];
|
|
break;
|
|
case 20:
|
|
|
|
// Alt start
|
|
$$[$0-1].unshift({type: 'altStart', altText:$$[$0-2], signalType: yy.LINETYPE.ALT_START});
|
|
// Content in alt is already in $$[$0-1]
|
|
// End
|
|
$$[$0-1].push({type: 'altEnd', signalType: yy.LINETYPE.ALT_END});
|
|
this.$=$$[$0-1];
|
|
break;
|
|
case 21:
|
|
|
|
// Parallel start
|
|
$$[$0-1].unshift({type: 'parStart', parText:$$[$0-2], signalType: yy.LINETYPE.PAR_START});
|
|
// Content in par is already in $$[$0-1]
|
|
// End
|
|
$$[$0-1].push({type: 'parEnd', signalType: yy.LINETYPE.PAR_END});
|
|
this.$=$$[$0-1];
|
|
break;
|
|
case 23:
|
|
this.$ = $$[$0-3].concat([{type: 'and', parText:$$[$0-1], signalType: yy.LINETYPE.PAR_AND}, $$[$0]]);
|
|
break;
|
|
case 25:
|
|
this.$ = $$[$0-3].concat([{type: 'else', altText:$$[$0-1], signalType: yy.LINETYPE.ALT_ELSE}, $$[$0]]);
|
|
break;
|
|
case 26:
|
|
|
|
this.$ = [$$[$0-1], {type:'addNote', placement:$$[$0-2], actor:$$[$0-1].actor, text:$$[$0]}];
|
|
break;
|
|
case 27:
|
|
|
|
// Coerce actor_pair into a [to, from, ...] array
|
|
$$[$0-2] = [].concat($$[$0-1], $$[$0-1]).slice(0, 2);
|
|
$$[$0-2][0] = $$[$0-2][0].actor;
|
|
$$[$0-2][1] = $$[$0-2][1].actor;
|
|
this.$ = [$$[$0-1], {type:'addNote', placement:yy.PLACEMENT.OVER, actor:$$[$0-2].slice(0, 2), text:$$[$0]}];
|
|
break;
|
|
case 30:
|
|
this.$ = [$$[$0-2], $$[$0]];
|
|
break;
|
|
case 31:
|
|
this.$ = $$[$0];
|
|
break;
|
|
case 32:
|
|
this.$ = yy.PLACEMENT.LEFTOF;
|
|
break;
|
|
case 33:
|
|
this.$ = yy.PLACEMENT.RIGHTOF;
|
|
break;
|
|
case 34:
|
|
this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},
|
|
{type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]}
|
|
]
|
|
break;
|
|
case 35:
|
|
this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},
|
|
{type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-4]}
|
|
]
|
|
break;
|
|
case 36:
|
|
this.$ = [$$[$0-3],$$[$0-1],{type: 'addMessage', from:$$[$0-3].actor, to:$$[$0-1].actor, signalType:$$[$0-2], msg:$$[$0]}]
|
|
break;
|
|
case 37:
|
|
this.$={type: 'addActor', actor:$$[$0]}
|
|
break;
|
|
case 38:
|
|
this.$ = yy.LINETYPE.SOLID_OPEN;
|
|
break;
|
|
case 39:
|
|
this.$ = yy.LINETYPE.DOTTED_OPEN;
|
|
break;
|
|
case 40:
|
|
this.$ = yy.LINETYPE.SOLID;
|
|
break;
|
|
case 41:
|
|
this.$ = yy.LINETYPE.DOTTED;
|
|
break;
|
|
case 42:
|
|
this.$ = yy.LINETYPE.SOLID_CROSS;
|
|
break;
|
|
case 43:
|
|
this.$ = yy.LINETYPE.DOTTED_CROSS;
|
|
break;
|
|
case 44:
|
|
this.$ = $$[$0].substring(1).trim().replace(/\\n/gm, "\n");
|
|
break;
|
|
}
|
|
},
|
|
table: [{3:1,4:$V0,5:$V1,6:$V2},{1:[3]},{3:5,4:$V0,5:$V1,6:$V2},{3:6,4:$V0,5:$V1,6:$V2},o([1,4,5,10,15,16,17,19,21,23,24,25,27,31,42],$V3,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:$V4,5:$V5,8:8,9:10,10:$V6,11:24,14:13,15:$V7,16:$V8,17:$V9,18:17,19:$Va,21:$Vb,23:$Vc,24:$Vd,25:$Ve,27:$Vf,31:$Vg,42:$Vh},o($Vi,[2,5]),{9:27,10:$V6,11:24,14:13,15:$V7,16:$V8,17:$V9,18:17,19:$Va,21:$Vb,23:$Vc,24:$Vd,25:$Ve,27:$Vf,31:$Vg,42:$Vh},o($Vi,[2,7]),o($Vi,[2,8]),{11:28,42:$Vh},{5:[1,29]},o($Vi,[2,12]),{11:30,42:$Vh},{11:31,42:$Vh},{5:[1,32]},{20:33,49:$Vj},{13:[1,35]},{13:[1,36]},{13:[1,37]},{13:[1,38]},{13:[1,39]},{39:40,43:[1,41],44:[1,42],45:[1,43],46:[1,44],47:[1,45],48:[1,46]},{32:47,33:[1,48],37:[1,49],38:[1,50]},o([5,12,36,43,44,45,46,47,48,49],[2,37]),o($Vi,[2,6]),{5:[1,52],12:[1,51]},o($Vi,[2,11]),{5:[1,53]},{5:[1,54]},o($Vi,[2,15]),{5:[1,55]},{5:[2,44]},o($Vk,$V3,{7:56}),o($Vk,$V3,{7:57}),o($Vk,$V3,{7:58}),o($Vl,$V3,{26:59,7:60}),o($Vm,$V3,{28:61,7:62}),{11:65,40:[1,63],41:[1,64],42:$Vh},o($Vn,[2,38]),o($Vn,[2,39]),o($Vn,[2,40]),o($Vn,[2,41]),o($Vn,[2,42]),o($Vn,[2,43]),{11:66,42:$Vh},{11:68,34:67,42:$Vh},{42:[2,32]},{42:[2,33]},{13:[1,69]},o($Vi,[2,10]),o($Vi,[2,13]),o($Vi,[2,14]),o($Vi,[2,16]),{4:$V4,5:$V5,8:8,9:10,10:$V6,11:24,14:13,15:$V7,16:$V8,17:$V9,18:17,19:$Va,21:$Vb,22:[1,70],23:$Vc,24:$Vd,25:$Ve,27:$Vf,31:$Vg,42:$Vh},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:24,14:13,15:$V7,16:$V8,17:$V9,18:17,19:$Va,21:$Vb,22:[1,71],23:$Vc,24:$Vd,25:$Ve,27:$Vf,31:$Vg,42:$Vh},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:24,14:13,15:$V7,16:$V8,17:$V9,18:17,19:$Va,21:$Vb,22:[1,72],23:$Vc,24:$Vd,25:$Ve,27:$Vf,31:$Vg,42:$Vh},{22:[1,73]},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:24,14:13,15:$V7,16:$V8,17:$V9,18:17,19:$Va,21:$Vb,22:[2,24],23:$Vc,24:$Vd,25:$Ve,27:$Vf,30:[1,74],31:$Vg,42:$Vh},{22:[1,75]},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:24,14:13,15:$V7,16:$V8,17:$V9,18:17,19:$Va,21:$Vb,22:[2,22],23:$Vc,24:$Vd,25:$Ve,27:$Vf,29:[1,76],31:$Vg,42:$Vh},{11:77,42:$Vh},{11:78,42:$Vh},{20:79,49:$Vj},{20:80,49:$Vj},{20:81,49:$Vj},{36:[1,82],49:[2,31]},{5:[1,83]},o($Vi,[2,17]),o($Vi,[2,18]),o($Vi,[2,19]),o($Vi,[2,20]),{13:[1,84]},o($Vi,[2,21]),{13:[1,85]},{20:86,49:$Vj},{20:87,49:$Vj},{5:[2,36]},{5:[2,26]},{5:[2,27]},{11:88,42:$Vh},o($Vi,[2,9]),o($Vl,$V3,{7:60,26:89}),o($Vm,$V3,{7:62,28:90}),{5:[2,34]},{5:[2,35]},{49:[2,30]},{22:[2,25]},{22:[2,23]}],
|
|
defaultActions: {5:[2,1],6:[2,2],34:[2,44],49:[2,32],50:[2,33],79:[2,36],80:[2,26],81:[2,27],86:[2,34],87:[2,35],88:[2,30],89:[2,25],90:[2,23]},
|
|
parseError: function parseError (str, hash) {
|
|
if (hash.recoverable) {
|
|
this.trace(str);
|
|
} else {
|
|
var error = new Error(str);
|
|
error.hash = hash;
|
|
throw error;
|
|
}
|
|
},
|
|
parse: function parse(input) {
|
|
var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
var args = lstack.slice.call(arguments, 1);
|
|
var lexer = Object.create(this.lexer);
|
|
var sharedState = { yy: {} };
|
|
for (var k in this.yy) {
|
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
|
sharedState.yy[k] = this.yy[k];
|
|
}
|
|
}
|
|
lexer.setInput(input, sharedState.yy);
|
|
sharedState.yy.lexer = lexer;
|
|
sharedState.yy.parser = this;
|
|
if (typeof lexer.yylloc == 'undefined') {
|
|
lexer.yylloc = {};
|
|
}
|
|
var yyloc = lexer.yylloc;
|
|
lstack.push(yyloc);
|
|
var ranges = lexer.options && lexer.options.ranges;
|
|
if (typeof sharedState.yy.parseError === 'function') {
|
|
this.parseError = sharedState.yy.parseError;
|
|
} else {
|
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
|
}
|
|
function popStack(n) {
|
|
stack.length = stack.length - 2 * n;
|
|
vstack.length = vstack.length - n;
|
|
lstack.length = lstack.length - n;
|
|
}
|
|
function lex() {
|
|
var token;
|
|
token = tstack.pop() || lexer.lex() || EOF;
|
|
if (typeof token !== 'number') {
|
|
if (token instanceof Array) {
|
|
tstack = token;
|
|
token = tstack.pop();
|
|
}
|
|
token = self.symbols_[token] || token;
|
|
}
|
|
return token;
|
|
}
|
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
|
while (true) {
|
|
state = stack[stack.length - 1];
|
|
if (this.defaultActions[state]) {
|
|
action = this.defaultActions[state];
|
|
} else {
|
|
if (symbol === null || typeof symbol == 'undefined') {
|
|
symbol = lex();
|
|
}
|
|
action = table[state] && table[state][symbol];
|
|
}
|
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
|
var errStr = '';
|
|
expected = [];
|
|
for (p in table[state]) {
|
|
if (this.terminals_[p] && p > TERROR) {
|
|
expected.push('\'' + this.terminals_[p] + '\'');
|
|
}
|
|
}
|
|
if (lexer.showPosition) {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
|
|
} else {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
|
|
}
|
|
this.parseError(errStr, {
|
|
text: lexer.match,
|
|
token: this.terminals_[symbol] || symbol,
|
|
line: lexer.yylineno,
|
|
loc: yyloc,
|
|
expected: expected
|
|
});
|
|
}
|
|
if (action[0] instanceof Array && action.length > 1) {
|
|
throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
|
|
}
|
|
switch (action[0]) {
|
|
case 1:
|
|
stack.push(symbol);
|
|
vstack.push(lexer.yytext);
|
|
lstack.push(lexer.yylloc);
|
|
stack.push(action[1]);
|
|
symbol = null;
|
|
if (!preErrorSymbol) {
|
|
yyleng = lexer.yyleng;
|
|
yytext = lexer.yytext;
|
|
yylineno = lexer.yylineno;
|
|
yyloc = lexer.yylloc;
|
|
if (recovering > 0) {
|
|
recovering--;
|
|
}
|
|
} else {
|
|
symbol = preErrorSymbol;
|
|
preErrorSymbol = null;
|
|
}
|
|
break;
|
|
case 2:
|
|
len = this.productions_[action[1]][1];
|
|
yyval.$ = vstack[vstack.length - len];
|
|
yyval._$ = {
|
|
first_line: lstack[lstack.length - (len || 1)].first_line,
|
|
last_line: lstack[lstack.length - 1].last_line,
|
|
first_column: lstack[lstack.length - (len || 1)].first_column,
|
|
last_column: lstack[lstack.length - 1].last_column
|
|
};
|
|
if (ranges) {
|
|
yyval._$.range = [
|
|
lstack[lstack.length - (len || 1)].range[0],
|
|
lstack[lstack.length - 1].range[1]
|
|
];
|
|
}
|
|
r = this.performAction.apply(yyval, [
|
|
yytext,
|
|
yyleng,
|
|
yylineno,
|
|
sharedState.yy,
|
|
action[1],
|
|
vstack,
|
|
lstack
|
|
].concat(args));
|
|
if (typeof r !== 'undefined') {
|
|
return r;
|
|
}
|
|
if (len) {
|
|
stack = stack.slice(0, -1 * len * 2);
|
|
vstack = vstack.slice(0, -1 * len);
|
|
lstack = lstack.slice(0, -1 * len);
|
|
}
|
|
stack.push(this.productions_[action[1]][0]);
|
|
vstack.push(yyval.$);
|
|
lstack.push(yyval._$);
|
|
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
stack.push(newState);
|
|
break;
|
|
case 3:
|
|
return true;
|
|
}
|
|
}
|
|
return true;
|
|
}};
|
|
|
|
/* generated by jison-lex 0.3.4 */
|
|
var lexer = (function(){
|
|
var lexer = ({
|
|
|
|
EOF:1,
|
|
|
|
parseError:function parseError(str, hash) {
|
|
if (this.yy.parser) {
|
|
this.yy.parser.parseError(str, hash);
|
|
} else {
|
|
throw new Error(str);
|
|
}
|
|
},
|
|
|
|
// resets the lexer, sets new input
|
|
setInput:function (input, yy) {
|
|
this.yy = yy || this.yy || {};
|
|
this._input = input;
|
|
this._more = this._backtrack = this.done = false;
|
|
this.yylineno = this.yyleng = 0;
|
|
this.yytext = this.matched = this.match = '';
|
|
this.conditionStack = ['INITIAL'];
|
|
this.yylloc = {
|
|
first_line: 1,
|
|
first_column: 0,
|
|
last_line: 1,
|
|
last_column: 0
|
|
};
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [0,0];
|
|
}
|
|
this.offset = 0;
|
|
return this;
|
|
},
|
|
|
|
// consumes and returns one char from the input
|
|
input:function () {
|
|
var ch = this._input[0];
|
|
this.yytext += ch;
|
|
this.yyleng++;
|
|
this.offset++;
|
|
this.match += ch;
|
|
this.matched += ch;
|
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno++;
|
|
this.yylloc.last_line++;
|
|
} else {
|
|
this.yylloc.last_column++;
|
|
}
|
|
if (this.options.ranges) {
|
|
this.yylloc.range[1]++;
|
|
}
|
|
|
|
this._input = this._input.slice(1);
|
|
return ch;
|
|
},
|
|
|
|
// unshifts one char (or a string) into the input
|
|
unput:function (ch) {
|
|
var len = ch.length;
|
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
|
|
|
this._input = ch + this._input;
|
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
|
//this.yyleng -= len;
|
|
this.offset -= len;
|
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
|
this.match = this.match.substr(0, this.match.length - 1);
|
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
|
|
|
if (lines.length - 1) {
|
|
this.yylineno -= lines.length - 1;
|
|
}
|
|
var r = this.yylloc.range;
|
|
|
|
this.yylloc = {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: lines ?
|
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
|
this.yylloc.first_column - len
|
|
};
|
|
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
|
}
|
|
this.yyleng = this.yytext.length;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, caches matched text and appends it on next action
|
|
more:function () {
|
|
this._more = true;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
|
reject:function () {
|
|
if (this.options.backtrack_lexer) {
|
|
this._backtrack = true;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
// retain first n characters of the match
|
|
less:function (n) {
|
|
this.unput(this.match.slice(n));
|
|
},
|
|
|
|
// displays already matched input, i.e. for error messages
|
|
pastInput:function () {
|
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays upcoming input, i.e. for error messages
|
|
upcomingInput:function () {
|
|
var next = this.match;
|
|
if (next.length < 20) {
|
|
next += this._input.substr(0, 20-next.length);
|
|
}
|
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
|
showPosition:function () {
|
|
var pre = this.pastInput();
|
|
var c = new Array(pre.length + 1).join("-");
|
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
|
},
|
|
|
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
|
test_match:function(match, indexed_rule) {
|
|
var token,
|
|
lines,
|
|
backup;
|
|
|
|
if (this.options.backtrack_lexer) {
|
|
// save context
|
|
backup = {
|
|
yylineno: this.yylineno,
|
|
yylloc: {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.last_line,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: this.yylloc.last_column
|
|
},
|
|
yytext: this.yytext,
|
|
match: this.match,
|
|
matches: this.matches,
|
|
matched: this.matched,
|
|
yyleng: this.yyleng,
|
|
offset: this.offset,
|
|
_more: this._more,
|
|
_input: this._input,
|
|
yy: this.yy,
|
|
conditionStack: this.conditionStack.slice(0),
|
|
done: this.done
|
|
};
|
|
if (this.options.ranges) {
|
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
|
}
|
|
}
|
|
|
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno += lines.length;
|
|
}
|
|
this.yylloc = {
|
|
first_line: this.yylloc.last_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.last_column,
|
|
last_column: lines ?
|
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
|
this.yylloc.last_column + match[0].length
|
|
};
|
|
this.yytext += match[0];
|
|
this.match += match[0];
|
|
this.matches = match;
|
|
this.yyleng = this.yytext.length;
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
|
}
|
|
this._more = false;
|
|
this._backtrack = false;
|
|
this._input = this._input.slice(match[0].length);
|
|
this.matched += match[0];
|
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
|
if (this.done && this._input) {
|
|
this.done = false;
|
|
}
|
|
if (token) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
// recover context
|
|
for (var k in backup) {
|
|
this[k] = backup[k];
|
|
}
|
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// return next match in input
|
|
next:function () {
|
|
if (this.done) {
|
|
return this.EOF;
|
|
}
|
|
if (!this._input) {
|
|
this.done = true;
|
|
}
|
|
|
|
var token,
|
|
match,
|
|
tempMatch,
|
|
index;
|
|
if (!this._more) {
|
|
this.yytext = '';
|
|
this.match = '';
|
|
}
|
|
var rules = this._currentRules();
|
|
for (var i = 0; i < rules.length; i++) {
|
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
|
match = tempMatch;
|
|
index = i;
|
|
if (this.options.backtrack_lexer) {
|
|
token = this.test_match(tempMatch, rules[i]);
|
|
if (token !== false) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
match = false;
|
|
continue; // rule action called reject() implying a rule MISmatch.
|
|
} else {
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
} else if (!this.options.flex) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (match) {
|
|
token = this.test_match(match, rules[index]);
|
|
if (token !== false) {
|
|
return token;
|
|
}
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
if (this._input === "") {
|
|
return this.EOF;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
}
|
|
},
|
|
|
|
// return next match that has a token
|
|
lex:function lex () {
|
|
var r = this.next();
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return this.lex();
|
|
}
|
|
},
|
|
|
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
|
begin:function begin (condition) {
|
|
this.conditionStack.push(condition);
|
|
},
|
|
|
|
// pop the previously active lexer condition state off the condition stack
|
|
popState:function popState () {
|
|
var n = this.conditionStack.length - 1;
|
|
if (n > 0) {
|
|
return this.conditionStack.pop();
|
|
} else {
|
|
return this.conditionStack[0];
|
|
}
|
|
},
|
|
|
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
|
_currentRules:function _currentRules () {
|
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
|
} else {
|
|
return this.conditions["INITIAL"].rules;
|
|
}
|
|
},
|
|
|
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
|
topState:function topState (n) {
|
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
|
if (n >= 0) {
|
|
return this.conditionStack[n];
|
|
} else {
|
|
return "INITIAL";
|
|
}
|
|
},
|
|
|
|
// alias for begin(condition)
|
|
pushState:function pushState (condition) {
|
|
this.begin(condition);
|
|
},
|
|
|
|
// return the number of states currently on the stack
|
|
stateStackSize:function stateStackSize() {
|
|
return this.conditionStack.length;
|
|
},
|
|
options: {"case-insensitive":true},
|
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
|
var YYSTATE=YY_START;
|
|
switch($avoiding_name_collisions) {
|
|
case 0:return 5;
|
|
break;
|
|
case 1:/* skip all whitespace */
|
|
break;
|
|
case 2:/* skip same-line whitespace */
|
|
break;
|
|
case 3:/* skip comments */
|
|
break;
|
|
case 4:/* skip comments */
|
|
break;
|
|
case 5: this.begin('ID'); return 10;
|
|
break;
|
|
case 6: yy_.yytext = yy_.yytext.trim(); this.begin('ALIAS'); return 42;
|
|
break;
|
|
case 7: this.popState(); this.popState(); this.begin('LINE'); return 12;
|
|
break;
|
|
case 8: this.popState(); this.popState(); return 5;
|
|
break;
|
|
case 9: this.begin('LINE'); return 21;
|
|
break;
|
|
case 10: this.begin('LINE'); return 23;
|
|
break;
|
|
case 11: this.begin('LINE'); return 24;
|
|
break;
|
|
case 12: this.begin('LINE'); return 25;
|
|
break;
|
|
case 13: this.begin('LINE'); return 30;
|
|
break;
|
|
case 14: this.begin('LINE'); return 27;
|
|
break;
|
|
case 15: this.begin('LINE'); return 29;
|
|
break;
|
|
case 16: this.popState(); return 13;
|
|
break;
|
|
case 17:return 22;
|
|
break;
|
|
case 18:return 37;
|
|
break;
|
|
case 19:return 38;
|
|
break;
|
|
case 20:return 33;
|
|
break;
|
|
case 21:return 31;
|
|
break;
|
|
case 22: this.begin('ID'); return 16;
|
|
break;
|
|
case 23: this.begin('ID'); return 17;
|
|
break;
|
|
case 24:return 19;
|
|
break;
|
|
case 25:return 6;
|
|
break;
|
|
case 26:return 15;
|
|
break;
|
|
case 27:return 36;
|
|
break;
|
|
case 28:return 5;
|
|
break;
|
|
case 29: yy_.yytext = yy_.yytext.trim(); return 42;
|
|
break;
|
|
case 30:return 45;
|
|
break;
|
|
case 31:return 46;
|
|
break;
|
|
case 32:return 43;
|
|
break;
|
|
case 33:return 44;
|
|
break;
|
|
case 34:return 47;
|
|
break;
|
|
case 35:return 48;
|
|
break;
|
|
case 36:return 49;
|
|
break;
|
|
case 37:return 40;
|
|
break;
|
|
case 38:return 41;
|
|
break;
|
|
case 39:return 5;
|
|
break;
|
|
case 40:return 'INVALID';
|
|
break;
|
|
}
|
|
},
|
|
rules: [/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:participant\b)/i,/^(?:[^\->:\n,;]+?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\b)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?::[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],
|
|
conditions: {"LINE":{"rules":[2,3,16],"inclusive":false},"ALIAS":{"rules":[2,3,7,8],"inclusive":false},"ID":{"rules":[2,3,6],"inclusive":false},"INITIAL":{"rules":[0,1,3,4,5,9,10,11,12,13,14,15,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"inclusive":true}}
|
|
});
|
|
return lexer;
|
|
})();
|
|
parser.lexer = lexer;
|
|
function Parser () {
|
|
this.yy = {};
|
|
}
|
|
Parser.prototype = parser;parser.Parser = Parser;
|
|
return new Parser;
|
|
})();
|
|
|
|
|
|
if (true) {
|
|
exports.parser = parser;
|
|
exports.Parser = parser.Parser;
|
|
exports.parse = function () { return parser.parse.apply(parser, arguments); };
|
|
exports.main = function commonjsMain (args) {
|
|
if (!args[1]) {
|
|
console.log('Usage: '+args[0]+' FILE');
|
|
process.exit(1);
|
|
}
|
|
var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
|
|
return exports.parser.parse(source);
|
|
};
|
|
if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
|
|
exports.main(process.argv.slice(1));
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js?f28c"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/sequence/sequenceDb.js":
|
|
/*!*********************************************!*\
|
|
!*** ./src/diagrams/sequence/sequenceDb.js ***!
|
|
\*********************************************/
|
|
/*! exports provided: addActor, addMessage, addSignal, getMessages, getActors, getActor, getActorKeys, getTitle, enableSequenceNumbers, showSequenceNumbers, clear, LINETYPE, ARROWTYPE, PLACEMENT, addNote, setTitle, apply, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addActor", function() { return addActor; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addMessage", function() { return addMessage; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSignal", function() { return addSignal; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMessages", function() { return getMessages; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActors", function() { return getActors; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActor", function() { return getActor; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActorKeys", function() { return getActorKeys; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTitle", function() { return getTitle; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableSequenceNumbers", function() { return enableSequenceNumbers; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showSequenceNumbers", function() { return showSequenceNumbers; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LINETYPE", function() { return LINETYPE; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ARROWTYPE", function() { return ARROWTYPE; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PLACEMENT", function() { return PLACEMENT; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addNote", function() { return addNote; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTitle", function() { return setTitle; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "apply", function() { return apply; });
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
|
|
var prevActor = undefined;
|
|
var actors = {};
|
|
var messages = [];
|
|
var notes = [];
|
|
var title = '';
|
|
var sequenceNumbersEnabled = false;
|
|
var addActor = function addActor(id, name, description) {
|
|
// Don't allow description nulling
|
|
var old = actors[id];
|
|
if (old && name === old.name && description == null) return; // Don't allow null descriptions, either
|
|
|
|
if (description == null) description = name;
|
|
actors[id] = {
|
|
name: name,
|
|
description: description,
|
|
prevActor: prevActor
|
|
};
|
|
|
|
if (prevActor && actors[prevActor]) {
|
|
actors[prevActor].nextActor = id;
|
|
}
|
|
|
|
prevActor = id;
|
|
};
|
|
|
|
var activationCount = function activationCount(part) {
|
|
var i = 0;
|
|
var count = 0;
|
|
|
|
for (i = 0; i < messages.length; i++) {
|
|
// console.warn(i, messages[i]);
|
|
if (messages[i].type === LINETYPE.ACTIVE_START) {
|
|
if (messages[i].from.actor === part) {
|
|
count++;
|
|
}
|
|
}
|
|
|
|
if (messages[i].type === LINETYPE.ACTIVE_END) {
|
|
if (messages[i].from.actor === part) {
|
|
count--;
|
|
}
|
|
}
|
|
}
|
|
|
|
return count;
|
|
};
|
|
|
|
var addMessage = function addMessage(idFrom, idTo, message, answer) {
|
|
messages.push({
|
|
from: idFrom,
|
|
to: idTo,
|
|
message: message,
|
|
answer: answer
|
|
});
|
|
};
|
|
var addSignal = function addSignal(idFrom, idTo, message, messageType) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Adding message from=' + idFrom + ' to=' + idTo + ' message=' + message + ' type=' + messageType);
|
|
|
|
if (messageType === LINETYPE.ACTIVE_END) {
|
|
var cnt = activationCount(idFrom.actor);
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Adding message from=', messages, cnt);
|
|
|
|
if (cnt < 1) {
|
|
// Bail out as there is an activation signal from an inactive participant
|
|
var error = new Error('Trying to inactivate an inactive participant (' + idFrom.actor + ')');
|
|
error.hash = {
|
|
text: '->>-',
|
|
token: '->>-',
|
|
line: '1',
|
|
loc: {
|
|
first_line: 1,
|
|
last_line: 1,
|
|
first_column: 1,
|
|
last_column: 1
|
|
},
|
|
expected: ["'ACTIVE_PARTICIPANT'"]
|
|
};
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
messages.push({
|
|
from: idFrom,
|
|
to: idTo,
|
|
message: message,
|
|
type: messageType
|
|
});
|
|
return true;
|
|
};
|
|
var getMessages = function getMessages() {
|
|
return messages;
|
|
};
|
|
var getActors = function getActors() {
|
|
return actors;
|
|
};
|
|
var getActor = function getActor(id) {
|
|
return actors[id];
|
|
};
|
|
var getActorKeys = function getActorKeys() {
|
|
return Object.keys(actors);
|
|
};
|
|
var getTitle = function getTitle() {
|
|
return title;
|
|
};
|
|
var enableSequenceNumbers = function enableSequenceNumbers() {
|
|
sequenceNumbersEnabled = true;
|
|
};
|
|
var showSequenceNumbers = function showSequenceNumbers() {
|
|
return sequenceNumbersEnabled;
|
|
};
|
|
var clear = function clear() {
|
|
actors = {};
|
|
messages = [];
|
|
};
|
|
var LINETYPE = {
|
|
SOLID: 0,
|
|
DOTTED: 1,
|
|
NOTE: 2,
|
|
SOLID_CROSS: 3,
|
|
DOTTED_CROSS: 4,
|
|
SOLID_OPEN: 5,
|
|
DOTTED_OPEN: 6,
|
|
LOOP_START: 10,
|
|
LOOP_END: 11,
|
|
ALT_START: 12,
|
|
ALT_ELSE: 13,
|
|
ALT_END: 14,
|
|
OPT_START: 15,
|
|
OPT_END: 16,
|
|
ACTIVE_START: 17,
|
|
ACTIVE_END: 18,
|
|
PAR_START: 19,
|
|
PAR_AND: 20,
|
|
PAR_END: 21,
|
|
RECT_START: 22,
|
|
RECT_END: 23
|
|
};
|
|
var ARROWTYPE = {
|
|
FILLED: 0,
|
|
OPEN: 1
|
|
};
|
|
var PLACEMENT = {
|
|
LEFTOF: 0,
|
|
RIGHTOF: 1,
|
|
OVER: 2
|
|
};
|
|
var addNote = function addNote(actor, placement, message) {
|
|
var note = {
|
|
actor: actor,
|
|
placement: placement,
|
|
message: message
|
|
}; // Coerce actor into a [to, from, ...] array
|
|
|
|
var actors = [].concat(actor, actor);
|
|
notes.push(note);
|
|
messages.push({
|
|
from: actors[0],
|
|
to: actors[1],
|
|
message: message,
|
|
type: LINETYPE.NOTE,
|
|
placement: placement
|
|
});
|
|
};
|
|
var setTitle = function setTitle(titleText) {
|
|
title = titleText;
|
|
};
|
|
var apply = function apply(param) {
|
|
if (param instanceof Array) {
|
|
param.forEach(function (item) {
|
|
apply(item);
|
|
});
|
|
} else {
|
|
switch (param.type) {
|
|
case 'addActor':
|
|
addActor(param.actor, param.actor, param.description);
|
|
break;
|
|
|
|
case 'activeStart':
|
|
addSignal(param.actor, undefined, undefined, param.signalType);
|
|
break;
|
|
|
|
case 'activeEnd':
|
|
addSignal(param.actor, undefined, undefined, param.signalType);
|
|
break;
|
|
|
|
case 'addNote':
|
|
addNote(param.actor, param.placement, param.text);
|
|
break;
|
|
|
|
case 'addMessage':
|
|
addSignal(param.from, param.to, param.msg, param.signalType);
|
|
break;
|
|
|
|
case 'loopStart':
|
|
addSignal(undefined, undefined, param.loopText, param.signalType);
|
|
break;
|
|
|
|
case 'loopEnd':
|
|
addSignal(undefined, undefined, undefined, param.signalType);
|
|
break;
|
|
|
|
case 'rectStart':
|
|
addSignal(undefined, undefined, param.color, param.signalType);
|
|
break;
|
|
|
|
case 'rectEnd':
|
|
addSignal(undefined, undefined, undefined, param.signalType);
|
|
break;
|
|
|
|
case 'optStart':
|
|
addSignal(undefined, undefined, param.optText, param.signalType);
|
|
break;
|
|
|
|
case 'optEnd':
|
|
addSignal(undefined, undefined, undefined, param.signalType);
|
|
break;
|
|
|
|
case 'altStart':
|
|
addSignal(undefined, undefined, param.altText, param.signalType);
|
|
break;
|
|
|
|
case 'else':
|
|
addSignal(undefined, undefined, param.altText, param.signalType);
|
|
break;
|
|
|
|
case 'altEnd':
|
|
addSignal(undefined, undefined, undefined, param.signalType);
|
|
break;
|
|
|
|
case 'setTitle':
|
|
setTitle(param.text);
|
|
break;
|
|
|
|
case 'parStart':
|
|
addSignal(undefined, undefined, param.parText, param.signalType);
|
|
break;
|
|
|
|
case 'and':
|
|
addSignal(undefined, undefined, param.parText, param.signalType);
|
|
break;
|
|
|
|
case 'parEnd':
|
|
addSignal(undefined, undefined, undefined, param.signalType);
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
addActor: addActor,
|
|
addMessage: addMessage,
|
|
addSignal: addSignal,
|
|
enableSequenceNumbers: enableSequenceNumbers,
|
|
showSequenceNumbers: showSequenceNumbers,
|
|
getMessages: getMessages,
|
|
getActors: getActors,
|
|
getActor: getActor,
|
|
getActorKeys: getActorKeys,
|
|
getTitle: getTitle,
|
|
clear: clear,
|
|
LINETYPE: LINETYPE,
|
|
ARROWTYPE: ARROWTYPE,
|
|
PLACEMENT: PLACEMENT,
|
|
addNote: addNote,
|
|
setTitle: setTitle,
|
|
apply: apply
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/sequence/sequenceRenderer.js":
|
|
/*!***************************************************!*\
|
|
!*** ./src/diagrams/sequence/sequenceRenderer.js ***!
|
|
\***************************************************/
|
|
/*! exports provided: bounds, drawActors, setConf, calculateTextWidth, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bounds", function() { return bounds; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawActors", function() { return drawActors; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "calculateTextWidth", function() { return calculateTextWidth; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _svgDraw__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./svgDraw */ "./src/diagrams/sequence/svgDraw.js");
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser/sequenceDiagram */ "./src/diagrams/sequence/parser/sequenceDiagram.jison");
|
|
/* harmony import */ var _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
|
/* harmony import */ var _sequenceDb__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sequenceDb */ "./src/diagrams/sequence/sequenceDb.js");
|
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
|
|
|
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
|
|
|
|
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
|
|
|
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy = _sequenceDb__WEBPACK_IMPORTED_MODULE_5__["default"];
|
|
var conf = {
|
|
diagramMarginX: 50,
|
|
diagramMarginY: 30,
|
|
// Margin between actors
|
|
actorMargin: 50,
|
|
// Width of actor boxes
|
|
width: 150,
|
|
// Height of actor boxes
|
|
height: 65,
|
|
actorFontSize: 14,
|
|
actorFontFamily: '"Open-Sans", "sans-serif"',
|
|
// Note font settings
|
|
noteFontSize: 14,
|
|
noteFontFamily: '"trebuchet ms", verdana, arial',
|
|
noteAlign: 'center',
|
|
// Message font settings
|
|
messageFontSize: 16,
|
|
messageFontFamily: '"trebuchet ms", verdana, arial',
|
|
// Margin around loop boxes
|
|
boxMargin: 10,
|
|
boxTextMargin: 5,
|
|
noteMargin: 10,
|
|
// Space between messages
|
|
messageMargin: 35,
|
|
// Multiline message alignment
|
|
messageAlign: 'center',
|
|
// mirror actors under diagram
|
|
mirrorActors: false,
|
|
// Depending on css styling this might need adjustment
|
|
// Prolongs the edge of the diagram downwards
|
|
bottomMarginAdj: 1,
|
|
// width of activation box
|
|
activationWidth: 10,
|
|
// text placement as: tspan | fo | old only text as before
|
|
textPlacement: 'tspan',
|
|
showSequenceNumbers: false
|
|
};
|
|
var bounds = {
|
|
data: {
|
|
startx: undefined,
|
|
stopx: undefined,
|
|
starty: undefined,
|
|
stopy: undefined
|
|
},
|
|
verticalPos: 0,
|
|
sequenceItems: [],
|
|
activations: [],
|
|
init: function init() {
|
|
this.sequenceItems = [];
|
|
this.activations = [];
|
|
this.data = {
|
|
startx: undefined,
|
|
stopx: undefined,
|
|
starty: undefined,
|
|
stopy: undefined
|
|
};
|
|
this.verticalPos = 0;
|
|
},
|
|
updateVal: function updateVal(obj, key, val, fun) {
|
|
if (typeof obj[key] === 'undefined') {
|
|
obj[key] = val;
|
|
} else {
|
|
obj[key] = fun(val, obj[key]);
|
|
}
|
|
},
|
|
updateBounds: function updateBounds(startx, starty, stopx, stopy) {
|
|
var _self = this;
|
|
|
|
var cnt = 0;
|
|
|
|
function updateFn(type) {
|
|
return function updateItemBounds(item) {
|
|
cnt++; // The loop sequenceItems is a stack so the biggest margins in the beginning of the sequenceItems
|
|
|
|
var n = _self.sequenceItems.length - cnt + 1;
|
|
|
|
_self.updateVal(item, 'starty', starty - n * conf.boxMargin, Math.min);
|
|
|
|
_self.updateVal(item, 'stopy', stopy + n * conf.boxMargin, Math.max);
|
|
|
|
_self.updateVal(bounds.data, 'startx', startx - n * conf.boxMargin, Math.min);
|
|
|
|
_self.updateVal(bounds.data, 'stopx', stopx + n * conf.boxMargin, Math.max);
|
|
|
|
if (!(type === 'activation')) {
|
|
_self.updateVal(item, 'startx', startx - n * conf.boxMargin, Math.min);
|
|
|
|
_self.updateVal(item, 'stopx', stopx + n * conf.boxMargin, Math.max);
|
|
|
|
_self.updateVal(bounds.data, 'starty', starty - n * conf.boxMargin, Math.min);
|
|
|
|
_self.updateVal(bounds.data, 'stopy', stopy + n * conf.boxMargin, Math.max);
|
|
}
|
|
};
|
|
}
|
|
|
|
this.sequenceItems.forEach(updateFn());
|
|
this.activations.forEach(updateFn('activation'));
|
|
},
|
|
insert: function insert(startx, starty, stopx, stopy) {
|
|
var _startx = Math.min(startx, stopx);
|
|
|
|
var _stopx = Math.max(startx, stopx);
|
|
|
|
var _starty = Math.min(starty, stopy);
|
|
|
|
var _stopy = Math.max(starty, stopy);
|
|
|
|
this.updateVal(bounds.data, 'startx', _startx, Math.min);
|
|
this.updateVal(bounds.data, 'starty', _starty, Math.min);
|
|
this.updateVal(bounds.data, 'stopx', _stopx, Math.max);
|
|
this.updateVal(bounds.data, 'stopy', _stopy, Math.max);
|
|
this.updateBounds(_startx, _starty, _stopx, _stopy);
|
|
},
|
|
newActivation: function newActivation(message, diagram) {
|
|
var actorRect = _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getActors()[message.from.actor];
|
|
var stackedSize = actorActivations(message.from.actor).length;
|
|
var x = actorRect.x + conf.width / 2 + (stackedSize - 1) * conf.activationWidth / 2;
|
|
this.activations.push({
|
|
startx: x,
|
|
starty: this.verticalPos + 2,
|
|
stopx: x + conf.activationWidth,
|
|
stopy: undefined,
|
|
actor: message.from.actor,
|
|
anchored: _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].anchorElement(diagram)
|
|
});
|
|
},
|
|
endActivation: function endActivation(message) {
|
|
// find most recent activation for given actor
|
|
var lastActorActivationIdx = this.activations.map(function (activation) {
|
|
return activation.actor;
|
|
}).lastIndexOf(message.from.actor);
|
|
var activation = this.activations.splice(lastActorActivationIdx, 1)[0];
|
|
return activation;
|
|
},
|
|
newLoop: function newLoop(title, fill) {
|
|
this.sequenceItems.push({
|
|
startx: undefined,
|
|
starty: this.verticalPos,
|
|
stopx: undefined,
|
|
stopy: undefined,
|
|
title: title,
|
|
fill: fill
|
|
});
|
|
},
|
|
endLoop: function endLoop() {
|
|
var loop = this.sequenceItems.pop();
|
|
return loop;
|
|
},
|
|
addSectionToLoop: function addSectionToLoop(message) {
|
|
var loop = this.sequenceItems.pop();
|
|
loop.sections = loop.sections || [];
|
|
loop.sectionTitles = loop.sectionTitles || [];
|
|
loop.sections.push(bounds.getVerticalPos());
|
|
loop.sectionTitles.push(message);
|
|
this.sequenceItems.push(loop);
|
|
},
|
|
bumpVerticalPos: function bumpVerticalPos(bump) {
|
|
this.verticalPos = this.verticalPos + bump;
|
|
this.data.stopy = this.verticalPos;
|
|
},
|
|
getVerticalPos: function getVerticalPos() {
|
|
return this.verticalPos;
|
|
},
|
|
getBounds: function getBounds() {
|
|
return this.data;
|
|
}
|
|
};
|
|
|
|
var _drawLongText = function _drawLongText(text, x, y, g, width) {
|
|
var textHeight = 0;
|
|
var prevTextHeight = 0;
|
|
var alignmentToAnchor = {
|
|
left: 'start',
|
|
start: 'start',
|
|
center: 'middle',
|
|
middle: 'middle',
|
|
right: 'end',
|
|
end: 'end'
|
|
};
|
|
var lines = text.split(_common_common__WEBPACK_IMPORTED_MODULE_4__["default"].lineBreakRegex);
|
|
var _iteratorNormalCompletion = true;
|
|
var _didIteratorError = false;
|
|
var _iteratorError = undefined;
|
|
|
|
try {
|
|
for (var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
var line = _step.value;
|
|
var textObj = _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].getTextObj();
|
|
var alignment = alignmentToAnchor[conf.noteAlign] || 'middle';
|
|
|
|
switch (alignment) {
|
|
case 'start':
|
|
textObj.x = x + conf.noteMargin;
|
|
break;
|
|
|
|
case 'middle':
|
|
textObj.x = x + width / 2;
|
|
break;
|
|
|
|
case 'end':
|
|
textObj.x = x + width - conf.noteMargin;
|
|
break;
|
|
}
|
|
|
|
textObj.y = y + textHeight;
|
|
textObj.dy = '1em';
|
|
textObj.text = line;
|
|
textObj.class = 'noteText';
|
|
var textElem = _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawText(g, textObj).style('text-anchor', alignment).style('font-size', conf.noteFontSize).style('font-family', conf.noteFontFamily).attr('dominant-baseline', 'central').attr('alignment-baseline', 'central');
|
|
textHeight += (textElem._groups || textElem)[0][0].getBBox().height;
|
|
textElem.attr('y', y + (prevTextHeight + textHeight + 2 * conf.noteMargin) / 2);
|
|
prevTextHeight = textHeight;
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError = true;
|
|
_iteratorError = err;
|
|
} finally {
|
|
try {
|
|
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
_iterator.return();
|
|
}
|
|
} finally {
|
|
if (_didIteratorError) {
|
|
throw _iteratorError;
|
|
}
|
|
}
|
|
}
|
|
|
|
return textHeight;
|
|
};
|
|
/**
|
|
* Draws an note in the diagram with the attaced line
|
|
* @param elem - The diagram to draw to.
|
|
* @param startx - The x axis start position.
|
|
* @param verticalPos - The y axis position.
|
|
* @param msg - The message to be drawn.
|
|
* @param forceWidth - Set this with a custom width to override the default configured width.
|
|
*/
|
|
|
|
|
|
var drawNote = function drawNote(elem, startx, verticalPos, msg, forceWidth) {
|
|
var rect = _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].getNoteRect();
|
|
rect.x = startx;
|
|
rect.y = verticalPos;
|
|
rect.width = forceWidth || conf.width;
|
|
rect.class = 'note';
|
|
var g = elem.append('g');
|
|
var rectElem = _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawRect(g, rect);
|
|
|
|
var textHeight = _drawLongText(msg.message, startx, verticalPos, g, rect.width);
|
|
|
|
bounds.insert(startx, verticalPos, startx + rect.width, verticalPos + 2 * conf.noteMargin + textHeight);
|
|
rectElem.attr('height', textHeight + 2 * conf.noteMargin);
|
|
bounds.bumpVerticalPos(textHeight + 2 * conf.noteMargin);
|
|
};
|
|
/**
|
|
* Draws a message
|
|
* @param elem
|
|
* @param startx
|
|
* @param stopx
|
|
* @param verticalPos
|
|
* @param txtCenter
|
|
* @param msg
|
|
*/
|
|
|
|
|
|
var drawMessage = function drawMessage(elem, startx, stopx, verticalPos, msg, sequenceIndex) {
|
|
var g = elem.append('g');
|
|
var txtCenter = startx + (stopx - startx) / 2;
|
|
var textElems = [];
|
|
var counterBreaklines = 0;
|
|
var breaklineOffset = 17;
|
|
var breaklines = msg.message.split(_common_common__WEBPACK_IMPORTED_MODULE_4__["default"].lineBreakRegex);
|
|
var _iteratorNormalCompletion2 = true;
|
|
var _didIteratorError2 = false;
|
|
var _iteratorError2 = undefined;
|
|
|
|
try {
|
|
for (var _iterator2 = breaklines[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
var breakline = _step2.value;
|
|
textElems.push(g.append('text') // text label for the x axis
|
|
.attr('x', txtCenter).attr('y', verticalPos - 7 + counterBreaklines * breaklineOffset).style('font-size', conf.messageFontSize).style('font-family', conf.messageFontFamily).style('text-anchor', 'middle').attr('class', 'messageText').text(breakline.trim()));
|
|
counterBreaklines++;
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError2 = true;
|
|
_iteratorError2 = err;
|
|
} finally {
|
|
try {
|
|
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
_iterator2.return();
|
|
}
|
|
} finally {
|
|
if (_didIteratorError2) {
|
|
throw _iteratorError2;
|
|
}
|
|
}
|
|
}
|
|
|
|
var offsetLineCounter = counterBreaklines - 1;
|
|
var totalOffset = offsetLineCounter * breaklineOffset;
|
|
var textWidths = textElems.map(function (textElem) {
|
|
return (textElem._groups || textElem)[0][0].getBBox().width;
|
|
});
|
|
var textWidth = Math.max.apply(Math, _toConsumableArray(textWidths));
|
|
|
|
for (var _i = 0, _textElems = textElems; _i < _textElems.length; _i++) {
|
|
var textElem = _textElems[_i];
|
|
|
|
if (conf.messageAlign === 'left') {
|
|
textElem.attr('x', txtCenter - textWidth / 2).style('text-anchor', 'start');
|
|
} else if (conf.messageAlign === 'right') {
|
|
textElem.attr('x', txtCenter + textWidth / 2).style('text-anchor', 'end');
|
|
}
|
|
}
|
|
|
|
bounds.bumpVerticalPos(totalOffset);
|
|
var line;
|
|
|
|
if (startx === stopx) {
|
|
if (conf.rightAngles) {
|
|
line = g.append('path').attr('d', "M ".concat(startx, ",").concat(verticalPos + totalOffset, " H ").concat(startx + conf.width / 2, " V ").concat(verticalPos + 25 + totalOffset, " H ").concat(startx));
|
|
} else {
|
|
totalOffset += 5;
|
|
line = g.append('path').attr('d', 'M ' + startx + ',' + (verticalPos + totalOffset) + ' C ' + (startx + 60) + ',' + (verticalPos - 10 + totalOffset) + ' ' + (startx + 60) + ',' + (verticalPos + 30 + totalOffset) + ' ' + startx + ',' + (verticalPos + 20 + totalOffset));
|
|
}
|
|
|
|
bounds.bumpVerticalPos(30 + totalOffset);
|
|
var dx = Math.max(textWidth / 2, 100);
|
|
bounds.insert(startx - dx, bounds.getVerticalPos() - 10 + totalOffset, stopx + dx, bounds.getVerticalPos() + totalOffset);
|
|
} else {
|
|
line = g.append('line');
|
|
line.attr('x1', startx);
|
|
line.attr('y1', verticalPos + totalOffset);
|
|
line.attr('x2', stopx);
|
|
line.attr('y2', verticalPos + totalOffset);
|
|
bounds.insert(startx, bounds.getVerticalPos() - 10 + totalOffset, stopx, bounds.getVerticalPos() + totalOffset);
|
|
} // Make an SVG Container
|
|
// Draw the line
|
|
|
|
|
|
if (msg.type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED || msg.type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_CROSS || msg.type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_OPEN) {
|
|
line.style('stroke-dasharray', '3, 3');
|
|
line.attr('class', 'messageLine1');
|
|
} else {
|
|
line.attr('class', 'messageLine0');
|
|
}
|
|
|
|
var url = '';
|
|
|
|
if (conf.arrowMarkerAbsolute) {
|
|
url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
|
|
url = url.replace(/\(/g, '\\(');
|
|
url = url.replace(/\)/g, '\\)');
|
|
}
|
|
|
|
line.attr('stroke-width', 2);
|
|
line.attr('stroke', 'black');
|
|
line.style('fill', 'none'); // remove any fill colour
|
|
|
|
if (msg.type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID || msg.type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED) {
|
|
line.attr('marker-end', 'url(' + url + '#arrowhead)');
|
|
}
|
|
|
|
if (msg.type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID_CROSS || msg.type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_CROSS) {
|
|
line.attr('marker-end', 'url(' + url + '#crosshead)');
|
|
} // add node number
|
|
|
|
|
|
if (_sequenceDb__WEBPACK_IMPORTED_MODULE_5__["default"].showSequenceNumbers() || conf.showSequenceNumbers) {
|
|
line.attr('marker-start', 'url(' + url + '#sequencenumber)');
|
|
g.append('text').attr('x', startx).attr('y', verticalPos + 4 + totalOffset).attr('font-family', 'sans-serif').attr('font-size', '12px').attr('text-anchor', 'middle').attr('textLength', '16px').attr('class', 'sequenceNumber').text(sequenceIndex);
|
|
}
|
|
};
|
|
|
|
var drawActors = function drawActors(diagram, actors, actorKeys, verticalPos) {
|
|
// Draw the actors
|
|
var prevWidth = 0;
|
|
var prevMargin = 0;
|
|
|
|
for (var i = 0; i < actorKeys.length; i++) {
|
|
var actor = actors[actorKeys[i]]; // Add some rendering data to the object
|
|
|
|
actor.width = actor.width || calculateActorWidth(actor);
|
|
actor.height = conf.height;
|
|
actor.margin = actor.margin || conf.actorMargin;
|
|
actor.x = prevWidth + prevMargin;
|
|
actor.y = verticalPos; // Draw the box with the attached line
|
|
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawActor(diagram, actor, conf);
|
|
bounds.insert(actor.x, verticalPos, actor.x + actor.width, conf.height);
|
|
prevWidth += actor.width;
|
|
prevMargin += actor.margin;
|
|
} // Add a margin between the actor boxes and the first arrow
|
|
|
|
|
|
bounds.bumpVerticalPos(conf.height);
|
|
};
|
|
var setConf = function setConf(cnf) {
|
|
var keys = Object.keys(cnf);
|
|
keys.forEach(function (key) {
|
|
conf[key] = cnf[key];
|
|
});
|
|
|
|
if (cnf.fontFamily) {
|
|
conf.actorFontFamily = conf.noteFontFamily = cnf.fontFamily;
|
|
}
|
|
};
|
|
|
|
var actorActivations = function actorActivations(actor) {
|
|
return bounds.activations.filter(function (activation) {
|
|
return activation.actor === actor;
|
|
});
|
|
};
|
|
|
|
var actorFlowVerticaBounds = function actorFlowVerticaBounds(actor) {
|
|
// handle multiple stacked activations for same actor
|
|
var actorObj = _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getActors()[actor];
|
|
var activations = actorActivations(actor);
|
|
var left = activations.reduce(function (acc, activation) {
|
|
return Math.min(acc, activation.startx);
|
|
}, actorObj.x + actorObj.width / 2);
|
|
var right = activations.reduce(function (acc, activation) {
|
|
return Math.max(acc, activation.stopx);
|
|
}, actorObj.x + actorObj.width / 2);
|
|
return [left, right];
|
|
};
|
|
/**
|
|
* This calculates the actor's width, taking into account both the statically configured width,
|
|
* and the actor's description.
|
|
*
|
|
* If the description text has greater length, we extend the width of the actor, so it's description
|
|
* won't overflow.
|
|
*
|
|
* @param actor - An actor object
|
|
* @return - The width for the given actor
|
|
*/
|
|
|
|
|
|
var calculateActorWidth = function calculateActorWidth(actor) {
|
|
if (!actor.description) {
|
|
return conf.width;
|
|
}
|
|
|
|
return Math.max(conf.width, calculateTextWidth(actor.description, conf.actorFontSize, conf.actorFontFamily));
|
|
};
|
|
/**
|
|
* This calculates the width of the given text, font size and family.
|
|
*
|
|
* @param text - The text to calculate the width of
|
|
* @param fontSize - The font size of the given text
|
|
* @param fontFamily - The font family (one, or more fonts) to render
|
|
*/
|
|
|
|
|
|
var calculateTextWidth = function calculateTextWidth(text, fontSize, fontFamily) {
|
|
if (!text) {
|
|
return 0;
|
|
}
|
|
|
|
fontSize = fontSize ? fontSize : conf.actorFontSize;
|
|
fontFamily = fontFamily ? fontFamily : conf.actorFontFamily; // We can't really know if the user supplied font family will render on the user agent;
|
|
// thus, we'll take the max width between the user supplied font family, and a default
|
|
// of sans-serif.
|
|
|
|
var fontFamilies = ['sans-serif', fontFamily];
|
|
var lines = text.split(_common_common__WEBPACK_IMPORTED_MODULE_4__["default"].lineBreakRegex);
|
|
var maxWidth = 0;
|
|
var body = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('body'); // We don'y want to leak DOM elements - if a removal operation isn't available
|
|
// for any reason, do not continue.
|
|
|
|
if (!body.remove) {
|
|
return 0;
|
|
}
|
|
|
|
var g = body.append('svg');
|
|
var _iteratorNormalCompletion3 = true;
|
|
var _didIteratorError3 = false;
|
|
var _iteratorError3 = undefined;
|
|
|
|
try {
|
|
for (var _iterator3 = lines[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
|
var line = _step3.value;
|
|
var _iteratorNormalCompletion4 = true;
|
|
var _didIteratorError4 = false;
|
|
var _iteratorError4 = undefined;
|
|
|
|
try {
|
|
for (var _iterator4 = fontFamilies[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
|
var _fontFamily = _step4.value;
|
|
var textObj = _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].getTextObj();
|
|
textObj.text = line;
|
|
var textElem = _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawText(g, textObj).style('font-size', fontSize).style('font-family', _fontFamily);
|
|
maxWidth = Math.max(maxWidth, (textElem._groups || textElem)[0][0].getBBox().width);
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError4 = true;
|
|
_iteratorError4 = err;
|
|
} finally {
|
|
try {
|
|
if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
|
|
_iterator4.return();
|
|
}
|
|
} finally {
|
|
if (_didIteratorError4) {
|
|
throw _iteratorError4;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError3 = true;
|
|
_iteratorError3 = err;
|
|
} finally {
|
|
try {
|
|
if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
|
|
_iterator3.return();
|
|
}
|
|
} finally {
|
|
if (_didIteratorError3) {
|
|
throw _iteratorError3;
|
|
}
|
|
}
|
|
}
|
|
|
|
g.remove(); // Adds some padding, so the text won't sit exactly within the actor's borders
|
|
|
|
return maxWidth + 35;
|
|
};
|
|
/**
|
|
* Draws a flowchart in the tag with id: id based on the graph definition in text.
|
|
* @param text
|
|
* @param id
|
|
*/
|
|
|
|
var draw = function draw(text, id) {
|
|
_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.clear();
|
|
_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].parse(text + '\n');
|
|
bounds.init();
|
|
var diagram = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id=\"".concat(id, "\"]"));
|
|
var startx;
|
|
var stopx;
|
|
var forceWidth; // Fetch data from the parsing
|
|
|
|
var actors = _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getActors();
|
|
var actorKeys = _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getActorKeys();
|
|
var messages = _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getMessages();
|
|
var title = _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getTitle();
|
|
var maxMessageWidthPerActor = getMaxMessageWidthPerActor(actors, messages);
|
|
calculateActorMargins(actors, maxMessageWidthPerActor);
|
|
drawActors(diagram, actors, actorKeys, 0); // The arrow head definition is attached to the svg once
|
|
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].insertArrowHead(diagram);
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].insertArrowCrossHead(diagram);
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].insertSequenceNumber(diagram);
|
|
|
|
function activeEnd(msg, verticalPos) {
|
|
var activationData = bounds.endActivation(msg);
|
|
|
|
if (activationData.starty + 18 > verticalPos) {
|
|
activationData.starty = verticalPos - 6;
|
|
verticalPos += 12;
|
|
}
|
|
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawActivation(diagram, activationData, verticalPos, conf, actorActivations(msg.from.actor).length);
|
|
bounds.insert(activationData.startx, verticalPos - 10, activationData.stopx, verticalPos);
|
|
} // Draw the messages/signals
|
|
|
|
|
|
var sequenceIndex = 1;
|
|
messages.forEach(function (msg) {
|
|
var loopData;
|
|
var noteWidth = Math.max(conf.width, calculateTextWidth(msg.message, conf.noteFontSize, conf.noteFontFamily));
|
|
|
|
switch (msg.type) {
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.NOTE:
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
startx = actors[msg.from].x;
|
|
stopx = actors[msg.to].x;
|
|
|
|
if (msg.placement === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.RIGHTOF) {
|
|
drawNote(diagram, startx + (actors[msg.from].width + conf.actorMargin) / 2, bounds.getVerticalPos(), msg, noteWidth);
|
|
} else if (msg.placement === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.LEFTOF) {
|
|
drawNote(diagram, startx - noteWidth + (actors[msg.from].width - conf.actorMargin) / 2, bounds.getVerticalPos(), msg, noteWidth);
|
|
} else if (msg.to === msg.from) {
|
|
// Single-actor over
|
|
drawNote(diagram, startx + (actors[msg.to].width - noteWidth) / 2, bounds.getVerticalPos(), msg, noteWidth);
|
|
} else {
|
|
// Multi-actor over
|
|
forceWidth = Math.abs(startx - stopx) + conf.actorMargin;
|
|
var x = startx < stopx ? startx + (actors[msg.from].width - conf.actorMargin) / 2 : stopx + (actors[msg.to].width - conf.actorMargin) / 2;
|
|
drawNote(diagram, x, bounds.getVerticalPos(), msg, forceWidth);
|
|
}
|
|
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ACTIVE_START:
|
|
bounds.newActivation(msg, diagram);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ACTIVE_END:
|
|
activeEnd(msg, bounds.getVerticalPos());
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.LOOP_START:
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
bounds.newLoop(msg.message);
|
|
bounds.bumpVerticalPos(conf.boxMargin + conf.boxTextMargin);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.LOOP_END:
|
|
loopData = bounds.endLoop();
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawLoop(diagram, loopData, 'loop', conf);
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.RECT_START:
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
bounds.newLoop(undefined, msg.message);
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.RECT_END:
|
|
{
|
|
var rectData = bounds.endLoop();
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawBackgroundRect(diagram, rectData);
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
break;
|
|
}
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.OPT_START:
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
bounds.newLoop(msg.message);
|
|
bounds.bumpVerticalPos(conf.boxMargin + conf.boxTextMargin);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.OPT_END:
|
|
loopData = bounds.endLoop();
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawLoop(diagram, loopData, 'opt', conf);
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ALT_START:
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
bounds.newLoop(msg.message);
|
|
bounds.bumpVerticalPos(conf.boxMargin + conf.boxTextMargin);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ALT_ELSE:
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
loopData = bounds.addSectionToLoop(msg.message);
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ALT_END:
|
|
loopData = bounds.endLoop();
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawLoop(diagram, loopData, 'alt', conf);
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.PAR_START:
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
bounds.newLoop(msg.message);
|
|
bounds.bumpVerticalPos(conf.boxMargin + conf.boxTextMargin);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.PAR_AND:
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
loopData = bounds.addSectionToLoop(msg.message);
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
break;
|
|
|
|
case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.PAR_END:
|
|
loopData = bounds.endLoop();
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawLoop(diagram, loopData, 'par', conf);
|
|
bounds.bumpVerticalPos(conf.boxMargin);
|
|
break;
|
|
|
|
default:
|
|
try {
|
|
// lastMsg = msg
|
|
bounds.bumpVerticalPos(conf.messageMargin);
|
|
var fromBounds = actorFlowVerticaBounds(msg.from);
|
|
var toBounds = actorFlowVerticaBounds(msg.to);
|
|
var fromIdx = fromBounds[0] <= toBounds[0] ? 1 : 0;
|
|
var toIdx = fromBounds[0] < toBounds[0] ? 0 : 1;
|
|
startx = fromBounds[fromIdx];
|
|
stopx = toBounds[toIdx];
|
|
var verticalPos = bounds.getVerticalPos();
|
|
drawMessage(diagram, startx, stopx, verticalPos, msg, sequenceIndex);
|
|
var allBounds = fromBounds.concat(toBounds);
|
|
bounds.insert(Math.min.apply(null, allBounds), verticalPos, Math.max.apply(null, allBounds), verticalPos);
|
|
} catch (e) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error('error while drawing message', e);
|
|
}
|
|
|
|
} // Increment sequence counter if msg.type is a line (and not another event like activation or note, etc)
|
|
|
|
|
|
if ([_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID_OPEN, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_OPEN, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID_CROSS, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_CROSS].includes(msg.type)) {
|
|
sequenceIndex++;
|
|
}
|
|
});
|
|
|
|
if (conf.mirrorActors) {
|
|
// Draw actors below diagram
|
|
bounds.bumpVerticalPos(conf.boxMargin * 2);
|
|
drawActors(diagram, actors, actorKeys, bounds.getVerticalPos());
|
|
}
|
|
|
|
var box = bounds.getBounds(); // Adjust line height of actor lines now that the height of the diagram is known
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('For line height fix Querying: #' + id + ' .actor-line');
|
|
var actorLines = Object(d3__WEBPACK_IMPORTED_MODULE_0__["selectAll"])('#' + id + ' .actor-line');
|
|
actorLines.attr('y2', box.stopy);
|
|
var height = box.stopy - box.starty + 2 * conf.diagramMarginY;
|
|
|
|
if (conf.mirrorActors) {
|
|
height = height - conf.boxMargin + conf.bottomMarginAdj;
|
|
}
|
|
|
|
var width = box.stopx - box.startx + 2 * conf.diagramMarginX;
|
|
|
|
if (title) {
|
|
diagram.append('text').text(title).attr('x', (box.stopx - box.startx) / 2 - 2 * conf.diagramMarginX).attr('y', -25);
|
|
}
|
|
|
|
if (conf.useMaxWidth) {
|
|
diagram.attr('height', '100%');
|
|
diagram.attr('width', '100%');
|
|
diagram.attr('style', 'max-width:' + width + 'px;');
|
|
} else {
|
|
diagram.attr('height', height);
|
|
diagram.attr('width', width);
|
|
}
|
|
|
|
var extraVertForTitle = title ? 40 : 0;
|
|
diagram.attr('viewBox', box.startx - conf.diagramMarginX + ' -' + (conf.diagramMarginY + extraVertForTitle) + ' ' + width + ' ' + (height + extraVertForTitle));
|
|
};
|
|
/**
|
|
* Retrieves the max message width of each actor, supports signals (messages, loops)
|
|
* and notes.
|
|
*
|
|
* It will enumerate each given message, and will determine its text width, in relation
|
|
* to the actor it originates from, and destined to.
|
|
*
|
|
* @param actors - The actors map
|
|
* @param messages - A list of message objects to iterate
|
|
*/
|
|
|
|
var getMaxMessageWidthPerActor = function getMaxMessageWidthPerActor(actors, messages) {
|
|
var maxMessageWidthPerActor = {};
|
|
messages.forEach(function (msg) {
|
|
if (actors[msg.to] && actors[msg.from]) {
|
|
var actor = actors[msg.to]; // If this is the first actor, and the message is left of it, no need to calculate the margin
|
|
|
|
if (msg.placement == _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.LEFTOF && !actor.prevActor) {
|
|
return;
|
|
} // If this is the last actor, and the message is right of it, no need to calculate the margin
|
|
|
|
|
|
if (msg.placement == _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.RIGHTOF && !actor.nextActor) {
|
|
return;
|
|
}
|
|
|
|
var isNote = msg.placement !== undefined;
|
|
var isMessage = !isNote;
|
|
var fontSize = isNote ? conf.noteFontSize : conf.messageFontSize;
|
|
var fontFamily = isNote ? conf.noteFontFamily : conf.messageFontFamily;
|
|
var messageWidth = calculateTextWidth(msg.message, fontSize, fontFamily);
|
|
/*
|
|
* The following scenarios should be supported:
|
|
*
|
|
* - There's a message (non-note) between fromActor and toActor
|
|
* - If fromActor is on the right and toActor is on the left, we should
|
|
* define the toActor's margin
|
|
* - If fromActor is on the left and toActor is on the right, we should
|
|
* define the fromActor's margin
|
|
* - There's a note, in which case fromActor == toActor
|
|
* - If the note is to the left of the actor, we should define the previous actor
|
|
* margin
|
|
* - If the note is on the actor, we should define both the previous and next actor
|
|
* margins, each being the half of the note size
|
|
* - If the note is on the right of the actor, we should define the current actor
|
|
* margin
|
|
*/
|
|
|
|
if (isMessage && msg.from == actor.nextActor) {
|
|
maxMessageWidthPerActor[msg.to] = Math.max(maxMessageWidthPerActor[msg.to] || 0, messageWidth);
|
|
} else if (isMessage && msg.from == actor.prevActor || msg.placement == _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.RIGHTOF) {
|
|
maxMessageWidthPerActor[msg.from] = Math.max(maxMessageWidthPerActor[msg.from] || 0, messageWidth);
|
|
} else if (msg.placement == _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.LEFTOF) {
|
|
maxMessageWidthPerActor[actor.prevActor] = Math.max(maxMessageWidthPerActor[actor.prevActor] || 0, messageWidth);
|
|
} else if (msg.placement == _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.OVER) {
|
|
if (actor.prevActor) {
|
|
maxMessageWidthPerActor[actor.prevActor] = Math.max(maxMessageWidthPerActor[actor.prevActor] || 0, messageWidth / 2);
|
|
}
|
|
|
|
if (actor.nextActor) {
|
|
maxMessageWidthPerActor[msg.from] = Math.max(maxMessageWidthPerActor[msg.from] || 0, messageWidth / 2);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
return maxMessageWidthPerActor;
|
|
};
|
|
/**
|
|
* This will calculate the optimal margin for each given actor, for a given
|
|
* actor->messageWidth map.
|
|
*
|
|
* An actor's margin is determined by the width of the actor, the width of the
|
|
* largest message that originates from it, and the configured conf.actorMargin.
|
|
*
|
|
* @param actors - The actors map to calculate margins for
|
|
* @param actorToMessageWidth - A map of actor key -> max message width it holds
|
|
*/
|
|
|
|
|
|
var calculateActorMargins = function calculateActorMargins(actors, actorToMessageWidth) {
|
|
for (var actorKey in actorToMessageWidth) {
|
|
var actor = actors[actorKey];
|
|
|
|
if (!actor) {
|
|
continue;
|
|
}
|
|
|
|
var nextActor = actors[actor.nextActor]; // No need to space out an actor that doesn't have a next link
|
|
|
|
if (!nextActor) {
|
|
continue;
|
|
}
|
|
|
|
actor.width = Math.max(conf.width, calculateTextWidth(actor.description, conf.actorFontSize, conf.actorFontFamily));
|
|
nextActor.width = Math.max(conf.width, calculateTextWidth(nextActor.description, conf.actorFontSize, conf.actorFontFamily));
|
|
var messageWidth = actorToMessageWidth[actorKey];
|
|
var actorWidth = messageWidth + conf.actorMargin - actor.width / 2 - nextActor.width / 2;
|
|
actor.margin = Math.max(actorWidth, conf.actorMargin);
|
|
}
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
bounds: bounds,
|
|
drawActors: drawActors,
|
|
setConf: setConf,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/sequence/svgDraw.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/diagrams/sequence/svgDraw.js ***!
|
|
\******************************************/
|
|
/*! exports provided: drawRect, drawText, drawLabel, drawActor, anchorElement, drawActivation, drawLoop, drawBackgroundRect, insertArrowHead, insertSequenceNumber, insertArrowCrossHead, getTextObj, getNoteRect, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawRect", function() { return drawRect; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawText", function() { return drawText; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawLabel", function() { return drawLabel; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawActor", function() { return drawActor; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "anchorElement", function() { return anchorElement; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawActivation", function() { return drawActivation; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawLoop", function() { return drawLoop; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawBackgroundRect", function() { return drawBackgroundRect; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertArrowHead", function() { return insertArrowHead; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertSequenceNumber", function() { return insertSequenceNumber; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertArrowCrossHead", function() { return insertArrowCrossHead; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTextObj", function() { return getTextObj; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNoteRect", function() { return getNoteRect; });
|
|
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
|
|
|
var drawRect = function drawRect(elem, rectData) {
|
|
var rectElem = elem.append('rect');
|
|
rectElem.attr('x', rectData.x);
|
|
rectElem.attr('y', rectData.y);
|
|
rectElem.attr('fill', rectData.fill);
|
|
rectElem.attr('stroke', rectData.stroke);
|
|
rectElem.attr('width', rectData.width);
|
|
rectElem.attr('height', rectData.height);
|
|
rectElem.attr('rx', rectData.rx);
|
|
rectElem.attr('ry', rectData.ry);
|
|
|
|
if (typeof rectData.class !== 'undefined') {
|
|
rectElem.attr('class', rectData.class);
|
|
}
|
|
|
|
return rectElem;
|
|
};
|
|
var drawText = function drawText(elem, textData) {
|
|
// Remove and ignore br:s
|
|
var nText = textData.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex, ' ');
|
|
var textElem = elem.append('text');
|
|
textElem.attr('x', textData.x);
|
|
textElem.attr('y', textData.y);
|
|
textElem.style('text-anchor', textData.anchor);
|
|
textElem.attr('fill', textData.fill);
|
|
|
|
if (typeof textData.class !== 'undefined') {
|
|
textElem.attr('class', textData.class);
|
|
}
|
|
|
|
var span = textElem.append('tspan');
|
|
span.attr('x', textData.x + textData.textMargin * 2);
|
|
span.attr('fill', textData.fill);
|
|
span.text(nText);
|
|
return textElem;
|
|
};
|
|
var drawLabel = function drawLabel(elem, txtObject) {
|
|
function genPoints(x, y, width, height, cut) {
|
|
return x + ',' + y + ' ' + (x + width) + ',' + y + ' ' + (x + width) + ',' + (y + height - cut) + ' ' + (x + width - cut * 1.2) + ',' + (y + height) + ' ' + x + ',' + (y + height);
|
|
}
|
|
|
|
var polygon = elem.append('polygon');
|
|
polygon.attr('points', genPoints(txtObject.x, txtObject.y, 50, 20, 7));
|
|
polygon.attr('class', 'labelBox');
|
|
txtObject.y = txtObject.y + txtObject.labelMargin;
|
|
txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin;
|
|
drawText(elem, txtObject);
|
|
};
|
|
var actorCnt = -1;
|
|
/**
|
|
* Draws an actor in the diagram with the attaced line
|
|
* @param elem - The diagram we'll draw to.
|
|
* @param actor - The actor to draw.
|
|
* @param config - The sequence diagram config object.
|
|
*/
|
|
|
|
var drawActor = function drawActor(elem, actor, conf) {
|
|
var center = actor.x + actor.width / 2;
|
|
var g = elem.append('g');
|
|
|
|
if (actor.y === 0) {
|
|
actorCnt++;
|
|
g.append('line').attr('id', 'actor' + actorCnt).attr('x1', center).attr('y1', 5).attr('x2', center).attr('y2', 2000).attr('class', 'actor-line').attr('stroke-width', '0.5px').attr('stroke', '#999');
|
|
}
|
|
|
|
var rect = getNoteRect();
|
|
rect.x = actor.x;
|
|
rect.y = actor.y;
|
|
rect.fill = '#eaeaea';
|
|
rect.width = actor.width;
|
|
rect.height = actor.height;
|
|
rect.class = 'actor';
|
|
rect.rx = 3;
|
|
rect.ry = 3;
|
|
drawRect(g, rect);
|
|
|
|
_drawTextCandidateFunc(conf)(actor.description, g, rect.x, rect.y, rect.width, rect.height, {
|
|
class: 'actor'
|
|
}, conf);
|
|
};
|
|
var anchorElement = function anchorElement(elem) {
|
|
return elem.append('g');
|
|
};
|
|
/**
|
|
* Draws an activation in the diagram
|
|
* @param elem - element to append activation rect.
|
|
* @param bounds - activation box bounds.
|
|
* @param verticalPos - precise y cooridnate of bottom activation box edge.
|
|
* @param conf - sequence diagram config object.
|
|
* @param actorActivations - number of activations on the actor.
|
|
*/
|
|
|
|
var drawActivation = function drawActivation(elem, bounds, verticalPos, conf, actorActivations) {
|
|
var rect = getNoteRect();
|
|
var g = bounds.anchored;
|
|
rect.x = bounds.startx;
|
|
rect.y = bounds.starty;
|
|
rect.class = 'activation' + actorActivations % 3; // Will evaluate to 0, 1 or 2
|
|
|
|
rect.width = bounds.stopx - bounds.startx;
|
|
rect.height = verticalPos - bounds.starty;
|
|
drawRect(g, rect);
|
|
};
|
|
/**
|
|
* Draws a loop in the diagram
|
|
* @param elem - elemenet to append the loop to.
|
|
* @param bounds - bounds of the given loop.
|
|
* @param labelText - Text within the loop.
|
|
* @param config - sequence diagram config object.
|
|
*/
|
|
|
|
var drawLoop = function drawLoop(elem, bounds, labelText, conf) {
|
|
var g = elem.append('g');
|
|
|
|
var drawLoopLine = function drawLoopLine(startx, starty, stopx, stopy) {
|
|
return g.append('line').attr('x1', startx).attr('y1', starty).attr('x2', stopx).attr('y2', stopy).attr('class', 'loopLine');
|
|
};
|
|
|
|
drawLoopLine(bounds.startx, bounds.starty, bounds.stopx, bounds.starty);
|
|
drawLoopLine(bounds.stopx, bounds.starty, bounds.stopx, bounds.stopy);
|
|
drawLoopLine(bounds.startx, bounds.stopy, bounds.stopx, bounds.stopy);
|
|
drawLoopLine(bounds.startx, bounds.starty, bounds.startx, bounds.stopy);
|
|
|
|
if (typeof bounds.sections !== 'undefined') {
|
|
bounds.sections.forEach(function (item) {
|
|
drawLoopLine(bounds.startx, item, bounds.stopx, item).style('stroke-dasharray', '3, 3');
|
|
});
|
|
}
|
|
|
|
var txt = getTextObj();
|
|
txt.text = labelText;
|
|
txt.x = bounds.startx;
|
|
txt.y = bounds.starty;
|
|
txt.labelMargin = 1.5 * 10; // This is the small box that says "loop"
|
|
|
|
txt.class = 'labelText'; // Its size & position are fixed.
|
|
|
|
drawLabel(g, txt);
|
|
txt = getTextObj();
|
|
txt.text = '[ ' + bounds.title + ' ]';
|
|
txt.x = bounds.startx + (bounds.stopx - bounds.startx) / 2;
|
|
txt.y = bounds.starty + 1.5 * conf.boxMargin;
|
|
txt.anchor = 'middle';
|
|
txt.class = 'loopText';
|
|
drawText(g, txt);
|
|
|
|
if (typeof bounds.sectionTitles !== 'undefined') {
|
|
bounds.sectionTitles.forEach(function (item, idx) {
|
|
if (item !== '') {
|
|
txt.text = '[ ' + item + ' ]';
|
|
txt.y = bounds.sections[idx] + 1.5 * conf.boxMargin;
|
|
drawText(g, txt);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
/**
|
|
* Draws a background rectangle
|
|
* @param color - The fill color for the background
|
|
*/
|
|
|
|
var drawBackgroundRect = function drawBackgroundRect(elem, bounds) {
|
|
var rectElem = drawRect(elem, {
|
|
x: bounds.startx,
|
|
y: bounds.starty,
|
|
width: bounds.stopx - bounds.startx,
|
|
height: bounds.stopy - bounds.starty,
|
|
fill: bounds.fill,
|
|
class: 'rect'
|
|
});
|
|
rectElem.lower();
|
|
};
|
|
/**
|
|
* Setup arrow head and define the marker. The result is appended to the svg.
|
|
*/
|
|
|
|
var insertArrowHead = function insertArrowHead(elem) {
|
|
elem.append('defs').append('marker').attr('id', 'arrowhead').attr('refX', 5).attr('refY', 2).attr('markerWidth', 6).attr('markerHeight', 4).attr('orient', 'auto').append('path').attr('d', 'M 0,0 V 4 L6,2 Z'); // this is actual shape for arrowhead
|
|
};
|
|
/**
|
|
* Setup node number. The result is appended to the svg.
|
|
*/
|
|
|
|
var insertSequenceNumber = function insertSequenceNumber(elem) {
|
|
elem.append('defs').append('marker').attr('id', 'sequencenumber').attr('refX', 15).attr('refY', 15).attr('markerWidth', 60).attr('markerHeight', 40).attr('orient', 'auto').append('circle').attr('cx', 15).attr('cy', 15).attr('r', 6); // .style("fill", '#f00');
|
|
};
|
|
/**
|
|
* Setup arrow head and define the marker. The result is appended to the svg.
|
|
*/
|
|
|
|
var insertArrowCrossHead = function insertArrowCrossHead(elem) {
|
|
var defs = elem.append('defs');
|
|
var marker = defs.append('marker').attr('id', 'crosshead').attr('markerWidth', 15).attr('markerHeight', 8).attr('orient', 'auto').attr('refX', 16).attr('refY', 4); // The arrow
|
|
|
|
marker.append('path').attr('fill', 'black').attr('stroke', '#000000').style('stroke-dasharray', '0, 0').attr('stroke-width', '1px').attr('d', 'M 9,2 V 6 L16,4 Z'); // The cross
|
|
|
|
marker.append('path').attr('fill', 'none').attr('stroke', '#000000').style('stroke-dasharray', '0, 0').attr('stroke-width', '1px').attr('d', 'M 0,1 L 6,7 M 6,1 L 0,7'); // this is actual shape for arrowhead
|
|
};
|
|
var getTextObj = function getTextObj() {
|
|
var txt = {
|
|
x: 0,
|
|
y: 0,
|
|
fill: undefined,
|
|
'text-anchor': 'start',
|
|
style: '#666',
|
|
width: 100,
|
|
height: 100,
|
|
textMargin: 0,
|
|
rx: 0,
|
|
ry: 0
|
|
};
|
|
return txt;
|
|
};
|
|
var getNoteRect = function getNoteRect() {
|
|
var rect = {
|
|
x: 0,
|
|
y: 0,
|
|
fill: '#EDF2AE',
|
|
stroke: '#666',
|
|
width: 100,
|
|
anchor: 'start',
|
|
height: 100,
|
|
rx: 0,
|
|
ry: 0
|
|
};
|
|
return rect;
|
|
};
|
|
|
|
var _drawTextCandidateFunc = function () {
|
|
function byText(content, g, x, y, width, height, textAttrs) {
|
|
var text = g.append('text').attr('x', x + width / 2).attr('y', y + height / 2 + 5).style('text-anchor', 'middle').text(content);
|
|
|
|
_setTextAttrs(text, textAttrs);
|
|
}
|
|
|
|
function byTspan(content, g, x, y, width, height, textAttrs, conf) {
|
|
var actorFontSize = conf.actorFontSize,
|
|
actorFontFamily = conf.actorFontFamily;
|
|
var lines = content.split(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex);
|
|
|
|
for (var i = 0; i < lines.length; i++) {
|
|
var dy = i * actorFontSize - actorFontSize * (lines.length - 1) / 2;
|
|
var text = g.append('text').attr('x', x + width / 2).attr('y', y).style('text-anchor', 'middle').style('font-size', actorFontSize).style('font-family', actorFontFamily);
|
|
text.append('tspan').attr('x', x + width / 2).attr('dy', dy).text(lines[i]);
|
|
text.attr('y', y + height / 2.0).attr('dominant-baseline', 'central').attr('alignment-baseline', 'central');
|
|
|
|
_setTextAttrs(text, textAttrs);
|
|
}
|
|
}
|
|
|
|
function byFo(content, g, x, y, width, height, textAttrs, conf) {
|
|
var s = g.append('switch');
|
|
var f = s.append('foreignObject').attr('x', x).attr('y', y).attr('width', width).attr('height', height);
|
|
var text = f.append('div').style('display', 'table').style('height', '100%').style('width', '100%');
|
|
text.append('div').style('display', 'table-cell').style('text-align', 'center').style('vertical-align', 'middle').text(content);
|
|
byTspan(content, s, x, y, width, height, textAttrs, conf);
|
|
|
|
_setTextAttrs(text, textAttrs);
|
|
}
|
|
|
|
function _setTextAttrs(toText, fromTextAttrsDict) {
|
|
for (var key in fromTextAttrsDict) {
|
|
if (fromTextAttrsDict.hasOwnProperty(key)) {
|
|
// eslint-disable-line
|
|
toText.attr(key, fromTextAttrsDict[key]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return function (conf) {
|
|
return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;
|
|
};
|
|
}();
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
drawRect: drawRect,
|
|
drawText: drawText,
|
|
drawLabel: drawLabel,
|
|
drawActor: drawActor,
|
|
anchorElement: anchorElement,
|
|
drawActivation: drawActivation,
|
|
drawLoop: drawLoop,
|
|
drawBackgroundRect: drawBackgroundRect,
|
|
insertArrowHead: insertArrowHead,
|
|
insertSequenceNumber: insertSequenceNumber,
|
|
insertArrowCrossHead: insertArrowCrossHead,
|
|
getTextObj: getTextObj,
|
|
getNoteRect: getNoteRect
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/state/id-cache.js":
|
|
/*!****************************************!*\
|
|
!*** ./src/diagrams/state/id-cache.js ***!
|
|
\****************************************/
|
|
/*! exports provided: set, get, keys, size, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "set", function() { return set; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get", function() { return get; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "keys", function() { return keys; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "size", function() { return size; });
|
|
var idCache = {};
|
|
var set = function set(key, val) {
|
|
idCache[key] = val;
|
|
};
|
|
var get = function get(k) {
|
|
return idCache[k];
|
|
};
|
|
var keys = function keys() {
|
|
return Object.keys(idCache);
|
|
};
|
|
var size = function size() {
|
|
return keys().length;
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
get: get,
|
|
set: set,
|
|
keys: keys,
|
|
size: size
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/state/parser/stateDiagram.jison":
|
|
/*!******************************************************!*\
|
|
!*** ./src/diagrams/state/parser/stateDiagram.jison ***!
|
|
\******************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
|
|
/*
|
|
Returns a Parser object of the following structure:
|
|
|
|
Parser: {
|
|
yy: {}
|
|
}
|
|
|
|
Parser.prototype: {
|
|
yy: {},
|
|
trace: function(),
|
|
symbols_: {associative list: name ==> number},
|
|
terminals_: {associative list: number ==> name},
|
|
productions_: [...],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
|
table: [...],
|
|
defaultActions: {...},
|
|
parseError: function(str, hash),
|
|
parse: function(input),
|
|
|
|
lexer: {
|
|
EOF: 1,
|
|
parseError: function(str, hash),
|
|
setInput: function(input),
|
|
input: function(),
|
|
unput: function(str),
|
|
more: function(),
|
|
less: function(n),
|
|
pastInput: function(),
|
|
upcomingInput: function(),
|
|
showPosition: function(),
|
|
test_match: function(regex_match_array, rule_index),
|
|
next: function(),
|
|
lex: function(),
|
|
begin: function(condition),
|
|
popState: function(),
|
|
_currentRules: function(),
|
|
topState: function(),
|
|
pushState: function(condition),
|
|
|
|
options: {
|
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
|
},
|
|
|
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
|
rules: [...],
|
|
conditions: {associative list: name ==> set},
|
|
}
|
|
}
|
|
|
|
|
|
token location info (@$, _$, etc.): {
|
|
first_line: n,
|
|
last_line: n,
|
|
first_column: n,
|
|
last_column: n,
|
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
|
}
|
|
|
|
|
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
|
text: (matched text)
|
|
token: (the produced terminal token, if any)
|
|
line: (yylineno)
|
|
}
|
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
|
loc: (yylloc)
|
|
expected: (string describing the set of expected tokens)
|
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
|
}
|
|
*/
|
|
var parser = (function(){
|
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,3],$V2=[1,4],$V3=[2,4],$V4=[1,9],$V5=[1,11],$V6=[1,13],$V7=[1,14],$V8=[1,15],$V9=[1,16],$Va=[1,21],$Vb=[1,17],$Vc=[1,18],$Vd=[1,19],$Ve=[1,20],$Vf=[1,22],$Vg=[1,4,5,13,14,16,18,19,21,22,23,24,25,28],$Vh=[1,4,5,11,12,13,14,16,18,19,21,22,23,24,25,28],$Vi=[4,5,13,14,16,18,19,21,22,23,24,25,28];
|
|
var parser = {trace: function trace () { },
|
|
yy: {},
|
|
symbols_: {"error":2,"start":3,"SPACE":4,"NL":5,"SD":6,"document":7,"line":8,"statement":9,"idStatement":10,"DESCR":11,"-->":12,"HIDE_EMPTY":13,"scale":14,"WIDTH":15,"COMPOSIT_STATE":16,"STRUCT_START":17,"STRUCT_STOP":18,"STATE_DESCR":19,"AS":20,"ID":21,"FORK":22,"JOIN":23,"CONCURRENT":24,"note":25,"notePosition":26,"NOTE_TEXT":27,"EDGE_STATE":28,"left_of":29,"right_of":30,"$accept":0,"$end":1},
|
|
terminals_: {2:"error",4:"SPACE",5:"NL",6:"SD",11:"DESCR",12:"-->",13:"HIDE_EMPTY",14:"scale",15:"WIDTH",16:"COMPOSIT_STATE",17:"STRUCT_START",18:"STRUCT_STOP",19:"STATE_DESCR",20:"AS",21:"ID",22:"FORK",23:"JOIN",24:"CONCURRENT",25:"note",27:"NOTE_TEXT",28:"EDGE_STATE",29:"left_of",30:"right_of"},
|
|
productions_: [0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,4],[9,4],[10,1],[10,1],[26,1],[26,1]],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
|
/* this == yyval */
|
|
|
|
var $0 = $$.length - 1;
|
|
switch (yystate) {
|
|
case 3:
|
|
/*console.warn('Root document', $$[$0]);*/ yy.setRootDoc($$[$0]);return $$[$0];
|
|
break;
|
|
case 4:
|
|
this.$ = []
|
|
break;
|
|
case 5:
|
|
|
|
if($$[$0]!='nl'){
|
|
$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
|
|
}
|
|
// console.warn('Got document',$$[$0-1], $$[$0]);
|
|
|
|
break;
|
|
case 6: case 7:
|
|
this.$ = $$[$0]
|
|
break;
|
|
case 8:
|
|
this.$='nl';
|
|
break;
|
|
case 9:
|
|
/*console.warn('got id and descr', $$[$0]);*/this.$={ stmt: 'state', id: $$[$0], type: 'default', description: ''};
|
|
break;
|
|
case 10:
|
|
/*console.warn('got id and descr', $$[$0-1], $$[$0].trim());*/this.$={ stmt: 'state', id: $$[$0-1], type: 'default', description: yy.trimColon($$[$0])};
|
|
break;
|
|
case 11:
|
|
|
|
/*console.warn('got id', $$[$0-2]);yy.addRelation($$[$0-2], $$[$0]);*/
|
|
this.$={ stmt: 'relation', state1: { stmt: 'state', id: $$[$0-2], type: 'default', description: '' }, state2:{ stmt: 'state', id: $$[$0] ,type: 'default', description: ''}};
|
|
|
|
break;
|
|
case 12:
|
|
|
|
/*yy.addRelation($$[$0-3], $$[$0-1], $$[$0].substr(1).trim());*/
|
|
this.$={ stmt: 'relation', state1: { stmt: 'state', id: $$[$0-3], type: 'default', description: '' }, state2:{ stmt: 'state', id: $$[$0-1] ,type: 'default', description: ''}, description: $$[$0].substr(1).trim()};
|
|
|
|
break;
|
|
case 16:
|
|
|
|
|
|
/* console.warn('Adding document for state without id ', $$[$0-3]);*/
|
|
this.$={ stmt: 'state', id: $$[$0-3], type: 'default', description: '', doc: $$[$0-1] }
|
|
|
|
break;
|
|
case 17:
|
|
|
|
var id=$$[$0];
|
|
var description = $$[$0-2].trim();
|
|
if($$[$0].match(':')){
|
|
var parts = $$[$0].split(':');
|
|
id=parts[0];
|
|
description = [description, parts[1]];
|
|
}
|
|
this.$={stmt: 'state', id: id, type: 'default', description: description};
|
|
|
|
|
|
break;
|
|
case 18:
|
|
|
|
//console.warn('Adding document for state with id ', $$[$0-3], $$[$0-2]); yy.addDocument($$[$0-3]);
|
|
this.$={ stmt: 'state', id: $$[$0-3], type: 'default', description: $$[$0-5], doc: $$[$0-1] }
|
|
|
|
break;
|
|
case 19:
|
|
|
|
this.$={ stmt: 'state', id: $$[$0], type: 'fork' }
|
|
|
|
break;
|
|
case 20:
|
|
|
|
this.$={ stmt: 'state', id: $$[$0], type: 'join' }
|
|
|
|
break;
|
|
case 21:
|
|
|
|
this.$={ stmt: 'state', id: yy.getDividerId(), type: 'divider' }
|
|
|
|
break;
|
|
case 22:
|
|
|
|
/*console.warn('got NOTE, position: ', $$[$0-2].trim(), 'id = ', $$[$0-1].trim(), 'note: ', $$[$0]);*/
|
|
this.$={ stmt: 'state', id: $$[$0-1].trim(), note:{position: $$[$0-2].trim(), text: $$[$0].trim()}};
|
|
|
|
break;
|
|
case 24: case 25:
|
|
this.$=$$[$0];
|
|
break;
|
|
}
|
|
},
|
|
table: [{3:1,4:$V0,5:$V1,6:$V2},{1:[3]},{3:5,4:$V0,5:$V1,6:$V2},{3:6,4:$V0,5:$V1,6:$V2},o([1,4,5,13,14,16,19,21,22,23,24,25,28],$V3,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:$V4,5:$V5,8:8,9:10,10:12,13:$V6,14:$V7,16:$V8,19:$V9,21:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,28:$Vf},o($Vg,[2,5]),{9:23,10:12,13:$V6,14:$V7,16:$V8,19:$V9,21:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,28:$Vf},o($Vg,[2,7]),o($Vg,[2,8]),o($Vg,[2,9],{11:[1,24],12:[1,25]}),o($Vg,[2,13]),{15:[1,26]},o($Vg,[2,15],{17:[1,27]}),{20:[1,28]},o($Vg,[2,19]),o($Vg,[2,20]),o($Vg,[2,21]),{26:29,27:[1,30],29:[1,31],30:[1,32]},o($Vh,[2,24]),o($Vh,[2,25]),o($Vg,[2,6]),o($Vg,[2,10]),{10:33,21:$Va,28:$Vf},o($Vg,[2,14]),o($Vi,$V3,{7:34}),{21:[1,35]},{21:[1,36]},{20:[1,37]},{21:[2,26]},{21:[2,27]},o($Vg,[2,11],{11:[1,38]}),{4:$V4,5:$V5,8:8,9:10,10:12,13:$V6,14:$V7,16:$V8,18:[1,39],19:$V9,21:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,28:$Vf},o($Vg,[2,17],{17:[1,40]}),{27:[1,41]},{21:[1,42]},o($Vg,[2,12]),o($Vg,[2,16]),o($Vi,$V3,{7:43}),o($Vg,[2,22]),o($Vg,[2,23]),{4:$V4,5:$V5,8:8,9:10,10:12,13:$V6,14:$V7,16:$V8,18:[1,44],19:$V9,21:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,28:$Vf},o($Vg,[2,18])],
|
|
defaultActions: {5:[2,1],6:[2,2],31:[2,26],32:[2,27]},
|
|
parseError: function parseError (str, hash) {
|
|
if (hash.recoverable) {
|
|
this.trace(str);
|
|
} else {
|
|
var error = new Error(str);
|
|
error.hash = hash;
|
|
throw error;
|
|
}
|
|
},
|
|
parse: function parse(input) {
|
|
var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
var args = lstack.slice.call(arguments, 1);
|
|
var lexer = Object.create(this.lexer);
|
|
var sharedState = { yy: {} };
|
|
for (var k in this.yy) {
|
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
|
sharedState.yy[k] = this.yy[k];
|
|
}
|
|
}
|
|
lexer.setInput(input, sharedState.yy);
|
|
sharedState.yy.lexer = lexer;
|
|
sharedState.yy.parser = this;
|
|
if (typeof lexer.yylloc == 'undefined') {
|
|
lexer.yylloc = {};
|
|
}
|
|
var yyloc = lexer.yylloc;
|
|
lstack.push(yyloc);
|
|
var ranges = lexer.options && lexer.options.ranges;
|
|
if (typeof sharedState.yy.parseError === 'function') {
|
|
this.parseError = sharedState.yy.parseError;
|
|
} else {
|
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
|
}
|
|
function popStack(n) {
|
|
stack.length = stack.length - 2 * n;
|
|
vstack.length = vstack.length - n;
|
|
lstack.length = lstack.length - n;
|
|
}
|
|
function lex() {
|
|
var token;
|
|
token = tstack.pop() || lexer.lex() || EOF;
|
|
if (typeof token !== 'number') {
|
|
if (token instanceof Array) {
|
|
tstack = token;
|
|
token = tstack.pop();
|
|
}
|
|
token = self.symbols_[token] || token;
|
|
}
|
|
return token;
|
|
}
|
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
|
while (true) {
|
|
state = stack[stack.length - 1];
|
|
if (this.defaultActions[state]) {
|
|
action = this.defaultActions[state];
|
|
} else {
|
|
if (symbol === null || typeof symbol == 'undefined') {
|
|
symbol = lex();
|
|
}
|
|
action = table[state] && table[state][symbol];
|
|
}
|
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
|
var errStr = '';
|
|
expected = [];
|
|
for (p in table[state]) {
|
|
if (this.terminals_[p] && p > TERROR) {
|
|
expected.push('\'' + this.terminals_[p] + '\'');
|
|
}
|
|
}
|
|
if (lexer.showPosition) {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
|
|
} else {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
|
|
}
|
|
this.parseError(errStr, {
|
|
text: lexer.match,
|
|
token: this.terminals_[symbol] || symbol,
|
|
line: lexer.yylineno,
|
|
loc: yyloc,
|
|
expected: expected
|
|
});
|
|
}
|
|
if (action[0] instanceof Array && action.length > 1) {
|
|
throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
|
|
}
|
|
switch (action[0]) {
|
|
case 1:
|
|
stack.push(symbol);
|
|
vstack.push(lexer.yytext);
|
|
lstack.push(lexer.yylloc);
|
|
stack.push(action[1]);
|
|
symbol = null;
|
|
if (!preErrorSymbol) {
|
|
yyleng = lexer.yyleng;
|
|
yytext = lexer.yytext;
|
|
yylineno = lexer.yylineno;
|
|
yyloc = lexer.yylloc;
|
|
if (recovering > 0) {
|
|
recovering--;
|
|
}
|
|
} else {
|
|
symbol = preErrorSymbol;
|
|
preErrorSymbol = null;
|
|
}
|
|
break;
|
|
case 2:
|
|
len = this.productions_[action[1]][1];
|
|
yyval.$ = vstack[vstack.length - len];
|
|
yyval._$ = {
|
|
first_line: lstack[lstack.length - (len || 1)].first_line,
|
|
last_line: lstack[lstack.length - 1].last_line,
|
|
first_column: lstack[lstack.length - (len || 1)].first_column,
|
|
last_column: lstack[lstack.length - 1].last_column
|
|
};
|
|
if (ranges) {
|
|
yyval._$.range = [
|
|
lstack[lstack.length - (len || 1)].range[0],
|
|
lstack[lstack.length - 1].range[1]
|
|
];
|
|
}
|
|
r = this.performAction.apply(yyval, [
|
|
yytext,
|
|
yyleng,
|
|
yylineno,
|
|
sharedState.yy,
|
|
action[1],
|
|
vstack,
|
|
lstack
|
|
].concat(args));
|
|
if (typeof r !== 'undefined') {
|
|
return r;
|
|
}
|
|
if (len) {
|
|
stack = stack.slice(0, -1 * len * 2);
|
|
vstack = vstack.slice(0, -1 * len);
|
|
lstack = lstack.slice(0, -1 * len);
|
|
}
|
|
stack.push(this.productions_[action[1]][0]);
|
|
vstack.push(yyval.$);
|
|
lstack.push(yyval._$);
|
|
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
stack.push(newState);
|
|
break;
|
|
case 3:
|
|
return true;
|
|
}
|
|
}
|
|
return true;
|
|
}};
|
|
|
|
/* generated by jison-lex 0.3.4 */
|
|
var lexer = (function(){
|
|
var lexer = ({
|
|
|
|
EOF:1,
|
|
|
|
parseError:function parseError(str, hash) {
|
|
if (this.yy.parser) {
|
|
this.yy.parser.parseError(str, hash);
|
|
} else {
|
|
throw new Error(str);
|
|
}
|
|
},
|
|
|
|
// resets the lexer, sets new input
|
|
setInput:function (input, yy) {
|
|
this.yy = yy || this.yy || {};
|
|
this._input = input;
|
|
this._more = this._backtrack = this.done = false;
|
|
this.yylineno = this.yyleng = 0;
|
|
this.yytext = this.matched = this.match = '';
|
|
this.conditionStack = ['INITIAL'];
|
|
this.yylloc = {
|
|
first_line: 1,
|
|
first_column: 0,
|
|
last_line: 1,
|
|
last_column: 0
|
|
};
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [0,0];
|
|
}
|
|
this.offset = 0;
|
|
return this;
|
|
},
|
|
|
|
// consumes and returns one char from the input
|
|
input:function () {
|
|
var ch = this._input[0];
|
|
this.yytext += ch;
|
|
this.yyleng++;
|
|
this.offset++;
|
|
this.match += ch;
|
|
this.matched += ch;
|
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno++;
|
|
this.yylloc.last_line++;
|
|
} else {
|
|
this.yylloc.last_column++;
|
|
}
|
|
if (this.options.ranges) {
|
|
this.yylloc.range[1]++;
|
|
}
|
|
|
|
this._input = this._input.slice(1);
|
|
return ch;
|
|
},
|
|
|
|
// unshifts one char (or a string) into the input
|
|
unput:function (ch) {
|
|
var len = ch.length;
|
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
|
|
|
this._input = ch + this._input;
|
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
|
//this.yyleng -= len;
|
|
this.offset -= len;
|
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
|
this.match = this.match.substr(0, this.match.length - 1);
|
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
|
|
|
if (lines.length - 1) {
|
|
this.yylineno -= lines.length - 1;
|
|
}
|
|
var r = this.yylloc.range;
|
|
|
|
this.yylloc = {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: lines ?
|
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
|
this.yylloc.first_column - len
|
|
};
|
|
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
|
}
|
|
this.yyleng = this.yytext.length;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, caches matched text and appends it on next action
|
|
more:function () {
|
|
this._more = true;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
|
reject:function () {
|
|
if (this.options.backtrack_lexer) {
|
|
this._backtrack = true;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
// retain first n characters of the match
|
|
less:function (n) {
|
|
this.unput(this.match.slice(n));
|
|
},
|
|
|
|
// displays already matched input, i.e. for error messages
|
|
pastInput:function () {
|
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays upcoming input, i.e. for error messages
|
|
upcomingInput:function () {
|
|
var next = this.match;
|
|
if (next.length < 20) {
|
|
next += this._input.substr(0, 20-next.length);
|
|
}
|
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
|
showPosition:function () {
|
|
var pre = this.pastInput();
|
|
var c = new Array(pre.length + 1).join("-");
|
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
|
},
|
|
|
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
|
test_match:function(match, indexed_rule) {
|
|
var token,
|
|
lines,
|
|
backup;
|
|
|
|
if (this.options.backtrack_lexer) {
|
|
// save context
|
|
backup = {
|
|
yylineno: this.yylineno,
|
|
yylloc: {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.last_line,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: this.yylloc.last_column
|
|
},
|
|
yytext: this.yytext,
|
|
match: this.match,
|
|
matches: this.matches,
|
|
matched: this.matched,
|
|
yyleng: this.yyleng,
|
|
offset: this.offset,
|
|
_more: this._more,
|
|
_input: this._input,
|
|
yy: this.yy,
|
|
conditionStack: this.conditionStack.slice(0),
|
|
done: this.done
|
|
};
|
|
if (this.options.ranges) {
|
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
|
}
|
|
}
|
|
|
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno += lines.length;
|
|
}
|
|
this.yylloc = {
|
|
first_line: this.yylloc.last_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.last_column,
|
|
last_column: lines ?
|
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
|
this.yylloc.last_column + match[0].length
|
|
};
|
|
this.yytext += match[0];
|
|
this.match += match[0];
|
|
this.matches = match;
|
|
this.yyleng = this.yytext.length;
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
|
}
|
|
this._more = false;
|
|
this._backtrack = false;
|
|
this._input = this._input.slice(match[0].length);
|
|
this.matched += match[0];
|
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
|
if (this.done && this._input) {
|
|
this.done = false;
|
|
}
|
|
if (token) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
// recover context
|
|
for (var k in backup) {
|
|
this[k] = backup[k];
|
|
}
|
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// return next match in input
|
|
next:function () {
|
|
if (this.done) {
|
|
return this.EOF;
|
|
}
|
|
if (!this._input) {
|
|
this.done = true;
|
|
}
|
|
|
|
var token,
|
|
match,
|
|
tempMatch,
|
|
index;
|
|
if (!this._more) {
|
|
this.yytext = '';
|
|
this.match = '';
|
|
}
|
|
var rules = this._currentRules();
|
|
for (var i = 0; i < rules.length; i++) {
|
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
|
match = tempMatch;
|
|
index = i;
|
|
if (this.options.backtrack_lexer) {
|
|
token = this.test_match(tempMatch, rules[i]);
|
|
if (token !== false) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
match = false;
|
|
continue; // rule action called reject() implying a rule MISmatch.
|
|
} else {
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
} else if (!this.options.flex) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (match) {
|
|
token = this.test_match(match, rules[index]);
|
|
if (token !== false) {
|
|
return token;
|
|
}
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
if (this._input === "") {
|
|
return this.EOF;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
}
|
|
},
|
|
|
|
// return next match that has a token
|
|
lex:function lex () {
|
|
var r = this.next();
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return this.lex();
|
|
}
|
|
},
|
|
|
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
|
begin:function begin (condition) {
|
|
this.conditionStack.push(condition);
|
|
},
|
|
|
|
// pop the previously active lexer condition state off the condition stack
|
|
popState:function popState () {
|
|
var n = this.conditionStack.length - 1;
|
|
if (n > 0) {
|
|
return this.conditionStack.pop();
|
|
} else {
|
|
return this.conditionStack[0];
|
|
}
|
|
},
|
|
|
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
|
_currentRules:function _currentRules () {
|
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
|
} else {
|
|
return this.conditions["INITIAL"].rules;
|
|
}
|
|
},
|
|
|
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
|
topState:function topState (n) {
|
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
|
if (n >= 0) {
|
|
return this.conditionStack[n];
|
|
} else {
|
|
return "INITIAL";
|
|
}
|
|
},
|
|
|
|
// alias for begin(condition)
|
|
pushState:function pushState (condition) {
|
|
this.begin(condition);
|
|
},
|
|
|
|
// return the number of states currently on the stack
|
|
stateStackSize:function stateStackSize() {
|
|
return this.conditionStack.length;
|
|
},
|
|
options: {"case-insensitive":true},
|
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
|
var YYSTATE=YY_START;
|
|
switch($avoiding_name_collisions) {
|
|
case 0:return 5;
|
|
break;
|
|
case 1:/* skip all whitespace */
|
|
break;
|
|
case 2:/* skip same-line whitespace */
|
|
break;
|
|
case 3:/* skip comments */
|
|
break;
|
|
case 4:/* skip comments */
|
|
break;
|
|
case 5: this.pushState('SCALE'); /* console.log('Got scale', yy_.yytext);*/ return 14;
|
|
break;
|
|
case 6:return 15;
|
|
break;
|
|
case 7:this.popState();
|
|
break;
|
|
case 8: this.pushState('STATE');
|
|
break;
|
|
case 9:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim(); /*console.warn('Fork Fork: ',yy_.yytext);*/return 22;
|
|
break;
|
|
case 10:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 23;
|
|
break;
|
|
case 11:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Fork: ',yy_.yytext);*/return 22;
|
|
break;
|
|
case 12:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 23;
|
|
break;
|
|
case 13:this.begin("STATE_STRING");
|
|
break;
|
|
case 14:this.popState();this.pushState('STATE_ID');return "AS";
|
|
break;
|
|
case 15:this.popState();/* console.log('STATE_ID', yy_.yytext);*/return "ID";
|
|
break;
|
|
case 16:this.popState();
|
|
break;
|
|
case 17: /*console.log('Long description:', yy_.yytext);*/return "STATE_DESCR";
|
|
break;
|
|
case 18:/*console.log('COMPOSIT_STATE', yy_.yytext);*/return 16;
|
|
break;
|
|
case 19:this.popState();
|
|
break;
|
|
case 20:this.popState();this.pushState('struct'); /*console.log('begin struct', yy_.yytext);*/return 17;
|
|
break;
|
|
case 21: /*console.log('Ending struct');*/ this.popState(); return 18;
|
|
break;
|
|
case 22:/* nothing */
|
|
break;
|
|
case 23: this.begin('NOTE'); return 25;
|
|
break;
|
|
case 24: this.popState();this.pushState('NOTE_ID');return 29;
|
|
break;
|
|
case 25: this.popState();this.pushState('NOTE_ID');return 30;
|
|
break;
|
|
case 26: this.popState();this.pushState('FLOATING_NOTE');
|
|
break;
|
|
case 27:this.popState();this.pushState('FLOATING_NOTE_ID');return "AS";
|
|
break;
|
|
case 28:/**/
|
|
break;
|
|
case 29: /*console.log('Floating note text: ', yy_.yytext);*/return "NOTE_TEXT";
|
|
break;
|
|
case 30:this.popState();/*console.log('Floating note ID', yy_.yytext);*/return "ID";
|
|
break;
|
|
case 31: this.popState();this.pushState('NOTE_TEXT');/*console.log('Got ID for note', yy_.yytext);*/return 21;
|
|
break;
|
|
case 32: this.popState();/*console.log('Got NOTE_TEXT for note',yy_.yytext);*/yy_.yytext = yy_.yytext.substr(2).trim();return 27;
|
|
break;
|
|
case 33: this.popState();/*console.log('Got NOTE_TEXT for note',yy_.yytext);*/yy_.yytext = yy_.yytext.slice(0,-8).trim();return 27;
|
|
break;
|
|
case 34: /*console.log('Got state diagram', yy_.yytext,'#');*/return 6;
|
|
break;
|
|
case 35: /*console.log('Got state diagram', yy_.yytext,'#');*/return 6;
|
|
break;
|
|
case 36: /*console.log('HIDE_EMPTY', yy_.yytext,'#');*/return 13;
|
|
break;
|
|
case 37: /*console.log('EDGE_STATE=',yy_.yytext);*/ return 28;
|
|
break;
|
|
case 38: /*console.log('=>ID=',yy_.yytext);*/ return 21;
|
|
break;
|
|
case 39: yy_.yytext = yy_.yytext.trim(); /*console.log('Descr = ', yy_.yytext);*/ return 11;
|
|
break;
|
|
case 40:return 12;
|
|
break;
|
|
case 41:return 24;
|
|
break;
|
|
case 42:return 5;
|
|
break;
|
|
case 43:return 'INVALID';
|
|
break;
|
|
}
|
|
},
|
|
rules: [/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<<fork>>)/i,/^(?:.*<<join>>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:\s*[^:;]+end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?:$)/i,/^(?:.)/i],
|
|
conditions: {"LINE":{"rules":[2,3],"inclusive":false},"struct":{"rules":[2,3,8,21,22,23,37,38,39,40,41],"inclusive":false},"FLOATING_NOTE_ID":{"rules":[30],"inclusive":false},"FLOATING_NOTE":{"rules":[27,28,29],"inclusive":false},"NOTE_TEXT":{"rules":[32,33],"inclusive":false},"NOTE_ID":{"rules":[31],"inclusive":false},"NOTE":{"rules":[24,25,26],"inclusive":false},"SCALE":{"rules":[6,7],"inclusive":false},"ALIAS":{"rules":[],"inclusive":false},"STATE_ID":{"rules":[15],"inclusive":false},"STATE_STRING":{"rules":[16,17],"inclusive":false},"FORK_STATE":{"rules":[],"inclusive":false},"STATE":{"rules":[2,3,9,10,11,12,13,14,18,19,20],"inclusive":false},"ID":{"rules":[2,3],"inclusive":false},"INITIAL":{"rules":[0,1,3,4,5,8,20,23,34,35,36,37,38,39,40,42,43],"inclusive":true}}
|
|
});
|
|
return lexer;
|
|
})();
|
|
parser.lexer = lexer;
|
|
function Parser () {
|
|
this.yy = {};
|
|
}
|
|
Parser.prototype = parser;parser.Parser = Parser;
|
|
return new Parser;
|
|
})();
|
|
|
|
|
|
if (true) {
|
|
exports.parser = parser;
|
|
exports.Parser = parser.Parser;
|
|
exports.parse = function () { return parser.parse.apply(parser, arguments); };
|
|
exports.main = function commonjsMain (args) {
|
|
if (!args[1]) {
|
|
console.log('Usage: '+args[0]+' FILE');
|
|
process.exit(1);
|
|
}
|
|
var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
|
|
return exports.parser.parse(source);
|
|
};
|
|
if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
|
|
exports.main(process.argv.slice(1));
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js?f28c"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/state/shapes.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/diagrams/state/shapes.js ***!
|
|
\**************************************/
|
|
/*! exports provided: drawStartState, drawDivider, drawSimpleState, drawDescrState, addTitleAndBox, drawText, drawNote, drawState, drawEdge */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawStartState", function() { return drawStartState; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawDivider", function() { return drawDivider; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawSimpleState", function() { return drawSimpleState; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawDescrState", function() { return drawDescrState; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTitleAndBox", function() { return addTitleAndBox; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawText", function() { return drawText; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawNote", function() { return drawNote; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawState", function() { return drawState; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawEdge", function() { return drawEdge; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _id_cache_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./id-cache.js */ "./src/diagrams/state/id-cache.js");
|
|
/* harmony import */ var _stateDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stateDb */ "./src/diagrams/state/stateDb.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
|
|
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// let conf;
|
|
|
|
/**
|
|
* Draws a start state as a black circle
|
|
*/
|
|
|
|
var drawStartState = function drawStartState(g) {
|
|
return g.append('circle').style('stroke', 'black').style('fill', 'black').attr('r', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit).attr('cx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit).attr('cy', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit);
|
|
};
|
|
/**
|
|
* Draws a start state as a black circle
|
|
*/
|
|
|
|
var drawDivider = function drawDivider(g) {
|
|
return g.append('line').style('stroke', 'grey').style('stroke-dasharray', '3').attr('x1', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight).attr('class', 'divider').attr('x2', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight * 2).attr('y1', 0).attr('y2', 0);
|
|
};
|
|
/**
|
|
* Draws a an end state as a black circle
|
|
*/
|
|
|
|
var drawSimpleState = function drawSimpleState(g, stateDef) {
|
|
var state = g.append('text').attr('x', 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('font-size', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.fontSize).attr('class', 'state-title').text(stateDef.id);
|
|
var classBox = state.node().getBBox();
|
|
g.insert('rect', ':first-child').attr('x', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('width', classBox.width + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('height', classBox.height + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('rx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.radius);
|
|
return state;
|
|
};
|
|
/**
|
|
* Draws a state with descriptions
|
|
* @param {*} g
|
|
* @param {*} stateDef
|
|
*/
|
|
|
|
var drawDescrState = function drawDescrState(g, stateDef) {
|
|
var addTspan = function addTspan(textEl, txt, isFirst) {
|
|
var tSpan = textEl.append('tspan').attr('x', 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).text(txt);
|
|
|
|
if (!isFirst) {
|
|
tSpan.attr('dy', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight);
|
|
}
|
|
};
|
|
|
|
var title = g.append('text').attr('x', 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight + 1.3 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('font-size', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.fontSize).attr('class', 'state-title').text(stateDef.descriptions[0]);
|
|
var titleBox = title.node().getBBox();
|
|
var titleHeight = titleBox.height;
|
|
var description = g.append('text') // text label for the x axis
|
|
.attr('x', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', titleHeight + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding * 0.4 + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.dividerMargin + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight).attr('class', 'state-description');
|
|
var isFirst = true;
|
|
var isSecond = true;
|
|
stateDef.descriptions.forEach(function (descr) {
|
|
if (!isFirst) {
|
|
addTspan(description, descr, isSecond);
|
|
isSecond = false;
|
|
}
|
|
|
|
isFirst = false;
|
|
});
|
|
var descrLine = g.append('line') // text label for the x axis
|
|
.attr('x1', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y1', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + titleHeight + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.dividerMargin / 2).attr('y2', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + titleHeight + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.dividerMargin / 2).attr('class', 'descr-divider');
|
|
var descrBox = description.node().getBBox();
|
|
var width = Math.max(descrBox.width, titleBox.width);
|
|
descrLine.attr('x2', width + 3 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding); // const classBox = title.node().getBBox();
|
|
|
|
g.insert('rect', ':first-child').attr('x', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('width', width + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('height', descrBox.height + titleHeight + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('rx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.radius);
|
|
return g;
|
|
};
|
|
/**
|
|
* Adds the creates a box around the existing content and adds a
|
|
* panel for the id on top of the content.
|
|
*/
|
|
|
|
/**
|
|
* Function that creates an title row and a frame around a substate for a composit state diagram.
|
|
* The function returns a new d3 svg object with updated width and height properties;
|
|
* @param {*} g The d3 svg object for the substate to framed
|
|
* @param {*} stateDef The info about the
|
|
*/
|
|
|
|
var addTitleAndBox = function addTitleAndBox(g, stateDef, altBkg) {
|
|
var pad = Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding;
|
|
var dblPad = 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding;
|
|
var orgBox = g.node().getBBox();
|
|
var orgWidth = orgBox.width;
|
|
var orgX = orgBox.x;
|
|
var title = g.append('text').attr('x', 0).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.titleShift).attr('font-size', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.fontSize).attr('class', 'state-title').text(stateDef.id);
|
|
var titleBox = title.node().getBBox();
|
|
var titleWidth = titleBox.width + dblPad;
|
|
var width = Math.max(titleWidth, orgWidth); // + dblPad;
|
|
|
|
if (width === orgWidth) {
|
|
width = width + dblPad;
|
|
}
|
|
|
|
var startX; // const lineY = 1 - getConfig().state.textHeight;
|
|
// const descrLine = g
|
|
// .append('line') // text label for the x axis
|
|
// .attr('x1', 0)
|
|
// .attr('y1', lineY)
|
|
// .attr('y2', lineY)
|
|
// .attr('class', 'descr-divider');
|
|
|
|
var graphBox = g.node().getBBox(); // console.warn(width / 2, titleWidth / 2, getConfig().state.padding, orgBox);
|
|
// descrLine.attr('x2', graphBox.width + getConfig().state.padding);
|
|
|
|
if (stateDef.doc) {// cnsole.warn(
|
|
// stateDef.id,
|
|
// 'orgX: ',
|
|
// orgX,
|
|
// 'width: ',
|
|
// width,
|
|
// 'titleWidth: ',
|
|
// titleWidth,
|
|
// 'orgWidth: ',
|
|
// orgWidth,
|
|
// 'width',
|
|
// width
|
|
// );
|
|
}
|
|
|
|
startX = orgX - pad;
|
|
|
|
if (titleWidth > orgWidth) {
|
|
startX = (orgWidth - width) / 2 + pad;
|
|
}
|
|
|
|
if (Math.abs(orgX - graphBox.x) < pad) {
|
|
if (titleWidth > orgWidth) {
|
|
startX = orgX - (titleWidth - orgWidth) / 2;
|
|
}
|
|
}
|
|
|
|
var lineY = 1 - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight; // White color
|
|
|
|
g.insert('rect', ':first-child').attr('x', startX).attr('y', lineY).attr('class', altBkg ? 'alt-composit' : 'composit').attr('width', width).attr('height', graphBox.height + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.titleShift + 1).attr('rx', '0');
|
|
title.attr('x', startX + pad);
|
|
if (titleWidth <= orgWidth) title.attr('x', orgX + (width - dblPad) / 2 - titleWidth / 2 + pad); // Title background
|
|
|
|
g.insert('rect', ':first-child').attr('x', startX).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.titleShift - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('width', width) // Just needs to be higher then the descr line, will be clipped by the white color box
|
|
.attr('height', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight * 3).attr('rx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.radius); // Full background
|
|
|
|
g.insert('rect', ':first-child').attr('x', startX).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.titleShift - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('width', width).attr('height', graphBox.height + 3 + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight).attr('rx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.radius);
|
|
return g;
|
|
};
|
|
|
|
var drawEndState = function drawEndState(g) {
|
|
g.append('circle').style('stroke', 'black').style('fill', 'white').attr('r', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.miniPadding).attr('cx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.miniPadding).attr('cy', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.miniPadding);
|
|
return g.append('circle').style('stroke', 'black').style('fill', 'black').attr('r', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit).attr('cx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit + 2).attr('cy', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit + 2);
|
|
};
|
|
|
|
var drawForkJoinState = function drawForkJoinState(g, stateDef) {
|
|
var width = Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.forkWidth;
|
|
var height = Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.forkHeight;
|
|
|
|
if (stateDef.parentId) {
|
|
var tmp = width;
|
|
width = height;
|
|
height = tmp;
|
|
}
|
|
|
|
return g.append('rect').style('stroke', 'black').style('fill', 'black').attr('width', width).attr('height', height).attr('x', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding);
|
|
};
|
|
|
|
var drawText = function drawText(elem, textData) {
|
|
// Remove and ignore br:s
|
|
var nText = textData.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_4__["default"].lineBreakRegex, ' ');
|
|
var textElem = elem.append('text');
|
|
textElem.attr('x', textData.x);
|
|
textElem.attr('y', textData.y);
|
|
textElem.style('text-anchor', textData.anchor);
|
|
textElem.attr('fill', textData.fill);
|
|
|
|
if (typeof textData.class !== 'undefined') {
|
|
textElem.attr('class', textData.class);
|
|
}
|
|
|
|
var span = textElem.append('tspan');
|
|
span.attr('x', textData.x + textData.textMargin * 2);
|
|
span.attr('fill', textData.fill);
|
|
span.text(nText);
|
|
return textElem;
|
|
};
|
|
|
|
var _drawLongText = function _drawLongText(_text, x, y, g) {
|
|
var textHeight = 0;
|
|
var textElem = g.append('text');
|
|
textElem.style('text-anchor', 'start');
|
|
textElem.attr('class', 'noteText');
|
|
|
|
var text = _text.replace(/\r\n/g, '<br/>');
|
|
|
|
text = text.replace(/\n/g, '<br/>');
|
|
var lines = text.split(_common_common__WEBPACK_IMPORTED_MODULE_4__["default"].lineBreakRegex);
|
|
var tHeight = 1.25 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.noteMargin;
|
|
var _iteratorNormalCompletion = true;
|
|
var _didIteratorError = false;
|
|
var _iteratorError = undefined;
|
|
|
|
try {
|
|
for (var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
var _line = _step.value;
|
|
|
|
var txt = _line.trim();
|
|
|
|
if (txt.length > 0) {
|
|
var span = textElem.append('tspan');
|
|
span.text(txt);
|
|
|
|
if (tHeight === 0) {
|
|
var textBounds = span.node().getBBox();
|
|
tHeight += textBounds.height;
|
|
} // console.warn('textBounds', textBounds);
|
|
|
|
|
|
textHeight += tHeight;
|
|
span.attr('x', x + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.noteMargin);
|
|
span.attr('y', y + textHeight + 1.25 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.noteMargin);
|
|
}
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError = true;
|
|
_iteratorError = err;
|
|
} finally {
|
|
try {
|
|
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
_iterator.return();
|
|
}
|
|
} finally {
|
|
if (_didIteratorError) {
|
|
throw _iteratorError;
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
textWidth: textElem.node().getBBox().width,
|
|
textHeight: textHeight
|
|
};
|
|
};
|
|
/**
|
|
* Draws a note to the diagram
|
|
* @param text - The text of the given note.
|
|
* @param g - The element the note is attached to.
|
|
*/
|
|
|
|
|
|
var drawNote = function drawNote(text, g) {
|
|
g.attr('class', 'state-note');
|
|
var note = g.append('rect').attr('x', 0).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding);
|
|
var rectElem = g.append('g');
|
|
|
|
var _drawLongText2 = _drawLongText(text, 0, 0, rectElem),
|
|
textWidth = _drawLongText2.textWidth,
|
|
textHeight = _drawLongText2.textHeight;
|
|
|
|
note.attr('height', textHeight + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.noteMargin);
|
|
note.attr('width', textWidth + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.noteMargin * 2);
|
|
return note;
|
|
};
|
|
/**
|
|
* Starting point for drawing a state. The function finds out the specifics
|
|
* about the state and renders with approprtiate function.
|
|
* @param {*} elem
|
|
* @param {*} stateDef
|
|
*/
|
|
|
|
var drawState = function drawState(elem, stateDef) {
|
|
var id = stateDef.id;
|
|
var stateInfo = {
|
|
id: id,
|
|
label: stateDef.id,
|
|
width: 0,
|
|
height: 0
|
|
};
|
|
var g = elem.append('g').attr('id', id).attr('class', 'stateGroup');
|
|
if (stateDef.type === 'start') drawStartState(g);
|
|
if (stateDef.type === 'end') drawEndState(g);
|
|
if (stateDef.type === 'fork' || stateDef.type === 'join') drawForkJoinState(g, stateDef);
|
|
if (stateDef.type === 'note') drawNote(stateDef.note.text, g);
|
|
if (stateDef.type === 'divider') drawDivider(g);
|
|
if (stateDef.type === 'default' && stateDef.descriptions.length === 0) drawSimpleState(g, stateDef);
|
|
if (stateDef.type === 'default' && stateDef.descriptions.length > 0) drawDescrState(g, stateDef);
|
|
var stateBox = g.node().getBBox();
|
|
stateInfo.width = stateBox.width + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding;
|
|
stateInfo.height = stateBox.height + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding;
|
|
_id_cache_js__WEBPACK_IMPORTED_MODULE_1__["default"].set(id, stateInfo); // stateCnt++;
|
|
|
|
return stateInfo;
|
|
};
|
|
var edgeCount = 0;
|
|
var drawEdge = function drawEdge(elem, path, relation) {
|
|
var getRelationType = function getRelationType(type) {
|
|
switch (type) {
|
|
case _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].relationType.AGGREGATION:
|
|
return 'aggregation';
|
|
|
|
case _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].relationType.EXTENSION:
|
|
return 'extension';
|
|
|
|
case _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].relationType.COMPOSITION:
|
|
return 'composition';
|
|
|
|
case _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].relationType.DEPENDENCY:
|
|
return 'dependency';
|
|
}
|
|
};
|
|
|
|
path.points = path.points.filter(function (p) {
|
|
return !Number.isNaN(p.y);
|
|
}); // The data for our line
|
|
|
|
var lineData = path.points; // This is the accessor function we talked about above
|
|
|
|
var lineFunction = Object(d3__WEBPACK_IMPORTED_MODULE_0__["line"])().x(function (d) {
|
|
return d.x;
|
|
}).y(function (d) {
|
|
return d.y;
|
|
}).curve(d3__WEBPACK_IMPORTED_MODULE_0__["curveBasis"]);
|
|
var svgPath = elem.append('path').attr('d', lineFunction(lineData)).attr('id', 'edge' + edgeCount).attr('class', 'transition');
|
|
var url = '';
|
|
|
|
if (Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.arrowMarkerAbsolute) {
|
|
url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
|
|
url = url.replace(/\(/g, '\\(');
|
|
url = url.replace(/\)/g, '\\)');
|
|
}
|
|
|
|
svgPath.attr('marker-end', 'url(' + url + '#' + getRelationType(_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].relationType.DEPENDENCY) + 'End' + ')');
|
|
|
|
if (typeof relation.title !== 'undefined') {
|
|
var label = elem.append('g').attr('class', 'stateLabel');
|
|
|
|
var _utils$calcLabelPosit = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].calcLabelPosition(path.points),
|
|
x = _utils$calcLabelPosit.x,
|
|
y = _utils$calcLabelPosit.y;
|
|
|
|
var rows = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].getRows(relation.title); // console.warn(rows);
|
|
|
|
var titleHeight = 0;
|
|
var titleRows = [];
|
|
var maxWidth = 0;
|
|
var minX = 0;
|
|
|
|
for (var i = 0; i <= rows.length; i++) {
|
|
var title = label.append('text').attr('text-anchor', 'middle').text(rows[i]).attr('x', x).attr('y', y + titleHeight);
|
|
var boundstmp = title.node().getBBox();
|
|
maxWidth = Math.max(maxWidth, boundstmp.width);
|
|
minX = Math.min(minX, boundstmp.x);
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info(boundstmp.x, x, y + titleHeight);
|
|
|
|
if (titleHeight === 0) {
|
|
var titleBox = title.node().getBBox();
|
|
titleHeight = titleBox.height;
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Title height', titleHeight, y);
|
|
}
|
|
|
|
titleRows.push(title);
|
|
}
|
|
|
|
var boxHeight = titleHeight * rows.length;
|
|
|
|
if (rows.length > 1) {
|
|
var heightAdj = (rows.length - 1) * titleHeight * 0.5;
|
|
titleRows.forEach(function (title, i) {
|
|
return title.attr('y', y + i * titleHeight - heightAdj);
|
|
});
|
|
boxHeight = titleHeight * rows.length;
|
|
}
|
|
|
|
var bounds = label.node().getBBox();
|
|
label.insert('rect', ':first-child').attr('class', 'box').attr('x', x - maxWidth / 2 - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding / 2).attr('y', y - boxHeight / 2 - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding / 2 - 3.5).attr('width', maxWidth + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('height', boxHeight + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding);
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info(bounds); //label.attr('transform', '0 -' + (bounds.y / 2));
|
|
// Debug points
|
|
// path.points.forEach(point => {
|
|
// g.append('circle')
|
|
// .style('stroke', 'red')
|
|
// .style('fill', 'red')
|
|
// .attr('r', 1)
|
|
// .attr('cx', point.x)
|
|
// .attr('cy', point.y);
|
|
// });
|
|
// g.append('circle')
|
|
// .style('stroke', 'blue')
|
|
// .style('fill', 'blue')
|
|
// .attr('r', 1)
|
|
// .attr('cx', x)
|
|
// .attr('cy', y);
|
|
}
|
|
|
|
edgeCount++;
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/state/stateDb.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/diagrams/state/stateDb.js ***!
|
|
\***************************************/
|
|
/*! exports provided: addState, clear, getState, getStates, logDocuments, getRelations, addRelation, cleanupLabel, lineType, relationType, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addState", function() { return addState; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getState", function() { return getState; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getStates", function() { return getStates; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logDocuments", function() { return logDocuments; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRelations", function() { return getRelations; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addRelation", function() { return addRelation; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cleanupLabel", function() { return cleanupLabel; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lineType", function() { return lineType; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relationType", function() { return relationType; });
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
|
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
|
|
|
|
|
|
|
|
var clone = function clone(o) {
|
|
return JSON.parse(JSON.stringify(o));
|
|
};
|
|
|
|
var rootDoc = [];
|
|
|
|
var setRootDoc = function setRootDoc(o) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Setting root doc', o); // rootDoc = { id: 'root', doc: o };
|
|
|
|
rootDoc = o;
|
|
};
|
|
|
|
var getRootDoc = function getRootDoc() {
|
|
return rootDoc;
|
|
};
|
|
|
|
var docTranslator = function docTranslator(parent, node, first) {
|
|
if (node.stmt === 'relation') {
|
|
docTranslator(parent, node.state1, true);
|
|
docTranslator(parent, node.state2, false);
|
|
} else {
|
|
if (node.stmt === 'state') {
|
|
if (node.id === '[*]') {
|
|
node.id = first ? parent.id + '_start' : parent.id + '_end';
|
|
node.start = first;
|
|
}
|
|
}
|
|
|
|
if (node.doc) {
|
|
var doc = []; // Check for concurrency
|
|
|
|
var i = 0;
|
|
var currentDoc = [];
|
|
|
|
for (i = 0; i < node.doc.length; i++) {
|
|
if (node.doc[i].type === 'divider') {
|
|
// debugger;
|
|
var newNode = clone(node.doc[i]);
|
|
newNode.doc = clone(currentDoc);
|
|
doc.push(newNode);
|
|
currentDoc = [];
|
|
} else {
|
|
currentDoc.push(node.doc[i]);
|
|
}
|
|
} // If any divider was encountered
|
|
|
|
|
|
if (doc.length > 0 && currentDoc.length > 0) {
|
|
var _newNode = {
|
|
stmt: 'state',
|
|
id: Object(_utils__WEBPACK_IMPORTED_MODULE_1__["generateId"])(),
|
|
type: 'divider',
|
|
doc: clone(currentDoc)
|
|
};
|
|
doc.push(clone(_newNode));
|
|
node.doc = doc;
|
|
}
|
|
|
|
node.doc.forEach(function (docNode) {
|
|
return docTranslator(node, docNode, true);
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
var getRootDocV2 = function getRootDocV2() {
|
|
docTranslator({
|
|
id: 'root'
|
|
}, {
|
|
id: 'root',
|
|
doc: rootDoc
|
|
}, true);
|
|
return {
|
|
id: 'root',
|
|
doc: rootDoc
|
|
};
|
|
};
|
|
|
|
var extract = function extract(_doc) {
|
|
// const res = { states: [], relations: [] };
|
|
var doc;
|
|
|
|
if (_doc.doc) {
|
|
doc = _doc.doc;
|
|
} else {
|
|
doc = _doc;
|
|
} // let doc = root.doc;
|
|
// if (!doc) {
|
|
// doc = root;
|
|
// }
|
|
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info(doc);
|
|
clear();
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Extract', doc);
|
|
doc.forEach(function (item) {
|
|
if (item.stmt === 'state') {
|
|
addState(item.id, item.type, item.doc, item.description, item.note);
|
|
}
|
|
|
|
if (item.stmt === 'relation') {
|
|
addRelation(item.state1.id, item.state2.id, item.description);
|
|
}
|
|
});
|
|
};
|
|
|
|
var newDoc = function newDoc() {
|
|
return {
|
|
relations: [],
|
|
states: {},
|
|
documents: {}
|
|
};
|
|
};
|
|
|
|
var documents = {
|
|
root: newDoc()
|
|
};
|
|
var currentDocument = documents.root;
|
|
var startCnt = 0;
|
|
var endCnt = 0; // eslint-disable-line
|
|
// let stateCnt = 0;
|
|
|
|
/**
|
|
* Function called by parser when a node definition has been found.
|
|
* @param id
|
|
* @param text
|
|
* @param type
|
|
* @param style
|
|
*/
|
|
|
|
var addState = function addState(id, type, doc, descr, note) {
|
|
if (typeof currentDocument.states[id] === 'undefined') {
|
|
currentDocument.states[id] = {
|
|
id: id,
|
|
descriptions: [],
|
|
type: type,
|
|
doc: doc,
|
|
note: note
|
|
};
|
|
} else {
|
|
if (!currentDocument.states[id].doc) {
|
|
currentDocument.states[id].doc = doc;
|
|
}
|
|
|
|
if (!currentDocument.states[id].type) {
|
|
currentDocument.states[id].type = type;
|
|
}
|
|
}
|
|
|
|
if (descr) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Adding state ', id, descr);
|
|
if (typeof descr === 'string') addDescription(id, descr.trim());
|
|
|
|
if (_typeof(descr) === 'object') {
|
|
descr.forEach(function (des) {
|
|
return addDescription(id, des.trim());
|
|
});
|
|
}
|
|
}
|
|
|
|
if (note) currentDocument.states[id].note = note;
|
|
};
|
|
var clear = function clear() {
|
|
documents = {
|
|
root: newDoc()
|
|
};
|
|
currentDocument = documents.root;
|
|
currentDocument = documents.root;
|
|
startCnt = 0;
|
|
endCnt = 0; // eslint-disable-line
|
|
|
|
classes = [];
|
|
};
|
|
var getState = function getState(id) {
|
|
return currentDocument.states[id];
|
|
};
|
|
var getStates = function getStates() {
|
|
return currentDocument.states;
|
|
};
|
|
var logDocuments = function logDocuments() {
|
|
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Documents = ', documents);
|
|
};
|
|
var getRelations = function getRelations() {
|
|
return currentDocument.relations;
|
|
};
|
|
var addRelation = function addRelation(_id1, _id2, title) {
|
|
var id1 = _id1;
|
|
var id2 = _id2;
|
|
var type1 = 'default';
|
|
var type2 = 'default';
|
|
|
|
if (_id1 === '[*]') {
|
|
startCnt++;
|
|
id1 = 'start' + startCnt;
|
|
type1 = 'start';
|
|
}
|
|
|
|
if (_id2 === '[*]') {
|
|
endCnt++;
|
|
id2 = 'end' + startCnt;
|
|
type2 = 'end';
|
|
}
|
|
|
|
addState(id1, type1);
|
|
addState(id2, type2);
|
|
currentDocument.relations.push({
|
|
id1: id1,
|
|
id2: id2,
|
|
title: title
|
|
});
|
|
};
|
|
|
|
var addDescription = function addDescription(id, _descr) {
|
|
var theState = currentDocument.states[id];
|
|
var descr = _descr;
|
|
|
|
if (descr[0] === ':') {
|
|
descr = descr.substr(1).trim();
|
|
}
|
|
|
|
theState.descriptions.push(descr);
|
|
};
|
|
|
|
var cleanupLabel = function cleanupLabel(label) {
|
|
if (label.substring(0, 1) === ':') {
|
|
return label.substr(2).trim();
|
|
} else {
|
|
return label.trim();
|
|
}
|
|
};
|
|
var lineType = {
|
|
LINE: 0,
|
|
DOTTED_LINE: 1
|
|
};
|
|
var dividerCnt = 0;
|
|
|
|
var getDividerId = function getDividerId() {
|
|
dividerCnt++;
|
|
return 'divider-id-' + dividerCnt;
|
|
};
|
|
|
|
var classes = [];
|
|
|
|
var getClasses = function getClasses() {
|
|
return classes;
|
|
};
|
|
|
|
var getDirection = function getDirection() {
|
|
return 'TB';
|
|
};
|
|
|
|
var relationType = {
|
|
AGGREGATION: 0,
|
|
EXTENSION: 1,
|
|
COMPOSITION: 2,
|
|
DEPENDENCY: 3
|
|
};
|
|
|
|
var trimColon = function trimColon(str) {
|
|
return str && str[0] === ':' ? str.substr(1).trim() : str.trim();
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
addState: addState,
|
|
clear: clear,
|
|
getState: getState,
|
|
getStates: getStates,
|
|
getRelations: getRelations,
|
|
getClasses: getClasses,
|
|
getDirection: getDirection,
|
|
addRelation: addRelation,
|
|
getDividerId: getDividerId,
|
|
// addDescription,
|
|
cleanupLabel: cleanupLabel,
|
|
lineType: lineType,
|
|
relationType: relationType,
|
|
logDocuments: logDocuments,
|
|
getRootDoc: getRootDoc,
|
|
setRootDoc: setRootDoc,
|
|
getRootDocV2: getRootDocV2,
|
|
extract: extract,
|
|
trimColon: trimColon
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/state/stateRenderer-v2.js":
|
|
/*!************************************************!*\
|
|
!*** ./src/diagrams/state/stateRenderer-v2.js ***!
|
|
\************************************************/
|
|
/*! exports provided: setConf, getClasses, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClasses", function() { return getClasses; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! graphlib */ "graphlib");
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _stateDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stateDb */ "./src/diagrams/state/stateDb.js");
|
|
/* harmony import */ var _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser/stateDiagram */ "./src/diagrams/state/parser/stateDiagram.jison");
|
|
/* harmony import */ var _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
|
/* harmony import */ var _dagre_wrapper_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../dagre-wrapper/index.js */ "./src/dagre-wrapper/index.js");
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var conf = {};
|
|
var setConf = function setConf(cnf) {
|
|
var keys = Object.keys(cnf);
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
conf[keys[i]] = cnf[keys[i]];
|
|
}
|
|
};
|
|
var nodeDb = {};
|
|
/**
|
|
* Returns the all the styles from classDef statements in the graph definition.
|
|
* @returns {object} classDef styles
|
|
*/
|
|
|
|
var getClasses = function getClasses(text) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].trace('Extracting classes');
|
|
_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
|
|
var parser = _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
|
|
parser.yy = _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
|
|
|
|
parser.parse(text);
|
|
return _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getClasses();
|
|
};
|
|
|
|
var setupNode = function setupNode(g, parent, node, altFlag) {
|
|
// Add the node
|
|
if (node.id !== 'root') {
|
|
var shape = 'rect';
|
|
|
|
if (node.start === true) {
|
|
shape = 'start';
|
|
}
|
|
|
|
if (node.start === false) {
|
|
shape = 'end';
|
|
}
|
|
|
|
if (node.type !== 'default') {
|
|
shape = node.type;
|
|
}
|
|
|
|
if (!nodeDb[node.id]) {
|
|
nodeDb[node.id] = {
|
|
id: node.id,
|
|
shape: shape,
|
|
description: node.id,
|
|
classes: 'statediagram-state'
|
|
};
|
|
} // Build of the array of description strings accordinging
|
|
|
|
|
|
if (node.description) {
|
|
if (Array.isArray(nodeDb[node.id].description)) {
|
|
// There already is an array of strings,add to it
|
|
nodeDb[node.id].shape = 'rectWithTitle';
|
|
nodeDb[node.id].description.push(node.description);
|
|
} else {
|
|
if (nodeDb[node.id].description.length > 0) {
|
|
// if there is a description already transformit to an array
|
|
nodeDb[node.id].shape = 'rectWithTitle';
|
|
|
|
if (nodeDb[node.id].description === node.id) {
|
|
// If the previous description was the is, remove it
|
|
nodeDb[node.id].description = [node.description];
|
|
} else {
|
|
nodeDb[node.id].description = [nodeDb[node.id].description, node.description];
|
|
}
|
|
} else {
|
|
nodeDb[node.id].shape = 'rect';
|
|
nodeDb[node.id].description = node.description;
|
|
}
|
|
}
|
|
} // Save data for description and group so that for instance a statement without description overwrites
|
|
// one with description
|
|
// group
|
|
|
|
|
|
if (!nodeDb[node.id].type && node.doc) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Setting cluser for ', node.id);
|
|
nodeDb[node.id].type = 'group';
|
|
nodeDb[node.id].shape = node.type === 'divider' ? 'divider' : 'roundedWithTitle';
|
|
nodeDb[node.id].classes = nodeDb[node.id].classes + ' ' + (altFlag ? 'statediagram-cluster statediagram-cluster-alt' : 'statediagram-cluster');
|
|
}
|
|
|
|
var nodeData = {
|
|
labelStyle: '',
|
|
shape: nodeDb[node.id].shape,
|
|
labelText: nodeDb[node.id].description,
|
|
classes: nodeDb[node.id].classes,
|
|
//classStr,
|
|
style: '',
|
|
//styles.style,
|
|
id: node.id,
|
|
type: nodeDb[node.id].type,
|
|
padding: 15 //getConfig().flowchart.padding
|
|
|
|
};
|
|
|
|
if (node.note) {
|
|
// Todo: set random id
|
|
var noteData = {
|
|
labelStyle: '',
|
|
shape: 'note',
|
|
labelText: node.note.text,
|
|
classes: 'statediagram-note',
|
|
//classStr,
|
|
style: '',
|
|
//styles.style,
|
|
id: node.id + '----note',
|
|
type: nodeDb[node.id].type,
|
|
padding: 15 //getConfig().flowchart.padding
|
|
|
|
};
|
|
var groupData = {
|
|
labelStyle: '',
|
|
shape: 'noteGroup',
|
|
labelText: node.note.text,
|
|
classes: nodeDb[node.id].classes,
|
|
//classStr,
|
|
style: '',
|
|
//styles.style,
|
|
id: node.id + '----parent',
|
|
type: 'group',
|
|
padding: 0 //getConfig().flowchart.padding
|
|
|
|
};
|
|
g.setNode(node.id + '----parent', groupData);
|
|
g.setNode(noteData.id, noteData);
|
|
g.setNode(node.id, nodeData);
|
|
g.setParent(node.id, node.id + '----parent');
|
|
g.setParent(noteData.id, node.id + '----parent');
|
|
var from = node.id;
|
|
var to = noteData.id;
|
|
|
|
if (node.note.position === 'left of') {
|
|
from = noteData.id;
|
|
to = node.id;
|
|
}
|
|
|
|
g.setEdge(from, to, {
|
|
arrowhead: 'none',
|
|
arrowType: '',
|
|
style: 'fill:none',
|
|
labelStyle: '',
|
|
classes: 'note-edge',
|
|
arrowheadStyle: 'fill: #333',
|
|
labelpos: 'c',
|
|
labelType: 'text'
|
|
});
|
|
} else {
|
|
g.setNode(node.id, nodeData);
|
|
}
|
|
}
|
|
|
|
if (parent) {
|
|
if (parent.id !== 'root') {
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Setting node ', node.id, ' to be child of its parent ', parent.id);
|
|
g.setParent(node.id, parent.id);
|
|
}
|
|
}
|
|
|
|
if (node.doc) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Adding nodes children ');
|
|
setupDoc(g, node, node.doc, !altFlag);
|
|
}
|
|
};
|
|
|
|
var cnt = 0;
|
|
|
|
var setupDoc = function setupDoc(g, parent, doc, altFlag) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].trace('items', doc);
|
|
doc.forEach(function (item) {
|
|
if (item.stmt === 'state' || item.stmt === 'default') {
|
|
setupNode(g, parent, item, altFlag);
|
|
} else if (item.stmt === 'relation') {
|
|
setupNode(g, parent, item.state1, altFlag);
|
|
setupNode(g, parent, item.state2, altFlag);
|
|
var edgeData = {
|
|
id: 'edge' + cnt,
|
|
arrowhead: 'normal',
|
|
arrowType: 'arrow_barb',
|
|
style: 'fill:none',
|
|
labelStyle: '',
|
|
label: item.description,
|
|
arrowheadStyle: 'fill: #333',
|
|
labelpos: 'c',
|
|
labelType: 'text'
|
|
};
|
|
var startId = item.state1.id;
|
|
var endId = item.state2.id;
|
|
g.setEdge(startId, endId, edgeData, cnt);
|
|
cnt++;
|
|
}
|
|
});
|
|
};
|
|
/**
|
|
* Draws a flowchart in the tag with id: id based on the graph definition in text.
|
|
* @param text
|
|
* @param id
|
|
*/
|
|
|
|
|
|
var draw = function draw(text, id) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Drawing state diagram (v2)', id);
|
|
_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
|
|
nodeDb = {};
|
|
var parser = _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
|
|
parser.yy = _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
|
|
|
|
try {
|
|
parser.parse(text);
|
|
} catch (err) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].debug('Parsing failed');
|
|
} // Fetch the default direction, use TD if none was found
|
|
|
|
|
|
var dir = _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getDirection();
|
|
|
|
if (typeof dir === 'undefined') {
|
|
dir = 'LR';
|
|
}
|
|
|
|
var conf = Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().state;
|
|
var nodeSpacing = conf.nodeSpacing || 50;
|
|
var rankSpacing = conf.rankSpacing || 50; // Create the input mermaid.graph
|
|
|
|
var g = new graphlib__WEBPACK_IMPORTED_MODULE_0___default.a.Graph({
|
|
multigraph: true,
|
|
compound: true
|
|
}).setGraph({
|
|
rankdir: 'TB',
|
|
nodesep: nodeSpacing,
|
|
ranksep: rankSpacing,
|
|
marginx: 8,
|
|
marginy: 8
|
|
}).setDefaultEdgeLabel(function () {
|
|
return {};
|
|
});
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info(_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getRootDocV2());
|
|
_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].extract(_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getRootDocV2());
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info(_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getRootDocV2());
|
|
setupNode(g, undefined, _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getRootDocV2(), true); // Set up an SVG group so that we can translate the final graph.
|
|
|
|
var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(id, "\"]")); // Run the renderer. This is what draws the final graph.
|
|
|
|
var element = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#' + id + ' g');
|
|
Object(_dagre_wrapper_index_js__WEBPACK_IMPORTED_MODULE_5__["render"])(element, g, ['barb'], 'statediagram', id);
|
|
var padding = 8; // const svgBounds = svg.node().getBBox();
|
|
// const width = svgBounds.width + padding * 2;
|
|
// const height = svgBounds.height + padding * 2;
|
|
// logger.debug(
|
|
// `new ViewBox 0 0 ${width} ${height}`,
|
|
// `translate(${padding + g._label.marginx}, ${padding + g._label.marginy})`
|
|
// );
|
|
// if (conf.useMaxWidth) {
|
|
// svg.attr('width', '100%');
|
|
// svg.attr('style', `max-width: ${width}px;`);
|
|
// } else {
|
|
// svg.attr('height', height);
|
|
// svg.attr('width', width);
|
|
// }
|
|
// svg.attr('viewBox', `0 0 ${width} ${height}`);
|
|
// svg
|
|
// .select('g')
|
|
// .attr('transform', `translate(${padding - g._label.marginx}, ${padding - svgBounds.y})`);
|
|
|
|
var bounds = svg.node().getBBox();
|
|
var width = bounds.width + padding * 2;
|
|
var height = bounds.height + padding * 2; // diagram.attr('height', '100%');
|
|
// diagram.attr('style', `width: ${bounds.width * 3 + conf.padding * 2};`);
|
|
// diagram.attr('height', height);
|
|
// Zoom in a bit
|
|
|
|
svg.attr('width', width * 1.75);
|
|
svg.attr('class', 'statediagram'); // diagram.attr('height', bounds.height * 3 + conf.padding * 2);
|
|
// svg.attr(
|
|
// 'viewBox',
|
|
// `${bounds.x - conf.padding} ${bounds.y - conf.padding} ` + width + ' ' + height
|
|
// );
|
|
|
|
var svgBounds = svg.node().getBBox();
|
|
|
|
if (conf.useMaxWidth) {
|
|
svg.attr('width', '100%');
|
|
svg.attr('style', "max-width: ".concat(width, "px;"));
|
|
} else {
|
|
svg.attr('height', height);
|
|
svg.attr('width', width);
|
|
} // Ensure the viewBox includes the whole svgBounds area with extra space for padding
|
|
|
|
|
|
var vBox = "".concat(svgBounds.x - padding, " ").concat(svgBounds.y - padding, " ").concat(width, " ").concat(height);
|
|
_logger__WEBPACK_IMPORTED_MODULE_6__["logger"].debug("viewBox ".concat(vBox));
|
|
svg.attr('viewBox', vBox); // Add label rects for non html labels
|
|
|
|
if (!conf.htmlLabels) {
|
|
var labels = document.querySelectorAll('[id="' + id + '"] .edgeLabel .label');
|
|
|
|
for (var k = 0; k < labels.length; k++) {
|
|
var label = labels[k]; // Get dimensions of label
|
|
|
|
var dim = label.getBBox();
|
|
var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
rect.setAttribute('rx', 0);
|
|
rect.setAttribute('ry', 0);
|
|
rect.setAttribute('width', dim.width);
|
|
rect.setAttribute('height', dim.height);
|
|
rect.setAttribute('style', 'fill:#e8e8e8;');
|
|
label.insertBefore(rect, label.firstChild);
|
|
}
|
|
}
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
getClasses: getClasses,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/state/stateRenderer.js":
|
|
/*!*********************************************!*\
|
|
!*** ./src/diagrams/state/stateRenderer.js ***!
|
|
\*********************************************/
|
|
/*! exports provided: setConf, draw, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dagre */ "dagre");
|
|
/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dagre__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! graphlib */ "graphlib");
|
|
/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
/* harmony import */ var _stateDb__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stateDb */ "./src/diagrams/state/stateDb.js");
|
|
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
|
/* harmony import */ var _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./parser/stateDiagram */ "./src/diagrams/state/parser/stateDiagram.jison");
|
|
/* harmony import */ var _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./shapes */ "./src/diagrams/state/shapes.js");
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// import idCache from './id-cache';
|
|
|
|
|
|
|
|
_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6__["parser"].yy = _stateDb__WEBPACK_IMPORTED_MODULE_4__["default"]; // TODO Move conf object to main conf in mermaidAPI
|
|
|
|
var conf;
|
|
var transformationLog = {};
|
|
var setConf = function setConf() {}; // Todo optimize
|
|
|
|
/**
|
|
* Setup arrow head and define the marker. The result is appended to the svg.
|
|
*/
|
|
|
|
var insertMarkers = function insertMarkers(elem) {
|
|
elem.append('defs').append('marker').attr('id', 'dependencyEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');
|
|
};
|
|
/**
|
|
* Draws a flowchart in the tag with id: id based on the graph definition in text.
|
|
* @param text
|
|
* @param id
|
|
*/
|
|
|
|
|
|
var draw = function draw(text, id) {
|
|
conf = Object(_config__WEBPACK_IMPORTED_MODULE_8__["getConfig"])().state;
|
|
_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6__["parser"].yy.clear();
|
|
_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6__["parser"].parse(text);
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Rendering diagram ' + text); // Fetch the default direction, use TD if none was found
|
|
|
|
var diagram = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id='".concat(id, "']"));
|
|
insertMarkers(diagram); // Layout graph, Create a new directed graph
|
|
|
|
var graph = new graphlib__WEBPACK_IMPORTED_MODULE_2___default.a.Graph({
|
|
multigraph: true,
|
|
compound: true,
|
|
// acyclicer: 'greedy',
|
|
rankdir: 'RL' // ranksep: '20'
|
|
|
|
}); // Default to assigning a new object as a label for each new edge.
|
|
|
|
graph.setDefaultEdgeLabel(function () {
|
|
return {};
|
|
});
|
|
var rootDoc = _stateDb__WEBPACK_IMPORTED_MODULE_4__["default"].getRootDoc();
|
|
renderDoc(rootDoc, diagram, undefined, false);
|
|
var padding = conf.padding;
|
|
var bounds = diagram.node().getBBox();
|
|
var width = bounds.width + padding * 2;
|
|
var height = bounds.height + padding * 2;
|
|
|
|
if (conf.useMaxWidth) {
|
|
diagram.attr('width', '100%');
|
|
diagram.attr('style', "max-width: ".concat(width * 1.75, "px;"));
|
|
} else {
|
|
// Zoom in a bit
|
|
diagram.attr('width', width * 1.75);
|
|
} // diagram.attr('height', bounds.height * 3 + conf.padding * 2);
|
|
|
|
|
|
diagram.attr('viewBox', "".concat(bounds.x - conf.padding, " ").concat(bounds.y - conf.padding, " ") + width + ' ' + height);
|
|
};
|
|
|
|
var getLabelWidth = function getLabelWidth(text) {
|
|
return text ? text.length * conf.fontSizeFactor : 1;
|
|
};
|
|
|
|
var renderDoc = function renderDoc(doc, diagram, parentId, altBkg) {
|
|
// // Layout graph, Create a new directed graph
|
|
var graph = new graphlib__WEBPACK_IMPORTED_MODULE_2___default.a.Graph({
|
|
compound: true,
|
|
multigraph: true
|
|
});
|
|
var i;
|
|
var edgeFreeDoc = true;
|
|
|
|
for (i = 0; i < doc.length; i++) {
|
|
if (doc[i].stmt === 'relation') {
|
|
edgeFreeDoc = false;
|
|
break;
|
|
}
|
|
} // Set an object for the graph label
|
|
|
|
|
|
if (parentId) graph.setGraph({
|
|
rankdir: 'LR',
|
|
multigraph: true,
|
|
compound: true,
|
|
// acyclicer: 'greedy',
|
|
ranker: 'tight-tree',
|
|
ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor,
|
|
nodeSep: edgeFreeDoc ? 1 : 50,
|
|
isMultiGraph: true // ranksep: 5,
|
|
// nodesep: 1
|
|
|
|
});else {
|
|
graph.setGraph({
|
|
rankdir: 'TB',
|
|
multigraph: true,
|
|
compound: true,
|
|
// isCompound: true,
|
|
// acyclicer: 'greedy',
|
|
// ranker: 'longest-path'
|
|
ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor,
|
|
nodeSep: edgeFreeDoc ? 1 : 50,
|
|
ranker: 'tight-tree',
|
|
// ranker: 'network-simplex'
|
|
isMultiGraph: true
|
|
});
|
|
} // Default to assigning a new object as a label for each new edge.
|
|
|
|
graph.setDefaultEdgeLabel(function () {
|
|
return {};
|
|
});
|
|
_stateDb__WEBPACK_IMPORTED_MODULE_4__["default"].extract(doc);
|
|
var states = _stateDb__WEBPACK_IMPORTED_MODULE_4__["default"].getStates();
|
|
var relations = _stateDb__WEBPACK_IMPORTED_MODULE_4__["default"].getRelations();
|
|
var keys = Object.keys(states);
|
|
var first = true;
|
|
|
|
for (var _i = 0; _i < keys.length; _i++) {
|
|
var stateDef = states[keys[_i]];
|
|
|
|
if (parentId) {
|
|
stateDef.parentId = parentId;
|
|
}
|
|
|
|
var node = void 0;
|
|
|
|
if (stateDef.doc) {
|
|
var sub = diagram.append('g').attr('id', stateDef.id).attr('class', 'stateGroup');
|
|
node = renderDoc(stateDef.doc, sub, stateDef.id, !altBkg);
|
|
|
|
if (first) {
|
|
// first = false;
|
|
sub = Object(_shapes__WEBPACK_IMPORTED_MODULE_7__["addTitleAndBox"])(sub, stateDef, altBkg);
|
|
var boxBounds = sub.node().getBBox();
|
|
node.width = boxBounds.width;
|
|
node.height = boxBounds.height + conf.padding / 2;
|
|
transformationLog[stateDef.id] = {
|
|
y: conf.compositTitleSize
|
|
};
|
|
} else {
|
|
// sub = addIdAndBox(sub, stateDef);
|
|
var _boxBounds = sub.node().getBBox();
|
|
|
|
node.width = _boxBounds.width;
|
|
node.height = _boxBounds.height; // transformationLog[stateDef.id] = { y: conf.compositTitleSize };
|
|
}
|
|
} else {
|
|
node = Object(_shapes__WEBPACK_IMPORTED_MODULE_7__["drawState"])(diagram, stateDef, graph);
|
|
}
|
|
|
|
if (stateDef.note) {
|
|
// Draw note note
|
|
var noteDef = {
|
|
descriptions: [],
|
|
id: stateDef.id + '-note',
|
|
note: stateDef.note,
|
|
type: 'note'
|
|
};
|
|
var note = Object(_shapes__WEBPACK_IMPORTED_MODULE_7__["drawState"])(diagram, noteDef, graph); // graph.setNode(node.id, node);
|
|
|
|
if (stateDef.note.position === 'left of') {
|
|
graph.setNode(node.id + '-note', note);
|
|
graph.setNode(node.id, node);
|
|
} else {
|
|
graph.setNode(node.id, node);
|
|
graph.setNode(node.id + '-note', note);
|
|
} // graph.setNode(node.id);
|
|
|
|
|
|
graph.setParent(node.id, node.id + '-group');
|
|
graph.setParent(node.id + '-note', node.id + '-group');
|
|
} else {
|
|
// Add nodes to the graph. The first argument is the node id. The second is
|
|
// metadata about the node. In this case we're going to add labels to each of
|
|
// our nodes.
|
|
graph.setNode(node.id, node);
|
|
}
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Count=', graph.nodeCount(), graph);
|
|
var cnt = 0;
|
|
relations.forEach(function (relation) {
|
|
cnt++;
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Setting edge', relation);
|
|
graph.setEdge(relation.id1, relation.id2, {
|
|
relation: relation,
|
|
width: getLabelWidth(relation.title),
|
|
height: conf.labelHeight * _common_common__WEBPACK_IMPORTED_MODULE_5__["default"].getRows(relation.title).length,
|
|
labelpos: 'c'
|
|
}, 'id' + cnt);
|
|
});
|
|
dagre__WEBPACK_IMPORTED_MODULE_1___default.a.layout(graph);
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Graph after layout', graph.nodes());
|
|
var svgElem = diagram.node();
|
|
graph.nodes().forEach(function (v) {
|
|
if (typeof v !== 'undefined' && typeof graph.node(v) !== 'undefined') {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn('Node ' + v + ': ' + JSON.stringify(graph.node(v)));
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + svgElem.id + ' #' + v).attr('transform', 'translate(' + (graph.node(v).x - graph.node(v).width / 2) + ',' + (graph.node(v).y + (transformationLog[v] ? transformationLog[v].y : 0) - graph.node(v).height / 2) + ' )');
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + svgElem.id + ' #' + v).attr('data-x-shift', graph.node(v).x - graph.node(v).width / 2);
|
|
var dividers = document.querySelectorAll('#' + svgElem.id + ' #' + v + ' .divider');
|
|
dividers.forEach(function (divider) {
|
|
var parent = divider.parentElement;
|
|
var pWidth = 0;
|
|
var pShift = 0;
|
|
|
|
if (parent) {
|
|
if (parent.parentElement) pWidth = parent.parentElement.getBBox().width;
|
|
pShift = parseInt(parent.getAttribute('data-x-shift'), 10);
|
|
|
|
if (Number.isNaN(pShift)) {
|
|
pShift = 0;
|
|
}
|
|
}
|
|
|
|
divider.setAttribute('x1', 0 - pShift + 8);
|
|
divider.setAttribute('x2', pWidth - pShift - 8);
|
|
});
|
|
} else {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('No Node ' + v + ': ' + JSON.stringify(graph.node(v)));
|
|
}
|
|
});
|
|
var stateBox = svgElem.getBBox();
|
|
graph.edges().forEach(function (e) {
|
|
if (typeof e !== 'undefined' && typeof graph.edge(e) !== 'undefined') {
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));
|
|
Object(_shapes__WEBPACK_IMPORTED_MODULE_7__["drawEdge"])(diagram, graph.edge(e), graph.edge(e).relation);
|
|
}
|
|
});
|
|
stateBox = svgElem.getBBox();
|
|
var stateInfo = {
|
|
id: parentId ? parentId : 'root',
|
|
label: parentId ? parentId : 'root',
|
|
width: 0,
|
|
height: 0
|
|
};
|
|
stateInfo.width = stateBox.width + 2 * conf.padding;
|
|
stateInfo.height = stateBox.height + 2 * conf.padding;
|
|
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Doc rendered', stateInfo, graph);
|
|
return stateInfo;
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/user-journey/journeyDb.js":
|
|
/*!************************************************!*\
|
|
!*** ./src/diagrams/user-journey/journeyDb.js ***!
|
|
\************************************************/
|
|
/*! exports provided: clear, setTitle, getTitle, addSection, getSections, getTasks, addTask, addTaskOrg, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTitle", function() { return setTitle; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTitle", function() { return getTitle; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSection", function() { return addSection; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSections", function() { return getSections; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTasks", function() { return getTasks; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTask", function() { return addTask; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTaskOrg", function() { return addTaskOrg; });
|
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
|
|
|
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
|
|
|
|
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
|
|
|
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
|
|
|
|
var title = '';
|
|
var currentSection = '';
|
|
var sections = [];
|
|
var tasks = [];
|
|
var rawTasks = [];
|
|
var clear = function clear() {
|
|
sections.length = 0;
|
|
tasks.length = 0;
|
|
currentSection = '';
|
|
title = '';
|
|
rawTasks.length = 0;
|
|
};
|
|
var setTitle = function setTitle(txt) {
|
|
title = txt;
|
|
};
|
|
var getTitle = function getTitle() {
|
|
return title;
|
|
};
|
|
var addSection = function addSection(txt) {
|
|
currentSection = txt;
|
|
sections.push(txt);
|
|
};
|
|
var getSections = function getSections() {
|
|
return sections;
|
|
};
|
|
var getTasks = function getTasks() {
|
|
var allItemsProcessed = compileTasks();
|
|
var maxDepth = 100;
|
|
var iterationCount = 0;
|
|
|
|
while (!allItemsProcessed && iterationCount < maxDepth) {
|
|
allItemsProcessed = compileTasks();
|
|
iterationCount++;
|
|
}
|
|
|
|
tasks.push.apply(tasks, rawTasks);
|
|
return tasks;
|
|
};
|
|
|
|
var updateActors = function updateActors() {
|
|
var tempActors = [];
|
|
tasks.forEach(function (task) {
|
|
if (task.people) {
|
|
tempActors.push.apply(tempActors, _toConsumableArray(task.people));
|
|
}
|
|
});
|
|
var unique = new Set(tempActors);
|
|
return _toConsumableArray(unique).sort();
|
|
};
|
|
|
|
var addTask = function addTask(descr, taskData) {
|
|
var pieces = taskData.substr(1).split(':');
|
|
var score = 0;
|
|
var peeps = [];
|
|
|
|
if (pieces.length === 1) {
|
|
score = Number(pieces[0]);
|
|
peeps = [];
|
|
} else {
|
|
score = Number(pieces[0]);
|
|
peeps = pieces[1].split(',');
|
|
}
|
|
|
|
var peopleList = peeps.map(function (s) {
|
|
return s.trim();
|
|
});
|
|
var rawTask = {
|
|
section: currentSection,
|
|
type: currentSection,
|
|
people: peopleList,
|
|
task: descr,
|
|
score: score
|
|
};
|
|
rawTasks.push(rawTask);
|
|
};
|
|
var addTaskOrg = function addTaskOrg(descr) {
|
|
var newTask = {
|
|
section: currentSection,
|
|
type: currentSection,
|
|
description: descr,
|
|
task: descr,
|
|
classes: []
|
|
};
|
|
tasks.push(newTask);
|
|
};
|
|
|
|
var compileTasks = function compileTasks() {
|
|
var compileTask = function compileTask(pos) {
|
|
return rawTasks[pos].processed;
|
|
};
|
|
|
|
var allProcessed = true;
|
|
|
|
for (var i = 0; i < rawTasks.length; i++) {
|
|
compileTask(i);
|
|
allProcessed = allProcessed && rawTasks[i].processed;
|
|
}
|
|
|
|
return allProcessed;
|
|
};
|
|
|
|
var getActors = function getActors() {
|
|
return updateActors();
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
clear: clear,
|
|
setTitle: setTitle,
|
|
getTitle: getTitle,
|
|
addSection: addSection,
|
|
getSections: getSections,
|
|
getTasks: getTasks,
|
|
addTask: addTask,
|
|
addTaskOrg: addTaskOrg,
|
|
getActors: getActors
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/user-journey/journeyRenderer.js":
|
|
/*!******************************************************!*\
|
|
!*** ./src/diagrams/user-journey/journeyRenderer.js ***!
|
|
\******************************************************/
|
|
/*! exports provided: setConf, draw, bounds, drawTasks, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bounds", function() { return bounds; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawTasks", function() { return drawTasks; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _parser_journey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parser/journey */ "./src/diagrams/user-journey/parser/journey.jison");
|
|
/* harmony import */ var _parser_journey__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_parser_journey__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _journeyDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./journeyDb */ "./src/diagrams/user-journey/journeyDb.js");
|
|
/* harmony import */ var _svgDraw__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./svgDraw */ "./src/diagrams/user-journey/svgDraw.js");
|
|
|
|
|
|
|
|
|
|
_parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].yy = _journeyDb__WEBPACK_IMPORTED_MODULE_2__["default"];
|
|
var conf = {
|
|
leftMargin: 150,
|
|
diagramMarginX: 50,
|
|
diagramMarginY: 20,
|
|
// Margin between tasks
|
|
taskMargin: 50,
|
|
// Width of task boxes
|
|
width: 150,
|
|
// Height of task boxes
|
|
height: 50,
|
|
taskFontSize: 14,
|
|
taskFontFamily: '"Open-Sans", "sans-serif"',
|
|
// Margin around loop boxes
|
|
boxMargin: 10,
|
|
boxTextMargin: 5,
|
|
noteMargin: 10,
|
|
// Space between messages
|
|
messageMargin: 35,
|
|
// Multiline message alignment
|
|
messageAlign: 'center',
|
|
// Depending on css styling this might need adjustment
|
|
// Projects the edge of the diagram downwards
|
|
bottomMarginAdj: 1,
|
|
// width of activation box
|
|
activationWidth: 10,
|
|
// text placement as: tspan | fo | old only text as before
|
|
textPlacement: 'fo',
|
|
actorColours: ['#8FBC8F', '#7CFC00', '#00FFFF', '#20B2AA', '#B0E0E6', '#FFFFE0'],
|
|
sectionFills: ['#191970', '#8B008B', '#4B0082', '#2F4F4F', '#800000', '#8B4513', '#00008B'],
|
|
sectionColours: ['#fff']
|
|
};
|
|
var setConf = function setConf(cnf) {
|
|
var keys = Object.keys(cnf);
|
|
keys.forEach(function (key) {
|
|
conf[key] = cnf[key];
|
|
});
|
|
};
|
|
var actors = {};
|
|
|
|
function drawActorLegend(diagram) {
|
|
// Draw the actors
|
|
var yPos = 60;
|
|
Object.keys(actors).forEach(function (person) {
|
|
var colour = actors[person];
|
|
var circleData = {
|
|
cx: 20,
|
|
cy: yPos,
|
|
r: 7,
|
|
fill: colour,
|
|
stroke: '#000'
|
|
};
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_3__["default"].drawCircle(diagram, circleData);
|
|
var labelData = {
|
|
x: 40,
|
|
y: yPos + 7,
|
|
fill: '#666',
|
|
text: person
|
|
};
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_3__["default"].drawText(diagram, labelData);
|
|
yPos += 20;
|
|
});
|
|
}
|
|
|
|
var LEFT_MARGIN = conf.leftMargin;
|
|
var draw = function draw(text, id) {
|
|
_parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.clear();
|
|
_parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].parse(text + '\n');
|
|
bounds.init();
|
|
var diagram = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + id);
|
|
diagram.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink');
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_3__["default"].initGraphics(diagram);
|
|
var tasks = _parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getTasks();
|
|
var title = _parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getTitle();
|
|
var actorNames = _parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getActors();
|
|
|
|
for (var member in actors) {
|
|
delete actors[member];
|
|
}
|
|
|
|
var actorPos = 0;
|
|
actorNames.forEach(function (actorName) {
|
|
actors[actorName] = conf.actorColours[actorPos % conf.actorColours.length];
|
|
actorPos++;
|
|
});
|
|
drawActorLegend(diagram);
|
|
bounds.insert(0, 0, LEFT_MARGIN, Object.keys(actors).length * 50);
|
|
drawTasks(diagram, tasks, 0);
|
|
var box = bounds.getBounds();
|
|
|
|
if (title) {
|
|
diagram.append('text').text(title).attr('x', LEFT_MARGIN).attr('font-size', '4ex').attr('font-weight', 'bold').attr('y', 25);
|
|
}
|
|
|
|
var height = box.stopy - box.starty + 2 * conf.diagramMarginY;
|
|
var width = LEFT_MARGIN + box.stopx + 2 * conf.diagramMarginX;
|
|
|
|
if (conf.useMaxWidth) {
|
|
diagram.attr('height', '100%');
|
|
diagram.attr('width', '100%');
|
|
diagram.attr('style', 'max-width:' + width + 'px;');
|
|
} else {
|
|
diagram.attr('height', height);
|
|
diagram.attr('width', width);
|
|
} // Draw activity line
|
|
|
|
|
|
diagram.append('line').attr('x1', LEFT_MARGIN).attr('y1', conf.height * 4) // One section head + one task + margins
|
|
.attr('x2', width - LEFT_MARGIN - 4) // Subtract stroke width so arrow point is retained
|
|
.attr('y2', conf.height * 4).attr('stroke-width', 4).attr('stroke', 'black').attr('marker-end', 'url(#arrowhead)');
|
|
var extraVertForTitle = title ? 70 : 0;
|
|
diagram.attr('viewBox', "".concat(box.startx, " -25 ").concat(width, " ").concat(height + extraVertForTitle));
|
|
diagram.attr('preserveAspectRatio', 'xMinYMin meet');
|
|
};
|
|
var bounds = {
|
|
data: {
|
|
startx: undefined,
|
|
stopx: undefined,
|
|
starty: undefined,
|
|
stopy: undefined
|
|
},
|
|
verticalPos: 0,
|
|
sequenceItems: [],
|
|
init: function init() {
|
|
this.sequenceItems = [];
|
|
this.data = {
|
|
startx: undefined,
|
|
stopx: undefined,
|
|
starty: undefined,
|
|
stopy: undefined
|
|
};
|
|
this.verticalPos = 0;
|
|
},
|
|
updateVal: function updateVal(obj, key, val, fun) {
|
|
if (typeof obj[key] === 'undefined') {
|
|
obj[key] = val;
|
|
} else {
|
|
obj[key] = fun(val, obj[key]);
|
|
}
|
|
},
|
|
updateBounds: function updateBounds(startx, starty, stopx, stopy) {
|
|
var _self = this;
|
|
|
|
var cnt = 0;
|
|
|
|
function updateFn(type) {
|
|
return function updateItemBounds(item) {
|
|
cnt++; // The loop sequenceItems is a stack so the biggest margins in the beginning of the sequenceItems
|
|
|
|
var n = _self.sequenceItems.length - cnt + 1;
|
|
|
|
_self.updateVal(item, 'starty', starty - n * conf.boxMargin, Math.min);
|
|
|
|
_self.updateVal(item, 'stopy', stopy + n * conf.boxMargin, Math.max);
|
|
|
|
_self.updateVal(bounds.data, 'startx', startx - n * conf.boxMargin, Math.min);
|
|
|
|
_self.updateVal(bounds.data, 'stopx', stopx + n * conf.boxMargin, Math.max);
|
|
|
|
if (!(type === 'activation')) {
|
|
_self.updateVal(item, 'startx', startx - n * conf.boxMargin, Math.min);
|
|
|
|
_self.updateVal(item, 'stopx', stopx + n * conf.boxMargin, Math.max);
|
|
|
|
_self.updateVal(bounds.data, 'starty', starty - n * conf.boxMargin, Math.min);
|
|
|
|
_self.updateVal(bounds.data, 'stopy', stopy + n * conf.boxMargin, Math.max);
|
|
}
|
|
};
|
|
}
|
|
|
|
this.sequenceItems.forEach(updateFn());
|
|
},
|
|
insert: function insert(startx, starty, stopx, stopy) {
|
|
var _startx = Math.min(startx, stopx);
|
|
|
|
var _stopx = Math.max(startx, stopx);
|
|
|
|
var _starty = Math.min(starty, stopy);
|
|
|
|
var _stopy = Math.max(starty, stopy);
|
|
|
|
this.updateVal(bounds.data, 'startx', _startx, Math.min);
|
|
this.updateVal(bounds.data, 'starty', _starty, Math.min);
|
|
this.updateVal(bounds.data, 'stopx', _stopx, Math.max);
|
|
this.updateVal(bounds.data, 'stopy', _stopy, Math.max);
|
|
this.updateBounds(_startx, _starty, _stopx, _stopy);
|
|
},
|
|
bumpVerticalPos: function bumpVerticalPos(bump) {
|
|
this.verticalPos = this.verticalPos + bump;
|
|
this.data.stopy = this.verticalPos;
|
|
},
|
|
getVerticalPos: function getVerticalPos() {
|
|
return this.verticalPos;
|
|
},
|
|
getBounds: function getBounds() {
|
|
return this.data;
|
|
}
|
|
};
|
|
var fills = conf.sectionFills;
|
|
var textColours = conf.sectionColours;
|
|
var drawTasks = function drawTasks(diagram, tasks, verticalPos) {
|
|
var lastSection = '';
|
|
var sectionVHeight = conf.height * 2 + conf.diagramMarginY;
|
|
var taskPos = verticalPos + sectionVHeight;
|
|
var sectionNumber = 0;
|
|
var fill = '#CCC';
|
|
var colour = 'black'; // Draw the tasks
|
|
|
|
for (var i = 0; i < tasks.length; i++) {
|
|
var task = tasks[i];
|
|
|
|
if (lastSection !== task.section) {
|
|
fill = fills[sectionNumber % fills.length];
|
|
colour = textColours[sectionNumber % textColours.length];
|
|
var section = {
|
|
x: i * conf.taskMargin + i * conf.width + LEFT_MARGIN,
|
|
y: 50,
|
|
text: task.section,
|
|
fill: fill,
|
|
colour: colour
|
|
};
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_3__["default"].drawSection(diagram, section, conf);
|
|
lastSection = task.section;
|
|
sectionNumber++;
|
|
} // Collect the actors involved in the task
|
|
|
|
|
|
var taskActors = task.people.reduce(function (acc, actorName) {
|
|
if (actors[actorName]) {
|
|
acc[actorName] = actors[actorName];
|
|
}
|
|
|
|
return acc;
|
|
}, {}); // Add some rendering data to the object
|
|
|
|
task.x = i * conf.taskMargin + i * conf.width + LEFT_MARGIN;
|
|
task.y = taskPos;
|
|
task.width = conf.diagramMarginX;
|
|
task.height = conf.diagramMarginY;
|
|
task.colour = colour;
|
|
task.fill = fill;
|
|
task.actors = taskActors; // Draw the box with the attached line
|
|
|
|
_svgDraw__WEBPACK_IMPORTED_MODULE_3__["default"].drawTask(diagram, task, conf);
|
|
bounds.insert(task.x, task.y, task.x + task.width + conf.taskMargin, 300 + 5 * 30); // stopy is the length of the descenders.
|
|
}
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
setConf: setConf,
|
|
draw: draw
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/user-journey/parser/journey.jison":
|
|
/*!********************************************************!*\
|
|
!*** ./src/diagrams/user-journey/parser/journey.jison ***!
|
|
\********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
|
|
/*
|
|
Returns a Parser object of the following structure:
|
|
|
|
Parser: {
|
|
yy: {}
|
|
}
|
|
|
|
Parser.prototype: {
|
|
yy: {},
|
|
trace: function(),
|
|
symbols_: {associative list: name ==> number},
|
|
terminals_: {associative list: number ==> name},
|
|
productions_: [...],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
|
table: [...],
|
|
defaultActions: {...},
|
|
parseError: function(str, hash),
|
|
parse: function(input),
|
|
|
|
lexer: {
|
|
EOF: 1,
|
|
parseError: function(str, hash),
|
|
setInput: function(input),
|
|
input: function(),
|
|
unput: function(str),
|
|
more: function(),
|
|
less: function(n),
|
|
pastInput: function(),
|
|
upcomingInput: function(),
|
|
showPosition: function(),
|
|
test_match: function(regex_match_array, rule_index),
|
|
next: function(),
|
|
lex: function(),
|
|
begin: function(condition),
|
|
popState: function(),
|
|
_currentRules: function(),
|
|
topState: function(),
|
|
pushState: function(condition),
|
|
|
|
options: {
|
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
|
},
|
|
|
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
|
rules: [...],
|
|
conditions: {associative list: name ==> set},
|
|
}
|
|
}
|
|
|
|
|
|
token location info (@$, _$, etc.): {
|
|
first_line: n,
|
|
last_line: n,
|
|
first_column: n,
|
|
last_column: n,
|
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
|
}
|
|
|
|
|
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
|
text: (matched text)
|
|
token: (the produced terminal token, if any)
|
|
line: (yylineno)
|
|
}
|
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
|
loc: (yylloc)
|
|
expected: (string describing the set of expected tokens)
|
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
|
}
|
|
*/
|
|
var parser = (function(){
|
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,10,11,12,13],$V1=[1,9],$V2=[1,10],$V3=[1,11];
|
|
var parser = {trace: function trace () { },
|
|
yy: {},
|
|
symbols_: {"error":2,"start":3,"journey":4,"document":5,"EOF":6,"line":7,"SPACE":8,"statement":9,"NL":10,"title":11,"section":12,"taskName":13,"taskData":14,"$accept":0,"$end":1},
|
|
terminals_: {2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NL",11:"title",12:"section",13:"taskName",14:"taskData"},
|
|
productions_: [0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,1],[9,2]],
|
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
|
/* this == yyval */
|
|
|
|
var $0 = $$.length - 1;
|
|
switch (yystate) {
|
|
case 1:
|
|
return $$[$0-1];
|
|
break;
|
|
case 2:
|
|
this.$ = []
|
|
break;
|
|
case 3:
|
|
$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
|
|
break;
|
|
case 4: case 5:
|
|
this.$ = $$[$0]
|
|
break;
|
|
case 6: case 7:
|
|
this.$=[];
|
|
break;
|
|
case 8:
|
|
yy.setTitle($$[$0].substr(6));this.$=$$[$0].substr(6);
|
|
break;
|
|
case 9:
|
|
yy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);
|
|
break;
|
|
case 10:
|
|
yy.addTask($$[$0-1], $$[$0]);this.$='task';
|
|
break;
|
|
}
|
|
},
|
|
table: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:$V1,12:$V2,13:$V3},o($V0,[2,7],{1:[2,1]}),o($V0,[2,3]),{9:12,11:$V1,12:$V2,13:$V3},o($V0,[2,5]),o($V0,[2,6]),o($V0,[2,8]),o($V0,[2,9]),{14:[1,13]},o($V0,[2,4]),o($V0,[2,10])],
|
|
defaultActions: {},
|
|
parseError: function parseError (str, hash) {
|
|
if (hash.recoverable) {
|
|
this.trace(str);
|
|
} else {
|
|
var error = new Error(str);
|
|
error.hash = hash;
|
|
throw error;
|
|
}
|
|
},
|
|
parse: function parse(input) {
|
|
var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
var args = lstack.slice.call(arguments, 1);
|
|
var lexer = Object.create(this.lexer);
|
|
var sharedState = { yy: {} };
|
|
for (var k in this.yy) {
|
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
|
sharedState.yy[k] = this.yy[k];
|
|
}
|
|
}
|
|
lexer.setInput(input, sharedState.yy);
|
|
sharedState.yy.lexer = lexer;
|
|
sharedState.yy.parser = this;
|
|
if (typeof lexer.yylloc == 'undefined') {
|
|
lexer.yylloc = {};
|
|
}
|
|
var yyloc = lexer.yylloc;
|
|
lstack.push(yyloc);
|
|
var ranges = lexer.options && lexer.options.ranges;
|
|
if (typeof sharedState.yy.parseError === 'function') {
|
|
this.parseError = sharedState.yy.parseError;
|
|
} else {
|
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
|
}
|
|
function popStack(n) {
|
|
stack.length = stack.length - 2 * n;
|
|
vstack.length = vstack.length - n;
|
|
lstack.length = lstack.length - n;
|
|
}
|
|
function lex() {
|
|
var token;
|
|
token = tstack.pop() || lexer.lex() || EOF;
|
|
if (typeof token !== 'number') {
|
|
if (token instanceof Array) {
|
|
tstack = token;
|
|
token = tstack.pop();
|
|
}
|
|
token = self.symbols_[token] || token;
|
|
}
|
|
return token;
|
|
}
|
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
|
while (true) {
|
|
state = stack[stack.length - 1];
|
|
if (this.defaultActions[state]) {
|
|
action = this.defaultActions[state];
|
|
} else {
|
|
if (symbol === null || typeof symbol == 'undefined') {
|
|
symbol = lex();
|
|
}
|
|
action = table[state] && table[state][symbol];
|
|
}
|
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
|
var errStr = '';
|
|
expected = [];
|
|
for (p in table[state]) {
|
|
if (this.terminals_[p] && p > TERROR) {
|
|
expected.push('\'' + this.terminals_[p] + '\'');
|
|
}
|
|
}
|
|
if (lexer.showPosition) {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
|
|
} else {
|
|
errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
|
|
}
|
|
this.parseError(errStr, {
|
|
text: lexer.match,
|
|
token: this.terminals_[symbol] || symbol,
|
|
line: lexer.yylineno,
|
|
loc: yyloc,
|
|
expected: expected
|
|
});
|
|
}
|
|
if (action[0] instanceof Array && action.length > 1) {
|
|
throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
|
|
}
|
|
switch (action[0]) {
|
|
case 1:
|
|
stack.push(symbol);
|
|
vstack.push(lexer.yytext);
|
|
lstack.push(lexer.yylloc);
|
|
stack.push(action[1]);
|
|
symbol = null;
|
|
if (!preErrorSymbol) {
|
|
yyleng = lexer.yyleng;
|
|
yytext = lexer.yytext;
|
|
yylineno = lexer.yylineno;
|
|
yyloc = lexer.yylloc;
|
|
if (recovering > 0) {
|
|
recovering--;
|
|
}
|
|
} else {
|
|
symbol = preErrorSymbol;
|
|
preErrorSymbol = null;
|
|
}
|
|
break;
|
|
case 2:
|
|
len = this.productions_[action[1]][1];
|
|
yyval.$ = vstack[vstack.length - len];
|
|
yyval._$ = {
|
|
first_line: lstack[lstack.length - (len || 1)].first_line,
|
|
last_line: lstack[lstack.length - 1].last_line,
|
|
first_column: lstack[lstack.length - (len || 1)].first_column,
|
|
last_column: lstack[lstack.length - 1].last_column
|
|
};
|
|
if (ranges) {
|
|
yyval._$.range = [
|
|
lstack[lstack.length - (len || 1)].range[0],
|
|
lstack[lstack.length - 1].range[1]
|
|
];
|
|
}
|
|
r = this.performAction.apply(yyval, [
|
|
yytext,
|
|
yyleng,
|
|
yylineno,
|
|
sharedState.yy,
|
|
action[1],
|
|
vstack,
|
|
lstack
|
|
].concat(args));
|
|
if (typeof r !== 'undefined') {
|
|
return r;
|
|
}
|
|
if (len) {
|
|
stack = stack.slice(0, -1 * len * 2);
|
|
vstack = vstack.slice(0, -1 * len);
|
|
lstack = lstack.slice(0, -1 * len);
|
|
}
|
|
stack.push(this.productions_[action[1]][0]);
|
|
vstack.push(yyval.$);
|
|
lstack.push(yyval._$);
|
|
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
stack.push(newState);
|
|
break;
|
|
case 3:
|
|
return true;
|
|
}
|
|
}
|
|
return true;
|
|
}};
|
|
/* generated by jison-lex 0.3.4 */
|
|
var lexer = (function(){
|
|
var lexer = ({
|
|
|
|
EOF:1,
|
|
|
|
parseError:function parseError(str, hash) {
|
|
if (this.yy.parser) {
|
|
this.yy.parser.parseError(str, hash);
|
|
} else {
|
|
throw new Error(str);
|
|
}
|
|
},
|
|
|
|
// resets the lexer, sets new input
|
|
setInput:function (input, yy) {
|
|
this.yy = yy || this.yy || {};
|
|
this._input = input;
|
|
this._more = this._backtrack = this.done = false;
|
|
this.yylineno = this.yyleng = 0;
|
|
this.yytext = this.matched = this.match = '';
|
|
this.conditionStack = ['INITIAL'];
|
|
this.yylloc = {
|
|
first_line: 1,
|
|
first_column: 0,
|
|
last_line: 1,
|
|
last_column: 0
|
|
};
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [0,0];
|
|
}
|
|
this.offset = 0;
|
|
return this;
|
|
},
|
|
|
|
// consumes and returns one char from the input
|
|
input:function () {
|
|
var ch = this._input[0];
|
|
this.yytext += ch;
|
|
this.yyleng++;
|
|
this.offset++;
|
|
this.match += ch;
|
|
this.matched += ch;
|
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno++;
|
|
this.yylloc.last_line++;
|
|
} else {
|
|
this.yylloc.last_column++;
|
|
}
|
|
if (this.options.ranges) {
|
|
this.yylloc.range[1]++;
|
|
}
|
|
|
|
this._input = this._input.slice(1);
|
|
return ch;
|
|
},
|
|
|
|
// unshifts one char (or a string) into the input
|
|
unput:function (ch) {
|
|
var len = ch.length;
|
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
|
|
|
this._input = ch + this._input;
|
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
|
//this.yyleng -= len;
|
|
this.offset -= len;
|
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
|
this.match = this.match.substr(0, this.match.length - 1);
|
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
|
|
|
if (lines.length - 1) {
|
|
this.yylineno -= lines.length - 1;
|
|
}
|
|
var r = this.yylloc.range;
|
|
|
|
this.yylloc = {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: lines ?
|
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
|
this.yylloc.first_column - len
|
|
};
|
|
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
|
}
|
|
this.yyleng = this.yytext.length;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, caches matched text and appends it on next action
|
|
more:function () {
|
|
this._more = true;
|
|
return this;
|
|
},
|
|
|
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
|
reject:function () {
|
|
if (this.options.backtrack_lexer) {
|
|
this._backtrack = true;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
|
|
}
|
|
return this;
|
|
},
|
|
|
|
// retain first n characters of the match
|
|
less:function (n) {
|
|
this.unput(this.match.slice(n));
|
|
},
|
|
|
|
// displays already matched input, i.e. for error messages
|
|
pastInput:function () {
|
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays upcoming input, i.e. for error messages
|
|
upcomingInput:function () {
|
|
var next = this.match;
|
|
if (next.length < 20) {
|
|
next += this._input.substr(0, 20-next.length);
|
|
}
|
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
|
},
|
|
|
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
|
showPosition:function () {
|
|
var pre = this.pastInput();
|
|
var c = new Array(pre.length + 1).join("-");
|
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
|
},
|
|
|
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
|
test_match:function(match, indexed_rule) {
|
|
var token,
|
|
lines,
|
|
backup;
|
|
|
|
if (this.options.backtrack_lexer) {
|
|
// save context
|
|
backup = {
|
|
yylineno: this.yylineno,
|
|
yylloc: {
|
|
first_line: this.yylloc.first_line,
|
|
last_line: this.last_line,
|
|
first_column: this.yylloc.first_column,
|
|
last_column: this.yylloc.last_column
|
|
},
|
|
yytext: this.yytext,
|
|
match: this.match,
|
|
matches: this.matches,
|
|
matched: this.matched,
|
|
yyleng: this.yyleng,
|
|
offset: this.offset,
|
|
_more: this._more,
|
|
_input: this._input,
|
|
yy: this.yy,
|
|
conditionStack: this.conditionStack.slice(0),
|
|
done: this.done
|
|
};
|
|
if (this.options.ranges) {
|
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
|
}
|
|
}
|
|
|
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
|
if (lines) {
|
|
this.yylineno += lines.length;
|
|
}
|
|
this.yylloc = {
|
|
first_line: this.yylloc.last_line,
|
|
last_line: this.yylineno + 1,
|
|
first_column: this.yylloc.last_column,
|
|
last_column: lines ?
|
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
|
this.yylloc.last_column + match[0].length
|
|
};
|
|
this.yytext += match[0];
|
|
this.match += match[0];
|
|
this.matches = match;
|
|
this.yyleng = this.yytext.length;
|
|
if (this.options.ranges) {
|
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
|
}
|
|
this._more = false;
|
|
this._backtrack = false;
|
|
this._input = this._input.slice(match[0].length);
|
|
this.matched += match[0];
|
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
|
if (this.done && this._input) {
|
|
this.done = false;
|
|
}
|
|
if (token) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
// recover context
|
|
for (var k in backup) {
|
|
this[k] = backup[k];
|
|
}
|
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// return next match in input
|
|
next:function () {
|
|
if (this.done) {
|
|
return this.EOF;
|
|
}
|
|
if (!this._input) {
|
|
this.done = true;
|
|
}
|
|
|
|
var token,
|
|
match,
|
|
tempMatch,
|
|
index;
|
|
if (!this._more) {
|
|
this.yytext = '';
|
|
this.match = '';
|
|
}
|
|
var rules = this._currentRules();
|
|
for (var i = 0; i < rules.length; i++) {
|
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
|
match = tempMatch;
|
|
index = i;
|
|
if (this.options.backtrack_lexer) {
|
|
token = this.test_match(tempMatch, rules[i]);
|
|
if (token !== false) {
|
|
return token;
|
|
} else if (this._backtrack) {
|
|
match = false;
|
|
continue; // rule action called reject() implying a rule MISmatch.
|
|
} else {
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
} else if (!this.options.flex) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (match) {
|
|
token = this.test_match(match, rules[index]);
|
|
if (token !== false) {
|
|
return token;
|
|
}
|
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
|
return false;
|
|
}
|
|
if (this._input === "") {
|
|
return this.EOF;
|
|
} else {
|
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
|
text: "",
|
|
token: null,
|
|
line: this.yylineno
|
|
});
|
|
}
|
|
},
|
|
|
|
// return next match that has a token
|
|
lex:function lex () {
|
|
var r = this.next();
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return this.lex();
|
|
}
|
|
},
|
|
|
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
|
begin:function begin (condition) {
|
|
this.conditionStack.push(condition);
|
|
},
|
|
|
|
// pop the previously active lexer condition state off the condition stack
|
|
popState:function popState () {
|
|
var n = this.conditionStack.length - 1;
|
|
if (n > 0) {
|
|
return this.conditionStack.pop();
|
|
} else {
|
|
return this.conditionStack[0];
|
|
}
|
|
},
|
|
|
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
|
_currentRules:function _currentRules () {
|
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
|
} else {
|
|
return this.conditions["INITIAL"].rules;
|
|
}
|
|
},
|
|
|
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
|
topState:function topState (n) {
|
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
|
if (n >= 0) {
|
|
return this.conditionStack[n];
|
|
} else {
|
|
return "INITIAL";
|
|
}
|
|
},
|
|
|
|
// alias for begin(condition)
|
|
pushState:function pushState (condition) {
|
|
this.begin(condition);
|
|
},
|
|
|
|
// return the number of states currently on the stack
|
|
stateStackSize:function stateStackSize() {
|
|
return this.conditionStack.length;
|
|
},
|
|
options: {"case-insensitive":true},
|
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
|
var YYSTATE=YY_START;
|
|
switch($avoiding_name_collisions) {
|
|
case 0:return 10;
|
|
break;
|
|
case 1:/* skip whitespace */
|
|
break;
|
|
case 2:/* skip comments */
|
|
break;
|
|
case 3:/* skip comments */
|
|
break;
|
|
case 4:return 4;
|
|
break;
|
|
case 5:return 11;
|
|
break;
|
|
case 6:return 12;
|
|
break;
|
|
case 7:return 13;
|
|
break;
|
|
case 8:return 14;
|
|
break;
|
|
case 9:return ':';
|
|
break;
|
|
case 10:return 6;
|
|
break;
|
|
case 11:return 'INVALID';
|
|
break;
|
|
}
|
|
},
|
|
rules: [/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],
|
|
conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11],"inclusive":true}}
|
|
});
|
|
return lexer;
|
|
})();
|
|
parser.lexer = lexer;
|
|
function Parser () {
|
|
this.yy = {};
|
|
}
|
|
Parser.prototype = parser;parser.Parser = Parser;
|
|
return new Parser;
|
|
})();
|
|
|
|
|
|
if (true) {
|
|
exports.parser = parser;
|
|
exports.Parser = parser.Parser;
|
|
exports.parse = function () { return parser.parse.apply(parser, arguments); };
|
|
exports.main = function commonjsMain (args) {
|
|
if (!args[1]) {
|
|
console.log('Usage: '+args[0]+' FILE');
|
|
process.exit(1);
|
|
}
|
|
var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
|
|
return exports.parser.parse(source);
|
|
};
|
|
if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
|
|
exports.main(process.argv.slice(1));
|
|
}
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js?f28c"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/diagrams/user-journey/svgDraw.js":
|
|
/*!**********************************************!*\
|
|
!*** ./src/diagrams/user-journey/svgDraw.js ***!
|
|
\**********************************************/
|
|
/*! exports provided: drawRect, drawFace, drawCircle, drawText, drawLabel, drawSection, drawTask, drawBackgroundRect, getTextObj, getNoteRect, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawRect", function() { return drawRect; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawFace", function() { return drawFace; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawCircle", function() { return drawCircle; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawText", function() { return drawText; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawLabel", function() { return drawLabel; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawSection", function() { return drawSection; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawTask", function() { return drawTask; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawBackgroundRect", function() { return drawBackgroundRect; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTextObj", function() { return getTextObj; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNoteRect", function() { return getNoteRect; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
|
|
var drawRect = function drawRect(elem, rectData) {
|
|
var rectElem = elem.append('rect');
|
|
rectElem.attr('x', rectData.x);
|
|
rectElem.attr('y', rectData.y);
|
|
rectElem.attr('fill', rectData.fill);
|
|
rectElem.attr('stroke', rectData.stroke);
|
|
rectElem.attr('width', rectData.width);
|
|
rectElem.attr('height', rectData.height);
|
|
rectElem.attr('rx', rectData.rx);
|
|
rectElem.attr('ry', rectData.ry);
|
|
|
|
if (typeof rectData.class !== 'undefined') {
|
|
rectElem.attr('class', rectData.class);
|
|
}
|
|
|
|
return rectElem;
|
|
};
|
|
var drawFace = function drawFace(element, faceData) {
|
|
var radius = 15;
|
|
var circleElement = element.append('circle').attr('cx', faceData.cx).attr('cy', faceData.cy).attr('fill', '#FFF8DC').attr('stroke', '#999').attr('r', radius).attr('stroke-width', 2).attr('overflow', 'visible');
|
|
var face = element.append('g'); //left eye
|
|
|
|
face.append('circle').attr('cx', faceData.cx - radius / 3).attr('cy', faceData.cy - radius / 3).attr('r', 1.5).attr('stroke-width', 2).attr('fill', '#666').attr('stroke', '#666'); //right eye
|
|
|
|
face.append('circle').attr('cx', faceData.cx + radius / 3).attr('cy', faceData.cy - radius / 3).attr('r', 1.5).attr('stroke-width', 2).attr('fill', '#666').attr('stroke', '#666');
|
|
|
|
function smile(face) {
|
|
var arc = Object(d3__WEBPACK_IMPORTED_MODULE_0__["arc"])().startAngle(Math.PI / 2).endAngle(3 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); //mouth
|
|
|
|
face.append('path').attr('d', arc).attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 2) + ')');
|
|
}
|
|
|
|
function sad(face) {
|
|
var arc = Object(d3__WEBPACK_IMPORTED_MODULE_0__["arc"])().startAngle(3 * Math.PI / 2).endAngle(5 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); //mouth
|
|
|
|
face.append('path').attr('d', arc).attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 7) + ')');
|
|
}
|
|
|
|
function ambivalent(face) {
|
|
face.append('line').attr('stroke', 2).attr('x1', faceData.cx - 5).attr('y1', faceData.cy + 7).attr('x2', faceData.cx + 5).attr('y2', faceData.cy + 7).attr('class', 'task-line').attr('stroke-width', '1px').attr('stroke', '#666');
|
|
}
|
|
|
|
if (faceData.score > 3) {
|
|
smile(face);
|
|
} else if (faceData.score < 3) {
|
|
sad(face);
|
|
} else {
|
|
ambivalent(face);
|
|
}
|
|
|
|
return circleElement;
|
|
};
|
|
var drawCircle = function drawCircle(element, circleData) {
|
|
var circleElement = element.append('circle');
|
|
circleElement.attr('cx', circleData.cx);
|
|
circleElement.attr('cy', circleData.cy);
|
|
circleElement.attr('fill', circleData.fill);
|
|
circleElement.attr('stroke', circleData.stroke);
|
|
circleElement.attr('r', circleData.r);
|
|
|
|
if (typeof circleElement.class !== 'undefined') {
|
|
circleElement.attr('class', circleElement.class);
|
|
}
|
|
|
|
if (typeof circleData.title !== 'undefined') {
|
|
circleElement.append('title').text(circleData.title);
|
|
}
|
|
|
|
return circleElement;
|
|
};
|
|
var drawText = function drawText(elem, textData) {
|
|
// Remove and ignore br:s
|
|
var nText = textData.text.replace(/<br\s*\/?>/gi, ' ');
|
|
var textElem = elem.append('text');
|
|
textElem.attr('x', textData.x);
|
|
textElem.attr('y', textData.y);
|
|
textElem.attr('fill', textData.fill);
|
|
textElem.style('text-anchor', textData.anchor);
|
|
|
|
if (typeof textData.class !== 'undefined') {
|
|
textElem.attr('class', textData.class);
|
|
}
|
|
|
|
var span = textElem.append('tspan');
|
|
span.attr('x', textData.x + textData.textMargin * 2);
|
|
span.text(nText);
|
|
return textElem;
|
|
};
|
|
var drawLabel = function drawLabel(elem, txtObject) {
|
|
function genPoints(x, y, width, height, cut) {
|
|
return x + ',' + y + ' ' + (x + width) + ',' + y + ' ' + (x + width) + ',' + (y + height - cut) + ' ' + (x + width - cut * 1.2) + ',' + (y + height) + ' ' + x + ',' + (y + height);
|
|
}
|
|
|
|
var polygon = elem.append('polygon');
|
|
polygon.attr('points', genPoints(txtObject.x, txtObject.y, 50, 20, 7));
|
|
polygon.attr('class', 'labelBox');
|
|
txtObject.y = txtObject.y + txtObject.labelMargin;
|
|
txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin;
|
|
drawText(elem, txtObject);
|
|
};
|
|
var drawSection = function drawSection(elem, section, conf) {
|
|
var g = elem.append('g');
|
|
var rect = getNoteRect();
|
|
rect.x = section.x;
|
|
rect.y = section.y;
|
|
rect.fill = section.fill;
|
|
rect.width = conf.width;
|
|
rect.height = conf.height;
|
|
rect.class = 'journey-section';
|
|
rect.rx = 3;
|
|
rect.ry = 3;
|
|
drawRect(g, rect);
|
|
|
|
_drawTextCandidateFunc(conf)(section.text, g, rect.x, rect.y, rect.width, rect.height, {
|
|
class: 'journey-section'
|
|
}, conf, section.colour);
|
|
};
|
|
var taskCount = -1;
|
|
/**
|
|
* Draws an actor in the diagram with the attaced line
|
|
* @param elem The HTML element
|
|
* @param task The task to render
|
|
* @param conf The global configuration
|
|
*/
|
|
|
|
var drawTask = function drawTask(elem, task, conf) {
|
|
var center = task.x + conf.width / 2;
|
|
var g = elem.append('g');
|
|
taskCount++;
|
|
var maxHeight = 300 + 5 * 30;
|
|
g.append('line').attr('id', 'task' + taskCount).attr('x1', center).attr('y1', task.y).attr('x2', center).attr('y2', maxHeight).attr('class', 'task-line').attr('stroke-width', '1px').attr('stroke-dasharray', '4 2').attr('stroke', '#666');
|
|
drawFace(g, {
|
|
cx: center,
|
|
cy: 300 + (5 - task.score) * 30,
|
|
score: task.score
|
|
});
|
|
var rect = getNoteRect();
|
|
rect.x = task.x;
|
|
rect.y = task.y;
|
|
rect.fill = task.fill;
|
|
rect.width = conf.width;
|
|
rect.height = conf.height;
|
|
rect.class = 'task';
|
|
rect.rx = 3;
|
|
rect.ry = 3;
|
|
drawRect(g, rect);
|
|
var xPos = task.x + 14;
|
|
task.people.forEach(function (person) {
|
|
var colour = task.actors[person];
|
|
var circle = {
|
|
cx: xPos,
|
|
cy: task.y,
|
|
r: 7,
|
|
fill: colour,
|
|
stroke: '#000',
|
|
title: person
|
|
};
|
|
drawCircle(g, circle);
|
|
xPos += 10;
|
|
});
|
|
|
|
_drawTextCandidateFunc(conf)(task.task, g, rect.x, rect.y, rect.width, rect.height, {
|
|
class: 'task'
|
|
}, conf, task.colour);
|
|
};
|
|
/**
|
|
* Draws a background rectangle
|
|
* @param elem The html element
|
|
* @param bounds The bounds of the drawing
|
|
*/
|
|
|
|
var drawBackgroundRect = function drawBackgroundRect(elem, bounds) {
|
|
var rectElem = drawRect(elem, {
|
|
x: bounds.startx,
|
|
y: bounds.starty,
|
|
width: bounds.stopx - bounds.startx,
|
|
height: bounds.stopy - bounds.starty,
|
|
fill: bounds.fill,
|
|
class: 'rect'
|
|
});
|
|
rectElem.lower();
|
|
};
|
|
var getTextObj = function getTextObj() {
|
|
return {
|
|
x: 0,
|
|
y: 0,
|
|
fill: undefined,
|
|
'text-anchor': 'start',
|
|
width: 100,
|
|
height: 100,
|
|
textMargin: 0,
|
|
rx: 0,
|
|
ry: 0
|
|
};
|
|
};
|
|
var getNoteRect = function getNoteRect() {
|
|
return {
|
|
x: 0,
|
|
y: 0,
|
|
width: 100,
|
|
anchor: 'start',
|
|
height: 100,
|
|
rx: 0,
|
|
ry: 0
|
|
};
|
|
};
|
|
|
|
var _drawTextCandidateFunc = function () {
|
|
function byText(content, g, x, y, width, height, textAttrs, colour) {
|
|
var text = g.append('text').attr('x', x + width / 2).attr('y', y + height / 2 + 5).style('font-color', colour).style('text-anchor', 'middle').text(content);
|
|
|
|
_setTextAttrs(text, textAttrs);
|
|
}
|
|
|
|
function byTspan(content, g, x, y, width, height, textAttrs, conf, colour) {
|
|
var taskFontSize = conf.taskFontSize,
|
|
taskFontFamily = conf.taskFontFamily;
|
|
var lines = content.split(/<br\s*\/?>/gi);
|
|
|
|
for (var i = 0; i < lines.length; i++) {
|
|
var dy = i * taskFontSize - taskFontSize * (lines.length - 1) / 2;
|
|
var text = g.append('text').attr('x', x + width / 2).attr('y', y).attr('fill', colour).style('text-anchor', 'middle').style('font-size', taskFontSize).style('font-family', taskFontFamily);
|
|
text.append('tspan').attr('x', x + width / 2).attr('dy', dy).text(lines[i]);
|
|
text.attr('y', y + height / 2.0).attr('dominant-baseline', 'central').attr('alignment-baseline', 'central');
|
|
|
|
_setTextAttrs(text, textAttrs);
|
|
}
|
|
}
|
|
|
|
function byFo(content, g, x, y, width, height, textAttrs, conf, colour) {
|
|
var body = g.append('switch');
|
|
var f = body.append('foreignObject').attr('x', x).attr('y', y).attr('width', width).attr('height', height).attr('position', 'fixed');
|
|
var text = f.append('div').style('display', 'table').style('height', '100%').style('width', '100%');
|
|
text.append('div').style('display', 'table-cell').style('text-align', 'center').style('vertical-align', 'middle').style('color', colour).text(content);
|
|
byTspan(content, body, x, y, width, height, textAttrs, conf);
|
|
|
|
_setTextAttrs(text, textAttrs);
|
|
}
|
|
|
|
function _setTextAttrs(toText, fromTextAttrsDict) {
|
|
for (var key in fromTextAttrsDict) {
|
|
if (key in fromTextAttrsDict) {
|
|
// eslint-disable-line
|
|
// noinspection JSUnfilteredForInLoop
|
|
toText.attr(key, fromTextAttrsDict[key]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return function (conf) {
|
|
return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;
|
|
};
|
|
}();
|
|
|
|
var initGraphics = function initGraphics(graphics) {
|
|
graphics.append('defs').append('marker').attr('id', 'arrowhead').attr('refX', 5).attr('refY', 2).attr('markerWidth', 6).attr('markerHeight', 4).attr('orient', 'auto').append('path').attr('d', 'M 0,0 V 4 L6,2 Z'); // this is actual shape for arrowhead
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
drawRect: drawRect,
|
|
drawCircle: drawCircle,
|
|
drawSection: drawSection,
|
|
drawText: drawText,
|
|
drawLabel: drawLabel,
|
|
drawTask: drawTask,
|
|
drawBackgroundRect: drawBackgroundRect,
|
|
getTextObj: getTextObj,
|
|
getNoteRect: getNoteRect,
|
|
initGraphics: initGraphics
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/logger.js":
|
|
/*!***********************!*\
|
|
!*** ./src/logger.js ***!
|
|
\***********************/
|
|
/*! exports provided: LEVELS, logger, setLogLevel */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LEVELS", function() { return LEVELS; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return logger; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLogLevel", function() { return setLogLevel; });
|
|
/* harmony import */ var moment_mini__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment-mini */ "moment-mini");
|
|
/* harmony import */ var moment_mini__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment_mini__WEBPACK_IMPORTED_MODULE_0__);
|
|
//
|
|
|
|
var LEVELS = {
|
|
debug: 1,
|
|
info: 2,
|
|
warn: 3,
|
|
error: 4,
|
|
fatal: 5
|
|
};
|
|
var logger = {
|
|
debug: function debug() {},
|
|
info: function info() {},
|
|
warn: function warn() {},
|
|
error: function error() {},
|
|
fatal: function fatal() {}
|
|
};
|
|
var setLogLevel = function setLogLevel(level) {
|
|
logger.trace = function () {};
|
|
|
|
logger.debug = function () {};
|
|
|
|
logger.info = function () {};
|
|
|
|
logger.warn = function () {};
|
|
|
|
logger.error = function () {};
|
|
|
|
logger.fatal = function () {};
|
|
|
|
if (level <= LEVELS.fatal) {
|
|
logger.fatal = console.error ? console.error.bind(console, format('FATAL'), 'color: orange') : console.log.bind(console, '\x1b[35m', format('FATAL'));
|
|
}
|
|
|
|
if (level <= LEVELS.error) {
|
|
logger.error = console.error ? console.error.bind(console, format('ERROR'), 'color: orange') : console.log.bind(console, '\x1b[31m', format('ERROR'));
|
|
}
|
|
|
|
if (level <= LEVELS.warn) {
|
|
logger.warn = console.warn ? console.warn.bind(console, format('WARN'), 'color: orange') : console.log.bind(console, "\x1B[33m", format('WARN'));
|
|
}
|
|
|
|
if (level <= LEVELS.info) {
|
|
logger.info = console.info ? // ? console.info.bind(console, '\x1b[34m', format('INFO'), 'color: blue')
|
|
console.info.bind(console, format('INFO'), 'color: lightblue') : console.log.bind(console, '\x1b[34m', format('INFO'));
|
|
}
|
|
|
|
if (level <= LEVELS.debug) {
|
|
logger.debug = console.debug ? console.debug.bind(console, format('DEBUG'), 'color: lightgreen') : console.log.bind(console, '\x1b[32m', format('DEBUG'));
|
|
}
|
|
};
|
|
|
|
var format = function format(level) {
|
|
var time = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()().format('ss.SSS');
|
|
return "%c".concat(time, " : ").concat(level, " : ");
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/mermaid.js":
|
|
/*!************************!*\
|
|
!*** ./src/mermaid.js ***!
|
|
\************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var entity_decode_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! entity-decode/browser */ "entity-decode/browser");
|
|
/* harmony import */ var entity_decode_browser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(entity_decode_browser__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mermaidAPI */ "./src/mermaidAPI.js");
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./logger */ "./src/logger.js");
|
|
/**
|
|
* Web page integration module for the mermaid framework. It uses the mermaidAPI for mermaid functionality and to render
|
|
* the diagrams to svg code.
|
|
*/
|
|
// import { decode } from 'he';
|
|
|
|
|
|
|
|
/**
|
|
* ## init
|
|
* Function that goes through the document to find the chart definitions in there and render them.
|
|
*
|
|
* The function tags the processed attributes with the attribute data-processed and ignores found elements with the
|
|
* attribute already set. This way the init function can be triggered several times.
|
|
*
|
|
* Optionally, `init` can accept in the second argument one of the following:
|
|
* - a DOM Node
|
|
* - an array of DOM nodes (as would come from a jQuery selector)
|
|
* - a W3C selector, a la `.mermaid`
|
|
*
|
|
* ```mermaid
|
|
* graph LR;
|
|
* a(Find elements)-->b{Processed}
|
|
* b-->|Yes|c(Leave element)
|
|
* b-->|No |d(Transform)
|
|
* ```
|
|
* Renders the mermaid diagrams
|
|
* @param nodes a css selector or an array of nodes
|
|
*/
|
|
|
|
var init = function init() {
|
|
var conf = _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].getConfig();
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Starting rendering diagrams');
|
|
var nodes;
|
|
|
|
if (arguments.length >= 2) {
|
|
/*! sequence config was passed as #1 */
|
|
if (typeof arguments[0] !== 'undefined') {
|
|
mermaid.sequenceConfig = arguments[0];
|
|
}
|
|
|
|
nodes = arguments[1];
|
|
} else {
|
|
nodes = arguments[0];
|
|
} // if last argument is a function this is the callback function
|
|
|
|
|
|
var callback;
|
|
|
|
if (typeof arguments[arguments.length - 1] === 'function') {
|
|
callback = arguments[arguments.length - 1];
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Callback function found');
|
|
} else {
|
|
if (typeof conf.mermaid !== 'undefined') {
|
|
if (typeof conf.mermaid.callback === 'function') {
|
|
callback = conf.mermaid.callback;
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Callback function found');
|
|
} else {
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('No Callback function found');
|
|
}
|
|
}
|
|
}
|
|
|
|
nodes = nodes === undefined ? document.querySelectorAll('.mermaid') : typeof nodes === 'string' ? document.querySelectorAll(nodes) : nodes instanceof window.Node ? [nodes] : nodes; // Last case - sequence config was passed pick next
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Start On Load before: ' + mermaid.startOnLoad);
|
|
|
|
if (typeof mermaid.startOnLoad !== 'undefined') {
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Start On Load inner: ' + mermaid.startOnLoad);
|
|
_mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].initialize({
|
|
startOnLoad: mermaid.startOnLoad
|
|
});
|
|
}
|
|
|
|
if (typeof mermaid.ganttConfig !== 'undefined') {
|
|
_mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].initialize({
|
|
gantt: mermaid.ganttConfig
|
|
});
|
|
}
|
|
|
|
var txt;
|
|
|
|
var _loop = function _loop(i) {
|
|
var element = nodes[i];
|
|
/*! Check if previously processed */
|
|
|
|
if (!element.getAttribute('data-processed')) {
|
|
element.setAttribute('data-processed', true);
|
|
} else {
|
|
return "continue";
|
|
}
|
|
|
|
var id = "mermaid-".concat(Date.now()); // Fetch the graph definition including tags
|
|
|
|
txt = element.innerHTML; // transforms the html to pure text
|
|
|
|
txt = entity_decode_browser__WEBPACK_IMPORTED_MODULE_0___default()(txt).trim().replace(/<br\s*\/?>/gi, '<br/>');
|
|
_mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].render(id, txt, function (svgCode, bindFunctions) {
|
|
element.innerHTML = svgCode;
|
|
|
|
if (typeof callback !== 'undefined') {
|
|
callback(id);
|
|
}
|
|
|
|
if (bindFunctions) bindFunctions(element);
|
|
}, element);
|
|
};
|
|
|
|
for (var i = 0; i < nodes.length; i++) {
|
|
var _ret = _loop(i);
|
|
|
|
if (_ret === "continue") continue;
|
|
}
|
|
};
|
|
|
|
var initialize = function initialize(config) {
|
|
if (typeof config.mermaid !== 'undefined') {
|
|
if (typeof config.mermaid.startOnLoad !== 'undefined') {
|
|
mermaid.startOnLoad = config.mermaid.startOnLoad;
|
|
}
|
|
|
|
if (typeof config.mermaid.htmlLabels !== 'undefined') {
|
|
mermaid.htmlLabels = config.mermaid.htmlLabels;
|
|
}
|
|
}
|
|
|
|
_mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].initialize(config);
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Initializing mermaid ');
|
|
};
|
|
/**
|
|
* ##contentLoaded
|
|
* Callback function that is called when page is loaded. This functions fetches configuration for mermaid rendering and
|
|
* calls init for rendering the mermaid diagrams on the page.
|
|
*/
|
|
|
|
|
|
var contentLoaded = function contentLoaded() {
|
|
var config;
|
|
|
|
if (mermaid.startOnLoad) {
|
|
// No config found, do check API config
|
|
config = _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].getConfig();
|
|
|
|
if (config.startOnLoad) {
|
|
mermaid.init();
|
|
}
|
|
} else {
|
|
if (typeof mermaid.startOnLoad === 'undefined') {
|
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('In start, no config');
|
|
config = _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].getConfig();
|
|
|
|
if (config.startOnLoad) {
|
|
mermaid.init();
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
if (typeof document !== 'undefined') {
|
|
/*!
|
|
* Wait for document loaded before starting the execution
|
|
*/
|
|
window.addEventListener('load', function () {
|
|
contentLoaded();
|
|
}, false);
|
|
}
|
|
|
|
var mermaid = {
|
|
startOnLoad: true,
|
|
htmlLabels: true,
|
|
mermaidAPI: _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"],
|
|
parse: _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].parse,
|
|
render: _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].render,
|
|
init: init,
|
|
initialize: initialize,
|
|
contentLoaded: contentLoaded
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = (mermaid);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/mermaidAPI.js":
|
|
/*!***************************!*\
|
|
!*** ./src/mermaidAPI.js ***!
|
|
\***************************/
|
|
/*! exports provided: encodeEntities, decodeEntities, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encodeEntities", function() { return encodeEntities; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decodeEntities", function() { return decodeEntities; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var scope_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! scope-css */ "scope-css");
|
|
/* harmony import */ var scope_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(scope_css__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../package.json */ "./package.json");
|
|
var _package_json__WEBPACK_IMPORTED_MODULE_2___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../package.json */ "./package.json", 1);
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./config */ "./src/config.js");
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./logger */ "./src/logger.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils */ "./src/utils.js");
|
|
/* harmony import */ var _diagrams_flowchart_flowRenderer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./diagrams/flowchart/flowRenderer */ "./src/diagrams/flowchart/flowRenderer.js");
|
|
/* harmony import */ var _diagrams_flowchart_flowRenderer_v2__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./diagrams/flowchart/flowRenderer-v2 */ "./src/diagrams/flowchart/flowRenderer-v2.js");
|
|
/* harmony import */ var _diagrams_flowchart_parser_flow__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./diagrams/flowchart/parser/flow */ "./src/diagrams/flowchart/parser/flow.jison");
|
|
/* harmony import */ var _diagrams_flowchart_parser_flow__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_diagrams_flowchart_parser_flow__WEBPACK_IMPORTED_MODULE_8__);
|
|
/* harmony import */ var _diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./diagrams/flowchart/flowDb */ "./src/diagrams/flowchart/flowDb.js");
|
|
/* harmony import */ var _diagrams_sequence_sequenceRenderer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./diagrams/sequence/sequenceRenderer */ "./src/diagrams/sequence/sequenceRenderer.js");
|
|
/* harmony import */ var _diagrams_sequence_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./diagrams/sequence/parser/sequenceDiagram */ "./src/diagrams/sequence/parser/sequenceDiagram.jison");
|
|
/* harmony import */ var _diagrams_sequence_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_diagrams_sequence_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_11__);
|
|
/* harmony import */ var _diagrams_sequence_sequenceDb__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./diagrams/sequence/sequenceDb */ "./src/diagrams/sequence/sequenceDb.js");
|
|
/* harmony import */ var _diagrams_gantt_ganttRenderer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./diagrams/gantt/ganttRenderer */ "./src/diagrams/gantt/ganttRenderer.js");
|
|
/* harmony import */ var _diagrams_gantt_parser_gantt__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./diagrams/gantt/parser/gantt */ "./src/diagrams/gantt/parser/gantt.jison");
|
|
/* harmony import */ var _diagrams_gantt_parser_gantt__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_diagrams_gantt_parser_gantt__WEBPACK_IMPORTED_MODULE_14__);
|
|
/* harmony import */ var _diagrams_gantt_ganttDb__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./diagrams/gantt/ganttDb */ "./src/diagrams/gantt/ganttDb.js");
|
|
/* harmony import */ var _diagrams_class_classRenderer__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./diagrams/class/classRenderer */ "./src/diagrams/class/classRenderer.js");
|
|
/* harmony import */ var _diagrams_class_parser_classDiagram__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./diagrams/class/parser/classDiagram */ "./src/diagrams/class/parser/classDiagram.jison");
|
|
/* harmony import */ var _diagrams_class_parser_classDiagram__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_diagrams_class_parser_classDiagram__WEBPACK_IMPORTED_MODULE_17__);
|
|
/* harmony import */ var _diagrams_class_classDb__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./diagrams/class/classDb */ "./src/diagrams/class/classDb.js");
|
|
/* harmony import */ var _diagrams_state_stateRenderer__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./diagrams/state/stateRenderer */ "./src/diagrams/state/stateRenderer.js");
|
|
/* harmony import */ var _diagrams_state_stateRenderer_v2__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./diagrams/state/stateRenderer-v2 */ "./src/diagrams/state/stateRenderer-v2.js");
|
|
/* harmony import */ var _diagrams_state_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./diagrams/state/parser/stateDiagram */ "./src/diagrams/state/parser/stateDiagram.jison");
|
|
/* harmony import */ var _diagrams_state_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(_diagrams_state_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_21__);
|
|
/* harmony import */ var _diagrams_state_stateDb__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./diagrams/state/stateDb */ "./src/diagrams/state/stateDb.js");
|
|
/* harmony import */ var _diagrams_git_gitGraphRenderer__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./diagrams/git/gitGraphRenderer */ "./src/diagrams/git/gitGraphRenderer.js");
|
|
/* harmony import */ var _diagrams_git_parser_gitGraph__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./diagrams/git/parser/gitGraph */ "./src/diagrams/git/parser/gitGraph.jison");
|
|
/* harmony import */ var _diagrams_git_parser_gitGraph__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(_diagrams_git_parser_gitGraph__WEBPACK_IMPORTED_MODULE_24__);
|
|
/* harmony import */ var _diagrams_git_gitGraphAst__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./diagrams/git/gitGraphAst */ "./src/diagrams/git/gitGraphAst.js");
|
|
/* harmony import */ var _diagrams_info_infoRenderer__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./diagrams/info/infoRenderer */ "./src/diagrams/info/infoRenderer.js");
|
|
/* harmony import */ var _diagrams_info_parser_info__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./diagrams/info/parser/info */ "./src/diagrams/info/parser/info.jison");
|
|
/* harmony import */ var _diagrams_info_parser_info__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(_diagrams_info_parser_info__WEBPACK_IMPORTED_MODULE_27__);
|
|
/* harmony import */ var _diagrams_info_infoDb__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./diagrams/info/infoDb */ "./src/diagrams/info/infoDb.js");
|
|
/* harmony import */ var _diagrams_pie_pieRenderer__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./diagrams/pie/pieRenderer */ "./src/diagrams/pie/pieRenderer.js");
|
|
/* harmony import */ var _diagrams_pie_parser_pie__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./diagrams/pie/parser/pie */ "./src/diagrams/pie/parser/pie.jison");
|
|
/* harmony import */ var _diagrams_pie_parser_pie__WEBPACK_IMPORTED_MODULE_30___default = /*#__PURE__*/__webpack_require__.n(_diagrams_pie_parser_pie__WEBPACK_IMPORTED_MODULE_30__);
|
|
/* harmony import */ var _diagrams_pie_pieDb__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./diagrams/pie/pieDb */ "./src/diagrams/pie/pieDb.js");
|
|
/* harmony import */ var _diagrams_er_erDb__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./diagrams/er/erDb */ "./src/diagrams/er/erDb.js");
|
|
/* harmony import */ var _diagrams_er_parser_erDiagram__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./diagrams/er/parser/erDiagram */ "./src/diagrams/er/parser/erDiagram.jison");
|
|
/* harmony import */ var _diagrams_er_parser_erDiagram__WEBPACK_IMPORTED_MODULE_33___default = /*#__PURE__*/__webpack_require__.n(_diagrams_er_parser_erDiagram__WEBPACK_IMPORTED_MODULE_33__);
|
|
/* harmony import */ var _diagrams_er_erRenderer__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./diagrams/er/erRenderer */ "./src/diagrams/er/erRenderer.js");
|
|
/* harmony import */ var _diagrams_user_journey_parser_journey__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./diagrams/user-journey/parser/journey */ "./src/diagrams/user-journey/parser/journey.jison");
|
|
/* harmony import */ var _diagrams_user_journey_parser_journey__WEBPACK_IMPORTED_MODULE_35___default = /*#__PURE__*/__webpack_require__.n(_diagrams_user_journey_parser_journey__WEBPACK_IMPORTED_MODULE_35__);
|
|
/* harmony import */ var _diagrams_user_journey_journeyDb__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./diagrams/user-journey/journeyDb */ "./src/diagrams/user-journey/journeyDb.js");
|
|
/* harmony import */ var _diagrams_user_journey_journeyRenderer__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./diagrams/user-journey/journeyRenderer */ "./src/diagrams/user-journey/journeyRenderer.js");
|
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
|
|
/**
|
|
* This is the api to be used when optionally handling the integration with the web page, instead of using the default integration provided by mermaid.js.
|
|
*
|
|
* The core of this api is the [**render**](https://github.com/knsv/mermaid/blob/master/docs/mermaidAPI.md#render) function which, given a graph
|
|
* definition as text, renders the graph/diagram and returns an svg element for the graph.
|
|
*
|
|
* It is is then up to the user of the API to make use of the svg, either insert it somewhere in the page or do something completely different.
|
|
*
|
|
* In addition to the render function, a number of behavioral configuration options are available.
|
|
*
|
|
* @name mermaidAPI
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var themes = {};
|
|
|
|
for (var _i = 0, _arr = ['default', 'forest', 'dark', 'neutral']; _i < _arr.length; _i++) {
|
|
var themeName = _arr[_i];
|
|
themes[themeName] = __webpack_require__("./src/themes sync recursive ^\\.\\/.*\\/index\\.scss$")("./".concat(themeName, "/index.scss"));
|
|
}
|
|
/**
|
|
* These are the default options which can be overridden with the initialization call like so:
|
|
* **Example 1:**
|
|
* <pre>
|
|
* mermaid.initialize({
|
|
* flowchart:{
|
|
* htmlLabels: false
|
|
* }
|
|
* });
|
|
* </pre>
|
|
*
|
|
* **Example 2:**
|
|
* <pre>
|
|
* <script>
|
|
* var config = {
|
|
* startOnLoad:true,
|
|
* flowchart:{
|
|
* useMaxWidth:true,
|
|
* htmlLabels:true,
|
|
* curve:'cardinal',
|
|
* },
|
|
*
|
|
* securityLevel:'loose',
|
|
* };
|
|
* mermaid.initialize(config);
|
|
* </script>
|
|
* </pre>
|
|
* A summary of all options and their defaults is found [here](https://github.com/knsv/mermaid/blob/master/docs/mermaidAPI.md#mermaidapi-configuration-defaults). A description of each option follows below.
|
|
*
|
|
* @name Configuration
|
|
*/
|
|
|
|
|
|
var config = {
|
|
/** theme , the CSS style sheet
|
|
*
|
|
* **theme** - Choose one of the built-in themes:
|
|
* * default
|
|
* * forest
|
|
* * dark
|
|
* * neutral.
|
|
* To disable any pre-defined mermaid theme, use "null".
|
|
*
|
|
* **themeCSS** - Use your own CSS. This overrides **theme**.
|
|
* <pre>
|
|
* "theme": "forest",
|
|
* "themeCSS": ".node rect { fill: red; }"
|
|
* </pre>
|
|
*/
|
|
theme: 'default',
|
|
themeCSS: undefined,
|
|
|
|
/* **maxTextSize** - The maximum allowed size of the users text diamgram */
|
|
maxTextSize: 50000,
|
|
|
|
/**
|
|
* **fontFamily** The font to be used for the rendered diagrams. Default value is \"trebuchet ms\", verdana, arial;
|
|
*/
|
|
fontFamily: '"trebuchet ms", verdana, arial;',
|
|
|
|
/**
|
|
* This option decides the amount of logging to be used.
|
|
* * debug: 1
|
|
* * info: 2
|
|
* * warn: 3
|
|
* * error: 4
|
|
* * fatal: (**default**) 5
|
|
*/
|
|
logLevel: 5,
|
|
|
|
/**
|
|
* Sets the level of trust to be used on the parsed diagrams.
|
|
* * **strict**: (**default**) tags in text are encoded, click functionality is disabeled
|
|
* * **loose**: tags in text are allowed, click functionality is enabled
|
|
*/
|
|
securityLevel: 'strict',
|
|
|
|
/**
|
|
* This options controls whether or mermaid starts when the page loads
|
|
* **Default value true**.
|
|
*/
|
|
startOnLoad: true,
|
|
|
|
/**
|
|
* This options controls whether or arrow markers in html code will be absolute paths or
|
|
* an anchor, #. This matters if you are using base tag settings.
|
|
* **Default value false**.
|
|
*/
|
|
arrowMarkerAbsolute: false,
|
|
|
|
/**
|
|
* The object containing configurations specific for flowcharts
|
|
*/
|
|
flowchart: {
|
|
/**
|
|
* Flag for setting whether or not a html tag should be used for rendering labels
|
|
* on the edges.
|
|
* **Default value true**.
|
|
*/
|
|
htmlLabels: true,
|
|
|
|
/**
|
|
* Defines the spacing between nodes on the same level (meaning horizontal spacing for
|
|
* TB or BT graphs, and the vertical spacing for LR as well as RL graphs).
|
|
* **Default value 50**.
|
|
*/
|
|
nodeSpacing: 50,
|
|
|
|
/**
|
|
* Defines the spacing between nodes on different levels (meaning vertical spacing for
|
|
* TB or BT graphs, and the horizontal spacing for LR as well as RL graphs).
|
|
* **Default value 50**.
|
|
*/
|
|
rankSpacing: 50,
|
|
|
|
/**
|
|
* How mermaid renders curves for flowcharts. Possible values are
|
|
* * basis
|
|
* * linear **default**
|
|
* * cardinal
|
|
*/
|
|
curve: 'linear',
|
|
// Only used in new experimental rendering
|
|
// repreesents the padding between the labels and the shape
|
|
padding: 15
|
|
},
|
|
|
|
/**
|
|
* The object containing configurations specific for sequence diagrams
|
|
*/
|
|
sequence: {
|
|
/**
|
|
* margin to the right and left of the sequence diagram.
|
|
* **Default value 50**.
|
|
*/
|
|
diagramMarginX: 50,
|
|
|
|
/**
|
|
* margin to the over and under the sequence diagram.
|
|
* **Default value 10**.
|
|
*/
|
|
diagramMarginY: 10,
|
|
|
|
/**
|
|
* Margin between actors.
|
|
* **Default value 50**.
|
|
*/
|
|
actorMargin: 50,
|
|
|
|
/**
|
|
* Width of actor boxes
|
|
* **Default value 150**.
|
|
*/
|
|
width: 150,
|
|
|
|
/**
|
|
* Height of actor boxes
|
|
* **Default value 65**.
|
|
*/
|
|
height: 65,
|
|
|
|
/**
|
|
* Margin around loop boxes
|
|
* **Default value 10**.
|
|
*/
|
|
boxMargin: 10,
|
|
|
|
/**
|
|
* margin around the text in loop/alt/opt boxes
|
|
* **Default value 5**.
|
|
*/
|
|
boxTextMargin: 5,
|
|
|
|
/**
|
|
* margin around notes.
|
|
* **Default value 10**.
|
|
*/
|
|
noteMargin: 10,
|
|
|
|
/**
|
|
* Space between messages.
|
|
* **Default value 35**.
|
|
*/
|
|
messageMargin: 35,
|
|
|
|
/**
|
|
* Multiline message alignment. Possible values are:
|
|
* * left
|
|
* * center **default**
|
|
* * right
|
|
*/
|
|
messageAlign: 'center',
|
|
|
|
/**
|
|
* mirror actors under diagram.
|
|
* **Default value true**.
|
|
*/
|
|
mirrorActors: true,
|
|
|
|
/**
|
|
* Depending on css styling this might need adjustment.
|
|
* Prolongs the edge of the diagram downwards.
|
|
* **Default value 1**.
|
|
*/
|
|
bottomMarginAdj: 1,
|
|
|
|
/**
|
|
* when this flag is set the height and width is set to 100% and is then scaling with the
|
|
* available space if not the absolute space required is used.
|
|
* **Default value true**.
|
|
*/
|
|
useMaxWidth: true,
|
|
|
|
/**
|
|
* This will display arrows that start and begin at the same node as right angles, rather than a curve
|
|
* **Default value false**.
|
|
*/
|
|
rightAngles: false,
|
|
|
|
/**
|
|
* This will show the node numbers
|
|
* **Default value false**.
|
|
*/
|
|
showSequenceNumbers: false,
|
|
|
|
/**
|
|
* This sets the font size of the actor's description
|
|
* **Default value 14**.
|
|
*/
|
|
actorFontSize: 14,
|
|
|
|
/**
|
|
* This sets the font family of the actor's description
|
|
* **Default value "Open-Sans", "sans-serif"**.
|
|
*/
|
|
actorFontFamily: '"Open-Sans", "sans-serif"',
|
|
|
|
/**
|
|
* This sets the font size of actor-attached notes.
|
|
* **Default value 14**.
|
|
*/
|
|
noteFontSize: 14,
|
|
|
|
/**
|
|
* This sets the font family of actor-attached notes.
|
|
* **Default value "trebuchet ms", verdana, arial**.
|
|
*/
|
|
noteFontFamily: '"trebuchet ms", verdana, arial',
|
|
|
|
/**
|
|
* This sets the text alignment of actor-attached notes.
|
|
* **Default value center**.
|
|
*/
|
|
noteAlign: 'center',
|
|
|
|
/**
|
|
* This sets the font size of actor messages.
|
|
* **Default value 16**.
|
|
*/
|
|
messageFontSize: 16,
|
|
|
|
/**
|
|
* This sets the font family of actor messages.
|
|
* **Default value "trebuchet ms", verdana, arial**.
|
|
*/
|
|
messageFontFamily: '"trebuchet ms", verdana, arial'
|
|
},
|
|
|
|
/**
|
|
* The object containing configurations specific for gantt diagrams*
|
|
*/
|
|
gantt: {
|
|
/**
|
|
* Margin top for the text over the gantt diagram
|
|
* **Default value 25**.
|
|
*/
|
|
titleTopMargin: 25,
|
|
|
|
/**
|
|
* The height of the bars in the graph
|
|
* **Default value 20**.
|
|
*/
|
|
barHeight: 20,
|
|
|
|
/**
|
|
* The margin between the different activities in the gantt diagram.
|
|
* **Default value 4**.
|
|
*/
|
|
barGap: 4,
|
|
|
|
/**
|
|
* Margin between title and gantt diagram and between axis and gantt diagram.
|
|
* **Default value 50**.
|
|
*/
|
|
topPadding: 50,
|
|
|
|
/**
|
|
* The space allocated for the section name to the left of the activities.
|
|
* **Default value 75**.
|
|
*/
|
|
leftPadding: 75,
|
|
|
|
/**
|
|
* Vertical starting position of the grid lines.
|
|
* **Default value 35**.
|
|
*/
|
|
gridLineStartPadding: 35,
|
|
|
|
/**
|
|
* Font size ...
|
|
* **Default value 11**.
|
|
*/
|
|
fontSize: 11,
|
|
|
|
/**
|
|
* font family ...
|
|
* **Default value '"Open-Sans", "sans-serif"'**.
|
|
*/
|
|
fontFamily: '"Open-Sans", "sans-serif"',
|
|
|
|
/**
|
|
* The number of alternating section styles.
|
|
* **Default value 4**.
|
|
*/
|
|
numberSectionStyles: 4,
|
|
|
|
/**
|
|
* Datetime format of the axis. This might need adjustment to match your locale and preferences
|
|
* **Default value '%Y-%m-%d'**.
|
|
*/
|
|
axisFormat: '%Y-%m-%d'
|
|
},
|
|
|
|
/**
|
|
* The object containing configurations specific for sequence diagrams
|
|
*/
|
|
journey: {
|
|
/**
|
|
* margin to the right and left of the sequence diagram.
|
|
* **Default value 50**.
|
|
*/
|
|
diagramMarginX: 50,
|
|
|
|
/**
|
|
* margin to the over and under the sequence diagram.
|
|
* **Default value 10**.
|
|
*/
|
|
diagramMarginY: 10,
|
|
|
|
/**
|
|
* Margin between actors.
|
|
* **Default value 50**.
|
|
*/
|
|
actorMargin: 50,
|
|
|
|
/**
|
|
* Width of actor boxes
|
|
* **Default value 150**.
|
|
*/
|
|
width: 150,
|
|
|
|
/**
|
|
* Height of actor boxes
|
|
* **Default value 65**.
|
|
*/
|
|
height: 65,
|
|
|
|
/**
|
|
* Margin around loop boxes
|
|
* **Default value 10**.
|
|
*/
|
|
boxMargin: 10,
|
|
|
|
/**
|
|
* margin around the text in loop/alt/opt boxes
|
|
* **Default value 5**.
|
|
*/
|
|
boxTextMargin: 5,
|
|
|
|
/**
|
|
* margin around notes.
|
|
* **Default value 10**.
|
|
*/
|
|
noteMargin: 10,
|
|
|
|
/**
|
|
* Space between messages.
|
|
* **Default value 35**.
|
|
*/
|
|
messageMargin: 35,
|
|
|
|
/**
|
|
* Multiline message alignment. Possible values are:
|
|
* * left
|
|
* * center **default**
|
|
* * right
|
|
*/
|
|
messageAlign: 'center',
|
|
|
|
/**
|
|
* Depending on css styling this might need adjustment.
|
|
* Prolongs the edge of the diagram downwards.
|
|
* **Default value 1**.
|
|
*/
|
|
bottomMarginAdj: 1,
|
|
|
|
/**
|
|
* when this flag is set the height and width is set to 100% and is then scaling with the
|
|
* available space if not the absolute space required is used.
|
|
* **Default value true**.
|
|
*/
|
|
useMaxWidth: true,
|
|
|
|
/**
|
|
* This will display arrows that start and begin at the same node as right angles, rather than a curve
|
|
* **Default value false**.
|
|
*/
|
|
rightAngles: false
|
|
},
|
|
class: {},
|
|
git: {},
|
|
state: {
|
|
dividerMargin: 10,
|
|
sizeUnit: 5,
|
|
padding: 8,
|
|
textHeight: 10,
|
|
titleShift: -15,
|
|
noteMargin: 10,
|
|
forkWidth: 70,
|
|
forkHeight: 7,
|
|
// Used
|
|
miniPadding: 2,
|
|
// Font size factor, this is used to guess the width of the edges labels before rendering by dagre
|
|
// layout. This might need updating if/when switching font
|
|
fontSizeFactor: 5.02,
|
|
fontSize: 24,
|
|
labelHeight: 16,
|
|
edgeLengthFactor: '20',
|
|
compositTitleSize: 35,
|
|
radius: 5
|
|
},
|
|
|
|
/**
|
|
* The object containing configurations specific for entity relationship diagrams
|
|
*/
|
|
er: {
|
|
/**
|
|
* The amount of padding around the diagram as a whole so that embedded diagrams have margins, expressed in pixels
|
|
*/
|
|
diagramPadding: 20,
|
|
|
|
/**
|
|
* Directional bias for layout of entities. Can be either 'TB', 'BT', 'LR', or 'RL',
|
|
* where T = top, B = bottom, L = left, and R = right.
|
|
*/
|
|
layoutDirection: 'TB',
|
|
|
|
/**
|
|
* The mimimum width of an entity box, expressed in pixels
|
|
*/
|
|
minEntityWidth: 100,
|
|
|
|
/**
|
|
* The minimum height of an entity box, expressed in pixels
|
|
*/
|
|
minEntityHeight: 75,
|
|
|
|
/**
|
|
* The minimum internal padding between the text in an entity box and the enclosing box borders, expressed in pixels
|
|
*/
|
|
entityPadding: 15,
|
|
|
|
/**
|
|
* Stroke color of box edges and lines
|
|
*/
|
|
stroke: 'gray',
|
|
|
|
/**
|
|
* Fill color of entity boxes
|
|
*/
|
|
fill: 'honeydew',
|
|
|
|
/**
|
|
* Font size (expressed as an integer representing a number of pixels)
|
|
*/
|
|
fontSize: 12
|
|
}
|
|
};
|
|
Object(_logger__WEBPACK_IMPORTED_MODULE_4__["setLogLevel"])(config.logLevel);
|
|
Object(_config__WEBPACK_IMPORTED_MODULE_3__["setConfig"])(config);
|
|
|
|
function parse(text) {
|
|
var graphType = _utils__WEBPACK_IMPORTED_MODULE_5__["default"].detectType(text);
|
|
var parser;
|
|
_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].debug('Type ' + graphType);
|
|
|
|
switch (graphType) {
|
|
case 'git':
|
|
parser = _diagrams_git_parser_gitGraph__WEBPACK_IMPORTED_MODULE_24___default.a;
|
|
parser.parser.yy = _diagrams_git_gitGraphAst__WEBPACK_IMPORTED_MODULE_25__["default"];
|
|
break;
|
|
|
|
case 'flowchart':
|
|
_diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_9__["default"].clear();
|
|
parser = _diagrams_flowchart_parser_flow__WEBPACK_IMPORTED_MODULE_8___default.a;
|
|
parser.parser.yy = _diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_9__["default"];
|
|
break;
|
|
|
|
case 'flowchart-v2':
|
|
_diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_9__["default"].clear();
|
|
parser = _diagrams_flowchart_parser_flow__WEBPACK_IMPORTED_MODULE_8___default.a;
|
|
parser.parser.yy = _diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_9__["default"];
|
|
break;
|
|
|
|
case 'sequence':
|
|
parser = _diagrams_sequence_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_11___default.a;
|
|
parser.parser.yy = _diagrams_sequence_sequenceDb__WEBPACK_IMPORTED_MODULE_12__["default"];
|
|
break;
|
|
|
|
case 'gantt':
|
|
parser = _diagrams_gantt_parser_gantt__WEBPACK_IMPORTED_MODULE_14___default.a;
|
|
parser.parser.yy = _diagrams_gantt_ganttDb__WEBPACK_IMPORTED_MODULE_15__["default"];
|
|
break;
|
|
|
|
case 'class':
|
|
parser = _diagrams_class_parser_classDiagram__WEBPACK_IMPORTED_MODULE_17___default.a;
|
|
parser.parser.yy = _diagrams_class_classDb__WEBPACK_IMPORTED_MODULE_18__["default"];
|
|
break;
|
|
|
|
case 'state':
|
|
parser = _diagrams_state_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_21___default.a;
|
|
parser.parser.yy = _diagrams_state_stateDb__WEBPACK_IMPORTED_MODULE_22__["default"];
|
|
break;
|
|
|
|
case 'stateDiagram':
|
|
parser = _diagrams_state_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_21___default.a;
|
|
parser.parser.yy = _diagrams_state_stateDb__WEBPACK_IMPORTED_MODULE_22__["default"];
|
|
break;
|
|
|
|
case 'info':
|
|
_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].debug('info info info');
|
|
parser = _diagrams_info_parser_info__WEBPACK_IMPORTED_MODULE_27___default.a;
|
|
parser.parser.yy = _diagrams_info_infoDb__WEBPACK_IMPORTED_MODULE_28__["default"];
|
|
break;
|
|
|
|
case 'pie':
|
|
_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].debug('pie');
|
|
parser = _diagrams_pie_parser_pie__WEBPACK_IMPORTED_MODULE_30___default.a;
|
|
parser.parser.yy = _diagrams_pie_pieDb__WEBPACK_IMPORTED_MODULE_31__["default"];
|
|
break;
|
|
|
|
case 'er':
|
|
_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].debug('er');
|
|
parser = _diagrams_er_parser_erDiagram__WEBPACK_IMPORTED_MODULE_33___default.a;
|
|
parser.parser.yy = _diagrams_er_erDb__WEBPACK_IMPORTED_MODULE_32__["default"];
|
|
break;
|
|
|
|
case 'journey':
|
|
_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].debug('Journey');
|
|
parser = _diagrams_user_journey_parser_journey__WEBPACK_IMPORTED_MODULE_35___default.a;
|
|
parser.parser.yy = _diagrams_user_journey_journeyDb__WEBPACK_IMPORTED_MODULE_36__["default"];
|
|
break;
|
|
}
|
|
|
|
parser.parser.yy.parseError = function (str, hash) {
|
|
var error = {
|
|
str: str,
|
|
hash: hash
|
|
};
|
|
throw error;
|
|
};
|
|
|
|
parser.parse(text);
|
|
}
|
|
|
|
var encodeEntities = function encodeEntities(text) {
|
|
var txt = text;
|
|
txt = txt.replace(/style.*:\S*#.*;/g, function (s) {
|
|
var innerTxt = s.substring(0, s.length - 1);
|
|
return innerTxt;
|
|
});
|
|
txt = txt.replace(/classDef.*:\S*#.*;/g, function (s) {
|
|
var innerTxt = s.substring(0, s.length - 1);
|
|
return innerTxt;
|
|
});
|
|
txt = txt.replace(/#\w+;/g, function (s) {
|
|
var innerTxt = s.substring(1, s.length - 1);
|
|
var isInt = /^\+?\d+$/.test(innerTxt);
|
|
|
|
if (isInt) {
|
|
return 'fl°°' + innerTxt + '¶ß';
|
|
} else {
|
|
return 'fl°' + innerTxt + '¶ß';
|
|
}
|
|
});
|
|
return txt;
|
|
};
|
|
var decodeEntities = function decodeEntities(text) {
|
|
var txt = text;
|
|
txt = txt.replace(/fl°°/g, function () {
|
|
return '&#';
|
|
});
|
|
txt = txt.replace(/fl°/g, function () {
|
|
return '&';
|
|
});
|
|
txt = txt.replace(/¶ß/g, function () {
|
|
return ';';
|
|
});
|
|
return txt;
|
|
};
|
|
/**
|
|
* Function that renders an svg with a graph from a chart definition. Usage example below.
|
|
*
|
|
* ```js
|
|
* mermaidAPI.initialize({
|
|
* startOnLoad:true
|
|
* });
|
|
* $(function(){
|
|
* const graphDefinition = 'graph TB\na-->b';
|
|
* const cb = function(svgGraph){
|
|
* console.log(svgGraph);
|
|
* };
|
|
* mermaidAPI.render('id1',graphDefinition,cb);
|
|
* });
|
|
*```
|
|
* @param id the id of the element to be rendered
|
|
* @param txt the graph definition
|
|
* @param cb callback which is called after rendering is finished with the svg code as inparam.
|
|
* @param container selector to element in which a div with the graph temporarily will be inserted. In one is
|
|
* provided a hidden div will be inserted in the body of the page instead. The element will be removed when rendering is
|
|
* completed.
|
|
*/
|
|
|
|
var render = function render(id, _txt, cb, container) {
|
|
// Check the maximum allowed text size
|
|
var txt = _txt;
|
|
|
|
if (_txt.length > config.maxTextSize) {
|
|
txt = 'graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa';
|
|
}
|
|
|
|
if (typeof container !== 'undefined') {
|
|
container.innerHTML = '';
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(container).append('div').attr('id', 'd' + id).attr('style', 'font-family: ' + config.fontFamily).append('svg').attr('id', id).attr('width', '100%').attr('xmlns', 'http://www.w3.org/2000/svg').append('g');
|
|
} else {
|
|
var existingSvg = document.getElementById(id);
|
|
|
|
if (existingSvg) {
|
|
existingSvg.remove();
|
|
}
|
|
|
|
var _element = document.querySelector('#' + 'd' + id);
|
|
|
|
if (_element) {
|
|
_element.innerHTML = '';
|
|
}
|
|
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('body').append('div').attr('id', 'd' + id).append('svg').attr('id', id).attr('width', '100%').attr('xmlns', 'http://www.w3.org/2000/svg').append('g');
|
|
}
|
|
|
|
window.txt = txt;
|
|
txt = encodeEntities(txt);
|
|
var element = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#d' + id).node();
|
|
var graphType = _utils__WEBPACK_IMPORTED_MODULE_5__["default"].detectType(txt); // insert inline style into svg
|
|
|
|
var svg = element.firstChild;
|
|
var firstChild = svg.firstChild; // pre-defined theme
|
|
|
|
var style = themes[config.theme];
|
|
|
|
if (style === undefined) {
|
|
style = '';
|
|
} // user provided theme CSS
|
|
|
|
|
|
if (config.themeCSS !== undefined) {
|
|
style += "\n".concat(config.themeCSS);
|
|
} // user provided theme CSS
|
|
|
|
|
|
if (config.fontFamily !== undefined) {
|
|
style += "\n:root { --mermaid-font-family: ".concat(config.fontFamily, "}");
|
|
} // user provided theme CSS
|
|
|
|
|
|
if (config.altFontFamily !== undefined) {
|
|
style += "\n:root { --mermaid-alt-font-family: ".concat(config.altFontFamily, "}");
|
|
} // classDef
|
|
|
|
|
|
if (graphType === 'flowchart' || graphType === 'flowchart-v2') {
|
|
var classes = _diagrams_flowchart_flowRenderer__WEBPACK_IMPORTED_MODULE_6__["default"].getClasses(txt);
|
|
|
|
for (var className in classes) {
|
|
style += "\n.".concat(className, " > * { ").concat(classes[className].styles.join(' !important; '), " !important; }");
|
|
|
|
if (classes[className].textStyles) {
|
|
style += "\n.".concat(className, " tspan { ").concat(classes[className].textStyles.join(' !important; '), " !important; }");
|
|
}
|
|
}
|
|
}
|
|
|
|
var style1 = document.createElement('style');
|
|
style1.innerHTML = scope_css__WEBPACK_IMPORTED_MODULE_1___default()(style, "#".concat(id));
|
|
svg.insertBefore(style1, firstChild);
|
|
var style2 = document.createElement('style');
|
|
var cs = window.getComputedStyle(svg);
|
|
style2.innerHTML = "#".concat(id, " {\n color: ").concat(cs.color, ";\n font: ").concat(cs.font, ";\n }");
|
|
svg.insertBefore(style2, firstChild);
|
|
|
|
switch (graphType) {
|
|
case 'git':
|
|
config.flowchart.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
|
|
_diagrams_git_gitGraphRenderer__WEBPACK_IMPORTED_MODULE_23__["default"].setConf(config.git);
|
|
_diagrams_git_gitGraphRenderer__WEBPACK_IMPORTED_MODULE_23__["default"].draw(txt, id, false);
|
|
break;
|
|
|
|
case 'flowchart':
|
|
config.flowchart.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
|
|
_diagrams_flowchart_flowRenderer__WEBPACK_IMPORTED_MODULE_6__["default"].setConf(config.flowchart);
|
|
_diagrams_flowchart_flowRenderer__WEBPACK_IMPORTED_MODULE_6__["default"].draw(txt, id, false);
|
|
break;
|
|
|
|
case 'flowchart-v2':
|
|
config.flowchart.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
|
|
_diagrams_flowchart_flowRenderer_v2__WEBPACK_IMPORTED_MODULE_7__["default"].setConf(config.flowchart);
|
|
_diagrams_flowchart_flowRenderer_v2__WEBPACK_IMPORTED_MODULE_7__["default"].draw(txt, id, false);
|
|
break;
|
|
|
|
case 'sequence':
|
|
config.sequence.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
|
|
|
|
if (config.sequenceDiagram) {
|
|
// backwards compatibility
|
|
_diagrams_sequence_sequenceRenderer__WEBPACK_IMPORTED_MODULE_10__["default"].setConf(Object.assign(config.sequence, config.sequenceDiagram));
|
|
console.error('`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.');
|
|
} else {
|
|
_diagrams_sequence_sequenceRenderer__WEBPACK_IMPORTED_MODULE_10__["default"].setConf(config.sequence);
|
|
}
|
|
|
|
_diagrams_sequence_sequenceRenderer__WEBPACK_IMPORTED_MODULE_10__["default"].draw(txt, id);
|
|
break;
|
|
|
|
case 'gantt':
|
|
config.gantt.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
|
|
_diagrams_gantt_ganttRenderer__WEBPACK_IMPORTED_MODULE_13__["default"].setConf(config.gantt);
|
|
_diagrams_gantt_ganttRenderer__WEBPACK_IMPORTED_MODULE_13__["default"].draw(txt, id);
|
|
break;
|
|
|
|
case 'class':
|
|
config.class.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
|
|
_diagrams_class_classRenderer__WEBPACK_IMPORTED_MODULE_16__["default"].setConf(config.class);
|
|
_diagrams_class_classRenderer__WEBPACK_IMPORTED_MODULE_16__["default"].draw(txt, id);
|
|
break;
|
|
|
|
case 'state':
|
|
// config.class.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
|
|
_diagrams_state_stateRenderer__WEBPACK_IMPORTED_MODULE_19__["default"].setConf(config.state);
|
|
_diagrams_state_stateRenderer__WEBPACK_IMPORTED_MODULE_19__["default"].draw(txt, id);
|
|
break;
|
|
|
|
case 'stateDiagram':
|
|
// config.class.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
|
|
_diagrams_state_stateRenderer_v2__WEBPACK_IMPORTED_MODULE_20__["default"].setConf(config.state);
|
|
_diagrams_state_stateRenderer_v2__WEBPACK_IMPORTED_MODULE_20__["default"].draw(txt, id);
|
|
break;
|
|
|
|
case 'info':
|
|
config.class.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
|
|
_diagrams_info_infoRenderer__WEBPACK_IMPORTED_MODULE_26__["default"].setConf(config.class);
|
|
_diagrams_info_infoRenderer__WEBPACK_IMPORTED_MODULE_26__["default"].draw(txt, id, _package_json__WEBPACK_IMPORTED_MODULE_2__.version);
|
|
break;
|
|
|
|
case 'pie':
|
|
config.class.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
|
|
_diagrams_pie_pieRenderer__WEBPACK_IMPORTED_MODULE_29__["default"].setConf(config.class);
|
|
_diagrams_pie_pieRenderer__WEBPACK_IMPORTED_MODULE_29__["default"].draw(txt, id, _package_json__WEBPACK_IMPORTED_MODULE_2__.version);
|
|
break;
|
|
|
|
case 'er':
|
|
_diagrams_er_erRenderer__WEBPACK_IMPORTED_MODULE_34__["default"].setConf(config.er);
|
|
_diagrams_er_erRenderer__WEBPACK_IMPORTED_MODULE_34__["default"].draw(txt, id, _package_json__WEBPACK_IMPORTED_MODULE_2__.version);
|
|
break;
|
|
|
|
case 'journey':
|
|
_diagrams_user_journey_journeyRenderer__WEBPACK_IMPORTED_MODULE_37__["default"].setConf(config.journey);
|
|
_diagrams_user_journey_journeyRenderer__WEBPACK_IMPORTED_MODULE_37__["default"].draw(txt, id, _package_json__WEBPACK_IMPORTED_MODULE_2__.version);
|
|
break;
|
|
}
|
|
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id=\"".concat(id, "\"]")).selectAll('foreignobject > *').attr('xmlns', 'http://www.w3.org/1999/xhtml'); // if (config.arrowMarkerAbsolute) {
|
|
// url =
|
|
// window.location.protocol +
|
|
// '//' +
|
|
// window.location.host +
|
|
// window.location.pathname +
|
|
// window.location.search;
|
|
// url = url.replace(/\(/g, '\\(');
|
|
// url = url.replace(/\)/g, '\\)');
|
|
// }
|
|
// Fix for when the base tag is used
|
|
|
|
var svgCode = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#d' + id).node().innerHTML;
|
|
|
|
if (!config.arrowMarkerAbsolute || config.arrowMarkerAbsolute === 'false') {
|
|
svgCode = svgCode.replace(/marker-end="url\(.*?#/g, 'marker-end="url(#', 'g');
|
|
}
|
|
|
|
svgCode = decodeEntities(svgCode);
|
|
|
|
if (typeof cb !== 'undefined') {
|
|
switch (graphType) {
|
|
case 'flowchart':
|
|
case 'flowchart-v2':
|
|
cb(svgCode, _diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_9__["default"].bindFunctions);
|
|
break;
|
|
|
|
case 'gantt':
|
|
cb(svgCode, _diagrams_gantt_ganttDb__WEBPACK_IMPORTED_MODULE_15__["default"].bindFunctions);
|
|
break;
|
|
|
|
case 'class':
|
|
cb(svgCode, _diagrams_class_classDb__WEBPACK_IMPORTED_MODULE_18__["default"].bindFunctions);
|
|
break;
|
|
|
|
default:
|
|
cb(svgCode);
|
|
}
|
|
} else {
|
|
_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].debug('CB = undefined!');
|
|
}
|
|
|
|
var node = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#d' + id).node();
|
|
|
|
if (node !== null && typeof node.remove === 'function') {
|
|
Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#d' + id).node().remove();
|
|
}
|
|
|
|
return svgCode;
|
|
};
|
|
|
|
var setConf = function setConf(cnf) {
|
|
// Top level initially mermaid, gflow, sequenceDiagram and gantt
|
|
var lvl1Keys = Object.keys(cnf);
|
|
|
|
for (var i = 0; i < lvl1Keys.length; i++) {
|
|
if (_typeof(cnf[lvl1Keys[i]]) === 'object' && cnf[lvl1Keys[i]] != null) {
|
|
var lvl2Keys = Object.keys(cnf[lvl1Keys[i]]);
|
|
|
|
for (var j = 0; j < lvl2Keys.length; j++) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].debug('Setting conf ', lvl1Keys[i], '-', lvl2Keys[j]);
|
|
|
|
if (typeof config[lvl1Keys[i]] === 'undefined') {
|
|
config[lvl1Keys[i]] = {};
|
|
}
|
|
|
|
_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].debug('Setting config: ' + lvl1Keys[i] + ' ' + lvl2Keys[j] + ' to ' + cnf[lvl1Keys[i]][lvl2Keys[j]]);
|
|
config[lvl1Keys[i]][lvl2Keys[j]] = cnf[lvl1Keys[i]][lvl2Keys[j]];
|
|
}
|
|
} else {
|
|
config[lvl1Keys[i]] = cnf[lvl1Keys[i]];
|
|
}
|
|
}
|
|
};
|
|
|
|
function initialize(options) {
|
|
_logger__WEBPACK_IMPORTED_MODULE_4__["logger"].debug('Initializing mermaidAPI ', _package_json__WEBPACK_IMPORTED_MODULE_2__.version); // Update default config with options supplied at initialization
|
|
|
|
if (_typeof(options) === 'object') {
|
|
setConf(options);
|
|
}
|
|
|
|
Object(_config__WEBPACK_IMPORTED_MODULE_3__["setConfig"])(config);
|
|
Object(_logger__WEBPACK_IMPORTED_MODULE_4__["setLogLevel"])(config.logLevel);
|
|
} // function getConfig () {
|
|
// console.warn('get config')
|
|
// return config
|
|
// }
|
|
|
|
|
|
var mermaidAPI = {
|
|
render: render,
|
|
parse: parse,
|
|
initialize: initialize,
|
|
getConfig: _config__WEBPACK_IMPORTED_MODULE_3__["getConfig"]
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = (mermaidAPI);
|
|
/**
|
|
* ## mermaidAPI configuration defaults
|
|
* <pre>
|
|
*
|
|
* <script>
|
|
* var config = {
|
|
* theme:'default',
|
|
* logLevel:'fatal',
|
|
* securityLevel:'strict',
|
|
* startOnLoad:true,
|
|
* arrowMarkerAbsolute:false,
|
|
*
|
|
* flowchart:{
|
|
* htmlLabels:true,
|
|
* curve:'linear',
|
|
* },
|
|
* sequence:{
|
|
* diagramMarginX:50,
|
|
* diagramMarginY:10,
|
|
* actorMargin:50,
|
|
* width:150,
|
|
* height:65,
|
|
* boxMargin:10,
|
|
* boxTextMargin:5,
|
|
* noteMargin:10,
|
|
* messageMargin:35,
|
|
* messageAlign:'center',
|
|
* mirrorActors:true,
|
|
* bottomMarginAdj:1,
|
|
* useMaxWidth:true,
|
|
* rightAngles:false,
|
|
* showSequenceNumbers:false,
|
|
* },
|
|
* gantt:{
|
|
* titleTopMargin:25,
|
|
* barHeight:20,
|
|
* barGap:4,
|
|
* topPadding:50,
|
|
* leftPadding:75,
|
|
* gridLineStartPadding:35,
|
|
* fontSize:11,
|
|
* fontFamily:'"Open-Sans", "sans-serif"',
|
|
* numberSectionStyles:4,
|
|
* axisFormat:'%Y-%m-%d',
|
|
* }
|
|
* };
|
|
* mermaid.initialize(config);
|
|
* </script>
|
|
*</pre>
|
|
*/
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/themes sync recursive ^\\.\\/.*\\/index\\.scss$":
|
|
/*!***********************************************!*\
|
|
!*** ./src/themes sync ^\.\/.*\/index\.scss$ ***!
|
|
\***********************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var map = {
|
|
"./dark/index.scss": "./src/themes/dark/index.scss",
|
|
"./default/index.scss": "./src/themes/default/index.scss",
|
|
"./forest/index.scss": "./src/themes/forest/index.scss",
|
|
"./neutral/index.scss": "./src/themes/neutral/index.scss"
|
|
};
|
|
|
|
|
|
function webpackContext(req) {
|
|
var id = webpackContextResolve(req);
|
|
return __webpack_require__(id);
|
|
}
|
|
function webpackContextResolve(req) {
|
|
if(!__webpack_require__.o(map, req)) {
|
|
var e = new Error("Cannot find module '" + req + "'");
|
|
e.code = 'MODULE_NOT_FOUND';
|
|
throw e;
|
|
}
|
|
return map[req];
|
|
}
|
|
webpackContext.keys = function webpackContextKeys() {
|
|
return Object.keys(map);
|
|
};
|
|
webpackContext.resolve = webpackContextResolve;
|
|
module.exports = webpackContext;
|
|
webpackContext.id = "./src/themes sync recursive ^\\.\\/.*\\/index\\.scss$";
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/themes/dark/index.scss":
|
|
/*!************************************!*\
|
|
!*** ./src/themes/dark/index.scss ***!
|
|
\************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
// css-to-string-loader: transforms styles from css-loader to a string output
|
|
|
|
// Get the styles
|
|
var styles = __webpack_require__(/*! !../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/sass-loader/dist/cjs.js!./index.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/dark/index.scss");
|
|
|
|
if (typeof styles === 'string') {
|
|
// Return an existing string
|
|
module.exports = styles;
|
|
} else {
|
|
// Call the custom toString method from css-loader module
|
|
module.exports = styles.toString();
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/themes/default/index.scss":
|
|
/*!***************************************!*\
|
|
!*** ./src/themes/default/index.scss ***!
|
|
\***************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
// css-to-string-loader: transforms styles from css-loader to a string output
|
|
|
|
// Get the styles
|
|
var styles = __webpack_require__(/*! !../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/sass-loader/dist/cjs.js!./index.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/default/index.scss");
|
|
|
|
if (typeof styles === 'string') {
|
|
// Return an existing string
|
|
module.exports = styles;
|
|
} else {
|
|
// Call the custom toString method from css-loader module
|
|
module.exports = styles.toString();
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/themes/forest/index.scss":
|
|
/*!**************************************!*\
|
|
!*** ./src/themes/forest/index.scss ***!
|
|
\**************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
// css-to-string-loader: transforms styles from css-loader to a string output
|
|
|
|
// Get the styles
|
|
var styles = __webpack_require__(/*! !../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/sass-loader/dist/cjs.js!./index.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/forest/index.scss");
|
|
|
|
if (typeof styles === 'string') {
|
|
// Return an existing string
|
|
module.exports = styles;
|
|
} else {
|
|
// Call the custom toString method from css-loader module
|
|
module.exports = styles.toString();
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/themes/neutral/index.scss":
|
|
/*!***************************************!*\
|
|
!*** ./src/themes/neutral/index.scss ***!
|
|
\***************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
// css-to-string-loader: transforms styles from css-loader to a string output
|
|
|
|
// Get the styles
|
|
var styles = __webpack_require__(/*! !../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/sass-loader/dist/cjs.js!./index.scss */ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/themes/neutral/index.scss");
|
|
|
|
if (typeof styles === 'string') {
|
|
// Return an existing string
|
|
module.exports = styles;
|
|
} else {
|
|
// Call the custom toString method from css-loader module
|
|
module.exports = styles.toString();
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/utils.js":
|
|
/*!**********************!*\
|
|
!*** ./src/utils.js ***!
|
|
\**********************/
|
|
/*! exports provided: detectType, isSubstringInArray, interpolateToCurve, formatUrl, getStylesFromArray, generateId, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "detectType", function() { return detectType; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSubstringInArray", function() { return isSubstringInArray; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateToCurve", function() { return interpolateToCurve; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatUrl", function() { return formatUrl; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getStylesFromArray", function() { return getStylesFromArray; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generateId", function() { return generateId; });
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "d3");
|
|
/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(d3__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./logger */ "./src/logger.js");
|
|
/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @braintree/sanitize-url */ "@braintree/sanitize-url");
|
|
/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_2__);
|
|
|
|
|
|
// Effectively an enum of the supported curve types, accessible by name
|
|
|
|
var d3CurveTypes = {
|
|
curveBasis: d3__WEBPACK_IMPORTED_MODULE_0__["curveBasis"],
|
|
curveBasisClosed: d3__WEBPACK_IMPORTED_MODULE_0__["curveBasisClosed"],
|
|
curveBasisOpen: d3__WEBPACK_IMPORTED_MODULE_0__["curveBasisOpen"],
|
|
curveLinear: d3__WEBPACK_IMPORTED_MODULE_0__["curveLinear"],
|
|
curveLinearClosed: d3__WEBPACK_IMPORTED_MODULE_0__["curveLinearClosed"],
|
|
curveMonotoneX: d3__WEBPACK_IMPORTED_MODULE_0__["curveMonotoneX"],
|
|
curveMonotoneY: d3__WEBPACK_IMPORTED_MODULE_0__["curveMonotoneY"],
|
|
curveNatural: d3__WEBPACK_IMPORTED_MODULE_0__["curveNatural"],
|
|
curveStep: d3__WEBPACK_IMPORTED_MODULE_0__["curveStep"],
|
|
curveStepAfter: d3__WEBPACK_IMPORTED_MODULE_0__["curveStepAfter"],
|
|
curveStepBefore: d3__WEBPACK_IMPORTED_MODULE_0__["curveStepBefore"]
|
|
};
|
|
/**
|
|
* @function detectType
|
|
* Detects the type of the graph text.
|
|
* ```mermaid
|
|
* graph LR
|
|
* a-->b
|
|
* b-->c
|
|
* c-->d
|
|
* d-->e
|
|
* e-->f
|
|
* f-->g
|
|
* g-->h
|
|
* ```
|
|
*
|
|
* @param {string} text The text defining the graph
|
|
* @returns {string} A graph definition key
|
|
*/
|
|
|
|
var detectType = function detectType(text) {
|
|
text = text.replace(/^\s*%%.*\n/g, '\n');
|
|
_logger__WEBPACK_IMPORTED_MODULE_1__["logger"].debug('Detecting diagram type based on the text ' + text);
|
|
|
|
if (text.match(/^\s*sequenceDiagram/)) {
|
|
return 'sequence';
|
|
}
|
|
|
|
if (text.match(/^\s*gantt/)) {
|
|
return 'gantt';
|
|
}
|
|
|
|
if (text.match(/^\s*classDiagram/)) {
|
|
return 'class';
|
|
}
|
|
|
|
if (text.match(/^\s*stateDiagram-v2/)) {
|
|
return 'stateDiagram';
|
|
}
|
|
|
|
if (text.match(/^\s*stateDiagram/)) {
|
|
return 'state';
|
|
}
|
|
|
|
if (text.match(/^\s*gitGraph/)) {
|
|
return 'git';
|
|
}
|
|
|
|
if (text.match(/^\s*flowchart/)) {
|
|
return 'flowchart-v2';
|
|
}
|
|
|
|
if (text.match(/^\s*info/)) {
|
|
return 'info';
|
|
}
|
|
|
|
if (text.match(/^\s*pie/)) {
|
|
return 'pie';
|
|
}
|
|
|
|
if (text.match(/^\s*erDiagram/)) {
|
|
return 'er';
|
|
}
|
|
|
|
if (text.match(/^\s*journey/)) {
|
|
return 'journey';
|
|
}
|
|
|
|
return 'flowchart';
|
|
};
|
|
/**
|
|
* @function isSubstringInArray
|
|
* Detects whether a substring in present in a given array
|
|
* @param {string} str The substring to detect
|
|
* @param {array} arr The array to search
|
|
* @returns {number} the array index containing the substring or -1 if not present
|
|
**/
|
|
|
|
var isSubstringInArray = function isSubstringInArray(str, arr) {
|
|
for (var i = 0; i < arr.length; i++) {
|
|
if (arr[i].match(str)) return i;
|
|
}
|
|
|
|
return -1;
|
|
};
|
|
var interpolateToCurve = function interpolateToCurve(interpolate, defaultCurve) {
|
|
if (!interpolate) {
|
|
return defaultCurve;
|
|
}
|
|
|
|
var curveName = "curve".concat(interpolate.charAt(0).toUpperCase() + interpolate.slice(1));
|
|
return d3CurveTypes[curveName] || defaultCurve;
|
|
};
|
|
var formatUrl = function formatUrl(linkStr, config) {
|
|
var url = linkStr.trim();
|
|
|
|
if (url) {
|
|
if (config.securityLevel !== 'loose') {
|
|
return Object(_braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_2__["sanitizeUrl"])(url);
|
|
}
|
|
|
|
return url;
|
|
}
|
|
};
|
|
|
|
var distance = function distance(p1, p2) {
|
|
return p1 && p2 ? Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)) : 0;
|
|
};
|
|
|
|
var traverseEdge = function traverseEdge(points) {
|
|
var prevPoint;
|
|
var totalDistance = 0;
|
|
points.forEach(function (point) {
|
|
totalDistance += distance(point, prevPoint);
|
|
prevPoint = point;
|
|
}); // Traverse half of total distance along points
|
|
|
|
var distanceToLabel = totalDistance / 2;
|
|
var remainingDistance = distanceToLabel;
|
|
var center;
|
|
prevPoint = undefined;
|
|
points.forEach(function (point) {
|
|
if (prevPoint && !center) {
|
|
var vectorDistance = distance(point, prevPoint);
|
|
|
|
if (vectorDistance < remainingDistance) {
|
|
remainingDistance -= vectorDistance;
|
|
} else {
|
|
// The point is remainingDistance from prevPoint in the vector between prevPoint and point
|
|
// Calculate the coordinates
|
|
var distanceRatio = remainingDistance / vectorDistance;
|
|
if (distanceRatio <= 0) center = prevPoint;
|
|
if (distanceRatio >= 1) center = {
|
|
x: point.x,
|
|
y: point.y
|
|
};
|
|
|
|
if (distanceRatio > 0 && distanceRatio < 1) {
|
|
center = {
|
|
x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point.x,
|
|
y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point.y
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
prevPoint = point;
|
|
});
|
|
return center;
|
|
};
|
|
|
|
var calcLabelPosition = function calcLabelPosition(points) {
|
|
var p = traverseEdge(points);
|
|
return p;
|
|
};
|
|
|
|
var calcCardinalityPosition = function calcCardinalityPosition(isRelationTypePresent, points, initialPosition) {
|
|
var prevPoint;
|
|
var totalDistance = 0; // eslint-disable-line
|
|
|
|
if (points[0] !== initialPosition) {
|
|
points = points.reverse();
|
|
}
|
|
|
|
points.forEach(function (point) {
|
|
totalDistance += distance(point, prevPoint);
|
|
prevPoint = point;
|
|
}); // Traverse only 25 total distance along points to find cardinality point
|
|
|
|
var distanceToCardinalityPoint = 25;
|
|
var remainingDistance = distanceToCardinalityPoint;
|
|
var center;
|
|
prevPoint = undefined;
|
|
points.forEach(function (point) {
|
|
if (prevPoint && !center) {
|
|
var vectorDistance = distance(point, prevPoint);
|
|
|
|
if (vectorDistance < remainingDistance) {
|
|
remainingDistance -= vectorDistance;
|
|
} else {
|
|
// The point is remainingDistance from prevPoint in the vector between prevPoint and point
|
|
// Calculate the coordinates
|
|
var distanceRatio = remainingDistance / vectorDistance;
|
|
if (distanceRatio <= 0) center = prevPoint;
|
|
if (distanceRatio >= 1) center = {
|
|
x: point.x,
|
|
y: point.y
|
|
};
|
|
|
|
if (distanceRatio > 0 && distanceRatio < 1) {
|
|
center = {
|
|
x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point.x,
|
|
y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point.y
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
prevPoint = point;
|
|
}); // if relation is present (Arrows will be added), change cardinality point off-set distance (d)
|
|
|
|
var d = isRelationTypePresent ? 10 : 5; //Calculate Angle for x and y axis
|
|
|
|
var angle = Math.atan2(points[0].y - center.y, points[0].x - center.x);
|
|
var cardinalityPosition = {
|
|
x: 0,
|
|
y: 0
|
|
}; //Calculation cardinality position using angle, center point on the line/curve but pendicular and with offset-distance
|
|
|
|
cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2;
|
|
cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2;
|
|
return cardinalityPosition;
|
|
};
|
|
|
|
var getStylesFromArray = function getStylesFromArray(arr) {
|
|
var style = '';
|
|
var labelStyle = '';
|
|
|
|
for (var i = 0; i < arr.length; i++) {
|
|
if (typeof arr[i] !== 'undefined') {
|
|
// add text properties to label style definition
|
|
if (arr[i].startsWith('color:') || arr[i].startsWith('text-align:')) {
|
|
labelStyle = labelStyle + arr[i] + ';';
|
|
} else {
|
|
style = style + arr[i] + ';';
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
style: style,
|
|
labelStyle: labelStyle
|
|
};
|
|
};
|
|
var cnt = 0;
|
|
var generateId = function generateId() {
|
|
cnt++;
|
|
return 'id-' + Math.random().toString(36).substr(2, 12) + '-' + cnt;
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
detectType: detectType,
|
|
isSubstringInArray: isSubstringInArray,
|
|
interpolateToCurve: interpolateToCurve,
|
|
calcLabelPosition: calcLabelPosition,
|
|
calcCardinalityPosition: calcCardinalityPosition,
|
|
formatUrl: formatUrl,
|
|
getStylesFromArray: getStylesFromArray,
|
|
generateId: generateId
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@braintree/sanitize-url":
|
|
/*!******************************************!*\
|
|
!*** external "@braintree/sanitize-url" ***!
|
|
\******************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@braintree/sanitize-url");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d3":
|
|
/*!*********************!*\
|
|
!*** external "d3" ***!
|
|
\*********************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("d3");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "dagre":
|
|
/*!************************!*\
|
|
!*** external "dagre" ***!
|
|
\************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("dagre");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "dagre-d3":
|
|
/*!***************************!*\
|
|
!*** external "dagre-d3" ***!
|
|
\***************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("dagre-d3");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "dagre-d3/lib/label/add-html-label.js":
|
|
/*!*******************************************************!*\
|
|
!*** external "dagre-d3/lib/label/add-html-label.js" ***!
|
|
\*******************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("dagre-d3/lib/label/add-html-label.js");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "entity-decode/browser":
|
|
/*!****************************************!*\
|
|
!*** external "entity-decode/browser" ***!
|
|
\****************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("entity-decode/browser");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "graphlib":
|
|
/*!***************************!*\
|
|
!*** external "graphlib" ***!
|
|
\***************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("graphlib");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "moment-mini":
|
|
/*!******************************!*\
|
|
!*** external "moment-mini" ***!
|
|
\******************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("moment-mini");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "scope-css":
|
|
/*!****************************!*\
|
|
!*** external "scope-css" ***!
|
|
\****************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("scope-css");
|
|
|
|
/***/ })
|
|
|
|
/******/ })["default"];
|
|
});
|
|
//# sourceMappingURL=mermaid.core.js.map
|