UNPKG

jsmind

Version:

jsMind is a pure javascript library for mindmap, it base on html5 canvas. jsMind was released under BSD license, you can embed it in any project, if only you observe the license.

1 lines 189 kB
{"version":3,"file":"jsmind.js","sources":["../src/jsmind.common.js","../src/jsmind.dom.js","../src/jsmind.util.js","../src/jsmind.option.js","../src/jsmind.node.js","../src/jsmind.mind.js","../src/jsmind.format.js","../src/jsmind.data_provider.js","../src/jsmind.layout_provider.js","../src/jsmind.graph.js","../src/jsmind.view_provider.js","../src/jsmind.shortcut_provider.js","../src/jsmind.plugin.js","../src/jsmind.js"],"sourcesContent":["/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nexport const __version__ = '0.8.7';\nexport const __author__ = 'hizzgdev@163.com';\n\nif (typeof String.prototype.startsWith != 'function') {\n String.prototype.startsWith = function (p) {\n return this.slice(0, p.length) === p;\n };\n}\n\nexport const Direction = {\n left: -1,\n center: 0,\n right: 1,\n of: function (dir) {\n if (!dir || dir === -1 || dir === 0 || dir === 1) {\n return dir;\n }\n if (dir === '-1' || dir === '0' || dir === '1') {\n return parseInt(dir);\n }\n if (dir.toLowerCase() === 'left') {\n return this.left;\n }\n if (dir.toLowerCase() === 'right') {\n return this.right;\n }\n if (dir.toLowerCase() === 'center') {\n return this.center;\n }\n },\n};\nexport const EventType = { show: 1, resize: 2, edit: 3, select: 4 };\nexport const Key = { meta: 1 << 13, ctrl: 1 << 12, alt: 1 << 11, shift: 1 << 10 };\nexport const LogLevel = { debug: 1, info: 2, warn: 3, error: 4, disable: 9 };\n\n// an noop function define\nvar _noop = function () {};\nexport let logger =\n typeof console === 'undefined'\n ? {\n level: _noop,\n log: _noop,\n debug: _noop,\n info: _noop,\n warn: _noop,\n error: _noop,\n }\n : {\n level: setup_logger_level,\n log: console.log,\n debug: console.debug,\n info: console.info,\n warn: console.warn,\n error: console.error,\n };\n\nfunction setup_logger_level(log_level) {\n if (log_level > LogLevel.debug) {\n logger.debug = _noop;\n } else {\n logger.debug = console.debug;\n }\n if (log_level > LogLevel.info) {\n logger.info = _noop;\n } else {\n logger.info = console.info;\n }\n if (log_level > LogLevel.warn) {\n logger.warn = _noop;\n } else {\n logger.warn = console.warn;\n }\n if (log_level > LogLevel.error) {\n logger.error = _noop;\n } else {\n logger.error = console.error;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nclass Dom {\n constructor(w) {\n this.w = w;\n this.d = w.document;\n this.g = function (id) {\n return this.d.getElementById(id);\n };\n this.c = function (tag) {\n return this.d.createElement(tag);\n };\n this.t = function (n, t) {\n if (n.hasChildNodes()) {\n n.firstChild.nodeValue = t;\n } else {\n n.appendChild(this.d.createTextNode(t));\n }\n };\n\n this.h = function (n, t) {\n if (t instanceof HTMLElement) {\n n.innerHTML = '';\n n.appendChild(t);\n } else {\n n.innerHTML = t;\n }\n };\n // detect isElement\n this.i = function (el) {\n return (\n !!el &&\n typeof el === 'object' &&\n el.nodeType === 1 &&\n typeof el.style === 'object' &&\n typeof el.ownerDocument === 'object'\n );\n };\n\n //target,eventType,handler\n this.on = function (t, e, h) {\n if (!!t.addEventListener) {\n t.addEventListener(e, h, false);\n } else {\n t.attachEvent('on' + e, h);\n }\n };\n }\n}\n\nexport const $ = new Dom(window);\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from './jsmind.dom.js';\n\nexport const util = {\n file: {\n read: function (file_data, fn_callback) {\n var reader = new FileReader();\n reader.onload = function () {\n if (typeof fn_callback === 'function') {\n fn_callback(this.result, file_data.name);\n }\n };\n reader.readAsText(file_data);\n },\n\n save: function (file_data, type, name) {\n var blob;\n if (typeof $.w.Blob === 'function') {\n blob = new Blob([file_data], { type: type });\n } else {\n var BlobBuilder =\n $.w.BlobBuilder ||\n $.w.MozBlobBuilder ||\n $.w.WebKitBlobBuilder ||\n $.w.MSBlobBuilder;\n var bb = new BlobBuilder();\n bb.append(file_data);\n blob = bb.getBlob(type);\n }\n if (navigator.msSaveBlob) {\n navigator.msSaveBlob(blob, name);\n } else {\n var URL = $.w.URL || $.w.webkitURL;\n var blob_url = URL.createObjectURL(blob);\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = blob_url;\n anchor.download = name;\n $.d.body.appendChild(anchor);\n var evt = $.d.createEvent('MouseEvents');\n evt.initEvent('click', true, true);\n anchor.dispatchEvent(evt);\n $.d.body.removeChild(anchor);\n } else {\n location.href = blob_url;\n }\n }\n },\n },\n\n json: {\n json2string: function (json) {\n return JSON.stringify(json);\n },\n string2json: function (json_str) {\n return JSON.parse(json_str);\n },\n merge: function (b, a) {\n for (var o in a) {\n if (o in b) {\n if (\n typeof b[o] === 'object' &&\n Object.prototype.toString.call(b[o]).toLowerCase() == '[object object]' &&\n !b[o].length\n ) {\n util.json.merge(b[o], a[o]);\n } else {\n b[o] = a[o];\n }\n } else {\n b[o] = a[o];\n }\n }\n return b;\n },\n },\n\n uuid: {\n newid: function () {\n return (\n new Date().getTime().toString(16) + Math.random().toString(16).substring(2)\n ).substring(2, 18);\n },\n },\n\n text: {\n is_empty: function (s) {\n if (!s) {\n return true;\n }\n return s.replace(/\\s*/, '').length == 0;\n },\n },\n};\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { util } from './jsmind.util.js';\n\nconst default_options = {\n container: '', // id of the container\n editable: false, // you can change it in your options\n theme: null,\n mode: 'full', // full or side\n support_html: true,\n log_level: 'info',\n\n view: {\n engine: 'canvas',\n enable_device_pixel_ratio: false,\n hmargin: 100,\n vmargin: 50,\n line_width: 2,\n line_color: '#555',\n line_style: 'curved', // [straight | curved]\n draggable: false, // drag the mind map with your mouse, when it's larger that the container\n hide_scrollbars_when_draggable: false, // hide container scrollbars, when mind map is larger than container and draggable option is true.\n node_overflow: 'hidden', // [hidden | wrap]\n zoom: {\n min: 0.5,\n max: 2.1,\n step: 0.1,\n mask_key: 4096,\n },\n custom_node_render: null,\n expander_style: 'char', // [char | number]\n },\n layout: {\n hspace: 30,\n vspace: 20,\n pspace: 13,\n cousin_space: 0,\n },\n default_event_handle: {\n enable_mousedown_handle: true,\n enable_click_handle: true,\n enable_dblclick_handle: true,\n enable_mousewheel_handle: true,\n },\n shortcut: {\n enable: true,\n handles: {},\n mapping: {\n addchild: [45, 4096 + 13], // Insert, Ctrl+Enter\n addbrother: 13, // Enter\n editnode: 113, // F2\n delnode: 46, // Delete\n toggle: 32, // Space\n left: 37, // Left\n up: 38, // Up\n right: 39, // Right\n down: 40, // Down\n },\n },\n plugin: {},\n};\n\nexport function merge_option(options) {\n var opts = {};\n util.json.merge(opts, default_options);\n util.json.merge(opts, options);\n\n if (!opts.container) {\n throw new Error('the options.container should not be null or empty.');\n }\n return opts;\n}\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { logger } from './jsmind.common.js';\nexport class Node {\n constructor(sId, iIndex, sTopic, oData, bIsRoot, oParent, eDirection, bExpanded) {\n if (!sId) {\n logger.error('invalid node id');\n return;\n }\n if (typeof iIndex != 'number') {\n logger.error('invalid node index');\n return;\n }\n if (typeof bExpanded === 'undefined') {\n bExpanded = true;\n }\n this.id = sId;\n this.index = iIndex;\n this.topic = sTopic;\n this.data = oData || {};\n this.isroot = bIsRoot;\n this.parent = oParent;\n this.direction = eDirection;\n this.expanded = !!bExpanded;\n this.children = [];\n this._data = {};\n }\n\n get_location() {\n var vd = this._data.view;\n return {\n x: vd.abs_x,\n y: vd.abs_y,\n };\n }\n get_size() {\n var vd = this._data.view;\n return {\n w: vd.width,\n h: vd.height,\n };\n }\n\n static compare(node1, node2) {\n // '-1' is always the latest\n var r = 0;\n var i1 = node1.index;\n var i2 = node2.index;\n if (i1 >= 0 && i2 >= 0) {\n r = i1 - i2;\n } else if (i1 == -1 && i2 == -1) {\n r = 0;\n } else if (i1 == -1) {\n r = 1;\n } else if (i2 == -1) {\n r = -1;\n } else {\n r = 0;\n }\n return r;\n }\n static inherited(parent_node, node) {\n if (!!parent_node && !!node) {\n if (parent_node.id === node.id) {\n return true;\n }\n if (parent_node.isroot) {\n return true;\n }\n var pid = parent_node.id;\n var p = node;\n while (!p.isroot) {\n p = p.parent;\n if (p.id === pid) {\n return true;\n }\n }\n }\n return false;\n }\n static is_node(n) {\n return !!n && n instanceof Node;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { Node } from './jsmind.node.js';\nimport { logger, Direction } from './jsmind.common.js';\n\nexport class Mind {\n constructor() {\n this.name = null;\n this.author = null;\n this.version = null;\n this.root = null;\n this.selected = null;\n this.nodes = {};\n }\n get_node(node_id) {\n if (node_id in this.nodes) {\n return this.nodes[node_id];\n } else {\n logger.warn('the node[id=' + node_id + '] can not be found');\n return null;\n }\n }\n set_root(node_id, topic, data) {\n if (this.root == null) {\n this.root = new Node(node_id, 0, topic, data, true);\n this._put_node(this.root);\n return this.root;\n } else {\n logger.error('root node is already exist');\n return null;\n }\n }\n add_node(parent_node, node_id, topic, data, direction, expanded, idx) {\n if (!Node.is_node(parent_node)) {\n logger.error('the parent_node ' + parent_node + ' is not a node.');\n return null;\n }\n var node_index = idx || -1;\n var node = new Node(\n node_id,\n node_index,\n topic,\n data,\n false,\n parent_node,\n parent_node.direction,\n expanded\n );\n if (parent_node.isroot) {\n node.direction = direction || Direction.right;\n }\n if (this._put_node(node)) {\n parent_node.children.push(node);\n this._update_index(parent_node);\n } else {\n logger.error(\"fail, the node id '\" + node.id + \"' has been already exist.\");\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, node_id, topic, data, direction) {\n if (!Node.is_node(node_before)) {\n logger.error('the node_before ' + node_before + ' is not a node.');\n return null;\n }\n var node_index = node_before.index - 0.5;\n return this.add_node(node_before.parent, node_id, topic, data, direction, true, node_index);\n }\n get_node_before(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n return null;\n } else {\n return this.get_node_before(the_node);\n }\n }\n if (node.isroot) {\n return null;\n }\n var idx = node.index - 2;\n if (idx >= 0) {\n return node.parent.children[idx];\n } else {\n return null;\n }\n }\n insert_node_after(node_after, node_id, topic, data, direction) {\n if (!Node.is_node(node_after)) {\n logger.error('the node_after ' + node_after + ' is not a node.');\n return null;\n }\n var node_index = node_after.index + 0.5;\n return this.add_node(node_after.parent, node_id, topic, data, direction, true, node_index);\n }\n get_node_after(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n return null;\n } else {\n return this.get_node_after(the_node);\n }\n }\n if (node.isroot) {\n return null;\n }\n var idx = node.index;\n var brothers = node.parent.children;\n if (brothers.length > idx) {\n return node.parent.children[idx];\n } else {\n return null;\n }\n }\n move_node(node, before_id, parent_id, direction) {\n if (!Node.is_node(node)) {\n logger.error('the parameter node ' + node + ' is not a node.');\n return null;\n }\n if (!parent_id) {\n parent_id = node.parent.id;\n }\n return this._move_node(node, before_id, parent_id, direction);\n }\n _flow_node_direction(node, direction) {\n if (typeof direction === 'undefined') {\n direction = node.direction;\n } else {\n node.direction = direction;\n }\n var len = node.children.length;\n while (len--) {\n this._flow_node_direction(node.children[len], direction);\n }\n }\n _move_node_internal(node, before_id) {\n if (!!node && !!before_id) {\n if (before_id == '_last_') {\n node.index = -1;\n this._update_index(node.parent);\n } else if (before_id == '_first_') {\n node.index = 0;\n this._update_index(node.parent);\n } else {\n var node_before = !!before_id ? this.get_node(before_id) : null;\n if (\n node_before != null &&\n node_before.parent != null &&\n node_before.parent.id == node.parent.id\n ) {\n node.index = node_before.index - 0.5;\n this._update_index(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, before_id, parent_id, direction) {\n if (!!node && !!parent_id) {\n var parent_node = this.get_node(parent_id);\n if (Node.inherited(node, parent_node)) {\n logger.error('can not move a node to its children');\n return null;\n }\n if (node.parent.id != parent_id) {\n // remove from parent's children\n var sibling = node.parent.children;\n var si = sibling.length;\n while (si--) {\n if (sibling[si].id == node.id) {\n sibling.splice(si, 1);\n break;\n }\n }\n let origin_parent = node.parent;\n node.parent = parent_node;\n parent_node.children.push(node);\n this._update_index(origin_parent);\n }\n\n if (node.parent.isroot) {\n if (direction == Direction.left) {\n node.direction = direction;\n } else {\n node.direction = Direction.right;\n }\n } else {\n node.direction = node.parent.direction;\n }\n this._move_node_internal(node, before_id);\n this._flow_node_direction(node);\n }\n return node;\n }\n remove_node(node) {\n if (!Node.is_node(node)) {\n logger.error('the parameter node ' + node + ' is not a node.');\n return false;\n }\n if (node.isroot) {\n logger.error('fail, can not remove root node');\n return false;\n }\n if (this.selected != null && this.selected.id == node.id) {\n this.selected = null;\n }\n // clean all subordinate nodes\n var children = node.children;\n var ci = children.length;\n while (ci--) {\n this.remove_node(children[ci]);\n }\n // clean all children\n children.length = 0;\n var node_parent = node.parent;\n // remove from parent's children\n var sibling = node_parent.children;\n var si = sibling.length;\n while (si--) {\n if (sibling[si].id == node.id) {\n sibling.splice(si, 1);\n break;\n }\n }\n // remove from global nodes\n delete this.nodes[node.id];\n // clean all properties\n for (var k in node) {\n delete node[k];\n }\n // remove it's self\n node = null;\n this._update_index(node_parent);\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn(\"the node_id '\" + node.id + \"' has been already exist.\");\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _update_index(node) {\n if (node instanceof Node) {\n node.children.sort(Node.compare);\n for (var i = 0; i < node.children.length; i++) {\n node.children[i].index = i + 1;\n }\n }\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __author__, __version__, logger, Direction } from './jsmind.common.js';\nimport { Mind } from './jsmind.mind.js';\nimport { Node } from './jsmind.node.js';\nimport { util } from './jsmind.util.js';\n\nconst DEFAULT_META = { name: 'jsMind', author: __author__, version: __version__ };\n\nexport const format = {\n node_tree: {\n example: {\n meta: DEFAULT_META,\n format: 'node_tree',\n data: { id: 'root', topic: 'jsMind node_tree example' },\n },\n get_mind: function (source) {\n var df = format.node_tree;\n var mind = new Mind();\n mind.name = source.meta.name;\n mind.author = source.meta.author;\n mind.version = source.meta.version;\n df._parse(mind, source.data);\n return mind;\n },\n get_data: function (mind) {\n var df = format.node_tree;\n var json = {};\n json.meta = {\n name: mind.name,\n author: mind.author,\n version: mind.version,\n };\n json.format = 'node_tree';\n json.data = df._build_node(mind.root);\n return json;\n },\n\n _parse: function (mind, node_root) {\n var df = format.node_tree;\n var data = df._extract_data(node_root);\n mind.set_root(node_root.id, node_root.topic, data);\n if ('children' in node_root) {\n var children = node_root.children;\n for (var i = 0; i < children.length; i++) {\n df._extract_subnode(mind, mind.root, children[i]);\n }\n }\n },\n\n _extract_data: function (node_json) {\n var data = {};\n for (var k in node_json) {\n if (\n k == 'id' ||\n k == 'topic' ||\n k == 'children' ||\n k == 'direction' ||\n k == 'expanded'\n ) {\n continue;\n }\n data[k] = node_json[k];\n }\n return data;\n },\n\n _extract_subnode: function (mind, node_parent, node_json) {\n var df = format.node_tree;\n var data = df._extract_data(node_json);\n var d = null;\n if (node_parent.isroot) {\n d = node_json.direction == 'left' ? Direction.left : Direction.right;\n }\n var node = mind.add_node(\n node_parent,\n node_json.id,\n node_json.topic,\n data,\n d,\n node_json.expanded\n );\n if (!!node_json['children']) {\n var children = node_json.children;\n for (var i = 0; i < children.length; i++) {\n df._extract_subnode(mind, node, children[i]);\n }\n }\n },\n\n _build_node: function (node) {\n var df = format.node_tree;\n if (!(node instanceof Node)) {\n return;\n }\n var o = {\n id: node.id,\n topic: node.topic,\n expanded: node.expanded,\n };\n if (!!node.parent && node.parent.isroot) {\n o.direction = node.direction == Direction.left ? 'left' : 'right';\n }\n if (node.data != null) {\n var node_data = node.data;\n for (var k in node_data) {\n o[k] = node_data[k];\n }\n }\n var children = node.children;\n if (children.length > 0) {\n o.children = [];\n for (var i = 0; i < children.length; i++) {\n o.children.push(df._build_node(children[i]));\n }\n }\n return o;\n },\n },\n\n node_array: {\n example: {\n meta: DEFAULT_META,\n format: 'node_array',\n data: [{ id: 'root', topic: 'jsMind node_array example', isroot: true }],\n },\n\n get_mind: function (source) {\n var df = format.node_array;\n var mind = new Mind();\n mind.name = source.meta.name;\n mind.author = source.meta.author;\n mind.version = source.meta.version;\n df._parse(mind, source.data);\n return mind;\n },\n\n get_data: function (mind) {\n var df = format.node_array;\n var json = {};\n json.meta = {\n name: mind.name,\n author: mind.author,\n version: mind.version,\n };\n json.format = 'node_array';\n json.data = [];\n df._array(mind, json.data);\n return json;\n },\n\n _parse: function (mind, node_array) {\n var df = format.node_array;\n var nodes = node_array.slice(0);\n // reverse array for improving looping performance\n nodes.reverse();\n var root_node = df._extract_root(mind, nodes);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, nodes);\n } else {\n logger.error('root node can not be found');\n }\n },\n\n _extract_root: function (mind, node_array) {\n var df = format.node_array;\n var i = node_array.length;\n while (i--) {\n if ('isroot' in node_array[i] && node_array[i].isroot) {\n var root_json = node_array[i];\n var data = df._extract_data(root_json);\n var node = mind.set_root(root_json.id, root_json.topic, data);\n node_array.splice(i, 1);\n return node;\n }\n }\n return null;\n },\n\n _extract_subnode: function (mind, parent_node, node_array) {\n var df = format.node_array;\n var i = node_array.length;\n var node_json = null;\n var data = null;\n var extract_count = 0;\n while (i--) {\n node_json = node_array[i];\n if (node_json.parentid == parent_node.id) {\n data = df._extract_data(node_json);\n var d = null;\n var node_direction = node_json.direction;\n if (!!node_direction) {\n d = node_direction == 'left' ? Direction.left : Direction.right;\n }\n var node = mind.add_node(\n parent_node,\n node_json.id,\n node_json.topic,\n data,\n d,\n node_json.expanded\n );\n node_array.splice(i, 1);\n extract_count++;\n var sub_extract_count = df._extract_subnode(mind, node, node_array);\n if (sub_extract_count > 0) {\n // reset loop index after extract subordinate node\n i = node_array.length;\n extract_count += sub_extract_count;\n }\n }\n }\n return extract_count;\n },\n\n _extract_data: function (node_json) {\n var data = {};\n for (var k in node_json) {\n if (\n k == 'id' ||\n k == 'topic' ||\n k == 'parentid' ||\n k == 'isroot' ||\n k == 'direction' ||\n k == 'expanded'\n ) {\n continue;\n }\n data[k] = node_json[k];\n }\n return data;\n },\n\n _array: function (mind, node_array) {\n var df = format.node_array;\n df._array_node(mind.root, node_array);\n },\n\n _array_node: function (node, node_array) {\n var df = format.node_array;\n if (!(node instanceof Node)) {\n return;\n }\n var o = {\n id: node.id,\n topic: node.topic,\n expanded: node.expanded,\n };\n if (!!node.parent) {\n o.parentid = node.parent.id;\n }\n if (node.isroot) {\n o.isroot = true;\n }\n if (!!node.parent && node.parent.isroot) {\n o.direction = node.direction == Direction.left ? 'left' : 'right';\n }\n if (node.data != null) {\n var node_data = node.data;\n for (var k in node_data) {\n o[k] = node_data[k];\n }\n }\n node_array.push(o);\n var ci = node.children.length;\n for (var i = 0; i < ci; i++) {\n df._array_node(node.children[i], node_array);\n }\n },\n },\n\n freemind: {\n example: {\n meta: DEFAULT_META,\n format: 'freemind',\n data: '<map version=\"1.0.1\"><node ID=\"root\" TEXT=\"jsMind freemind example\"/></map>',\n },\n get_mind: function (source) {\n var df = format.freemind;\n var mind = new Mind();\n mind.name = source.meta.name;\n mind.author = source.meta.author;\n mind.version = source.meta.version;\n var xml = source.data;\n var xml_doc = df._parse_xml(xml);\n var xml_root = df._find_root(xml_doc);\n df._load_node(mind, null, xml_root);\n return mind;\n },\n\n get_data: function (mind) {\n var df = format.freemind;\n var json = {};\n json.meta = {\n name: mind.name,\n author: mind.author,\n version: mind.version,\n };\n json.format = 'freemind';\n var xml_lines = [];\n xml_lines.push('<map version=\"1.0.1\">');\n df._build_map(mind.root, xml_lines);\n xml_lines.push('</map>');\n json.data = xml_lines.join('');\n return json;\n },\n\n _parse_xml: function (xml) {\n var xml_doc = null;\n if (window.DOMParser) {\n var parser = new DOMParser();\n xml_doc = parser.parseFromString(xml, 'text/xml');\n } else {\n // Internet Explorer\n xml_doc = new ActiveXObject('Microsoft.XMLDOM');\n xml_doc.async = false;\n xml_doc.loadXML(xml);\n }\n return xml_doc;\n },\n\n _find_root: function (xml_doc) {\n var nodes = xml_doc.childNodes;\n var node = null;\n var root = null;\n var n = null;\n for (var i = 0; i < nodes.length; i++) {\n n = nodes[i];\n if (n.nodeType == 1 && n.tagName == 'map') {\n node = n;\n break;\n }\n }\n if (!!node) {\n var ns = node.childNodes;\n node = null;\n for (var i = 0; i < ns.length; i++) {\n n = ns[i];\n if (n.nodeType == 1 && n.tagName == 'node') {\n node = n;\n break;\n }\n }\n }\n return node;\n },\n\n _load_node: function (mind, parent_node, xml_node) {\n var df = format.freemind;\n var node_id = xml_node.getAttribute('ID');\n var node_topic = xml_node.getAttribute('TEXT');\n var node_folded = xml_node.getAttribute('FOLDED');\n // look for richcontent\n if (node_topic == null) {\n var topic_children = xml_node.childNodes;\n var topic_child = null;\n for (var i = 0; i < topic_children.length; i++) {\n topic_child = topic_children[i];\n if (topic_child.nodeType == 1 && topic_child.tagName === 'richcontent') {\n node_topic = topic_child.textContent;\n break;\n }\n }\n }\n var node_data = df._load_attributes(xml_node);\n var node_expanded =\n 'expanded' in node_data ? node_data.expanded == 'true' : node_folded != 'true';\n delete node_data.expanded;\n\n var node_foreground_color = xml_node.getAttribute('COLOR');\n if (!!node_foreground_color) {\n node_data['foreground-color'] = node_foreground_color;\n }\n\n var node_background_color = xml_node.getAttribute('BACKGROUND_COLOR');\n if (!!node_background_color) {\n node_data['background-color'] = node_background_color;\n }\n\n var node_position = xml_node.getAttribute('POSITION');\n var node_direction = null;\n if (!!node_position) {\n node_direction = node_position == 'left' ? Direction.left : Direction.right;\n }\n var node = null;\n if (!!parent_node) {\n node = mind.add_node(\n parent_node,\n node_id,\n node_topic,\n node_data,\n node_direction,\n node_expanded\n );\n } else {\n node = mind.set_root(node_id, node_topic, node_data);\n }\n var children = xml_node.childNodes;\n var child = null;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (child.nodeType == 1 && child.tagName == 'node') {\n df._load_node(mind, node, child);\n }\n }\n },\n\n _load_attributes: function (xml_node) {\n var children = xml_node.childNodes;\n var attr = null;\n var attr_data = {};\n for (var i = 0; i < children.length; i++) {\n attr = children[i];\n if (attr.nodeType == 1 && attr.tagName === 'attribute') {\n attr_data[attr.getAttribute('NAME')] = attr.getAttribute('VALUE');\n }\n }\n return attr_data;\n },\n\n _build_map: function (node, xml_lines) {\n var df = format.freemind;\n var pos = null;\n var node_data = node.data;\n\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xml_lines.push('<node');\n xml_lines.push(' ID=\"' + node.id + '\"');\n if (!!pos) {\n xml_lines.push(' POSITION=\"' + pos + '\"');\n }\n if (!node.expanded) {\n xml_lines.push(' FOLDED=\"true\"');\n }\n if (!!node_data['foreground-color']) {\n xml_lines.push(' COLOR=\"' + node_data['foreground-color'] + '\"');\n }\n if (!!node_data['background-color']) {\n xml_lines.push(' BACKGROUND_COLOR=\"' + node_data['background-color'] + '\"');\n }\n xml_lines.push(' TEXT=\"' + df._escape(node.topic) + '\">');\n\n // for attributes\n if (node_data != null) {\n for (var k in node_data) {\n if (k === 'foreground-color' || k === 'background-color') {\n continue;\n }\n xml_lines.push('<attribute NAME=\"' + k + '\" VALUE=\"' + node_data[k] + '\"/>');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._build_map(children[i], xml_lines);\n }\n\n xml_lines.push('</node>');\n },\n\n _escape: function (text) {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/'/g, '&apos;')\n .replace(/\"/g, '&quot;');\n },\n },\n text: {\n example: {\n meta: DEFAULT_META,\n format: 'text',\n data: 'jsMind text example\\n node1\\n node1-sub\\n node1-sub\\n node2',\n },\n _line_regex: /\\s*/,\n get_mind: function (source) {\n var df = format.text;\n var mind = new Mind();\n mind.name = source.meta.name;\n mind.author = source.meta.author;\n mind.version = source.meta.version;\n var lines = source.data.split(/\\n|\\r/);\n df._fill_nodes(mind, lines, 0, 0);\n return mind;\n },\n\n _fill_nodes: function (mind, lines) {\n let node_path = [];\n let i = 0;\n while (i < lines.length) {\n let line = lines[i];\n let level = line.match(/\\s*/)[0].length;\n let topic = line.substr(level);\n\n if (level == 0 && node_path.length > 0) {\n log.error('more than 1 root node was found: ' + topic);\n return;\n }\n if (level > node_path.length) {\n log.error('a suspended node was found: ' + topic);\n return;\n }\n let diff = node_path.length - level;\n while (diff--) {\n node_path.pop();\n }\n\n if (level == 0 && node_path.length == 0) {\n let node = mind.set_root(util.uuid.newid(), topic);\n node_path.push(node);\n } else {\n let node = mind.add_node(\n node_path[level - 1],\n util.uuid.newid(),\n topic,\n {},\n null\n );\n node_path.push(node);\n }\n i++;\n }\n node_path.length = 0;\n },\n\n get_data: function (mind) {\n var df = format.text;\n var json = {};\n json.meta = {\n name: mind.name,\n author: mind.author,\n version: mind.version,\n };\n json.format = 'text';\n let lines = [];\n df._build_lines(lines, [mind.root], 0);\n json.data = lines.join('\\n');\n return json;\n },\n\n _build_lines: function (lines, nodes, level) {\n let prefix = new Array(level + 1).join(' ');\n for (let node of nodes) {\n lines.push(prefix + node.topic);\n if (!!node.children) {\n format.text._build_lines(lines, node.children, level + 1);\n }\n }\n },\n },\n};\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { logger } from './jsmind.common.js';\nimport { format } from './jsmind.format.js';\n\nexport class DataProvider {\n constructor(jm) {\n this.jm = jm;\n }\n\n init() {\n logger.debug('data.init');\n }\n reset() {\n logger.debug('data.reset');\n }\n load(mind_data) {\n var df = null;\n var mind = null;\n if (typeof mind_data === 'object') {\n if (!!mind_data.format) {\n df = mind_data.format;\n } else {\n df = 'node_tree';\n }\n } else {\n df = 'freemind';\n }\n\n if (df == 'node_array') {\n mind = format.node_array.get_mind(mind_data);\n } else if (df == 'node_tree') {\n mind = format.node_tree.get_mind(mind_data);\n } else if (df == 'freemind') {\n mind = format.freemind.get_mind(mind_data);\n } else if (df == 'text') {\n mind = format.text.get_mind(mind_data);\n } else {\n logger.warn('unsupported format');\n }\n return mind;\n }\n get_data(data_format) {\n var data = null;\n if (data_format == 'node_array') {\n data = format.node_array.get_data(this.jm.mind);\n } else if (data_format == 'node_tree') {\n data = format.node_tree.get_data(this.jm.mind);\n } else if (data_format == 'freemind') {\n data = format.freemind.get_data(this.jm.mind);\n } else if (data_format == 'text') {\n data = format.text.get_data(this.jm.mind);\n } else {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\nimport { logger, Direction, EventType } from './jsmind.common.js';\n\nexport class LayoutProvider {\n constructor(jm, options) {\n this.opts = options;\n this.jm = jm;\n this.isside = this.opts.mode == 'side';\n this.bounds = null;\n\n this.cache_valid = false;\n }\n init() {\n logger.debug('layout.init');\n }\n reset() {\n logger.debug('layout.reset');\n this.bounds = { n: 0, s: 0, w: 0, e: 0 };\n }\n calculate_next_child_direction(node) {\n if (this.isside) {\n return Direction.right;\n }\n var children = node.children || [];\n var children_len = children.length;\n var r = 0;\n for (var i = 0; i < children_len; i++) {\n if (children[i].direction === Direction.left) {\n r--;\n } else {\n r++;\n }\n }\n return children_len > 1 && r > 0 ? Direction.left : Direction.right;\n }\n layout() {\n logger.debug('layout.layout');\n this.layout_direction();\n this.layout_offset();\n }\n layout_direction() {\n this._layout_direction_root();\n }\n _layout_direction_root() {\n var node = this.jm.mind.root;\n var layout_data = null;\n if ('layout' in node._data) {\n layout_data = node._data.layout;\n } else {\n layout_data = {};\n node._data.layout = layout_data;\n }\n var children = node.children;\n var children_count = children.length;\n layout_data.direction = Direction.center;\n layout_data.side_index = 0;\n if (this.isside) {\n var i = children_count;\n while (i--) {\n this._layout_direction_side(children[i], Direction.right, i);\n }\n } else {\n var i = children_count;\n var subnode = null;\n while (i--) {\n subnode = children[i];\n if (subnode.direction == Direction.left) {\n this._layout_direction_side(subnode, Direction.left, i);\n } else {\n this._layout_direction_side(subnode, Direction.right, i);\n }\n }\n }\n }\n _layout_direction_side(node, direction, side_index) {\n var layout_data = null;\n if ('layout' in node._data) {\n layout_data = node._data.layout;\n } else {\n layout_data = {};\n node._data.layout = layout_data;\n }\n var children = node.children;\n var children_count = children.length;\n\n layout_data.direction = direction;\n layout_data.side_index = side_index;\n var i = children_count;\n while (i--) {\n this._layout_direction_side(children[i], direction, i);\n }\n }\n layout_offset() {\n var node = this.jm.mind.root;\n var layout_data = node._data.layout;\n layout_data.offset_x = 0;\n layout_data.offset_y = 0;\n layout_data.outer_height = 0;\n var children = node.children;\n var i = children.length;\n var left_nodes = [];\n var right_nodes = [];\n var subnode = null;\n while (i--) {\n subnode = children[i];\n if (subnode._data.layout.direction == Direction.right) {\n right_nodes.unshift(subnode);\n } else {\n left_nodes.unshift(subnode);\n }\n }\n layout_data.left_nodes = left_nodes;\n layout_data.right_nodes = right_nodes;\n layout_data.outer_height_left = this._layout_offset_subnodes(left_nodes);\n layout_data.outer_height_right = this._layout_offset_subnodes(right_nodes);\n this.bounds.e = node._data.view.width / 2;\n this.bounds.w = 0 - this.bounds.e;\n this.bounds.n = 0;\n this.bounds.s = Math.max(layout_data.outer_height_left, layout_data.outer_height_right);\n }\n // layout both the x and y axis\n _layout_offset_subnodes(nodes) {\n var total_height = 0;\n var nodes_count = nodes.length;\n var i = nodes_count;\n var node = null;\n var node_outer_height = 0;\n var layout_data = null;\n var base_y = 0;\n var pd = null; // parent._data\n while (i--) {\n node = nodes[i];\n layout_data = node._data.layout;\n if (pd == null) {\n pd = node.parent._data;\n }\n\n node_outer_height = this._layout_offset_subnodes(node.children);\n if (!node.expanded) {\n node_outer_height = 0;\n this.set_visible(node.children, false);\n }\n node_outer_height = Math.max(node._data.view.height, node_outer_height);\n\n if (this._should_reserve_cousin_space(node)) {\n node_outer_height += this.opts.cousin_space;\n }\n\n layout_data.outer_height = node_outer_height;\n layout_data.offset_y = base_y - node_outer_height / 2;\n layout_data.offset_x =\n this.opts.hspace * layout_data.direction +\n (pd.view.width * (pd.layout.direction + layout_data.direction)) / 2;\n if (!node.parent.isroot) {\n layout_data.offset_x += this.opts.pspace * layout_data.direction;\n }\n\n base_y = base_y - node_outer_height - this.opts.vspace;\n total_height += node_outer_height;\n }\n if (nodes_count > 1) {\n total_height += this.opts.vspace * (nodes_count - 1);\n }\n i = nodes_count;\n var middle_height = total_height / 2;\n while (i--) {\n node = nodes[i];\n node._data.layout.offset_y += middle_height;\n }\n return total_height;\n }\n // layout the y axis only, for collapse/expand a node\n _layout_offset_subnodes_height(nodes) {\n var total_height = 0;\n var nodes_count = nodes.length;\n var i = nodes_count;\n var node = null;\n var node_outer_height = 0;\n var layout_data = null;\n var base_y = 0;\n var pd = null; // parent._data\n while (i--) {\n node = nodes[i];\n layout_data = node._data.layout;\n if (pd == null) {\n pd = node.parent._data;\n }\n\n node_outer_height = this._layout_offset_subnodes_height(node.children);\n if (!node.expanded) {\n node_outer_height = 0;\n }\n node_outer_height = Math.max(node._data.view.height, node_outer_height);\n if (this._should_reserve_cousin_space(node)) {\n node_outer_height += this.opts.cousin_space;\n }\n\n layout_data.outer_height = node_outer_height;\n layout_data.offset_y = base_y - node_outer_height / 2;\n base_y = base_y - node_outer_height - this.opts.vspace;\n total_height += node_outer_height;\n }\n if (nodes_count > 1) {\n total_height += this.opts.vspace * (nodes_count - 1);\n }\n i = nodes_count;\n var middle_height = total_height / 2;\n while (i--) {\n node = nodes[i];\n node._data.layout.offset_y += middle_height;\n }\n return total_height;\n }\n _should_reserve_cousin_space(node) {\n return node.children.length > 0 && node.parent.children.length > 1;\n }\n get_node_offset(node) {\n var layout_data = node._data.layout;\n var offset_cache = null;\n if ('_offset_' in layout_data && this.cache_valid) {\n offset_cache = layout_data._offset_;\n } else {\n offset_cache = { x: -1, y: -1 };\n layout_data._offset_ = offset_cache;\n }\n if (offset_cache.x == -1 || offset_cache.y == -1) {\n var x = layout_data.offset_x;\n var y = layout_data.offset_y;\n if (!node.isroot) {\n var offset_p = this.get_node_offset(node.parent);\n x += offset_p.x;\n y += offset_p.y;\n }\n offset_cache.x = x;\n offset_cache.y = y;\n }\n return offset_cache;\n }\n get_node_point(node) {\n var view_data = node._data.view;\n var offset_p = this.get_node_offset(node);\n var p = {};\n p.x = offset_p.x + (view_data.width * (node._data.layout.direction - 1)) / 2;\n p.y = offset_p.y - view_data.height / 2;\n return p;\n }\n get_node_point_in(node) {\n var p = this.get_node_offset(node);\n return p;\n }\n get_node_point_out(node) {\n var layout_data = node._data.layout;\n var pout_cache = null;\n if ('_pout_' in layout_data && this.cache_valid) {\n pout_cache = layout_data._pout_;\n } else {\n pout_cache = { x: -1, y: -1 };\n layout_data._pout_ = pout_cache;\n }\n if (pout_cache.x == -1 || pout_cache.y == -1) {\n if (node.isroot) {\n pout_cache.x = 0;\n pout_cache.y = 0;\n } else {\n var view_data = node._data.view;\n var offset_p = this.get_node_offset(node);\n pout_cache.x =\n offset_p.x + (view_data.width + this.opts.pspace) * node._data.layout.direction;\n pout_cache.y = offset_p.y;\n }\n }\n return pout_cache;\n }\n get_expander_point(node) {\n var p = this.get_node_point_out(node);\n var ex_p = {};\n if (node._data.layout.direction == Direction.right) {\n ex_p.x = p.x - this.opts.pspace;\n } else {\n ex_p.x = p.x;\n }\n ex_p.y = p.y - Math.ceil(this.opts.pspace / 2);\n return ex_p;\n }\n get_min_size() {\n var nodes = this.jm.mind.nodes;\n var node = null;\n var pout = null;\n for (var node_id in nodes) {\n node = nodes[node_id];\n pout = this.get_node_point_out(node);\n if (pout.x > this.bounds.e) {\n this.bounds.e = pout.x;\n }\n if (pout.x < this.bounds.w) {\n this.bounds.w = pout.x;\n }\n }\n return {\n w: this.bounds.e - this.bounds.w,\n h: this.bounds.s - this.bounds.n,\n };\n }\n toggle_node(node) {\n if (node.isroot) {\n return;\n }\n if (node.expanded) {\n this.collapse_node(node);\n } else {\n this.expand_node(node);\n }\n }\n expand_node(node) {\n node.expanded = true;\n this.part_layout(node);\n this.set_visible(node.children, true);\n this.jm.invoke_event_handle(EventType.show, {\n evt: 'expand_node',\n data: [],\n node: node.id,\n });\n }\n collapse_node(node) {\n node.expanded = false;\n this.part_layout(node);\n this.set_visible(node.children, false);\n this.jm.invoke_event_handle(EventType.show, {\n evt: 'collapse_node',\n data: [],\n node: node.id,\n });\n }\n expand_all() {\n var nodes = this.jm.mind.nodes;\n var c = 0;\n var node;\n for (var node_id in nodes) {\n node = nodes[node_id];\n if (!node.expanded) {\n node.expanded = true;\n c++;\n }\n }\n if (c > 0) {\n var root = this.jm.mind.root;\n this.part_layout(root);\n this.set_visible(root.children, true);\n }\n }\n collapse_all() {\n var nodes = this.jm.mind.nodes;\n var c = 0;\n var node;\n for (var node_id in nodes) {\n node = nodes[node_id];\n if (node.expanded && !node.isroot) {\n node.expanded = false;\n c++;\n }\n }\n if (c > 0) {\n var root = this.jm.mind.root;\n this.part_layout(root);\n this.set_visible(root.children, true);\n }\n }\n expand_to_depth(target_depth, curr_nodes, curr_depth) {\n if (target_depth < 1) {\n return;\n }\n var nodes = curr_nodes || this.jm.mind.root.children;\n var depth = curr_depth || 1;\n var i = nodes.length;\n var node = null;\n while (i--) {\n node = nodes[i];\n if (depth < target_depth) {\n if (!node.expanded) {\n this.expand_node(node);\n }\n this.expand_to_depth(target_depth, node.children, depth + 1);\n }\n if (depth == target_depth) {\n if (node.expanded) {\n this.collapse_node(node);\n }\n }\n }\n }\n part_layout(node) {\n var root = this.jm.mind.root;\n if (!!root) {\n var root_layout_data = root._data.layout;\n if (node.isroot) {\n root_layout_data.outer_height_right = this._layout_offset_subnodes_height(\n root_layout_data.right_nodes\n );\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(\n root_layout_data.left_nodes\n );\n } else {\n if (node._data.layout.direction == Direction.right) {\n root_layout_data.outer_height_right = this._layout_offset_subnodes_height(\n root_layout_data.right_nodes\n );\n } else {\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(\n root_layout_data.left_nodes\n );\n }\n }\n this.bounds.s = Math.max(\n root_layout_data.outer_height_left,\n root_layout_data.outer_height_right\n );\n this.cache_valid = false;\n } else {\n logger.warn('can not found root node');\n }\n }\n set_visible(nodes, visible) {\n var i = nodes.length;\n var node = null;\n var layout_data = null;\n while (i--) {\n node = nodes[i];\n layout_data = node._data.layout;\n if (node.expanded) {\n this.set_visible(node.children, visible);\n } else {\n this.set_visible(node.children, false);\n }\n if (!node.isroot) {\n node._data.layout.visible = visible;\n }\n }\n }\n is_expand(node) {\n return node.expanded;\n }\n is_visible(node) {\n var layout_data = node._data.layout;\n if ('visible' in layout_data && !layout_data.visible) {\n return false;\n } else {\n return true;\n }\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from './jsmind.dom.js';\nimport { logger } from './jsmind.common.js';\n\nclass SvgGraph {\n constructor(view) {\n this.view = view;\n this.opts = view.opts;\n this.e_svg = SvgGraph.c('svg');\n this.e_svg.setAttribute('class', 'jsmind');\n this.size = { w: 0, h: 0 };\n this.lines = [];\n this.line_drawing = {\n straight: this._line_to,\n curved: this._bezier_to,\n };\n this.init_line_render();\n }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\n }\n init_line_render() {\n if (typeof this.opts.custom_line_render === 'function') {\n this.drawing = (path, x1, y1, x2, y2) => {\n try {\n this.opts.custom_line_render.call(this, {\n ctx: path,\n start_point: { x: x1, y: y1 },\n end_point: { x: x2, y: y2 },\n });\n } catch (e) {\n logger.error('custom line renderer error: ', e);\n }\n };\n } else {\n this.drawing = this.line_drawing[this.opts.line_style] || this.line_drawing.curved;\n }\n }\n element() {\n return this.e_svg;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_svg.setAttribute('width', w);\n this.e_svg.setAttribute('height', h);\n }\n clear() {\n var len = this.lines.length;\n while (len--) {\n this.e_svg.removeChild(this.lines[len]);\n }\n this.lines.length = 0;\n }\n draw_line(pout, pin, offset, color) {\n var line = SvgGraph.c('path');\n line.setAttribute('stroke', color || this.opts.line_color);\n line.setAttribute('stroke-width', this.opts.line_width);\n line.setAttribute('fill', 'transparent');\n this.lines.push(line);\n this.e_svg.appendChild(line);\n this.drawing(\n line,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y\n );\n }\n\n copy_to(dest_canvas_ctx, callback) {\n var img = new Image();\n img.onload = function () {\n dest_canvas_ctx.drawImage(img, 0, 0);\n !!callback && callback();\n };\n img.src =\n 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg));\n }\n _bezier_to(path, x1, y1, x2, y2) {\n path.setAttribute(\n 'd',\n 'M ' +\n x1 +\n ' ' +\n y1 +\n ' C ' +\n (x1 + ((x2 - x1) * 2) / 3) +\n ' ' +\n y1 +\n ', ' +\n x1 +\n ' ' +\n y2 +\n ', ' +\n x2 +\n ' ' +\n y2\n );\n }\n _line_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2);\n }\n}\n\nclass CanvasGraph {\n constructor(view) {\n this.opts = view.opts;\n this.e_canvas = $.c('canvas');\n this.e_canvas.className = 'jsmind';\n this.canvas_ctx = this.e_canvas.getContext('2d');\n this.size = { w: 0, h: 0 };\n this.line_drawing = {\n straight: this._line_to,\n curved: this._bezier_to,\n };\n this.dpr = view.device_pixel_ratio;\n this.init_line_render();\n }\n init_line_render() {\n if (typeof this.opts.custom_line_render === 'function') {\n this.drawing = (ctx, x1, y1, x2, y2) => {\n try {\n this.opts.custom_line_render.call(this, {\n ctx,\n start_point: { x: x1, y: y1 },\n end_point: { x: x2, y: y2 },\n });\n } catch (e) {\n logger.error('custom line render error: ', e);\n }\n };\n } else {\n this.drawing = this.line_drawing[this.opts.line_style] || this.line_drawing.curved;\n }\n }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n if (this.e_canvas.width && this.e_canvas.height && this.canvas_ctx.scale) {\n this.e_canvas.width = w * this.dpr;\n this.e_canvas.height = h * this.dpr;\n\n this.e_canvas.style.width = w + 'px';\n this.e_canvas.style.height = h + 'px';\n this.canvas_ctx.scale(this.dpr, this.dpr);\n } else {\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n }\n\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset, color) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = color || this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n this.drawing(ctx, pin.x + offset.x, pin.y + offset.y, pout.x + offset.x, pout.y + offset.y);\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0, this.size.w, this.size.h);\n !!callback && callback();\n }\n _bezier_to(ctx, x1, y1, x2, y2) {\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(x1 + ((x2 - x1) * 2) / 3, y1, x1, y2, x2, y2);\n ctx.stroke();\n }\n _line_to(ctx, x1, y1, x2, y2) {\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n }\n}\n\nexport function init_graph(view, engine) {\n return engine.toLowerCase() === 'svg' ? new SvgGraph(view) : new CanvasGraph(view);\n}\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\nimport { logger, EventType } from './jsmind.common.js';\nimport { $ } from './jsmind.dom.js';\nimport { init_graph } from './jsmind.graph.js';\nimport { util } from './jsmind.util.js';\n\nexport class ViewProvider {\n constructor(jm, options) {\n this.opts = options;\n this.jm = jm;\n this.layout = jm.layout;\n\n this.container = null;\n this.e_panel = null;\n this.e_nodes = null;\n\n this.size = { w: 0, h: 0 };\n\n this.selected_node = null;\n this.editing_node = null;\n\n this.graph = null;\n this.render_node = !!options.custom_node_render\n ? this._custom_node_render\n : this._default_node_render;\n this.zoom_current = 1;\n this.device_pixel_ratio = this.opts.enable_device_pixel_ratio\n ? $.w.devicePixelRatio || 1\n : 1;\n this._initialized = false;\n }\n init() {\n logger.debug(this.opts);\n logger.debug('view.init');\n\n this.container = $.i(this.opts.container) ? this.opts.container : $.g(this.opts.container);\n if (!this.container) {\n logger.error('the options.view.container was not be found in dom');\n return;\n }\n this.graph = init_graph(this, this.opts.engine);\n\n this.e_panel = $.c('div');\n this.e_nodes = $.c('jmnodes');\n this.e_editor = $.c('input');\n this.e_panel.className = 'jsmind-inner jmnode-overflow-' + this.opts.node_overflow;\n this.e_panel.tabIndex = 1;\n this.e_panel.appendChild(this.graph.element());\n this.e_panel.appendChild(this.e_nodes);\n\n this.e_editor.className = 'jsmind-editor';\n this.e_editor.type = 'text';\n\n var v = this;\n $.on(this.e_editor, 'keydown', function (e) {\n var evt = e || event;\n if (evt.keyCode == 13) {\n v.edit_node_end();\n evt.stopPropagation();\n }\n });\n $.on(this.e_editor, 'blur', function (e) {\n v.edit_node_end();\n });\n\n this.container.appendChild(this.e_panel);\n\n if (!this.container.offsetParent) {\n new IntersectionObserver((entities, observer) => {\n if (entities[0].isIntersecting) {\n observer.unobserve(this.e_panel);\n this.resize();\n }\n }).observe(this.e_panel);\n }\n }\n\n add_event(obj, event_name, event_handle, capture_by_panel) {\n let target = !!capture_by_panel ? this.e_panel : this.e_nodes;\n $.on(target, event_name, function (e) {\n var evt = e || event;\n event_handle.call(obj, evt);\n });\n }\n get_binded_nodeid(element) {\n if (element == null) {\n return null;\n }\n var tagName = element.tagName.toLowerCase();\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else if (tagName == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n } else {\n return this.get_binded_nodeid(element.parentElement);\n }\n }\n is_node(element) {\n if (element == null) {\n return false;\n }\n var tagName = element.tagName.toLowerCase();\n if (tagName == 'jmnode') {\n return true;\n } else if (tagName == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return false;\n } else {\n return this.is_node(element.parentElement);\n }\n }\n is_expander(element) {\n return element.tagName.toLowerCase() == 'jmexpander';\n }\n reset() {\n logger.debug('view.reset');\n this.selected_node = null;\n this.clear_lines();\n this.clear_nodes();\n this.reset_theme();\n }\n reset_theme() {\n var theme_name = this.jm.options.theme;\n if (!!theme_name) {\n this.e_nodes.className = 'theme-' + theme_name;\n } else {\n this.e_nodes.className = '';\n }\n }\n reset_custom_style() {\n var nodes = this.jm.mind.nodes;\n for (var nodeid in nodes) {\n this.reset_node_custom_style(nodes[nodeid]);\n }\n }\n load() {\n logger.debug('view.load');\n this.setup_canvas_draggable(this.opts.draggable);\n this.init_nodes();\n this._initialized = true;\n }\n expand_size() {\n var min_size = this.layout.get_min_size();\n var min_width = min_size.w + this.opts.hmargin * 2;\n var min_height = min_size.h + this.opts.vmargin * 2;\n var client_w = this.e_panel.clientWidth;\n var client_h = this.e_panel.clientHeight;\n if (client_w < min_width) {\n client_w = min_width;\n }\n if (client_h < min_height) {\n client_h = min_height;\n }\n this.size.w = client_w;\n this.size.h = client_h;\n }\n init_nodes_size(node) {\n var view_data = node._data.view;\n view_data.width = view_data.element.clientWidth;\n view_data.height = view_data.element.clientHeight;\n }\n init_nodes() {\n var nodes = this.jm.mind.nodes;\n var doc_frag = $.d.createDocumentFragment();\n for (var nodeid in nodes) {\n this.create_node_element(nodes[nodeid], doc_frag);\n }\n this.e_nodes.appendChild(doc_frag);\n\n this.run_in_c11y_mode_if_needed(() => {\n for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n });\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.run_in_c11y_mode_if_needed(() => {\n this.init_nodes_size(node);\n });\n }\n run_in_c11y_mode_if_needed(func) {\n if (!!this.container.offsetParent) {\n func();\n return;\n }\n logger.warn(\n 'init nodes in compatibility mode. because the container or its parent has style {display:none}. '\n );\n this.e_panel.style.position = 'absolute';\n this.e_panel.style.top = '-100000';\n $.d.body.appendChild(this.e_panel);\n func();\n this.container.appendChild(this.e_panel);\n this.e_panel.style.position = null;\n this.e_panel.style.top = null;\n }\n create_node_element(node, parent_node) {\n var view_data = null;\n if ('view' in node._data) {\n view_data = node._data.view;\n } else {\n view_data = {};\n node._data.view = view_data;\n }\n\n var d = $.c('jmnode');\n if (node.isroot) {\n d.className = 'root';\n } else {\n var d_e = $.c('jmexpander');\n $.t(d_e, '-');\n d_e.setAttribute('nodeid', node.id);\n d_e.style.visibility = 'hidden';\n parent_node.appendChild(d_e);\n view_data.expander = d_e;\n }\n if (!!node.topic) {\n this.render_node(d, node);\n }\n d.setAttribute('nodeid', node.id);\n d.style.visibility = 'hidden';\n this._reset_node_custom_style(d, node.data);\n\n parent_node.appendChild(d);\n view_data.element = d;\n }\n remove_node(node) {\n if (this.selected_node != null && this.selected_node.id == node.id) {\n this.selected_node = null;\n }\n if (this.editing_node != null && this.editing_node.id == node.id) {\n node._data.view.element.removeChild(this.e_editor);\n this.editing_node = null;\n }\n var children = node.children;\n var i = children.length;\n while (i--) {\n this.remove_node(children[i]);\n }\n if (node._data.view) {\n var element = node._data.view.element;\n var expander = node._data.view.expander;\n this.e_nodes.removeChild(element);\n this.e_nodes.removeChild(expander);\n node._data.view.element = null;\n node._data.view.expander = null;\n }\n }\n update_node(node) {\n var view_data = node._data.view;\n var element = view_data.element;\n if (!!node.topic) {\n this.render_node(element, node);\n }\n if (this.layout.is_visible(node)) {\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\n } else {\n let origin_style = element.getAttribute('style');\n element.style = 'visibility: visible; left:0; top:0;';\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\n element.style = origin_style;\n }\n }\n select_node(node) {\n if (!!this.selected_node) {\n var element = this.selected_node._data.view.element;\n element.className = element.className.replace(/\\s*selected\\b/i, '');\n this.restore_selected_node_custom_style(this.selected_node);\n }\n if (!!node) {\n this.selected_node = node;\n node._data.view.element.className += ' selected';\n this.clear_selected_node_custom_style(node);\n }\n }\n select_clear() {\n this.select_node(null);\n }\n get_editing_node() {\n return this.editing_node;\n }\n is_editing() {\n return !!this.editing_node;\n }\n edit_node_begin(node) {\n if (!node.topic) {\n logger.warn(\"don't edit image nodes\");\n return;\n }\n if (this.editing_node != null) {\n this.edit_node_end();\n }\n this.editing_node = node;\n var view_data = node._data.view;\n var element = view_data.element;\n var topic = node.topic;\n var ncs = getComputedStyle(element);\n this.e_editor.value = topic;\n this.e_editor.style.width =\n element.clientWidth -\n parseInt(ncs.getPropertyValue('padding-left')) -\n parseInt(ncs.getPropertyValue('padding-right')) +\n 'px';\n element.innerHTML = '';\n element.appendChild(this.e_editor);\n element.style.zIndex = 5;\n this.e_editor.focus();\n this.e_editor.select();\n }\n edit_node_end() {\n if (this.editing_node != null) {\n var node = this.editing_node;\n this.editing_node = null;\n var view_data = node._data.view;\n var element = view_data.element;\n var topic = this.e_editor.value;\n element.style.zIndex = 'auto';\n element.removeChild(this.e_editor);\n if (util.text.is_empty(topic) || node.topic === topic) {\n this.render_node(element, node);\n } else {\n this.jm.update_node(node.id, topic);\n }\n }\n this.e_panel.focus();\n }\n get_view_offset() {\n var bounds = this.layout.bounds;\n var _x = (this.size.w - bounds.e - bounds.w) / 2;\n var _y = this.size.h / 2;\n return { x: _x, y: _y };\n }\n resize() {\n this.graph.set_size(1, 1);\n this.e_nodes.style.width = '1px';\n this.e_nodes.style.height = '1px';\n\n this.expand_size();\n this._show();\n }\n _show() {\n this.graph.set_size(this.size.w, this.size.h);\n this.e_nodes.style.width = this.size.w + 'px';\n this.e_nodes.style.height = this.size.h + 'px';\n this.show_nodes();\n this.show_lines();\n //this.layout.cache_valid = true;\n this.jm.invoke_event_handle(EventType.resize, { data: [] });\n }\n zoom_in(e) {\n return this.set_zoom(this.zoom_current + this.opts.zoom.step, e);\n }\n zoom_out(e) {\n return this.set_zoom(this.zoom_current - this.opts.zoom.step, e);\n }\n set_zoom(zoom, e) {\n if (zoom < this.opts.zoom.min || zoom > this.opts.zoom.max) {\n return false;\n }\n let e_panel_rect = this.e_panel.getBoundingClientRect();\n if (\n zoom < 1 &&\n zoom < this.zoom_current &&\n this.size.w * zoom < e_panel_rect.width &&\n this.size.h * zoom < e_panel_rect.height\n ) {\n return false;\n }\n let zoom_center = !!e\n ? { x: e.x - e_panel_rect.x, y: e.y - e_panel_rect.y }\n : { x: e_panel_rect.width / 2, y: e_panel_rect.height / 2 };\n let panel_scroll_x =\n ((this.e_panel.scrollLeft + zoom_center.x) * zoom) / this.zoom_current - zoom_center.x;\n let panel_scroll_y =\n ((this.e_panel.scrollTop + zoom_center.y) * zoom) / this.zoom_current - zoom_center.y;\n\n this.zoom_current = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.zoom = zoom;\n }\n this._show();\n this.e_panel.scrollLeft = panel_scroll_x;\n this.e_panel.scrollTop = panel_scroll_y;\n return true;\n }\n show(keep_center) {\n logger.debug(`view.show: {keep_center: ${keep_center}}`);\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this.center_node(this.jm.mind.root);\n }\n }\n relayout() {\n this.expand_size();\n this._show();\n }\n save_location(node) {\n var vd = node._data.view;\n vd._saved_location = {\n x: parseInt(vd.element.style.left) - this.e_panel.scrollLeft,\n y: parseInt(vd.element.style.top) - this.e_panel.scrollTop,\n };\n }\n restore_location(node) {\n var vd = node._data.view;\n this.e_panel.scrollLeft = parseInt(vd.element.style.left) - vd._saved_location.x;\n this.e_panel.scrollTop = parseInt(vd.element.style.top) - vd._saved_location.y;\n }\n clear_nodes() {\n var mind = this.jm.mind;\n if (mind == null) {\n return;\n }\n var nodes = mind.nodes;\n var node = null;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n node._data.view.element = null;\n node._data.view.expander = null;\n }\n this.e_nodes.innerHTML = '';\n }\n show_nodes() {\n var nodes = this.jm.mind.nodes;\n var node = null;\n var node_element = null;\n var p = null;\n var view_data = null;\n var view_offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n view_data = node._data.view;\n node_element = view_data.element;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n view_data.expander.style.display = 'none';\n continue;\n }\n this.reset_node_custom_style(node);\n p = this.layout.get_node_point(node);\n view_data.abs_x = view_offset.x + p.x;\n view_data.abs_y = view_offset.y + p.y;\n node_element.style.left = view_offset.x + p.x + 'px';\n node_element.style.top = view_offset.y + p.y + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n this._show_expander(node, view_offset);\n }\n }\n _show_expander(node, view_offset) {\n if (node.isroot) {\n return;\n }\n\n var expander = node._data.view.expander;\n if (node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n return;\n }\n\n let expander_text = this._get_expander_text(node);\n $.t(expander, expander_text);\n\n let p_expander = this.layout.get_expander_point(node);\n expander.style.left = view_offset.x + p_expander.x + 'px';\n expander.style.top = view_offset.y + p_expander.y + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n }\n\n _get_expander_text(node) {\n let style = !!this.opts.expander_style ? this.opts.expander_style.toLowerCase() : 'char';\n if (style === 'number') {\n return node.children.length > 99 ? '...' : node.children.length;\n }\n if (style === 'char') {\n return node.expanded ? '-' : '+';\n }\n }\n\n _default_node_render(ele, node) {\n if (this.opts.support_html) {\n $.h(ele, node.topic);\n } else {\n $.t(ele, node.topic);\n }\n }\n _custom_node_render(ele, node) {\n let rendered = this.opts.custom_node_render(this.jm, ele, node);\n if (!rendered) {\n this._default_node_render(ele, node);\n }\n }\n reset_node_custom_style(node) {\n this._reset_node_custom_style(node._data.view.element, node.data);\n }\n _reset_node_custom_style(node_element, node_data) {\n if ('background-color' in node_data) {\n node_element.style.backgroundColor = node_data['background-color'];\n }\n if ('foreground-color' in node_data) {\n node_element.style.color = node_data['foreground-color'];\n }\n if ('width' in node_data) {\n node_element.style.width = node_data['width'] + 'px';\n }\n if ('height' in node_data) {\n node_element.style.height = node_data['height'] + 'px';\n }\n if ('font-size' in node_data) {\n node_element.style.fontSize = node_data['font-size'] + 'px';\n }\n if ('font-weight' in node_data) {\n node_element.style.fontWeight = node_data['font-weight'];\n }\n if ('font-style' in node_data) {\n node_element.style.fontStyle = node_data['font-style'];\n }\n if ('background-image' in node_data) {\n var backgroundImage = node_data['background-image'];\n if (backgroundImage.startsWith('data') && node_data['width'] && node_data['height']) {\n var img = new Image();\n\n img.onload = function () {\n var c = $.c('canvas');\n c.width = node_element.clientWidth;\n c.height = node_element.clientHeight;\n var img = this;\n if (c.getContext) {\n var ctx = c.getContext('2d');\n ctx.drawImage(\n img,\n 2,\n 2,\n node_element.clientWidth,\n node_element.clientHeight\n );\n var scaledImageData = c.toDataURL();\n node_element.style.backgroundImage = 'url(' + scaledImageData + ')';\n }\n };\n img.src = backgroundImage;\n } else {\n node_element.style.backgroundImage = 'url(' + backgroundImage + ')';\n }\n node_element.style.backgroundSize = '99%';\n\n if ('background-rotation' in node_data) {\n node_element.style.transform =\n 'rotate(' + node_data['background-rotation'] + 'deg)';\n }\n }\n }\n restore_selected_node_custom_style(node) {\n var node_element = node._data.view.element;\n var node_data = node.data;\n if ('background-color' in node_data) {\n node_element.style.backgroundColor = node_data['background-color'];\n }\n if ('foreground-color' in node_data) {\n node_element.style.color = node_data['foreground-color'];\n }\n }\n clear_selected_node_custom_style(node) {\n var node_element = node._data.view.element;\n node_element.style.backgroundColor = '';\n node_element.style.color = '';\n }\n clear_lines() {\n this.graph.clear();\n }\n show_lines() {\n this.clear_lines();\n var nodes = this.jm.mind.nodes;\n var node = null;\n var pin = null;\n var pout = null;\n var color = null;\n var _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) {\n continue;\n }\n if (!this.layout.is_visible(node)) {\n continue;\n }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n color = node.data['leading-line-color'];\n this.graph.draw_line(pout, pin, _offset, color);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n setup_canvas_draggable(enabled) {\n this.opts.draggable = enabled;\n if (!this._initialized) {\n let dragging = false;\n let x, y;\n if (this.opts.hide_scrollbars_when_draggable) {\n // Avoid scrollbars when mind map is larger than the container (e_panel = id jsmind-inner)\n this.e_panel.style = 'overflow: hidden';\n }\n // Move the whole mind map with mouse moves, while button is down.\n $.on(this.container, 'mousedown', eventDown => {\n if (this.opts.draggable) {\n dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\n }\n });\n // Stop moving mind map once mouse button is released.\n $.on(this.container, 'mouseup', () => {\n dragging = false;\n });\n // Follow current mouse position and move mind map accordingly.\n $.on(this.container, 'mousemove', eventMove => {\n if (this.opts.draggable) {\n if (dragging) {\n this.e_panel.scrollBy(x - eventMove.clientX, y - eventMove.clientY);\n // Record new current position.\n x = eventMove.clientX;\n y = eventMove.clientY;\n }\n }\n });\n }\n }\n center_node(node) {\n if (!this.layout.is_visible(node)) {\n logger.warn('can not scroll to the node, because it is invisible');\n return false;\n }\n let view_data = node._data.view;\n let e_panel_rect = this.e_panel.getBoundingClientRect();\n let node_center_point = {\n x: view_data.abs_x + view_data.width / 2,\n y: view_data.abs_y + view_data.height / 2,\n };\n this.e_panel.scrollTo(\n node_center_point.x * this.zoom_current - e_panel_rect.width / 2,\n node_center_point.y * this.zoom_current - e_panel_rect.height / 2\n );\n return true;\n }\n\n zoomIn(e) {\n logger.warn('please use zoom_in instead');\n return this.zoom_in(e);\n }\n zoomOut(e) {\n logger.warn('please use zoom_out instead');\n return this.zoom_out(e);\n }\n setZoom(zoom, e) {\n logger.warn('please use set_zoom instead');\n return this.set_zoom(zoom, e);\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from './jsmind.dom.js';\nimport { util } from './jsmind.util.js';\nimport { Direction } from './jsmind.common.js';\n\nexport class ShortcutProvider {\n constructor(jm, options) {\n this.jm = jm;\n this.opts = options;\n this.mapping = options.mapping;\n this.handles = options.handles;\n this._newid = null;\n this._mapping = {};\n }\n init() {\n $.on(this.jm.view.e_panel, 'keydown', this.handler.bind(this));\n\n this.handles['addchild'] = this.handle_addchild;\n this.handles['addbrother'] = this.handle_addbrother;\n this.handles['editnode'] = this.handle_editnode;\n this.handles['delnode'] = this.handle_delnode;\n this.handles['toggle'] = this.handle_toggle;\n this.handles['up'] = this.handle_up;\n this.handles['down'] = this.handle_down;\n this.handles['left'] = this.handle_left;\n this.handles['right'] = this.handle_right;\n\n for (var handle in this.mapping) {\n if (!!this.mapping[handle] && handle in this.handles) {\n let keys = this.mapping[handle];\n if (!Array.isArray(keys)) {\n keys = [keys];\n }\n for (let key of keys) {\n this._mapping[key] = this.handles[handle];\n }\n }\n }\n\n if (typeof this.opts.id_generator === 'function') {\n this._newid = this.opts.id_generator;\n } else {\n this._newid = util.uuid.newid;\n }\n }\n enable_shortcut() {\n this.opts.enable = true;\n }\n disable_shortcut() {\n this.opts.enable = false;\n }\n handler(e) {\n if (e.which == 9) {\n e.preventDefault();\n } //prevent tab to change focus in browser\n if (this.jm.view.is_editing()) {\n return;\n }\n var evt = e || event;\n if (!this.opts.enable) {\n return true;\n }\n var kc =\n evt.keyCode +\n (evt.metaKey << 13) +\n (evt.ctrlKey << 12) +\n (evt.altKey << 11) +\n (evt.shiftKey << 10);\n if (kc in this._mapping) {\n this._mapping[kc].call(this, this.jm, e);\n }\n }\n handle_addchild(_jm, e) {\n var selected_node = _jm.get_selected_node();\n if (!!selected_node) {\n var node_id = this._newid();\n var node = _jm.add_node(selected_node, node_id, 'New Node');\n if (!!node) {\n _jm.select_node(node_id);\n _jm.begin_edit(node_id);\n }\n }\n }\n handle_addbrother(_jm, e) {\n var selected_node = _jm.get_selected_node();\n if (!!selected_node && !selected_node.isroot) {\n var node_id = this._newid();\n var node = _jm.insert_node_after(selected_node, node_id, 'New Node');\n if (!!node) {\n _jm.select_node(node_id);\n _jm.begin_edit(node_id);\n }\n }\n }\n handle_editnode(_jm, e) {\n var selected_node = _jm.get_selected_node();\n if (!!selected_node) {\n _jm.begin_edit(selected_node);\n }\n }\n handle_delnode(_jm, e) {\n var selected_node = _jm.get_selected_node();\n if (!!selected_node && !selected_node.isroot) {\n _jm.select_node(selected_node.parent);\n _jm.remove_node(selected_node);\n }\n }\n handle_toggle(_jm, e) {\n var evt = e || event;\n var selected_node = _jm.get_selected_node();\n if (!!selected_node) {\n _jm.toggle_node(selected_node.id);\n evt.stopPropagation();\n evt.preventDefault();\n }\n }\n handle_up(_jm, e) {\n var evt = e || event;\n var selected_node = _jm.get_selected_node();\n if (!!selected_node) {\n var up_node = _jm.find_node_before(selected_node);\n if (!up_node) {\n var np = _jm.find_node_before(selected_node.parent);\n if (!!np && np.children.length > 0) {\n up_node = np.children[np.children.length - 1];\n }\n }\n if (!!up_node) {\n _jm.select_node(up_node);\n }\n evt.stopPropagation();\n evt.preventDefault();\n }\n }\n handle_down(_jm, e) {\n var evt = e || event;\n var selected_node = _jm.get_selected_node();\n if (!!selected_node) {\n var down_node = _jm.find_node_after(selected_node);\n if (!down_node) {\n var np = _jm.find_node_after(selected_node.parent);\n if (!!np && np.children.length > 0) {\n down_node = np.children[0];\n }\n }\n if (!!down_node) {\n _jm.select_node(down_node);\n }\n evt.stopPropagation();\n evt.preventDefault();\n }\n }\n handle_left(_jm, e) {\n this._handle_direction(_jm, e, Direction.left);\n }\n handle_right(_jm, e) {\n this._handle_direction(_jm, e, Direction.right);\n }\n _handle_direction(_jm, e, d) {\n var evt = e || event;\n var selected_node = _jm.get_selected_node();\n var node = null;\n if (!!selected_node) {\n if (selected_node.isroot) {\n var c = selected_node.children;\n var children = [];\n for (var i = 0; i < c.length; i++) {\n if (c[i].direction === d) {\n children.push(i);\n }\n }\n node = c[children[Math.floor((children.length - 1) / 2)]];\n } else if (selected_node.direction === d) {\n var children = selected_node.children;\n var children_count = children.length;\n if (children_count > 0) {\n node = children[Math.floor((children_count - 1) / 2)];\n }\n } else {\n node = selected_node.parent;\n }\n if (!!node) {\n _jm.select_node(node);\n }\n evt.stopPropagation();\n evt.preventDefault();\n }\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from './jsmind.dom.js';\n\nconst plugin_data = {\n plugins: [],\n};\n\nexport function register(plugin) {\n if (!(plugin instanceof Plugin)) {\n throw new Error('can not register plugin, it is not an instance of Plugin');\n }\n if (plugin_data.plugins.map(p => p.name).includes(plugin.name)) {\n throw new Error('can not register plugin ' + plugin.name + ': plugin name already exist');\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm, options) {\n $.w.setTimeout(function () {\n _apply(jm, options);\n }, 0);\n}\n\nfunction _apply(jm, options) {\n plugin_data.plugins.forEach(p => p.fn_init(jm, options[p.name]));\n}\n\nexport class Plugin {\n // function fn_init(jm, options){ }\n constructor(name, fn_init) {\n if (!name) {\n throw new Error('plugin must has a name');\n }\n if (!fn_init || typeof fn_init !== 'function') {\n throw new Error('plugin must has an init function');\n }\n this.name = name;\n this.fn_init = fn_init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction, LogLevel } from './jsmind.common.js';\nimport { merge_option } from './jsmind.option.js';\nimport { Mind } from './jsmind.mind.js';\nimport { Node } from './jsmind.node.js';\nimport { DataProvider } from './jsmind.data_provider.js';\nimport { LayoutProvider } from './jsmind.layout_provider.js';\nimport { ViewProvider } from './jsmind.view_provider.js';\nimport { ShortcutProvider } from './jsmind.shortcut_provider.js';\nimport { Plugin, register as _register_plugin, apply as apply_plugins } from './jsmind.plugin.js';\nimport { format } from './jsmind.format.js';\nimport { $ } from './jsmind.dom.js';\nimport { util as _util } from './jsmind.util.js';\n\nexport default class jsMind {\n static mind = Mind;\n static node = Node;\n static direction = Direction;\n static event_type = EventType;\n static $ = $;\n static plugin = Plugin;\n static register_plugin = _register_plugin;\n static util = _util;\n\n constructor(options) {\n jsMind.current = this;\n this.options = merge_option(options);\n logger.level(LogLevel[this.options.log_level]);\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.init();\n }\n\n init() {\n if (!!this.initialized) {\n return;\n }\n this.initialized = true;\n var opts_layout = {\n mode: this.options.mode,\n hspace: this.options.layout.hspace,\n vspace: this.options.layout.vspace,\n pspace: this.options.layout.pspace,\n cousin_space: this.options.layout.cousin_space,\n };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\n enable_device_pixel_ratio: this.options.view.enable_device_pixel_ratio,\n hmargin: this.options.view.hmargin,\n vmargin: this.options.view.vmargin,\n line_width: this.options.view.line_width,\n line_color: this.options.view.line_color,\n line_style: this.options.view.line_style,\n custom_line_render: this.options.view.custom_line_render,\n draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable,\n node_overflow: this.options.view.node_overflow,\n zoom: this.options.view.zoom,\n custom_node_render: this.options.view.custom_node_render,\n expander_style: this.options.view.expander_style,\n };\n // create instance of function provider\n this.data = new DataProvider(this);\n this.layout = new LayoutProvider(this, opts_layout);\n this.view = new ViewProvider(this, opts_view);\n this.shortcut = new ShortcutProvider(this, this.options.shortcut);\n\n this.data.init();\n this.layout.init();\n this.view.init();\n this.shortcut.init();\n\n this._event_bind();\n\n apply_plugins(this, this.options.plugin);\n }\n get_editable() {\n return this.options.editable;\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n get_view_draggable() {\n return this.options.view.draggable;\n }\n enable_view_draggable() {\n this.options.view.draggable = true;\n this.view.setup_canvas_draggable(true);\n }\n disable_view_draggable() {\n this.options.view.draggable = false;\n this.view.setup_canvas_draggable(false);\n }\n // options are 'mousedown', 'click', 'dblclick', 'mousewheel'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // options are 'mousedown', 'click', 'dblclick', 'mousewheel'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n set_theme(theme) {\n var theme_old = this.options.theme;\n this.options.theme = !!theme ? theme : null;\n if (theme_old != this.options.theme) {\n this.view.reset_theme();\n this.view.reset_custom_style();\n }\n }\n _event_bind() {\n this.view.add_event(this, 'mousedown', this.mousedown_handle);\n this.view.add_event(this, 'click', this.click_handle);\n this.view.add_event(this, 'dblclick', this.dblclick_handle);\n this.view.add_event(this, 'wheel', this.mousewheel_handle, true);\n }\n mousedown_handle(e) {\n if (!this.options.default_event_handle['enable_mousedown_handle']) {\n return;\n }\n var element = e.target || event.srcElement;\n var node_id = this.view.get_binded_nodeid(element);\n if (!!node_id) {\n if (this.view.is_node(element)) {\n this.select_node(node_id);\n }\n } else {\n this.select_clear();\n }\n }\n click_handle(e) {\n if (!this.options.default_event_handle['enable_click_handle']) {\n return;\n }\n var element = e.target || event.srcElement;\n var is_expander = this.view.is_expander(element);\n if (is_expander) {\n var node_id = this.view.get_binded_nodeid(element);\n if (!!node_id) {\n this.toggle_node(node_id);\n }\n }\n }\n dblclick_handle(e) {\n if (!this.options.default_event_handle['enable_dblclick_handle']) {\n return;\n }\n if (this.get_editable()) {\n var element = e.target || event.srcElement;\n var is_node = this.view.is_node(element);\n if (is_node) {\n var node_id = this.view.get_binded_nodeid(element);\n if (!!node_id) {\n this.begin_edit(node_id);\n }\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(e) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n var kc = (e.metaKey << 13) + (e.ctrlKey << 12) + (e.altKey << 11) + (e.shiftKey << 10);\n if (\n !this.options.default_event_handle['enable_mousewheel_handle'] ||\n this.options.view.zoom.mask_key !== kc\n ) {\n return;\n }\n var evt = e || event;\n // Avoid default page scrolling behavior.\n evt.preventDefault();\n\n if (evt.deltaY < 0) {\n this.view.zoom_in(evt); // wheel down\n } else {\n this.view.zoom_out(evt);\n }\n }\n begin_edit(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n return false;\n } else {\n return this.begin_edit(the_node);\n }\n }\n if (this.get_editable()) {\n this.view.edit_node_begin(node);\n } else {\n logger.error('fail, this mind map is not editable.');\n return;\n }\n }\n end_edit() {\n this.view.edit_node_end();\n }\n toggle_node(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n return;\n } else {\n return this.toggle_node(the_node);\n }\n }\n if (node.isroot) {\n return;\n }\n this.view.save_location(node);\n this.layout.toggle_node(node);\n this.view.relayout();\n this.view.restore_location(node);\n }\n expand_node(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n return;\n } else {\n return this.expand_node(the_node);\n }\n }\n if (node.isroot) {\n return;\n }\n this.view.save_location(node);\n this.layout.expand_node(node);\n this.view.relayout();\n this.view.restore_location(node);\n }\n collapse_node(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n return;\n } else {\n return this.collapse_node(the_node);\n }\n }\n if (node.isroot) {\n return;\n }\n this.view.save_location(node);\n this.layout.collapse_node(node);\n this.view.relayout();\n this.view.restore_location(node);\n }\n expand_all() {\n this.layout.expand_all();\n this.view.relayout();\n }\n collapse_all() {\n this.layout.collapse_all();\n this.view.relayout();\n }\n expand_to_depth(depth) {\n this.layout.expand_to_depth(depth);\n this.view.relayout();\n }\n _reset() {\n this.view.reset();\n this.layout.reset();\n this.data.reset();\n }\n _show(mind, skip_centering) {\n var m = mind || format.node_array.example;\n this.mind = this.data.load(m);\n if (!this.mind) {\n logger.error('data.load error');\n return;\n } else {\n logger.debug('data.load ok');\n }\n\n this.view.load();\n logger.debug('view.load ok');\n\n this.layout.layout();\n logger.debug('layout.layout ok');\n\n this.view.show(!skip_centering);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind, skip_centering) {\n this._reset();\n this._show(mind, skip_centering);\n }\n get_meta() {\n return {\n name: this.mind.name,\n author: this.mind.author,\n version: this.mind.version,\n };\n }\n get_data(data_format) {\n var df = data_format || 'node_tree';\n return this.data.get_data(df);\n }\n get_root() {\n return this.mind.root;\n }\n get_node(node) {\n if (Node.is_node(node)) {\n return node;\n }\n return this.mind.get_node(node);\n }\n add_node(parent_node, node_id, topic, data, direction) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var dir = Direction.of(direction);\n if (dir === undefined) {\n dir = this.layout.calculate_next_child_direction(the_parent_node);\n }\n var node = this.mind.add_node(the_parent_node, node_id, topic, data, dir);\n if (!!node) {\n this.view.add_node(node);\n this.layout.layout();\n this.view.show(false);\n this.view.reset_node_custom_style(node);\n this.expand_node(the_parent_node);\n this.invoke_event_handle(EventType.edit, {\n evt: 'add_node',\n data: [the_parent_node.id, node_id, topic, data, dir],\n node: node_id,\n });\n }\n return node;\n } else {\n logger.error('fail, this mind map is not editable');\n return null;\n }\n }\n insert_node_before(node_before, node_id, topic, data, direction) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var dir = Direction.of(direction);\n if (dir === undefined) {\n dir = this.layout.calculate_next_child_direction(the_node_before.parent);\n }\n var node = this.mind.insert_node_before(the_node_before, node_id, topic, data, dir);\n if (!!node) {\n this.view.add_node(node);\n this.layout.layout();\n this.view.show(false);\n this.invoke_event_handle(EventType.edit, {\n evt: 'insert_node_before',\n data: [the_node_before.id, node_id, topic, data, dir],\n node: node_id,\n });\n }\n return node;\n } else {\n logger.error('fail, this mind map is not editable');\n return null;\n }\n }\n insert_node_after(node_after, node_id, topic, data, direction) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var dir = Direction.of(direction);\n if (dir === undefined) {\n dir = this.layout.calculate_next_child_direction(the_node_after.parent);\n }\n var node = this.mind.insert_node_after(the_node_after, node_id, topic, data, dir);\n if (!!node) {\n this.view.add_node(node);\n this.layout.layout();\n this.view.show(false);\n this.invoke_event_handle(EventType.edit, {\n evt: 'insert_node_after',\n data: [the_node_after.id, node_id, topic, data, dir],\n node: node_id,\n });\n }\n return node;\n } else {\n logger.error('fail, this mind map is not editable');\n return null;\n }\n }\n remove_node(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n return false;\n } else {\n return this.remove_node(the_node);\n }\n }\n if (this.get_editable()) {\n if (node.isroot) {\n logger.error('fail, can not remove root node');\n return false;\n }\n var node_id = node.id;\n var parent_id = node.parent.id;\n var parent_node = this.get_node(parent_id);\n this.view.save_location(parent_node);\n this.view.remove_node(node);\n this.mind.remove_node(node);\n this.layout.layout();\n this.view.show(false);\n this.view.restore_location(parent_node);\n this.invoke_event_handle(EventType.edit, {\n evt: 'remove_node',\n data: [node_id],\n node: parent_id,\n });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(node_id, topic) {\n if (this.get_editable()) {\n if (_util.text.is_empty(topic)) {\n logger.warn('fail, topic can not be empty');\n return;\n }\n var node = this.get_node(node_id);\n if (!!node) {\n if (node.topic === topic) {\n logger.info('nothing changed');\n this.view.update_node(node);\n return;\n }\n node.topic = topic;\n this.view.update_node(node);\n this.layout.layout();\n this.view.show(false);\n this.invoke_event_handle(EventType.edit, {\n evt: 'update_node',\n data: [node_id, topic],\n node: node_id,\n });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(node_id, before_id, parent_id, direction) {\n if (this.get_editable()) {\n var node = this.get_node(node_id);\n var updated_node = this.mind.move_node(node, before_id, parent_id, direction);\n if (!!updated_node) {\n this.view.update_node(updated_node);\n this.layout.layout();\n this.view.show(false);\n this.invoke_event_handle(EventType.edit, {\n evt: 'move_node',\n data: [node_id, before_id, parent_id, direction],\n node: node_id,\n });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n select_node(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n return;\n } else {\n return this.select_node(the_node);\n }\n }\n if (!this.layout.is_visible(node)) {\n return;\n }\n this.mind.selected = node;\n this.view.select_node(node);\n this.invoke_event_handle(EventType.select, { evt: 'select_node', data: [], node: node.id });\n }\n get_selected_node() {\n if (!!this.mind) {\n return this.mind.selected;\n } else {\n return null;\n }\n }\n select_clear() {\n if (!!this.mind) {\n this.mind.selected = null;\n this.view.select_clear();\n }\n }\n is_node_visible(node) {\n return this.layout.is_visible(node);\n }\n scroll_node_to_center(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n } else {\n this.scroll_node_to_center(the_node);\n }\n return;\n }\n this.view.center_node(node);\n }\n find_node_before(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n return;\n } else {\n return this.find_node_before(the_node);\n }\n }\n if (node.isroot) {\n return null;\n }\n var n = null;\n if (node.parent.isroot) {\n var c = node.parent.children;\n var prev = null;\n var ni = null;\n for (var i = 0; i < c.length; i++) {\n ni = c[i];\n if (node.direction === ni.direction) {\n if (node.id === ni.id) {\n n = prev;\n }\n prev = ni;\n }\n }\n } else {\n n = this.mind.get_node_before(node);\n }\n return n;\n }\n find_node_after(node) {\n if (!Node.is_node(node)) {\n var the_node = this.get_node(node);\n if (!the_node) {\n logger.error('the node[id=' + node + '] can not be found.');\n return;\n } else {\n return this.find_node_after(the_node);\n }\n }\n if (node.isroot) {\n return null;\n }\n var n = null;\n if (node.parent.isroot) {\n var c = node.parent.children;\n var found = false;\n var ni = null;\n for (var i = 0; i < c.length; i++) {\n ni = c[i];\n if (node.direction === ni.direction) {\n if (found) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n found = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(node_id, bg_color, fg_color) {\n if (this.get_editable()) {\n var node = this.mind.get_node(node_id);\n if (!!node) {\n if (!!bg_color) {\n node.data['background-color'] = bg_color;\n }\n if (!!fg_color) {\n node.data['foreground-color'] = fg_color;\n }\n this.view.reset_node_custom_style(node);\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return null;\n }\n }\n set_node_font_style(node_id, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(node_id);\n if (!!node) {\n if (!!size) {\n node.data['font-size'] = size;\n }\n if (!!weight) {\n node.data['font-weight'] = weight;\n }\n if (!!style) {\n node.data['font-style'] = style;\n }\n this.view.reset_node_custom_style(node);\n this.view.update_node(node);\n this.layout.layout();\n this.view.show(false);\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return null;\n }\n }\n set_node_background_image(node_id, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(node_id);\n if (!!node) {\n if (!!image) {\n node.data['background-image'] = image;\n }\n if (!!width) {\n node.data['width'] = width;\n }\n if (!!height) {\n node.data['height'] = height;\n }\n if (!!rotation) {\n node.data['background-rotation'] = rotation;\n }\n this.view.reset_node_custom_style(node);\n this.view.update_node(node);\n this.layout.layout();\n this.view.show(false);\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return null;\n }\n }\n set_node_background_rotation(node_id, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(node_id);\n if (!!node) {\n if (!node.data['background-image']) {\n logger.error(\n 'fail, only can change rotation angle of node with background image'\n );\n return null;\n }\n node.data['background-rotation'] = rotation;\n this.view.reset_node_custom_style(node);\n this.view.update_node(node);\n this.layout.layout();\n this.view.show(false);\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return null;\n }\n }\n resize() {\n this.view.resize();\n }\n // callback(type ,data)\n add_event_listener(callback) {\n if (typeof callback === 'function') {\n this.event_handles.push(callback);\n }\n }\n clear_event_listener() {\n this.event_handles = [];\n }\n invoke_event_handle(type, data) {\n var j = this;\n $.w.setTimeout(function () {\n j._invoke_event_handle(type, data);\n }, 0);\n }\n _invoke_event_handle(type, data) {\n var l = this.event_handles.length;\n for (var i = 0; i < l; i++) {\n this.event_handles[i](type, data);\n }\n }\n\n static show(options, mind) {\n logger.warn(\n '`jsMind.show(options, mind)` is deprecated, please use `jm = new jsMind(options); jm.show(mind);` instead'\n );\n var _jm = new jsMind(options);\n _jm.show(mind);\n return _jm;\n }\n}\n"],"names":["__version__","String","prototype","startsWith","p","this","slice","length","Direction","left","center","right","of","dir","parseInt","toLowerCase","EventType","show","resize","edit","select","LogLevel","debug","info","warn","error","disable","_noop","logger","console","level","log","log_level","$","constructor","w","d","document","g","id","getElementById","c","tag","createElement","t","n","hasChildNodes","firstChild","nodeValue","appendChild","createTextNode","h","HTMLElement","innerHTML","i","el","nodeType","style","ownerDocument","on","e","addEventListener","attachEvent","window","util","file","read","file_data","fn_callback","reader","FileReader","onload","result","name","readAsText","save","type","blob","Blob","bb","BlobBuilder","MozBlobBuilder","WebKitBlobBuilder","MSBlobBuilder","append","getBlob","navigator","msSaveBlob","blob_url","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json","json2string","JSON","stringify","string2json","json_str","parse","merge","b","a","o","Object","toString","call","uuid","newid","Date","getTime","Math","random","substring","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","enable_device_pixel_ratio","hmargin","vmargin","line_width","line_color","line_style","draggable","hide_scrollbars_when_draggable","node_overflow","zoom","min","max","step","mask_key","custom_node_render","expander_style","layout","hspace","vspace","pspace","cousin_space","default_event_handle","enable_mousedown_handle","enable_click_handle","enable_dblclick_handle","enable_mousewheel_handle","shortcut","enable","handles","mapping","addchild","addbrother","editnode","delnode","toggle","up","down","plugin","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","data","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","compare","node1","node2","i1","i2","inherited","parent_node","node","pid","is_node","Mind","author","version","root","selected","nodes","get_node","node_id","set_root","_put_node","add_node","idx","push","_update_index","insert_node_before","node_before","node_index","get_node_before","the_node","insert_node_after","node_after","get_node_after","move_node","before_id","parent_id","_move_node","_flow_node_direction","len","_move_node_internal","sibling","si","splice","origin_parent","remove_node","ci","node_parent","k","sort","DEFAULT_META","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_build_node","node_root","_extract_data","_extract_subnode","node_json","node_data","node_array","_array","reverse","root_node","_extract_root","root_json","extract_count","parentid","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xml_lines","_build_map","join","DOMParser","parseFromString","ActiveXObject","async","loadXML","childNodes","tagName","ns","xml_node","getAttribute","node_topic","node_folded","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_foreground_color","node_background_color","node_position","child","attr","attr_data","pos","_escape","_line_regex","lines","split","_fill_nodes","node_path","line","match","substr","diff","pop","_build_lines","prefix","Array","DataProvider","jm","init","reset","load","mind_data","data_format","LayoutProvider","options","opts","isside","bounds","cache_valid","calculate_next_child_direction","children_len","r","layout_direction","layout_offset","_layout_direction_root","layout_data","children_count","side_index","_layout_direction_side","subnode","offset_x","offset_y","outer_height","left_nodes","right_nodes","unshift","outer_height_left","_layout_offset_subnodes","outer_height_right","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","_should_reserve_cousin_space","middle_height","_layout_offset_subnodes_height","get_node_offset","offset_cache","_offset_","offset_p","get_node_point","view_data","get_node_point_in","get_node_point_out","pout_cache","_pout_","get_expander_point","ex_p","ceil","get_min_size","pout","toggle_node","collapse_node","expand_node","part_layout","invoke_event_handle","expand_all","collapse_all","expand_to_depth","target_depth","curr_nodes","curr_depth","depth","root_layout_data","visible","is_expand","is_visible","SvgGraph","e_svg","setAttribute","size","line_drawing","straight","_line_to","curved","_bezier_to","init_line_render","createElementNS","custom_line_render","drawing","path","x1","y1","x2","y2","ctx","start_point","end_point","element","set_size","clear","draw_line","pin","offset","color","copy_to","dest_canvas_ctx","callback","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","CanvasGraph","e_canvas","className","canvas_ctx","getContext","dpr","device_pixel_ratio","scale","clearRect","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","graph","render_node","_custom_node_render","_default_node_render","zoom_current","devicePixelRatio","_initialized","e_editor","tabIndex","v","event","keyCode","edit_node_end","stopPropagation","offsetParent","IntersectionObserver","entities","observer","isIntersecting","unobserve","observe","add_event","obj","event_name","event_handle","capture_by_panel","target","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","nodeid","reset_node_custom_style","setup_canvas_draggable","init_nodes","expand_size","min_size","min_width","min_height","client_w","clientWidth","client_h","clientHeight","init_nodes_size","doc_frag","createDocumentFragment","create_node_element","run_in_c11y_mode_if_needed","func","position","top","d_e","expander","_reset_node_custom_style","update_node","origin_style","select_node","restore_selected_node_custom_style","clear_selected_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoom_in","set_zoom","zoom_out","e_panel_rect","getBoundingClientRect","zoom_center","panel_scroll_x","scrollLeft","panel_scroll_y","scrollTop","keep_center","center_node","relayout","save_location","_saved_location","restore_location","node_element","view_offset","display","_show_expander","expander_text","_get_expander_text","p_expander","ele","backgroundColor","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","transform","_offset","enabled","dragging","eventDown","clientX","clientY","eventMove","scrollBy","node_center_point","scrollTo","zoomIn","zoomOut","setZoom","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","keys","isArray","key","id_generator","enable_shortcut","disable_shortcut","which","preventDefault","kc","metaKey","ctrlKey","altKey","shiftKey","_jm","get_selected_node","begin_edit","up_node","find_node_before","np","down_node","find_node_after","_handle_direction","floor","plugin_data","plugins","register","Plugin","Error","map","includes","apply","setTimeout","forEach","fn_init","_apply","jsMind","static","_register_plugin","_util","current","merge_option","initialized","event_handles","opts_layout","opts_view","_event_bind","apply_plugins","get_editable","enable_edit","disable_edit","get_view_draggable","enable_view_draggable","disable_view_draggable","enable_event_handle","disable_event_handle","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","srcElement","deltaY","end_edit","_reset","skip_centering","m","get_meta","get_root","the_parent_node","undefined","the_node_before","the_node_after","updated_node","is_node_visible","scroll_node_to_center","prev","ni","found","set_node_color","bg_color","fg_color","set_node_font_style","weight","set_node_background_image","image","rotation","set_node_background_rotation","add_event_listener","clear_event_listener","j","_invoke_event_handle","l"],"mappings":"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"}