From 04ab3bfe2ef3fe60ea127ba0edc69614466093c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20D=C3=BCsedau?= Date: Sat, 30 May 2020 00:04:54 +0200 Subject: [PATCH 001/274] english translation --- docs/en/1.usage.md | 12 ++-- docs/en/2.options.md | 14 ++-- docs/en/3.operation.md | 137 +++++++++++++++++++++++++++++++++++++- docs/en/4.contribution.md | 33 ++++++++- docs/en/index.md | 33 +++++---- 5 files changed, 202 insertions(+), 27 deletions(-) diff --git a/docs/en/1.usage.md b/docs/en/1.usage.md index 192386c8..8258ad40 100644 --- a/docs/en/1.usage.md +++ b/docs/en/1.usage.md @@ -65,7 +65,6 @@ Three formats are supported by jsMind: `node-tree format`,`node-array format`,`f These are simple demo for the 3 data format: A. node-tree format ---- ```javascript var mind = { @@ -100,7 +99,6 @@ var mind = { ``` B. node-array format ---- ```javascript var mind = { @@ -132,7 +130,6 @@ var mind = { ``` C. freemind format ---- ```javascript var mind = { @@ -147,7 +144,7 @@ var mind = { ``` 1.3. Themes ---- +=== 15 themes were supported in jsmind, you can preview those themes by visiting [feature-demo](http://hizzgdev.github.io/jsmind/example/2_features.html). @@ -179,7 +176,10 @@ jmnodes.theme-greensea jmexpander{} jmnodes.theme-greensea jmexpander:hover{} ``` -COPYRIGHT +copyright notice === -No reproduction, No derivatives. +Reproduction and deduction are prohibited. + +The jsMind project is still being updated and the corresponding documentation is updated at the same time as the version is updated. In order to avoid confusion to the user, it is forbidden to reprint this document without written permission and to make changes of any kind to this document. + diff --git a/docs/en/2.options.md b/docs/en/2.options.md index a1e0e6ae..6e0f7e47 100644 --- a/docs/en/2.options.md +++ b/docs/en/2.options.md @@ -1,6 +1,6 @@ [Contents](index.md) -1. [Usage] (1.usage.md) +1. [Usage](1.usage.md) 2. **Options** 3. [Operation](3.operation.md) 4. [Contribution](4.contribution.md) @@ -65,8 +65,8 @@ Except the container, there are all optional. These options are described in more detail below. -2.2 Conventional options -==== +2.2 Conventional Options +=== **container** : (string) [required] ID of the container @@ -97,8 +97,8 @@ These options are described in more detail below. > Note that in freemind, the style of the node is controlled using the HTML language, and it is recommended to set this parameter to true if you are using data in freemind format. -2.3 Layout options -==== +2.3 Layout Options +=== **view.engine** : (string) engine for drawing lines between nodes in a mindmap @@ -126,8 +126,8 @@ These options are described in more detail below. > If a node (other than the root node) has a subordinate node, the outside of this node shows the controller for the shrinking/expanding subordinate node, which is used to set the size (width and height) of this controller, the default value is 13 pixels. -2.4. shortcuts -==== +2.4. Shortcuts +=== **shortcut.enable** : (bool) Whether to enable shortcut keys diff --git a/docs/en/3.operation.md b/docs/en/3.operation.md index 321934b2..2b79965a 100644 --- a/docs/en/3.operation.md +++ b/docs/en/3.operation.md @@ -1,3 +1,138 @@ +[Contents](index.md) -**Thank you for helping us complete this document** +1. [Usage](1.usage.md) +2. [Options](2.options.md) +3. **Operation** +4. [Contribution](4.contribution.md) + +jsMind object +=== + +jsMind provides a set of APIs for manipulating the mindmap, all of which are based on the `jsMind` object processing, which can be obtained using the following code. + +```javascript +/* +Method 1. + jsMind objects are available when you create a mindmap +*/ +var jm = new jsMind(options); + +/* +Method 2. + This jsMind object can be obtained directly if a mindmap already exists on the current page + When multiple jsMind are created on a page, this method gets the last object created +*/ +var jm = jsMind.current; +``` + +3.1 Displaying a mindmap +=== + +Use the `jm.show(mind)` method to display a mindmap, see [1.1. Basic framework](1.usage.md) for specific usage. + +3.2. Finding Nodes +=== + +**Get root** : Use `jm.get_root()` to get the root of the current mindmap. + +**Find node by id** : Use the `jm.get_node(nodeid)` method to find the node specified in the current mind map by id, and return `null` if it is not found. + +**Get selected node** : Use `jm.get_selected_node()` to get the currently selected node and return `null` if there is no selected node. + +**Find adjacent nodes** : Use `jm.find_node_before(node|nodeid)` and `find_node_after(node|nodeid)` to get the previous or next node of the specified node, and return `null` if there is no previous or next one. + +**Fetch parent** : Use `node.parent` to get the parent node, the parent of the root node is `null`. + +**Fetching a collection of child nodes** : A collection of child nodes can be obtained using `node.children`. + +Tips +--- + +A mindmap diagram is composed of multiple nodes and connections between nodes, a mindmap diagram has a root node, the root node can have multiple child nodes on the periphery, and the child node can have multiple child nodes. Each node contains more than one of the following attributes. + +```javascript +node { + id, // : string node id + index, // : integer node number + topic, // : string node topic + isroot, // : boolean indicates whether this node is root or not + parent, // : node The parent of this node, the parent program of the root node is null, but please do not judge whether this node is the root node based on this property. + direction, // : enum(left,center,right) The distribution position of the node + children, // : array of node The combination of children of the node + expanded, // : boolean Is the next level of the node expanded or not + data, // : object{string,object} Other additional data for this node +} +``` + +3.3 Operation on Nodes +=== + +**Select node** : Use the `jm.select_node(node) method to select the specified node. + +**Collapse child nodes** : Use the `jm.collapse_node(node|nodeid)` method to collapse the child nodes of the node. + +**Expand Child Node** : Use the `jm.expand_node(node|nodeid)` method to expand the child node of this node. + +**Collapse or expand child nodes** : Use the `jm.toggle_node(node|nodeid)` method to automatically expand or collapse child nodes. + +**Expand all child nodes** : All child nodes can be expanded using the `jm.expand_all()` method. + +**Expand to level** : Use the `jm.expand_to_depth(depth)` method to expand to a specified level. + +**Move Node** : Use the `jm.move_node(node|nodeid,beforeid)` method to move the node to beforeid node, and set beforeid to `_first_` or `_last` to move the node to first or last of the adjacent node. + +**Enable editing** : Use the `jm.enable_edit()` method to enable editing of the current mindmap. + +**Disable_edit** : Use the `jm.disable_edit()` method to disable editing of the current mindmap. + +**Edit Node** : The node can be adjusted to edit using the `jm.begin_edit(node|nodeid)` method. + +**Stop editing** : The node can be adjusted to read-only using the `jm.end_edit()` method. + + +3.4. Editing Nodes +=== + +**Add Node** : A node can be added using the `jm.add_node(parent_node, nodeid, topic, data)` method. + +**Insert node before specified location** : The `jm.insert_node_before(node_before, nodeid, topic, data)` method can be used to insert a node before a node_before node. + +**Insert node after specified location** : Node can be inserted after node_after using `jm.insert_node_after(node_after, nodeid, topic, data)` method. + +**Delete Node** : Use the `jm.remove_node(node|nodeid)` method to delete a specified node and all its children. + +**Update node** : Use the `jm.update_node(nodeid, topic)` method to update the topic of the specified node. + + +3.5 Setting Style +=== + +**Set the theme** : Use the `jm.set_theme(theme)` method to set the theme of the mind map. + +**Set background / foreground color** : Use the `jm.set_node_color(nodeid, bgcolor, fgcolor)` method to set the background and foreground color of the specified node. + +**Set Font** : Use the `jm.set_node_font_style(nodeid, size, weight, style)` method to set the font of the specified node. + +**Set background image** : Use the `jm.set_node_background_image(nodeid, image, width, height)` method to set the background image of the specified node. + +3.6 Access to Data +=== + +**Get metadata** : Use the `jm.get_meta()` method to get metadata for the current mindmap. + +**Get Data** : The `jm.get_data(data_format)` method is used to get the data text in the specified format of the current mindmap. + +3.7 Other Operations +=== + +**Clear selection of nodes** : Use the `jm.select_clear()` method to clear the current selected state. + +**Determine if the node is visible** : Use the `jm.is_node_visible(node)` method to determine if this node is visible. + +copyright notice +=== + +Reproduction and deduction are prohibited. + +The jsMind project is still being updated and the corresponding documentation is updated at the same time as the version is updated. In order to avoid confusion to the user, it is forbidden to reprint this document without written permission and to make changes of any kind to this document. diff --git a/docs/en/4.contribution.md b/docs/en/4.contribution.md index 321934b2..308f7846 100644 --- a/docs/en/4.contribution.md +++ b/docs/en/4.contribution.md @@ -1,3 +1,34 @@ +[Contents](index.md) -**Thank you for helping us complete this document** +1. [Usage](1.usage.md) +2. [Options](2.options.md) +3. [Operation](3.operation.md) +4. **Contribution** +4.1. contribution code +=== + +jsMind may not meet the needs of your project in some ways, and you are very welcome to extend jsMind and give feedback by contributing code. + +The most convenient way to contribute code is to submit a pull-request to the jsMind project, which can be done in the github help documentation. + +* :: [Creating a pull request from a fork](https://help.github.com/en/articles/creating-a-pull-request-from-a-fork) +* :: [Working with forks] (https://help.github.com/en/articles/working-with-forks) + +Before submitting a pull-request, be sure to test it well and make a detailed note when submitting the pull-request, including feature descriptions, code change notes. + +4.2 Contribute ideas or needs +=== + +Or you can bring up a problem or need you've encountered via an issue for discussion, and hopefully a friend who has the ability and energy to join in and solve the problem together. + +For common requirements, it is recommended to implement post-implementation feedback to the open source project, for non-common requirements, you can fork out a separate warehouse for custom development. + +It is important to note that open source does not mean free. jsMind itself doesn't restrict commercial use, but it's only right to be paid for custom development. + +copyright notice +=== + +Reproduction and deduction are prohibited. + +The jsMind project is still being updated and the corresponding documentation is updated at the same time as the version is updated. In order to avoid confusion to the user, it is forbidden to reprint this document without written permission and to make changes of any kind to this document. \ No newline at end of file diff --git a/docs/en/index.md b/docs/en/index.md index 0c8c80b9..bc98201a 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -1,19 +1,28 @@ -Contents +Contents. ====== -**Sorry, documents in English have not been completed.** - -**Thank you for helping us complete (or revise) it.** - * [1. Usage](1.usage.md) - * 1.1. Basic Framework - * 1.2. Data Format - * 1.3. Themes + * 1.1 Basic Framework + * 1.2 Data Format + * 1.3 Themes * [2. Options](2.options.md) -* [3. Operation](3.operation.md) + * 2.1 Introduction + * 2.2 Conventional Options + * 2.3 Layout Options + * 2.4 Shortcuts +* [3. API / Operation](3.operation.md) + * 3.1 Displaying a Mindmap + * 3.2 Finding Nodes + * 3.3 Operation on Nodes + * 3.4 Editing Nodes + * 3.5 Setting Style + * 3.6 Access to Data + * 3.7 Other Operations * [4. Contribution](4.contribution.md) -COPYRIGHT -=== +copyright notice +====== + +Reproduction and deduction are prohibited. -No reproduction, No derivatives. +The jsMind project is still being updated and the corresponding documentation is updated at the same time as the version is updated. In order to avoid confusion to the user, it is forbidden to reprint this document without written permission and to make changes of any kind to this document. From 309ccd9589e98341a88470b62972942b05873d63 Mon Sep 17 00:00:00 2001 From: ysk2014 <1181102772@qq.com> Date: Mon, 10 Aug 2020 17:32:51 +0800 Subject: [PATCH 002/274] =?UTF-8?q?=E4=BF=AE=E6=94=B9svg=E7=9A=84class?= =?UTF-8?q?=E7=9A=84=E8=B5=8B=E5=80=BC=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/jsmind.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/jsmind.js b/js/jsmind.js index 5e103c06..d7428f9b 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -2222,7 +2222,7 @@ this.view = view; this.opts = view.opts; this.e_svg = jm.graph_svg.c('svg'); - this.e_svg.className = 'jsmind'; + this.e_svg.setAttribute('class', 'jsmind'); this.size = { w: 0, h: 0 }; this.lines = []; }; From e3e2b31a80491ab627927b0a835dc895c2d6a55c Mon Sep 17 00:00:00 2001 From: "Eddy.Wang" <1027220189@qq.com> Date: Thu, 26 Nov 2020 12:34:40 +0800 Subject: [PATCH 003/274] =?UTF-8?q?insert=5Fnode=5Fafter=20=20=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E8=8E=B7=E5=8F=96=E9=94=99=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/jsmind.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/jsmind.js b/js/jsmind.js index d7428f9b..b48c772a 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -289,7 +289,7 @@ insert_node_after: function (node_after, nodeid, topic, data) { if (!jm.util.is_node(node_after)) { - var the_node_after = this.get_node(node_before); + var the_node_after = this.get_node(node_after); if (!the_node_after) { logger.error('the node_after[id=' + node_after + '] can not be found.'); return null; From 288efc0c00d52a4d0a217d86de3d6d31c6918f15 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Fri, 18 Dec 2020 15:27:46 +0800 Subject: [PATCH 004/274] Update LICENSE --- LICENSE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 9d62b0c6..4335582c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2014-2015, ZHANG ZHIGANG +Copyright (c) 2014-2021, ZHANG ZHIGANG All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -11,7 +11,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -版权所有 (c) 2014-2015, 张志刚 +版权所有 (c) 2014-2021, 张志刚 保留一切权利。 在满足下列条件的前提下,授予使用者使用及再发布本软件的源代码或二进制形式的权利,无论是否修改皆然: From e7b9af8f4ab8d68e31cc7d0f6e902228f7eac02e Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sat, 8 May 2021 00:15:54 +0800 Subject: [PATCH 005/274] fix bug #268 --- js/jsmind.draggable.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/js/jsmind.draggable.js b/js/jsmind.draggable.js index 4a8e3452..c0b6b78a 100644 --- a/js/jsmind.draggable.js +++ b/js/jsmind.draggable.js @@ -140,6 +140,7 @@ jsMind.direction.right : jsMind.direction.left; var nodes = this.jm.mind.nodes; var node = null; + var layout = this.jm.layout; var min_distance = Number.MAX_VALUE; var distance = 0; var closest_node = null; @@ -152,6 +153,9 @@ if (node.id == this.active_node.id) { continue; } + if (!layout.is_visible(node)){ + continue; + } ns = node.get_size(); nl = node.get_location(); if (direct == jsMind.direction.right) { From d08e5c7ba87223a2a269afc292c1eec8deb4c5e8 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Tue, 11 May 2021 23:42:23 +0800 Subject: [PATCH 006/274] update comments --- features/jsmind.shell.js | 2 +- js/jsmind.draggable.js | 2 +- js/jsmind.js | 2 +- js/jsmind.screenshot.js | 2 +- style/jsmind.css | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/features/jsmind.shell.js b/features/jsmind.shell.js index c67a6cba..2da81ce6 100644 --- a/features/jsmind.shell.js +++ b/features/jsmind.shell.js @@ -1,6 +1,6 @@ /* * Released under BSD License - * Copyright (c) 2014-2015 hizzgdev@163.com + * Copyright (c) 2014-2021 hizzgdev@163.com * * Project Home: * https://github.com/hizzgdev/jsmind/ diff --git a/js/jsmind.draggable.js b/js/jsmind.draggable.js index c0b6b78a..89624401 100644 --- a/js/jsmind.draggable.js +++ b/js/jsmind.draggable.js @@ -1,6 +1,6 @@ /* * Released under BSD License - * Copyright (c) 2014-2015 hizzgdev@163.com + * Copyright (c) 2014-2021 hizzgdev@163.com * * Project Home: * https://github.com/hizzgdev/jsmind/ diff --git a/js/jsmind.js b/js/jsmind.js index b48c772a..882b5382 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -1,6 +1,6 @@ /* * Released under BSD License - * Copyright (c) 2014-2016 hizzgdev@163.com + * Copyright (c) 2014-2021 hizzgdev@163.com * * Project Home: * https://github.com/hizzgdev/jsmind/ diff --git a/js/jsmind.screenshot.js b/js/jsmind.screenshot.js index f8291a68..c5651d13 100644 --- a/js/jsmind.screenshot.js +++ b/js/jsmind.screenshot.js @@ -1,6 +1,6 @@ /* * Released under BSD License - * Copyright (c) 2014-2015 hizzgdev@163.com + * Copyright (c) 2014-2021 hizzgdev@163.com * * Project Home: * https://github.com/hizzgdev/jsmind/ diff --git a/style/jsmind.css b/style/jsmind.css index fdaa9ff1..613df6fc 100644 --- a/style/jsmind.css +++ b/style/jsmind.css @@ -1,6 +1,6 @@ /* * Released under BSD License - * Copyright (c) 2014-2015 hizzgdev@163.com + * Copyright (c) 2014-2021 hizzgdev@163.com * * Project Home: * https://github.com/hizzgdev/jsmind/ From 4f3772d94252f8e6cac6e4ef6e5998467c12853f Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Tue, 18 May 2021 22:26:52 +0800 Subject: [PATCH 007/274] resolve #296 global shortcut --- js/jsmind.js | 3 ++- style/jsmind.css | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/js/jsmind.js b/js/jsmind.js index 882b5382..4b94f69e 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -2313,6 +2313,7 @@ this.graph = this.opts.engine.toLowerCase() === 'svg' ? new jm.graph_svg(this) : new jm.graph_canvas(this); this.e_panel.className = 'jsmind-inner'; + this.e_panel.tabIndex = 1; this.e_panel.appendChild(this.graph.element()); this.e_panel.appendChild(this.e_nodes); @@ -2810,7 +2811,7 @@ jm.shortcut_provider.prototype = { init: function () { - jm.util.dom.add_event($d, 'keydown', this.handler.bind(this)); + jm.util.dom.add_event(this.jm.view.e_panel, 'keydown', this.handler.bind(this)); this.handles['addchild'] = this.handle_addchild; this.handles['addbrother'] = this.handle_addbrother; diff --git a/style/jsmind.css b/style/jsmind.css index 613df6fc..f178c832 100644 --- a/style/jsmind.css +++ b/style/jsmind.css @@ -7,7 +7,7 @@ */ /* important section */ -.jsmind-inner{position:relative;overflow:auto;width:100%;height:100%;}/*box-shadow:0 0 2px #000;*/ +.jsmind-inner{position:relative;overflow:auto;width:100%;height:100%;outline:none;}/*box-shadow:0 0 2px #000;*/ .jsmind-inner{ moz-user-select:-moz-none; -moz-user-select:none; From 6aae8332d3d1ce726689c1840069fc340e39815c Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sun, 23 May 2021 23:37:49 +0800 Subject: [PATCH 008/274] resolve #298 --- js/jsmind.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/jsmind.js b/js/jsmind.js index 4b94f69e..38206d8f 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -533,7 +533,7 @@ d = node_json.direction == 'left' ? jm.direction.left : jm.direction.right; } var node = mind.add_node(node_parent, node_json.id, node_json.topic, data, null, d, node_json.expanded); - if ('children' in node_json) { + if (!!node_json['children']) { var children = node_json.children; for (var i = 0; i < children.length; i++) { df._extract_subnode(mind, node, children[i]); From 9c54e17027b1efbb83f24074e5405023e834b37b Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sun, 4 Jul 2021 10:12:09 +0800 Subject: [PATCH 009/274] resolve issue #250 --- js/jsmind.draggable.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/js/jsmind.draggable.js b/js/jsmind.draggable.js index 89624401..f1208aa3 100644 --- a/js/jsmind.draggable.js +++ b/js/jsmind.draggable.js @@ -153,7 +153,7 @@ if (node.id == this.active_node.id) { continue; } - if (!layout.is_visible(node)){ + if (!layout.is_visible(node)) { continue; } ns = node.get_size(); @@ -241,8 +241,8 @@ if (!node.isroot) { this.reset_shadow(el); this.active_node = node; - this.offset_x = (e.clientX || e.touches[0].clientX) - el.offsetLeft; - this.offset_y = (e.clientY || e.touches[0].clientY) - el.offsetTop; + this.offset_x = (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft; + this.offset_y = (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop; this.client_hw = Math.floor(el.clientWidth / 2); this.client_hh = Math.floor(el.clientHeight / 2); if (this.hlookup_delay != 0) { @@ -270,10 +270,9 @@ this.show_shadow(); this.moved = true; clear_selection(); - var px = (e.clientX || e.touches[0].clientX) - this.offset_x; - var py = (e.clientY || e.touches[0].clientY) - this.offset_y; - var cx = px + this.client_hw; - var cy = py + this.client_hh; + var jview = this.jm.view; + var px = (e.clientX || e.touches[0].clientX) / jview.actualZoom - this.offset_x; + var py = (e.clientY || e.touches[0].clientY) / jview.actualZoom - this.offset_y; this.shadow.style.left = px + 'px'; this.shadow.style.top = py + 'px'; clear_selection(); From 0ded456fb739b14075372baa721ef719a681293e Mon Sep 17 00:00:00 2001 From: wangkun Date: Mon, 17 Jan 2022 16:50:28 +0800 Subject: [PATCH 010/274] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BD=BF=E7=94=A8enter=E9=94=AE=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=90=8E=E5=B7=A5=E5=85=B7=E6=A0=8F=E5=A4=B1?= =?UTF-8?q?=E7=84=A6=E5=AF=BC=E8=87=B4=E7=9A=84=E5=BF=AB=E6=8D=B7=E9=94=AE?= =?UTF-8?q?=E5=A4=B1=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/jsmind.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/jsmind.js b/js/jsmind.js index 38206d8f..9b68f50f 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -2328,7 +2328,7 @@ var v = this; jm.util.dom.add_event(this.e_editor, 'keydown', function (e) { var evt = e || event; - if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); } + if (evt.keyCode == 13) { v.edit_node_end(); v.e_panel.focus(); evt.stopPropagation(); } }); jm.util.dom.add_event(this.e_editor, 'blur', function (e) { v.edit_node_end(); From 934b3884528bd410737452e8cc586d13f0c51ca4 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Fri, 29 Apr 2022 01:56:34 +0800 Subject: [PATCH 011/274] fix bug #321 --- js/jsmind.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/jsmind.js b/js/jsmind.js index 38206d8f..10bace75 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -2565,6 +2565,7 @@ this.jm.update_node(node.id, topic); } } + this.e_panel.focus(); }, get_view_offset: function () { From cd46a86bbd767293febb207f9796041d453a7637 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Fri, 29 Apr 2022 02:35:07 +0800 Subject: [PATCH 012/274] revert to previous solution --- js/jsmind.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/jsmind.js b/js/jsmind.js index 4d6c95ce..10bace75 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -2328,7 +2328,7 @@ var v = this; jm.util.dom.add_event(this.e_editor, 'keydown', function (e) { var evt = e || event; - if (evt.keyCode == 13) { v.edit_node_end(); v.e_panel.focus(); evt.stopPropagation(); } + if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); } }); jm.util.dom.add_event(this.e_editor, 'blur', function (e) { v.edit_node_end(); From 7ac30217a4463e7b347bf8fe85969bfeede4fd64 Mon Sep 17 00:00:00 2001 From: beijihan <38355356+beijihan@users.noreply.github.com> Date: Fri, 29 Apr 2022 02:41:56 +0800 Subject: [PATCH 013/274] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=E5=9B=A0mode?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E5=BC=95=E8=B5=B7=E7=9A=84direction=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=AF=BC=E8=87=B4drag=E4=B8=8D=E8=83=BD=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E6=A3=80=E6=B5=8B=E7=9A=84=E9=97=AE=E9=A2=98=20(#316)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: wangkun --- js/jsmind.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/jsmind.js b/js/jsmind.js index 10bace75..1c3c1c3a 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -235,7 +235,9 @@ var children = parent_node.children; var children_len = children.length; var r = 0; - for (var i = 0; i < children_len; i++) { if (children[i].direction === jm.direction.left) { r--; } else { r++; } } + if(jm.current.options.mode !== 'side') { + for (var i = 0; i < children_len; i++) { if (children[i].direction === jm.direction.left) { r--; } else { r++; } } + } d = (children_len > 1 && r > 0) ? jm.direction.left : jm.direction.right; } else { d = (direction != jm.direction.left) ? jm.direction.right : jm.direction.left; From 51845b4c97edc48d36068499c11aaf36aa8d0ef6 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Fri, 29 Apr 2022 02:44:02 +0800 Subject: [PATCH 014/274] optimize #316 --- js/jsmind.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/js/jsmind.js b/js/jsmind.js index 1c3c1c3a..f2ec868c 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -232,13 +232,13 @@ if (parent_node.isroot) { var d = jm.direction.right; if (isNaN(direction)) { - var children = parent_node.children; - var children_len = children.length; - var r = 0; - if(jm.current.options.mode !== 'side') { + if (jm.current.options.mode !== 'side') { + var children = parent_node.children; + var children_len = children.length; + var r = 0; for (var i = 0; i < children_len; i++) { if (children[i].direction === jm.direction.left) { r--; } else { r++; } } + d = (children_len > 1 && r > 0) ? jm.direction.left : jm.direction.right; } - d = (children_len > 1 && r > 0) ? jm.direction.left : jm.direction.right; } else { d = (direction != jm.direction.left) ? jm.direction.right : jm.direction.left; } From 6883f57a5b20cdec7d9bc64ef9f42e5d2891445f Mon Sep 17 00:00:00 2001 From: mgcyung Date: Wed, 18 May 2022 16:06:13 +0800 Subject: [PATCH 015/274] test for mathjax (#330) --- README.md | 1 + example/3_mathjax.html | 104 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 example/3_mathjax.html diff --git a/README.md b/README.md index b38eeca7..8ed85e0f 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Links: * Demo : * * + * * Documents : * [简体中文][1] * [English(draft)][2] diff --git a/example/3_mathjax.html b/example/3_mathjax.html new file mode 100644 index 00000000..f1b6c88b --- /dev/null +++ b/example/3_mathjax.html @@ -0,0 +1,104 @@ + + + + + + jsMind + + + + + + + +
+ + + + + + + From 4f20d299fe479c002cafb1d6dce4e82bcbc3f0c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Madsen?= Date: Fri, 20 May 2022 17:32:45 +0200 Subject: [PATCH 016/274] Draggable option (#331) * Update jsmind.js Adding "draggable" option and corresponding "_drag_nodes" function, to override default behavior in case the mind map is bigger than the container. If true, no vertical nor horizontal scrollbars will appear, instead the whole mind map will be draggable while mouse button is down. * Draggable option (https://github.com/hizzgdev/jsmind/issues/323) Adding "draggable" option and corresponding "_drag_nodes" function, to override default behavior in case the mind map is bigger than the container. If true, no vertical nor horizontal scrollbars will appear, instead the whole mind map will be draggable while mouse button is down. * Draggable option (https://github.com/hizzgdev/jsmind/issues/323) Adding documentation to use draggable option. * Moving draggable option (https://github.com/hizzgdev/jsmind/pull/331) Moving option.draggable to option.view.draggable. * hide_scrollbars option (https://github.com/hizzgdev/jsmind/pull/331) Adding new option to hide container scrollbars when draggable mind map. * (https://github.com/hizzgdev/jsmind/pull/331) * Draggable adjustment (https://github.com/hizzgdev/jsmind/pull/331) Taking hizzgdev comments into consideration. * hide_scrollbars_when_draggable (https://github.com/hizzgdev/jsmind/pull/331) Rename hide_scrollbars to hide_scrollbars_when_draggable. * Draggable renaming (https://github.com/hizzgdev/jsmind/pull/331) Renaming hide_scrollbars to hide_scrollbars_when_draggable and _drag_nodes to enable_draggable_canvas. --- docs/en/2.options.md | 14 ++++++++++++- js/jsmind.js | 50 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/docs/en/2.options.md b/docs/en/2.options.md index 6e0f7e47..77be85e0 100644 --- a/docs/en/2.options.md +++ b/docs/en/2.options.md @@ -34,7 +34,9 @@ options = { hmargin:100, // Minimum horizontal distance of the mindmap from the outer frame of the container vmargin:50, // Minimum vertical distance of the mindmap from the outer frame of the container line_width:2, // thickness of the mindmap line - line_color:'#555' // Thought mindmap line color + line_color:'#555', // Thought mindmap line color + draggable: false, // Drag the mind map with your mouse, when it's larger that the container + hide_scrollbars_when_draggable: false // Hide container scrollbars, when mind map is larger than container and draggable option is true. }, layout:{ hspace:30, // horizontal spacing between nodes @@ -117,6 +119,16 @@ These options are described in more detail below. > These two parameters determine the style of the lines in the mindmap. By default, the lines are 2px in thickness and dark gray in color (#555). +**view.draggable** : (bool) Do you want whole mind map draggable inside container? + +> The default value of this parameter is false, as it keep the default behavior with vertical and horizontal scrollbars on the container when mind map is bigger than the container. + +**view.hide_scrollbars_when_draggable** : (bool) Do you want to hide container scrollbars? + +> Rely on draggable option activation, as otherwise it wouldn't be possible to explore the whole mind map when it's bigger than the container. +> The default value of this parameter is false, as it keep the default behavior with vertical and horizontal scrollbars on the container when mind map is bigger than the container. +> Otherwise, if true, there is no more scrollbars, and instead you can drag the mind map with your mouse, while button is down. + **layout.hspace** : horizontal distance (pixels) between (number) nodes **layout.vspace** : vertical spacing (pixels) between (number) nodes diff --git a/js/jsmind.js b/js/jsmind.js index f2ec868c..3574d5fd 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -12,7 +12,7 @@ // __name__ should be a const value, Never try to change it easily. var __name__ = 'jsMind'; // library version - var __version__ = '0.4.6'; + var __version__ = '0.4.7'; // author var __author__ = 'hizzgdev@163.com'; @@ -60,7 +60,9 @@ hmargin: 100, vmargin: 50, line_width: 2, - line_color: '#555' + line_color: '#555', + draggable: false, // drag the mind map with your mouse, when it's larger that the container + hide_scrollbars_when_draggable: false // hide container scrollbars, when mind map is larger than container and draggable option is true. }, layout: { hspace: 30, @@ -1083,7 +1085,9 @@ hmargin: opts.view.hmargin, vmargin: opts.view.vmargin, line_width: opts.view.line_width, - line_color: opts.view.line_color + line_color: opts.view.line_color, + draggable: opts.view.draggable, + hide_scrollbars_when_draggable: opts.view.hide_scrollbars_when_draggable }; // create instance of function provider this.data = new jm.data_provider(this); @@ -1666,7 +1670,7 @@ for (var i = 0; i < l; i++) { this.event_handles[i](type, data); } - } + }, }; @@ -2337,6 +2341,8 @@ }); this.container.appendChild(this.e_panel); + + this.enable_draggable_canvas() }, add_event: function (obj, event_name, event_handle) { @@ -2800,6 +2806,41 @@ this.graph.draw_line(pout, pin, _offset); } }, + + // Drag the whole mind map with your mouse, when it's larger that the container + enable_draggable_canvas: function () { + // If draggable option is true. + if (this.opts.draggable) { + // Dragging disabled by default. + let dragging = false + let x, y + if (this.opts.hide_scrollbars_when_draggable) { + // Avoid scrollbars when mind map is larger than the container (e_panel = id jsmind-inner) + this.e_panel.style = 'overflow: hidden' + } + // Move the whole mind map with mouse moves, while button is down. + jm.util.dom.add_event(this.container, 'mousedown', (eventDown) => { + dragging = true + // Record current mouse position. + x = eventDown.clientX + y = eventDown.clientY + }) + // Stop moving mind map once mouse button is released. + jm.util.dom.add_event(this.container, 'mouseup', () => { + dragging = false + }) + // Follow current mouse position and move mind map accordingly. + jm.util.dom.add_event(this.container, 'mousemove', (eventMove) => { + if (dragging) { + this.e_panel.scrollBy(x - eventMove.clientX, y - eventMove.clientY) + // Record new current position. + x = eventMove.clientX + y = eventMove.clientY + } + }) + } + }, + }; // shortcut provider @@ -3027,4 +3068,3 @@ $w[__name__] = jm; } })(typeof window !== 'undefined' ? window : global); - From 3aeecb67dccd95200bdcf72bfa697193d54b2fbb Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sat, 21 May 2022 00:01:33 +0800 Subject: [PATCH 017/274] update Chinese doc for the new options (#332) --- docs/en/2.options.md | 2 +- docs/zh/2.options.md | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/en/2.options.md b/docs/en/2.options.md index 77be85e0..f7419b36 100644 --- a/docs/en/2.options.md +++ b/docs/en/2.options.md @@ -127,7 +127,7 @@ These options are described in more detail below. > Rely on draggable option activation, as otherwise it wouldn't be possible to explore the whole mind map when it's bigger than the container. > The default value of this parameter is false, as it keep the default behavior with vertical and horizontal scrollbars on the container when mind map is bigger than the container. -> Otherwise, if true, there is no more scrollbars, and instead you can drag the mind map with your mouse, while button is down. +> Otherwise, if true, there is no more scrollbars, and instead you can drag the mind map with your mouse, while button is down. It should be noted that in this case, the user will not be able to explore the mind map by rolling the mouse wheel. **layout.hspace** : horizontal distance (pixels) between (number) nodes **layout.vspace** : vertical spacing (pixels) between (number) nodes diff --git a/docs/zh/2.options.md b/docs/zh/2.options.md index c6ee9d7f..49d85639 100644 --- a/docs/zh/2.options.md +++ b/docs/zh/2.options.md @@ -33,7 +33,9 @@ options = { hmargin:100, // 思维导图距容器外框的最小水平距离 vmargin:50, // 思维导图距容器外框的最小垂直距离 line_width:2, // 思维导图线条的粗细 - line_color:'#555' // 思维导图线条的颜色 + line_color:'#555', // 思维导图线条的颜色 + draggable: false, // 当容器不能完全容纳思维导图时,是否允许拖动画布代替鼠标滚动 + hide_scrollbars_when_draggable: false // 当设置 draggable = true 时,是否隐藏滚动条 }, layout:{ hspace:30, // 节点之间的水平间距 @@ -114,6 +116,15 @@ options = { > 这两个参数决定了思维导图中的线条的样式。默认情况下,线条的粗细是2px,颜色是深灰色(#555)。 +**view.draggable** : (bool) 当容器不能完全容纳思维导图时,是否允许拖动画布代替鼠标滚动 + +> 当思维导图不能在容器中完全显示时,默认情况下容器内会出现滚动条。开启此选项后,将允许通过拖拽画布的方式查看思维导图的不同部分。此参数默认值为 `false` (不开启此功能) + +**view.hide_scrollbars_when_draggable** : (bool) 当设置 draggable = true 时,是否隐藏滚动条 + +> 此参数仅当 `view.draggable` 为 true 时生效,其用于设置是否隐藏水平和垂直容器内的滚动条。 +> 此参数的默认值为 `false` (显示滚动条),当设置为 `true` 时,容器内的滚动条将会被隐藏,用户无法通过滚动鼠标滚轮的方式查看思维导图的不同部分。 + **layout.hspace** : (number) 节点之间的水平间距(像素) **layout.vspace** : (number) 节点之间的垂直间距(像素) From 7ab19a757fc696eaf4befd2babaec52343b89276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Madsen?= Date: Tue, 24 May 2022 18:11:05 +0200 Subject: [PATCH 018/274] Zoom in/out with mousewheel + Ctrl (#334) * Update jsmind.js Adding "draggable" option and corresponding "_drag_nodes" function, to override default behavior in case the mind map is bigger than the container. If true, no vertical nor horizontal scrollbars will appear, instead the whole mind map will be draggable while mouse button is down. * Draggable option (https://github.com/hizzgdev/jsmind/issues/323) Adding "draggable" option and corresponding "_drag_nodes" function, to override default behavior in case the mind map is bigger than the container. If true, no vertical nor horizontal scrollbars will appear, instead the whole mind map will be draggable while mouse button is down. * Draggable option (https://github.com/hizzgdev/jsmind/issues/323) Adding documentation to use draggable option. * Moving draggable option (https://github.com/hizzgdev/jsmind/pull/331) Moving option.draggable to option.view.draggable. * hide_scrollbars option (https://github.com/hizzgdev/jsmind/pull/331) Adding new option to hide container scrollbars when draggable mind map. * (https://github.com/hizzgdev/jsmind/pull/331) * Draggable adjustment (https://github.com/hizzgdev/jsmind/pull/331) Taking hizzgdev comments into consideration. * hide_scrollbars_when_draggable (https://github.com/hizzgdev/jsmind/pull/331) Rename hide_scrollbars to hide_scrollbars_when_draggable. * Draggable renaming (https://github.com/hizzgdev/jsmind/pull/331) Renaming hide_scrollbars to hide_scrollbars_when_draggable and _drag_nodes to enable_draggable_canvas. * Resolve conflict with https://github.com/hizzgdev/jsmind/pull/332 * Mousewheel to zoom in/out Adding option, activated by default, to zoom in/out with mousewheel and Ctrl key pressed (like in all common app). --- js/jsmind.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/js/jsmind.js b/js/jsmind.js index 3574d5fd..12b8ce08 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -12,7 +12,7 @@ // __name__ should be a const value, Never try to change it easily. var __name__ = 'jsMind'; // library version - var __version__ = '0.4.7'; + var __version__ = '0.4.8'; // author var __author__ = 'hizzgdev@163.com'; @@ -72,7 +72,8 @@ default_event_handle: { enable_mousedown_handle: true, enable_click_handle: true, - enable_dblclick_handle: true + enable_dblclick_handle: true, + enable_mousewheel_handle: true }, shortcut: { enable: true, @@ -1141,6 +1142,7 @@ this.view.add_event(this, 'mousedown', this.mousedown_handle); this.view.add_event(this, 'click', this.click_handle); this.view.add_event(this, 'dblclick', this.dblclick_handle); + this.view.add_event(this, "mousewheel", this.mousewheel_handle) }, mousedown_handle: function (e) { @@ -1185,6 +1187,23 @@ } }, + // Use [Ctrl] + Mousewheel, to zoom in/out. + mousewheel_handle: function(event) { + // Test if mousewheel option is enabled and Ctrl key is pressed. + if (!this.options.default_event_handle["enable_mousewheel_handle"] || !window.event.ctrlKey) { + return + } + // Avoid default page scrolling behavior. + event.preventDefault() + + var dir = event.deltaY > 0 ? "Up" : "Down" + if (dir == "Up") { + this.view.zoomIn() + } else { + this.view.zoomOut() + } + }, + begin_edit: function (node) { if (!jm.util.is_node(node)) { var the_node = this.get_node(node); From c27002f08e7750b8b4938b85976743efd37efaec Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Wed, 25 May 2022 00:18:05 +0800 Subject: [PATCH 019/274] update features demo to enable view.draggable & zoom in/out with mousewheel --- example/2_features.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/example/2_features.html b/example/2_features.html index 4133628f..c7e194c0 100644 --- a/example/2_features.html +++ b/example/2_features.html @@ -97,8 +97,7 @@
  • -
  • zoom
  • - +
  • zoom(ctrl+mousewheel)
  • @@ -147,7 +146,10 @@ var options = { container:'jsmind_container', theme:'greensea', - editable:true + editable:true, + view: { + draggable: true + } } _jm = jsMind.show(options); // _jm = jsMind.show(options,mind); From 3d392c00e35ad6f3e8cf06ca7f879759edb66545 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Fri, 27 May 2022 01:27:48 +0800 Subject: [PATCH 020/274] update npm version --- README.md | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8ed85e0f..448684df 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ jsMind ====== -jsMind 是一个显示/编辑思维导图的纯 javascript 类库,其基于 html5 的 canvas 进行设计。jsMind 以 BSD 协议开源,在此基础上你可以在你的项目上任意使用。你可以在此浏览[适用于 jsMind 的 BSD 许可协议(中英文版本)][3]。 +jsMind 是一个显示/编辑思维导图的纯 javascript 类库,其基于 html5 canvas (和 svg) 进行设计。jsMind 以 BSD 协议开源,在此基础上你可以在你的项目上任意使用。你可以在此浏览[适用于 jsMind 的 BSD 许可协议(中英文版本)][3]。 -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. You can read [the BSD license agreement for jsMind in English and Chinese version][3] here. +jsMind is a pure javascript library for mindmap, it base on html5 canvas and svg. jsMind was released under BSD license, you can embed it in any project, if only you observe the license. You can read [the BSD license agreement for jsMind in English and Chinese version][3] here. -**jsmind 现已发布到 npm https://www.npmjs.com/package/jsmind** +**jsmind on npm https://www.npmjs.com/package/jsmind** Links: @@ -17,7 +17,7 @@ Links: * * Documents : * [简体中文][1] - * [English(draft)][2] + * [English][2] * Wiki : * [邮件列表 Mailing List](../../wiki/MailingList) * [热点问题 Hot Topics](../../wiki/HotTopics) diff --git a/package.json b/package.json index 2b1492f2..9c464b50 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsmind", - "version": "0.4.6", + "version": "0.4.8", "description": "jsMind is a pure javascript library for mindmap, it base on html5 canvas. jsMind was released under BSD li cense, you can embed it in any project, if only you observe the license.", "main": "js/jsmind.js", "directories": { From 15341b7ba4b3f004b10bc91d0ff3abc8bb5e1512 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Fri, 27 May 2022 01:30:34 +0800 Subject: [PATCH 021/274] update readme --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 448684df..7f5e97d0 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,11 @@ jsMind 是一个显示/编辑思维导图的纯 javascript 类库,其基于 ht jsMind is a pure javascript library for mindmap, it base on html5 canvas and svg. jsMind was released under BSD license, you can embed it in any project, if only you observe the license. You can read [the BSD license agreement for jsMind in English and Chinese version][3] here. -**jsmind on npm https://www.npmjs.com/package/jsmind** - Links: * App : * Home : +* npm : * Demo : * * From 234301235bcc27f52d2780c6ad8f9e0a3700228d Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Thu, 2 Jun 2022 00:39:19 +0800 Subject: [PATCH 022/274] add unit test for jm.node --- .gitignore | 4 +++ js/jsmind.js | 2 +- package.json | 9 ++++--- tests/jsmind.node.test.js | 57 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 .gitignore create mode 100644 tests/jsmind.node.test.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..993d79c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ + +package-lock.json + diff --git a/js/jsmind.js b/js/jsmind.js index 12b8ce08..5e218040 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -119,7 +119,7 @@ jm.key = { meta: 1 << 13, ctrl: 1 << 12, alt: 1 << 11, shift: 1 << 10 }; jm.node = function (sId, iIndex, sTopic, oData, bIsRoot, oParent, eDirection, bExpanded) { - if (!sId) { logger.error('invalid nodeid'); return; } + if (!sId) { logger.error('invalid node id'); return; } if (typeof iIndex != 'number') { logger.error('invalid node index'); return; } if (typeof bExpanded === 'undefined') { bExpanded = true; } this.id = sId; diff --git a/package.json b/package.json index 9c464b50..b8676f58 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "example": "example" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "jest" }, "repository": { "type": "git", @@ -23,12 +23,15 @@ }, "homepage": "https://github.com/hizzgdev/jsmind#readme", "keywords": [ - "mindmap" + "jsmind", "mindmap" ], "maintainers": [ { "name": "hizzgdev", "email": "hizzgdev@163.com" } - ] + ], + "devDependencies": { + "jest": "^28.1.0" + } } diff --git a/tests/jsmind.node.test.js b/tests/jsmind.node.test.js new file mode 100644 index 00000000..85b07a16 --- /dev/null +++ b/tests/jsmind.node.test.js @@ -0,0 +1,57 @@ +const jm = require('../js/jsmind'); + +test('create node', () => { + const node = new jm.node('1', 1, 'topic', null, false, null, jm.direction.right) + const expected_node = { + id: '1', + index: 1, + topic: 'topic', + data: {}, + isroot: false, + parent: null, + direction: jm.direction.right, + expanded: true, + children: [], + _data: {} + } + expect(node).toEqual(expected_node) +}); + +test('compare node', () => { + function fake_node(sId, iIndex) { + return new jm.node(sId, iIndex) + } + + expect(jm.node.compare(fake_node('a', 1), fake_node('b', 2))).toBeLessThan(0) + expect(jm.node.compare(fake_node('a', 2), fake_node('b', 1))).toBeGreaterThan(0) + expect(jm.node.compare(fake_node('a', 2), fake_node('b', 2))).toBe(0) + expect(jm.node.compare(fake_node('a', -1), fake_node('b', 2))).toBeGreaterThan(0) + expect(jm.node.compare(fake_node('a', 1), fake_node('b', -1))).toBeLessThan(0) + expect(jm.node.compare(fake_node('a', -1), fake_node('b', -1))).toBe(0) + expect(jm.node.compare(fake_node('a', -5), fake_node('b', -6))).toBe(0) +}); + +test('inherited node', () => { + const rootNode = new jm.node('1', 1, 'root', null, true, null); + const node11 = new jm.node('1-1', 1, 'sub node 1', null, false, rootNode); + const node12 = new jm.node('1-2', 2, 'sub node 2', null, false, rootNode); + const node111 = new jm.node('1-1-1', 1, 'sub sub node 1', null, false, node11); + expect(jm.node.inherited(rootNode, node11)).toBe(true); + expect(jm.node.inherited(rootNode, node12)).toBe(true); + expect(jm.node.inherited(rootNode, node111)).toBe(true); + expect(jm.node.inherited(node11, node111)).toBe(true); + expect(jm.node.inherited(rootNode, rootNode)).toBe(true); + expect(jm.node.inherited(node11, node11)).toBe(true); + expect(jm.node.inherited(node11, rootNode)).toBe(false); + expect(jm.node.inherited(node11, node12)).toBe(false); + expect(jm.node.inherited(node12, node111)).toBe(false); +}); + +test('get location and size', () => { + const fakeNode = new jm.node('1', 1) + fakeNode._data.view = { + abs_x: 1, abs_y: 2, width: 3, height: 4 + } + expect(fakeNode.get_location()).toEqual({ x: 1, y: 2 }) + expect(fakeNode.get_size()).toEqual({ w: 3, h: 4 }) +}); From 9c4e83bbf4469cb426be27501253c245f780e915 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Thu, 2 Jun 2022 01:01:04 +0800 Subject: [PATCH 023/274] Automatically run tests on GitHub --- .github/workflows/node.js.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/node.js.yml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 00000000..6d2a0cd7 --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,31 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run build --if-present + - run: npm test From 3f4617595671a78acc7733567d50dc5b8a72b8fb Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Thu, 2 Jun 2022 01:03:44 +0800 Subject: [PATCH 024/274] add package-lock.json --- .gitignore | 2 - package-lock.json | 5928 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 5928 insertions(+), 2 deletions(-) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 993d79c0..d5700888 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ node_modules/ -package-lock.json - diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..1ba811ae --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5928 @@ +{ + "name": "jsmind", + "version": "0.4.8", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "jsmind", + "version": "0.4.8", + "license": "BSD-3-Clause", + "devDependencies": { + "jest": "^28.1.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", + "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.0.tgz", + "integrity": "sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.0", + "jest-util": "^28.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/core": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.0.tgz", + "integrity": "sha512-/2PTt0ywhjZ4NwNO4bUqD9IVJfmFVhVKGlhvSpmEfUCuxYf/3NHcKmRFI+I71lYzbTT3wMuYpETDCTHo81gC/g==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.0", + "@jest/reporters": "^28.1.0", + "@jest/test-result": "^28.1.0", + "@jest/transform": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^28.0.2", + "jest-config": "^28.1.0", + "jest-haste-map": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.0", + "jest-resolve-dependencies": "^28.1.0", + "jest-runner": "^28.1.0", + "jest-runtime": "^28.1.0", + "jest-snapshot": "^28.1.0", + "jest-util": "^28.1.0", + "jest-validate": "^28.1.0", + "jest-watcher": "^28.1.0", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.0.tgz", + "integrity": "sha512-S44WGSxkRngzHslhV6RoAExekfF7Qhwa6R5+IYFa81mpcj0YgdBnRSmvHe3SNwOt64yXaE5GG8Y2xM28ii5ssA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "jest-mock": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.0.tgz", + "integrity": "sha512-be9ETznPLaHOmeJqzYNIXv1ADEzENuQonIoobzThOYPuK/6GhrWNIJDVTgBLCrz3Am73PyEU2urQClZp0hLTtA==", + "dev": true, + "dependencies": { + "expect": "^28.1.0", + "jest-snapshot": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.0.tgz", + "integrity": "sha512-5BrG48dpC0sB80wpeIX5FU6kolDJI4K0n5BM9a5V38MGx0pyRvUBSS0u2aNTdDzmOrCjhOg8pGs6a20ivYkdmw==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.0.tgz", + "integrity": "sha512-Xqsf/6VLeAAq78+GNPzI7FZQRf5cCHj1qgQxCjws9n8rKw8r1UYoeaALwBvyuzOkpU3c1I6emeMySPa96rxtIg==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.0", + "@sinonjs/fake-timers": "^9.1.1", + "@types/node": "*", + "jest-message-util": "^28.1.0", + "jest-mock": "^28.1.0", + "jest-util": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.0.tgz", + "integrity": "sha512-3m7sTg52OTQR6dPhsEQSxAvU+LOBbMivZBwOvKEZ+Rb+GyxVnXi9HKgOTYkx/S99T8yvh17U4tNNJPIEQmtwYw==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.0", + "@jest/expect": "^28.1.0", + "@jest/types": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.0.tgz", + "integrity": "sha512-qxbFfqap/5QlSpIizH9c/bFCDKsQlM4uAKSOvZrP+nIdrjqre3FmKzpTtYyhsaVcOSNK7TTt2kjm+4BJIjysFA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^28.1.0", + "@jest/test-result": "^28.1.0", + "@jest/transform": "^28.1.0", + "@jest/types": "^28.1.0", + "@jridgewell/trace-mapping": "^0.3.7", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-util": "^28.1.0", + "jest-worker": "^28.1.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.23.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.0.2.tgz", + "integrity": "sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.7", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.0.tgz", + "integrity": "sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.0.tgz", + "integrity": "sha512-tZCEiVWlWNTs/2iK9yi6o3AlMfbbYgV4uuZInSVdzZ7ftpHZhCMuhvk2HLYhCZzLgPFQ9MnM1YaxMnh3TILFiQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.0.tgz", + "integrity": "sha512-omy2xe5WxlAfqmsTjTPxw+iXRTRnf+NtX0ToG+4S0tABeb4KsKmPUHq5UBuwunHg3tJRwgEQhEp0M/8oiatLEA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^28.1.0", + "@jridgewell/trace-mapping": "^0.3.7", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.0", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/types": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.0.tgz", + "integrity": "sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", + "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", + "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", + "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.0.tgz", + "integrity": "sha512-zNKk0yhDZ6QUwfxh9k07GII6siNGMJWVUU49gmFj5gfdqDKLqa2RArXOF2CODp4Dr7dLxN2cvAV+667dGJ4b4w==", + "dev": true, + "dependencies": { + "@jest/transform": "^28.1.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.0.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.0.2.tgz", + "integrity": "sha512-Kizhn/ZL+68ZQHxSnHyuvJv8IchXD62KQxV77TBDV/xoBFBOfgRAk97GNs6hXdTTCiVES9nB2I6+7MXXrk5llQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.0.2.tgz", + "integrity": "sha512-sYzXIdgIXXroJTFeB3S6sNDWtlJ2dllCdTEsnZ65ACrMojj3hVNFRmnJ1HZtomGi+Be7aqpY/HJ92fr8OhKVkQ==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^28.0.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001344", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", + "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.0.2.tgz", + "integrity": "sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.143", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz", + "integrity": "sha512-2hIgvu0+pDfXIqmVmV5X6iwMjQ2KxDsWKwM+oI1fABEOy/Dqmll0QJRmIQ3rm+XaoUa/qKrmy5h7LSTFQ6Ldzg==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.0.tgz", + "integrity": "sha512-qFXKl8Pmxk8TBGfaFKRtcQjfXEnKAs+dmlxdwvukJZorwrAabT7M3h8oLOG01I2utEhkmUTi17CHaPBovZsKdw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^28.1.0", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-util": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.0.tgz", + "integrity": "sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg==", + "dev": true, + "dependencies": { + "@jest/core": "^28.1.0", + "import-local": "^3.0.2", + "jest-cli": "^28.1.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.0.2.tgz", + "integrity": "sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-circus": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.0.tgz", + "integrity": "sha512-rNYfqfLC0L0zQKRKsg4n4J+W1A2fbyGH7Ss/kDIocp9KXD9iaL111glsLu7+Z7FHuZxwzInMDXq+N1ZIBkI/TQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.0", + "@jest/expect": "^28.1.0", + "@jest/test-result": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^28.1.0", + "jest-matcher-utils": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-runtime": "^28.1.0", + "jest-snapshot": "^28.1.0", + "jest-util": "^28.1.0", + "pretty-format": "^28.1.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-cli": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.0.tgz", + "integrity": "sha512-fDJRt6WPRriHrBsvvgb93OxgajHHsJbk4jZxiPqmZbMDRcHskfJBBfTyjFko0jjfprP544hOktdSi9HVgl4VUQ==", + "dev": true, + "dependencies": { + "@jest/core": "^28.1.0", + "@jest/test-result": "^28.1.0", + "@jest/types": "^28.1.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^28.1.0", + "jest-util": "^28.1.0", + "jest-validate": "^28.1.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.0.tgz", + "integrity": "sha512-aOV80E9LeWrmflp7hfZNn/zGA4QKv/xsn2w8QCBP0t0+YqObuCWTSgNbHJ0j9YsTuCO08ZR/wsvlxqqHX20iUA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.0", + "@jest/types": "^28.1.0", + "babel-jest": "^28.1.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^28.1.0", + "jest-environment-node": "^28.1.0", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.0", + "jest-runner": "^28.1.0", + "jest-util": "^28.1.0", + "jest-validate": "^28.1.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.0.tgz", + "integrity": "sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.0.2", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.0.2.tgz", + "integrity": "sha512-FH10WWw5NxLoeSdQlJwu+MTiv60aXV/t8KEwIRGEv74WARE1cXIqh1vGdy2CraHuWOOrnzTWj/azQKqW4fO7xg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-each": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.0.tgz", + "integrity": "sha512-a/XX02xF5NTspceMpHujmOexvJ4GftpYXqr6HhhmKmExtMXsyIN/fvanQlt/BcgFoRKN4OCXxLQKth9/n6OPFg==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "jest-util": "^28.1.0", + "pretty-format": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.0.tgz", + "integrity": "sha512-gBLZNiyrPw9CSMlTXF1yJhaBgWDPVvH0Pq6bOEwGMXaYNzhzhw2kA/OijNF8egbCgDS0/veRv97249x2CX+udQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.0", + "@jest/fake-timers": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "jest-mock": "^28.1.0", + "jest-util": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.0.tgz", + "integrity": "sha512-xyZ9sXV8PtKi6NCrJlmq53PyNVHzxmcfXNVvIRHpHmh1j/HChC4pwKgyjj7Z9us19JMw8PpQTJsFWOsIfT93Dw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.0", + "jest-worker": "^28.1.0", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.0.tgz", + "integrity": "sha512-uIJDQbxwEL2AMMs2xjhZl2hw8s77c3wrPaQ9v6tXJLGaaQ+4QrNJH5vuw7hA7w/uGT/iJ42a83opAqxGHeyRIA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz", + "integrity": "sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.0", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.0.tgz", + "integrity": "sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-mock": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.0.tgz", + "integrity": "sha512-H7BrhggNn77WhdL7O1apG0Q/iwl0Bdd5E1ydhCJzL3oBLh/UYxAwR3EJLsBZ9XA3ZU4PA3UNw4tQjduBTCTmLw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.0", + "@types/node": "*" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.0.tgz", + "integrity": "sha512-vvfN7+tPNnnhDvISuzD1P+CRVP8cK0FHXRwPAcdDaQv4zgvwvag2n55/h5VjYcM5UJG7L4TwE5tZlzcI0X2Lhw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.0", + "jest-validate": "^28.1.0", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.0.tgz", + "integrity": "sha512-Ue1VYoSZquPwEvng7Uefw8RmZR+me/1kr30H2jMINjGeHgeO/JgrR6wxj2ofkJ7KSAA11W3cOrhNCbj5Dqqd9g==", + "dev": true, + "dependencies": { + "jest-regex-util": "^28.0.2", + "jest-snapshot": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runner": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.0.tgz", + "integrity": "sha512-FBpmuh1HB2dsLklAlRdOxNTTHKFR6G1Qmd80pVDvwbZXTriqjWqjei5DKFC1UlM732KjYcE6yuCdiF0WUCOS2w==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.0", + "@jest/environment": "^28.1.0", + "@jest/test-result": "^28.1.0", + "@jest/transform": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "graceful-fs": "^4.2.9", + "jest-docblock": "^28.0.2", + "jest-environment-node": "^28.1.0", + "jest-haste-map": "^28.1.0", + "jest-leak-detector": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-resolve": "^28.1.0", + "jest-runtime": "^28.1.0", + "jest-util": "^28.1.0", + "jest-watcher": "^28.1.0", + "jest-worker": "^28.1.0", + "source-map-support": "0.5.13", + "throat": "^6.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.0.tgz", + "integrity": "sha512-wNYDiwhdH/TV3agaIyVF0lsJ33MhyujOe+lNTUiolqKt8pchy1Hq4+tDMGbtD5P/oNLA3zYrpx73T9dMTOCAcg==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.0", + "@jest/fake-timers": "^28.1.0", + "@jest/globals": "^28.1.0", + "@jest/source-map": "^28.0.2", + "@jest/test-result": "^28.1.0", + "@jest/transform": "^28.1.0", + "@jest/types": "^28.1.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-mock": "^28.1.0", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.0", + "jest-snapshot": "^28.1.0", + "jest-util": "^28.1.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.0.tgz", + "integrity": "sha512-ex49M2ZrZsUyQLpLGxQtDbahvgBjlLPgklkqGM0hq/F7W/f8DyqZxVHjdy19QKBm4O93eDp+H5S23EiTbbUmHw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.0", + "@jest/transform": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^28.1.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.0", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.0", + "jest-matcher-utils": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-util": "^28.1.0", + "natural-compare": "^1.4.0", + "pretty-format": "^28.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.0.tgz", + "integrity": "sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-validate": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.0.tgz", + "integrity": "sha512-Lly7CJYih3vQBfjLeANGgBSBJ7pEa18cxpQfQEq2go2xyEzehnHfQTjoUia8xUv4x4J80XKFIDwJJThXtRFQXQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "leven": "^3.1.0", + "pretty-format": "^28.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.0.tgz", + "integrity": "sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.0.tgz", + "integrity": "sha512-ZHwM6mNwaWBR52Snff8ZvsCTqQsvhCxP/bT1I6T6DAnb6ygkshsyLQIMxFwHpYxht0HOoqt23JlC01viI7T03A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz", + "integrity": "sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.0.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", + "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.7", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true, + "engines": { + "node": ">=12" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "dev": true + }, + "@babel/core": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "requires": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "dev": true, + "requires": { + "@babel/types": "^7.18.2" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/helpers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" + } + }, + "@babel/highlight": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", + "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.0.tgz", + "integrity": "sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.0", + "jest-util": "^28.1.0", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.0.tgz", + "integrity": "sha512-/2PTt0ywhjZ4NwNO4bUqD9IVJfmFVhVKGlhvSpmEfUCuxYf/3NHcKmRFI+I71lYzbTT3wMuYpETDCTHo81gC/g==", + "dev": true, + "requires": { + "@jest/console": "^28.1.0", + "@jest/reporters": "^28.1.0", + "@jest/test-result": "^28.1.0", + "@jest/transform": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^28.0.2", + "jest-config": "^28.1.0", + "jest-haste-map": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.0", + "jest-resolve-dependencies": "^28.1.0", + "jest-runner": "^28.1.0", + "jest-runtime": "^28.1.0", + "jest-snapshot": "^28.1.0", + "jest-util": "^28.1.0", + "jest-validate": "^28.1.0", + "jest-watcher": "^28.1.0", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.0.tgz", + "integrity": "sha512-S44WGSxkRngzHslhV6RoAExekfF7Qhwa6R5+IYFa81mpcj0YgdBnRSmvHe3SNwOt64yXaE5GG8Y2xM28ii5ssA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "jest-mock": "^28.1.0" + } + }, + "@jest/expect": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.0.tgz", + "integrity": "sha512-be9ETznPLaHOmeJqzYNIXv1ADEzENuQonIoobzThOYPuK/6GhrWNIJDVTgBLCrz3Am73PyEU2urQClZp0hLTtA==", + "dev": true, + "requires": { + "expect": "^28.1.0", + "jest-snapshot": "^28.1.0" + } + }, + "@jest/expect-utils": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.0.tgz", + "integrity": "sha512-5BrG48dpC0sB80wpeIX5FU6kolDJI4K0n5BM9a5V38MGx0pyRvUBSS0u2aNTdDzmOrCjhOg8pGs6a20ivYkdmw==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2" + } + }, + "@jest/fake-timers": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.0.tgz", + "integrity": "sha512-Xqsf/6VLeAAq78+GNPzI7FZQRf5cCHj1qgQxCjws9n8rKw8r1UYoeaALwBvyuzOkpU3c1I6emeMySPa96rxtIg==", + "dev": true, + "requires": { + "@jest/types": "^28.1.0", + "@sinonjs/fake-timers": "^9.1.1", + "@types/node": "*", + "jest-message-util": "^28.1.0", + "jest-mock": "^28.1.0", + "jest-util": "^28.1.0" + } + }, + "@jest/globals": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.0.tgz", + "integrity": "sha512-3m7sTg52OTQR6dPhsEQSxAvU+LOBbMivZBwOvKEZ+Rb+GyxVnXi9HKgOTYkx/S99T8yvh17U4tNNJPIEQmtwYw==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.0", + "@jest/expect": "^28.1.0", + "@jest/types": "^28.1.0" + } + }, + "@jest/reporters": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.0.tgz", + "integrity": "sha512-qxbFfqap/5QlSpIizH9c/bFCDKsQlM4uAKSOvZrP+nIdrjqre3FmKzpTtYyhsaVcOSNK7TTt2kjm+4BJIjysFA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^28.1.0", + "@jest/test-result": "^28.1.0", + "@jest/transform": "^28.1.0", + "@jest/types": "^28.1.0", + "@jridgewell/trace-mapping": "^0.3.7", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-util": "^28.1.0", + "jest-worker": "^28.1.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^9.0.0" + } + }, + "@jest/schemas": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.23.3" + } + }, + "@jest/source-map": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.0.2.tgz", + "integrity": "sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.7", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.0.tgz", + "integrity": "sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ==", + "dev": true, + "requires": { + "@jest/console": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.0.tgz", + "integrity": "sha512-tZCEiVWlWNTs/2iK9yi6o3AlMfbbYgV4uuZInSVdzZ7ftpHZhCMuhvk2HLYhCZzLgPFQ9MnM1YaxMnh3TILFiQ==", + "dev": true, + "requires": { + "@jest/test-result": "^28.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.0", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.0.tgz", + "integrity": "sha512-omy2xe5WxlAfqmsTjTPxw+iXRTRnf+NtX0ToG+4S0tABeb4KsKmPUHq5UBuwunHg3tJRwgEQhEp0M/8oiatLEA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^28.1.0", + "@jridgewell/trace-mapping": "^0.3.7", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.0", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + } + }, + "@jest/types": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.0.tgz", + "integrity": "sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA==", + "dev": true, + "requires": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@sinclair/typebox": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", + "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/node": { + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", + "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==", + "dev": true + }, + "@types/prettier": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", + "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "babel-jest": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.0.tgz", + "integrity": "sha512-zNKk0yhDZ6QUwfxh9k07GII6siNGMJWVUU49gmFj5gfdqDKLqa2RArXOF2CODp4Dr7dLxN2cvAV+667dGJ4b4w==", + "dev": true, + "requires": { + "@jest/transform": "^28.1.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.0.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.0.2.tgz", + "integrity": "sha512-Kizhn/ZL+68ZQHxSnHyuvJv8IchXD62KQxV77TBDV/xoBFBOfgRAk97GNs6hXdTTCiVES9nB2I6+7MXXrk5llQ==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.0.2.tgz", + "integrity": "sha512-sYzXIdgIXXroJTFeB3S6sNDWtlJ2dllCdTEsnZ65ACrMojj3hVNFRmnJ1HZtomGi+Be7aqpY/HJ92fr8OhKVkQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^28.0.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001344", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", + "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.0.2.tgz", + "integrity": "sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.143", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz", + "integrity": "sha512-2hIgvu0+pDfXIqmVmV5X6iwMjQ2KxDsWKwM+oI1fABEOy/Dqmll0QJRmIQ3rm+XaoUa/qKrmy5h7LSTFQ6Ldzg==", + "dev": true + }, + "emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.0.tgz", + "integrity": "sha512-qFXKl8Pmxk8TBGfaFKRtcQjfXEnKAs+dmlxdwvukJZorwrAabT7M3h8oLOG01I2utEhkmUTi17CHaPBovZsKdw==", + "dev": true, + "requires": { + "@jest/expect-utils": "^28.1.0", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-util": "^28.1.0" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.0.tgz", + "integrity": "sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg==", + "dev": true, + "requires": { + "@jest/core": "^28.1.0", + "import-local": "^3.0.2", + "jest-cli": "^28.1.0" + } + }, + "jest-changed-files": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.0.2.tgz", + "integrity": "sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.0.tgz", + "integrity": "sha512-rNYfqfLC0L0zQKRKsg4n4J+W1A2fbyGH7Ss/kDIocp9KXD9iaL111glsLu7+Z7FHuZxwzInMDXq+N1ZIBkI/TQ==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.0", + "@jest/expect": "^28.1.0", + "@jest/test-result": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^28.1.0", + "jest-matcher-utils": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-runtime": "^28.1.0", + "jest-snapshot": "^28.1.0", + "jest-util": "^28.1.0", + "pretty-format": "^28.1.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + } + }, + "jest-cli": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.0.tgz", + "integrity": "sha512-fDJRt6WPRriHrBsvvgb93OxgajHHsJbk4jZxiPqmZbMDRcHskfJBBfTyjFko0jjfprP544hOktdSi9HVgl4VUQ==", + "dev": true, + "requires": { + "@jest/core": "^28.1.0", + "@jest/test-result": "^28.1.0", + "@jest/types": "^28.1.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^28.1.0", + "jest-util": "^28.1.0", + "jest-validate": "^28.1.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + }, + "jest-config": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.0.tgz", + "integrity": "sha512-aOV80E9LeWrmflp7hfZNn/zGA4QKv/xsn2w8QCBP0t0+YqObuCWTSgNbHJ0j9YsTuCO08ZR/wsvlxqqHX20iUA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.0", + "@jest/types": "^28.1.0", + "babel-jest": "^28.1.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^28.1.0", + "jest-environment-node": "^28.1.0", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.0", + "jest-runner": "^28.1.0", + "jest-util": "^28.1.0", + "jest-validate": "^28.1.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.0.tgz", + "integrity": "sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^28.0.2", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.0" + } + }, + "jest-docblock": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.0.2.tgz", + "integrity": "sha512-FH10WWw5NxLoeSdQlJwu+MTiv60aXV/t8KEwIRGEv74WARE1cXIqh1vGdy2CraHuWOOrnzTWj/azQKqW4fO7xg==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.0.tgz", + "integrity": "sha512-a/XX02xF5NTspceMpHujmOexvJ4GftpYXqr6HhhmKmExtMXsyIN/fvanQlt/BcgFoRKN4OCXxLQKth9/n6OPFg==", + "dev": true, + "requires": { + "@jest/types": "^28.1.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "jest-util": "^28.1.0", + "pretty-format": "^28.1.0" + } + }, + "jest-environment-node": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.0.tgz", + "integrity": "sha512-gBLZNiyrPw9CSMlTXF1yJhaBgWDPVvH0Pq6bOEwGMXaYNzhzhw2kA/OijNF8egbCgDS0/veRv97249x2CX+udQ==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.0", + "@jest/fake-timers": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "jest-mock": "^28.1.0", + "jest-util": "^28.1.0" + } + }, + "jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true + }, + "jest-haste-map": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.0.tgz", + "integrity": "sha512-xyZ9sXV8PtKi6NCrJlmq53PyNVHzxmcfXNVvIRHpHmh1j/HChC4pwKgyjj7Z9us19JMw8PpQTJsFWOsIfT93Dw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.0", + "jest-worker": "^28.1.0", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-leak-detector": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.0.tgz", + "integrity": "sha512-uIJDQbxwEL2AMMs2xjhZl2hw8s77c3wrPaQ9v6tXJLGaaQ+4QrNJH5vuw7hA7w/uGT/iJ42a83opAqxGHeyRIA==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.0" + } + }, + "jest-matcher-utils": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz", + "integrity": "sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.0", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.0" + } + }, + "jest-message-util": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.0.tgz", + "integrity": "sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.0.tgz", + "integrity": "sha512-H7BrhggNn77WhdL7O1apG0Q/iwl0Bdd5E1ydhCJzL3oBLh/UYxAwR3EJLsBZ9XA3ZU4PA3UNw4tQjduBTCTmLw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.0", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true + }, + "jest-resolve": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.0.tgz", + "integrity": "sha512-vvfN7+tPNnnhDvISuzD1P+CRVP8cK0FHXRwPAcdDaQv4zgvwvag2n55/h5VjYcM5UJG7L4TwE5tZlzcI0X2Lhw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.0", + "jest-validate": "^28.1.0", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.0.tgz", + "integrity": "sha512-Ue1VYoSZquPwEvng7Uefw8RmZR+me/1kr30H2jMINjGeHgeO/JgrR6wxj2ofkJ7KSAA11W3cOrhNCbj5Dqqd9g==", + "dev": true, + "requires": { + "jest-regex-util": "^28.0.2", + "jest-snapshot": "^28.1.0" + } + }, + "jest-runner": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.0.tgz", + "integrity": "sha512-FBpmuh1HB2dsLklAlRdOxNTTHKFR6G1Qmd80pVDvwbZXTriqjWqjei5DKFC1UlM732KjYcE6yuCdiF0WUCOS2w==", + "dev": true, + "requires": { + "@jest/console": "^28.1.0", + "@jest/environment": "^28.1.0", + "@jest/test-result": "^28.1.0", + "@jest/transform": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "graceful-fs": "^4.2.9", + "jest-docblock": "^28.0.2", + "jest-environment-node": "^28.1.0", + "jest-haste-map": "^28.1.0", + "jest-leak-detector": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-resolve": "^28.1.0", + "jest-runtime": "^28.1.0", + "jest-util": "^28.1.0", + "jest-watcher": "^28.1.0", + "jest-worker": "^28.1.0", + "source-map-support": "0.5.13", + "throat": "^6.0.1" + } + }, + "jest-runtime": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.0.tgz", + "integrity": "sha512-wNYDiwhdH/TV3agaIyVF0lsJ33MhyujOe+lNTUiolqKt8pchy1Hq4+tDMGbtD5P/oNLA3zYrpx73T9dMTOCAcg==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.0", + "@jest/fake-timers": "^28.1.0", + "@jest/globals": "^28.1.0", + "@jest/source-map": "^28.0.2", + "@jest/test-result": "^28.1.0", + "@jest/transform": "^28.1.0", + "@jest/types": "^28.1.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-mock": "^28.1.0", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.0", + "jest-snapshot": "^28.1.0", + "jest-util": "^28.1.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.0.tgz", + "integrity": "sha512-ex49M2ZrZsUyQLpLGxQtDbahvgBjlLPgklkqGM0hq/F7W/f8DyqZxVHjdy19QKBm4O93eDp+H5S23EiTbbUmHw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.0", + "@jest/transform": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^28.1.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.0", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.0", + "jest-matcher-utils": "^28.1.0", + "jest-message-util": "^28.1.0", + "jest-util": "^28.1.0", + "natural-compare": "^1.4.0", + "pretty-format": "^28.1.0", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "jest-util": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.0.tgz", + "integrity": "sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.0.tgz", + "integrity": "sha512-Lly7CJYih3vQBfjLeANGgBSBJ7pEa18cxpQfQEq2go2xyEzehnHfQTjoUia8xUv4x4J80XKFIDwJJThXtRFQXQ==", + "dev": true, + "requires": { + "@jest/types": "^28.1.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "leven": "^3.1.0", + "pretty-format": "^28.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.0.tgz", + "integrity": "sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA==", + "dev": true, + "requires": { + "@jest/test-result": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.0", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.0.tgz", + "integrity": "sha512-ZHwM6mNwaWBR52Snff8ZvsCTqQsvhCxP/bT1I6T6DAnb6ygkshsyLQIMxFwHpYxht0HOoqt23JlC01viI7T03A==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pretty-format": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz", + "integrity": "sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q==", + "dev": true, + "requires": { + "@jest/schemas": "^28.0.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", + "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.7", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true + } + } +} From ee9c87f6ba71d1453f0230fbd9c36fe92e39a44a Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Thu, 2 Jun 2022 01:20:57 +0800 Subject: [PATCH 025/274] add test --- tests/jsmind.mind.test.js | 2 ++ tests/jsmind.node.test.js | 4 ++++ 2 files changed, 6 insertions(+) create mode 100644 tests/jsmind.mind.test.js diff --git a/tests/jsmind.mind.test.js b/tests/jsmind.mind.test.js new file mode 100644 index 00000000..256bddb4 --- /dev/null +++ b/tests/jsmind.mind.test.js @@ -0,0 +1,2 @@ +const jm = require('../js/jsmind'); +// TODO: add unit test \ No newline at end of file diff --git a/tests/jsmind.node.test.js b/tests/jsmind.node.test.js index 85b07a16..0384a45b 100644 --- a/tests/jsmind.node.test.js +++ b/tests/jsmind.node.test.js @@ -15,6 +15,10 @@ test('create node', () => { _data: {} } expect(node).toEqual(expected_node) + expect(new jm.node()).toEqual({}); + expect(new jm.node('1', '2')).toEqual({}); + expect(new jm.node('1', 'a')).toEqual({}); + expect(new jm.node('1', null)).toEqual({}); }); test('compare node', () => { From d8377ddd0663ac898cf4f5913d6c69094abe3743 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Thu, 2 Jun 2022 01:37:08 +0800 Subject: [PATCH 026/274] mute console.error --- tests/jsmind.mind.test.js | 13 ++++++++++++- tests/jsmind.node.test.js | 3 +++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/jsmind.mind.test.js b/tests/jsmind.mind.test.js index 256bddb4..c92b2da9 100644 --- a/tests/jsmind.mind.test.js +++ b/tests/jsmind.mind.test.js @@ -1,2 +1,13 @@ const jm = require('../js/jsmind'); -// TODO: add unit test \ No newline at end of file + +test('create mind', () => { + const mind = new jm.mind(); + expect(new jm.mind()).toEqual({ + name: null, + author: null, + version: null, + root: null, + selected: null, + nodes: {} + }) +}); \ No newline at end of file diff --git a/tests/jsmind.node.test.js b/tests/jsmind.node.test.js index 0384a45b..29186dcf 100644 --- a/tests/jsmind.node.test.js +++ b/tests/jsmind.node.test.js @@ -15,6 +15,9 @@ test('create node', () => { _data: {} } expect(node).toEqual(expected_node) + + const error = jest.spyOn(console, "error").mockImplementation(() => { }); + expect(new jm.node()).toEqual({}); expect(new jm.node('1', '2')).toEqual({}); expect(new jm.node('1', 'a')).toEqual({}); From b71b23afead0095550fe12564c46a8924b444a04 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Thu, 2 Jun 2022 01:48:05 +0800 Subject: [PATCH 027/274] add test for set root --- tests/jsmind.mind.test.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/jsmind.mind.test.js b/tests/jsmind.mind.test.js index c92b2da9..0dc079a1 100644 --- a/tests/jsmind.mind.test.js +++ b/tests/jsmind.mind.test.js @@ -10,4 +10,19 @@ test('create mind', () => { selected: null, nodes: {} }) -}); \ No newline at end of file +}); + +test('set root', () => { + const mind = new jm.mind(); + mind.set_root('1', 'root', { 'addition': 'test' }); + const root_node = new jm.node('1', 0, 'root', { 'addition': 'test' }, true); + const expect_mind = { + name: null, + author: null, + version: null, + root: root_node, + selected: null, + nodes: { '1': root_node } + } + expect(mind).toEqual(expect_mind); +}) \ No newline at end of file From f6e0c4f48db564d68813e6c542985aad8e4aa781 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Thu, 2 Jun 2022 02:00:51 +0800 Subject: [PATCH 028/274] add ci badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7f5e97d0..e2b3ca72 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ jsMind ====== +![build-test](https://github.com/hizzgdev/jsmind/actions/workflows/node.js.yml/badge.svg) jsMind 是一个显示/编辑思维导图的纯 javascript 类库,其基于 html5 canvas (和 svg) 进行设计。jsMind 以 BSD 协议开源,在此基础上你可以在你的项目上任意使用。你可以在此浏览[适用于 jsMind 的 BSD 许可协议(中英文版本)][3]。 From feef44835c3f1243e159f14b6c760bba5213f695 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Fri, 3 Jun 2022 02:29:31 +0800 Subject: [PATCH 029/274] [refactor]detect direction in layout module (#336) * detect direction in layout module * add unit test --- js/jsmind.js | 145 ++++++++++++++++++-------------------- package.json | 3 + tests/jsmind.mind.test.js | 110 +++++++++++++++++++++++++++-- tests/jsmind.node.test.js | 8 ++- 4 files changed, 184 insertions(+), 82 deletions(-) diff --git a/js/jsmind.js b/js/jsmind.js index 5e218040..7304b62a 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -12,7 +12,7 @@ // __name__ should be a const value, Never try to change it easily. var __name__ = 'jsMind'; // library version - var __version__ = '0.4.8'; + var __version__ = '0.4.9'; // author var __author__ = 'hizzgdev@163.com'; @@ -107,7 +107,7 @@ return; } this.options = opts; - this.inited = false; + this.initialized = false; this.mind = null; this.event_handles = []; this.init(); @@ -215,39 +215,22 @@ if (this.root == null) { this.root = new jm.node(nodeid, 0, topic, data, true); this._put_node(this.root); + return this.root; } else { logger.error('root node is already exist'); + return null; } }, - add_node: function (parent_node, nodeid, topic, data, idx, direction, expanded) { + add_node: function (parent_node, nodeid, topic, data, direction, expanded, idx) { if (!jm.util.is_node(parent_node)) { - var the_parent_node = this.get_node(parent_node); - if (!the_parent_node) { - logger.error('the parent_node[id=' + parent_node + '] can not be found.'); - return null; - } else { - return this.add_node(the_parent_node, nodeid, topic, data, idx, direction, expanded); - } + logger.error('the parent_node '+parent_node+' is not a node.'); + return null; } - var nodeindex = idx || -1; - var node = null; + var node_index = idx || -1; + var node = new jm.node(nodeid, node_index, topic, data, false, parent_node, parent_node.direction, expanded); if (parent_node.isroot) { - var d = jm.direction.right; - if (isNaN(direction)) { - if (jm.current.options.mode !== 'side') { - var children = parent_node.children; - var children_len = children.length; - var r = 0; - for (var i = 0; i < children_len; i++) { if (children[i].direction === jm.direction.left) { r--; } else { r++; } } - d = (children_len > 1 && r > 0) ? jm.direction.left : jm.direction.right; - } - } else { - d = (direction != jm.direction.left) ? jm.direction.right : jm.direction.left; - } - node = new jm.node(nodeid, nodeindex, topic, data, false, parent_node, d, expanded); - } else { - node = new jm.node(nodeid, nodeindex, topic, data, false, parent_node, parent_node.direction, expanded); + node.direction = direction || jm.direction.right; } if (this._put_node(node)) { parent_node.children.push(node); @@ -259,18 +242,13 @@ return node; }, - insert_node_before: function (node_before, nodeid, topic, data) { + insert_node_before: function (node_before, nodeid, topic, data, direction) { if (!jm.util.is_node(node_before)) { - var the_node_before = this.get_node(node_before); - if (!the_node_before) { - logger.error('the node_before[id=' + node_before + '] can not be found.'); - return null; - } else { - return this.insert_node_before(the_node_before, nodeid, topic, data); - } + logger.error('the node_before '+node_before+' is not a node.'); + return null; } var node_index = node_before.index - 0.5; - return this.add_node(node_before.parent, nodeid, topic, data, node_index); + return this.add_node(node_before.parent, nodeid, topic, data, direction, true, node_index); }, get_node_before: function (node) { @@ -292,18 +270,13 @@ } }, - insert_node_after: function (node_after, nodeid, topic, data) { + insert_node_after: function (node_after, nodeid, topic, data, direction) { if (!jm.util.is_node(node_after)) { - var the_node_after = this.get_node(node_after); - if (!the_node_after) { - logger.error('the node_after[id=' + node_after + '] can not be found.'); - return null; - } else { - return this.insert_node_after(the_node_after, nodeid, topic, data); - } + logger.error('the node_after '+node_after+' is not a node.'); + return null; } var node_index = node_after.index + 0.5; - return this.add_node(node_after.parent, nodeid, topic, data, node_index); + return this.add_node(node_after.parent, nodeid, topic, data, direction, true, node_index); }, get_node_after: function (node) { @@ -319,7 +292,8 @@ if (node.isroot) { return null; } var idx = node.index; var brothers = node.parent.children; - if (brothers.length >= idx) { + console.log('debug', brothers.length, idx) + if (brothers.length > idx) { return node.parent.children[idx]; } else { return null; @@ -537,7 +511,7 @@ if (node_parent.isroot) { d = node_json.direction == 'left' ? jm.direction.left : jm.direction.right; } - var node = mind.add_node(node_parent, node_json.id, node_json.topic, data, null, d, node_json.expanded); + var node = mind.add_node(node_parent, node_json.id, node_json.topic, data, d, node_json.expanded); if (!!node_json['children']) { var children = node_json.children; for (var i = 0; i < children.length; i++) { @@ -616,9 +590,9 @@ var narray = node_array.slice(0); // reverse array for improving looping performance narray.reverse(); - var root_id = df._extract_root(mind, narray); - if (!!root_id) { - df._extract_subnode(mind, root_id, narray); + var root_node = df._extract_root(mind, narray); + if (!!root_node) { + df._extract_subnode(mind, root_node, narray); } else { logger.error('root node can not be found'); } @@ -631,15 +605,15 @@ if ('isroot' in node_array[i] && node_array[i].isroot) { var root_json = node_array[i]; var data = df._extract_data(root_json); - mind.set_root(root_json.id, root_json.topic, data); + var node = mind.set_root(root_json.id, root_json.topic, data); node_array.splice(i, 1); - return root_json.id; + return node; } } return null; }, - _extract_subnode: function (mind, parentid, node_array) { + _extract_subnode: function (mind, parent_node, node_array) { var df = jm.format.node_array; var i = node_array.length; var node_json = null; @@ -647,17 +621,17 @@ var extract_count = 0; while (i--) { node_json = node_array[i]; - if (node_json.parentid == parentid) { + if (node_json.parentid == parent_node.id) { data = df._extract_data(node_json); var d = null; var node_direction = node_json.direction; if (!!node_direction) { d = node_direction == 'left' ? jm.direction.left : jm.direction.right; } - mind.add_node(parentid, node_json.id, node_json.topic, data, null, d, node_json.expanded); + var node = mind.add_node(parent_node, node_json.id, node_json.topic, data, d, node_json.expanded); node_array.splice(i, 1); extract_count++; - var sub_extract_count = df._extract_subnode(mind, node_json.id, node_array); + var sub_extract_count = df._extract_subnode(mind, node, node_array); if (sub_extract_count > 0) { // reset loop index after extract subordinate node i = node_array.length; @@ -794,7 +768,7 @@ return node; }, - _load_node: function (mind, parent_id, xml_node) { + _load_node: function (mind, parent_node, xml_node) { var df = jm.format.freemind; var node_id = xml_node.getAttribute('ID'); var node_topic = xml_node.getAttribute('TEXT'); @@ -821,17 +795,18 @@ node_direction = node_position == 'left' ? jm.direction.left : jm.direction.right; } //logger.debug(node_position +':'+ node_direction); - if (!!parent_id) { - mind.add_node(parent_id, node_id, node_topic, node_data, null, node_direction, node_expanded); + var node = null; + if (!!parent_node) { + node = mind.add_node(parent_node, node_id, node_topic, node_data, node_direction, node_expanded); } else { - mind.set_root(node_id, node_topic, node_data); + node = mind.set_root(node_id, node_topic, node_data); } var children = xml_node.childNodes; var child = null; for (var i = 0; i < children.length; i++) { child = children[i]; if (child.nodeType == 1 && child.tagName == 'node') { - df._load_node(mind, node_id, child); + df._load_node(mind, node, child); } } }, @@ -1068,8 +1043,8 @@ jm.prototype = { init: function () { - if (this.inited) { return; } - this.inited = true; + if (this.initialized) { return; } + this.initialized = true; var opts = this.options; @@ -1188,7 +1163,7 @@ }, // Use [Ctrl] + Mousewheel, to zoom in/out. - mousewheel_handle: function(event) { + mousewheel_handle: function (event) { // Test if mousewheel option is enabled and Ctrl key is pressed. if (!this.options.default_event_handle["enable_mousewheel_handle"] || !window.event.ctrlKey) { return @@ -1343,20 +1318,25 @@ return this.mind.root; }, - get_node: function (nodeid) { - return this.mind.get_node(nodeid); + get_node: function (node) { + if(jm.util.is_node(node)){ + return node; + } + return this.mind.get_node(node); }, add_node: function (parent_node, nodeid, topic, data) { if (this.get_editable()) { - var node = this.mind.add_node(parent_node, nodeid, topic, data); + var the_parent_node = this.get_node(parent_node); + var direction = this.layout.calculate_next_child_direction(the_parent_node); + var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction); if (!!node) { this.view.add_node(node); this.layout.layout(); this.view.show(false); this.view.reset_node_custom_style(node); - this.expand_node(parent_node); - this.invoke_event_handle(jm.event_type.edit, { evt: 'add_node', data: [parent_node.id, nodeid, topic, data], node: nodeid }); + this.expand_node(the_parent_node); + this.invoke_event_handle(jm.event_type.edit, { evt: 'add_node', data: [the_parent_node.id, nodeid, topic, data], node: nodeid }); } return node; } else { @@ -1367,13 +1347,14 @@ insert_node_before: function (node_before, nodeid, topic, data) { if (this.get_editable()) { - var beforeid = jm.util.is_node(node_before) ? node_before.id : node_before; - var node = this.mind.insert_node_before(node_before, nodeid, topic, data); + var the_node_before = this.get_node(node_before); + var direction = this.layout.calculate_next_child_direction(the_node_before.parent); + var node = this.mind.insert_node_before(the_node_before, nodeid, topic, data, direction); if (!!node) { this.view.add_node(node); this.layout.layout(); this.view.show(false); - this.invoke_event_handle(jm.event_type.edit, { evt: 'insert_node_before', data: [beforeid, nodeid, topic, data], node: nodeid }); + this.invoke_event_handle(jm.event_type.edit, { evt: 'insert_node_before', data: [the_node_before.id, nodeid, topic, data], node: nodeid }); } return node; } else { @@ -1384,13 +1365,14 @@ insert_node_after: function (node_after, nodeid, topic, data) { if (this.get_editable()) { - var afterid = jm.util.is_node(node_after) ? node_after.id : node_after; - var node = this.mind.insert_node_after(node_after, nodeid, topic, data); + var the_node_after = this.get_node(node_after); + var direction = this.layout.calculate_next_child_direction(the_node_after.parent); + var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction); if (!!node) { this.view.add_node(node); this.layout.layout(); this.view.show(false); - this.invoke_event_handle(jm.event_type.edit, { evt: 'insert_node_after', data: [afterid, nodeid, topic, data], node: nodeid }); + this.invoke_event_handle(jm.event_type.edit, { evt: 'insert_node_after', data: [the_node_after.id, nodeid, topic, data], node: nodeid }); } return node; } else { @@ -1763,10 +1745,23 @@ init: function () { logger.debug('layout.init'); }, + reset: function () { logger.debug('layout.reset'); this.bounds = { n: 0, s: 0, w: 0, e: 0 }; }, + + calculate_next_child_direction: function(node) { + if (this.isside) { + return jm.direction.right; + } + var children = node.children || []; + var children_len = children.length; + var r = 0; + for (var i = 0; i < children_len; i++) { if (children[i].direction === jm.direction.left) { r--; } else { r++; } } + return (children_len > 1 && r > 0) ? jm.direction.left : jm.direction.right; + }, + layout: function () { logger.debug('layout.layout'); this.layout_direction(); diff --git a/package.json b/package.json index b8676f58..a462845e 100644 --- a/package.json +++ b/package.json @@ -33,5 +33,8 @@ ], "devDependencies": { "jest": "^28.1.0" + }, + "jest": { + "verbose": true } } diff --git a/tests/jsmind.mind.test.js b/tests/jsmind.mind.test.js index 0dc079a1..d1d985ea 100644 --- a/tests/jsmind.mind.test.js +++ b/tests/jsmind.mind.test.js @@ -1,6 +1,10 @@ const jm = require('../js/jsmind'); -test('create mind', () => { +beforeEach(() => { + jest.restoreAllMocks(); +}); + +test('initial', () => { const mind = new jm.mind(); expect(new jm.mind()).toEqual({ name: null, @@ -12,17 +16,113 @@ test('create mind', () => { }) }); +test('get node', () => { + const mind = new jm.mind(); + const fake_node = new jm.node('1', 1); + mind.nodes = { '1': fake_node } + expect(mind.get_node('1')).toBe(fake_node) + + jest.spyOn(console, "warn").mockImplementation(() => { }); + expect(mind.get_node('2')).toBe(null) +}); + test('set root', () => { const mind = new jm.mind(); mind.set_root('1', 'root', { 'addition': 'test' }); const root_node = new jm.node('1', 0, 'root', { 'addition': 'test' }, true); - const expect_mind = { + expect(mind).toEqual({ name: null, author: null, version: null, root: root_node, selected: null, nodes: { '1': root_node } - } - expect(mind).toEqual(expect_mind); -}) \ No newline at end of file + }); + jest.spyOn(console, "warn").mockImplementation(() => { }); + expect(mind.get_node('2')).toBe(null) +}); + +test('add node', () => { + const mind = new jm.mind(); + const root = mind.set_root('1', 'root'); + const node2 = mind.add_node(root, '2', 'node2', { 'addition': 'test 2' }) + const node3 = mind.add_node(root, '3', 'node3', { 'addition': 'test 3' }, jm.direction.left) + const node4 = mind.add_node(root, '4', 'node4') + + expect(mind.get_node('1')).toBe(root) + expect(mind.get_node('2')).toBe(node2) + expect(mind.get_node('3')).toBe(node3) + expect(mind.get_node('4')).toBe(node4) + + expect(node2).toEqual({ + id: '2', + index: 1, + topic: 'node2', + data: { 'addition': 'test 2' }, + isroot: false, + parent: root, + direction: jm.direction.right, + expanded: true, + children: [], + _data: {} + }); + expect(node3).toEqual({ + id: '3', + index: 2, + topic: 'node3', + data: { 'addition': 'test 3' }, + isroot: false, + parent: root, + direction: jm.direction.left, + expanded: true, + children: [], + _data: {} + }); + expect(node4).toEqual({ + id: '4', + index: 3, + topic: 'node4', + data: {}, + isroot: false, + parent: root, + direction: jm.direction.right, + expanded: true, + children: [], + _data: {} + }); + expect(node2.index).toBe(1) + expect(node3.index).toBe(2) + expect(node4.index).toBe(3) + + jest.spyOn(console, "error").mockImplementation(() => { }); + jest.spyOn(console, "warn").mockImplementation(() => { }); + expect(mind.add_node('100')).toBe(null) +}); + +test('insert node before/after', () => { + const mind = new jm.mind(); + const root = mind.set_root('0', 'root'); + const node1 = mind.add_node(root, '1', 'node1'); + expect(node1.index).toBe(1); + const node_a = mind.insert_node_before(node1, '2', 'node2'); + expect(node_a.index).toBe(1); + expect(node1.index).toBe(2); + const node_b = mind.insert_node_after(node1, '3', 'node3'); + expect(node_a.index).toBe(1); + expect(node1.index).toBe(2); + expect(node_b.index).toBe(3); +}) + +test('get node before/after', () => { + const mind = new jm.mind(); + const root = mind.set_root('0', 'root'); + const node1 = mind.add_node(root, '1', 'node1'); + const node2 = mind.add_node(root, '2', 'node2'); + const node3 = mind.add_node(root, '3', 'node3'); + expect(mind.get_node_before(node1)).toBe(null) + expect(mind.get_node_before(node2)).toBe(node1) + expect(mind.get_node_before(node3)).toBe(node2) + expect(mind.get_node_after(node1)).toBe(node2) + expect(mind.get_node_after(node2)).toBe(node3) + expect(mind.get_node_after(node3)).toBe(null) +}) diff --git a/tests/jsmind.node.test.js b/tests/jsmind.node.test.js index 29186dcf..93e831ac 100644 --- a/tests/jsmind.node.test.js +++ b/tests/jsmind.node.test.js @@ -1,6 +1,10 @@ const jm = require('../js/jsmind'); -test('create node', () => { +beforeEach(() => { + jest.restoreAllMocks(); +}); + +test('initial', () => { const node = new jm.node('1', 1, 'topic', null, false, null, jm.direction.right) const expected_node = { id: '1', @@ -16,7 +20,7 @@ test('create node', () => { } expect(node).toEqual(expected_node) - const error = jest.spyOn(console, "error").mockImplementation(() => { }); + jest.spyOn(console, "error").mockImplementation(() => { }); expect(new jm.node()).toEqual({}); expect(new jm.node('1', '2')).toEqual({}); From 613c3e34d834bf29070113f8d9b3c8025d43e6ef Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Fri, 3 Jun 2022 02:33:53 +0800 Subject: [PATCH 030/274] remove debug log --- js/jsmind.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/jsmind.js b/js/jsmind.js index 7304b62a..c724f7f5 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -292,7 +292,6 @@ if (node.isroot) { return null; } var idx = node.index; var brothers = node.parent.children; - console.log('debug', brothers.length, idx) if (brothers.length > idx) { return node.parent.children[idx]; } else { From b551d5a6aa13f47ac627f38ac0d4fe616d5bf602 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Fri, 3 Jun 2022 03:29:13 +0800 Subject: [PATCH 031/274] update content in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a462845e..207a2d26 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jsmind", "version": "0.4.8", - "description": "jsMind is a pure javascript library for mindmap, it base on html5 canvas. jsMind was released under BSD li cense, you can embed it in any project, if only you observe the license.", + "description": "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.", "main": "js/jsmind.js", "directories": { "doc": "docs", From 1507c57e5e8c991bd1382cce8cdbbc26bd11239e Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Fri, 3 Jun 2022 23:34:00 +0800 Subject: [PATCH 032/274] refactor mind.move_node, and add unit tests for it (#337) --- js/jsmind.js | 33 +++++++++++++------------- tests/jsmind.mind.test.js | 49 ++++++++++++++++++++++++++++++++++----- 2 files changed, 60 insertions(+), 22 deletions(-) diff --git a/js/jsmind.js b/js/jsmind.js index c724f7f5..bd90abb3 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -299,20 +299,15 @@ } }, - move_node: function (node, beforeid, parentid, direction) { + move_node: function (node, before_id, parent_id, direction) { if (!jm.util.is_node(node)) { - var the_node = this.get_node(node); - if (!the_node) { - logger.error('the node[id=' + node + '] can not be found.'); - return null; - } else { - return this.move_node(the_node, beforeid, parentid, direction); - } + logger.error('the parameter node '+node+' is not a node.'); + return null; } - if (!parentid) { - parentid = node.parent.id; + if (!parent_id) { + parent_id = node.parent.id; } - return this._move_node(node, beforeid, parentid, direction); + return this._move_node(node, before_id, parent_id, direction); }, _flow_node_direction: function (node, direction) { @@ -348,6 +343,11 @@ _move_node: function (node, beforeid, parentid, direction) { if (!!node && !!parentid) { + var parent_node = this.get_node(parentid) + if(jm.node.inherited(node, parent_node)){ + logger.error('can not move a node to its children'); + return null; + } if (node.parent.id != parentid) { // remove from parent's children var sibling = node.parent.children; @@ -358,8 +358,8 @@ break; } } - node.parent = this.get_node(parentid); - node.parent.children.push(node); + node.parent = parent_node; + parent_node.children.push(node); } if (node.parent.isroot) { @@ -1439,9 +1439,10 @@ move_node: function (nodeid, beforeid, parentid, direction) { if (this.get_editable()) { - var node = this.mind.move_node(nodeid, beforeid, parentid, direction); - if (!!node) { - this.view.update_node(node); + var node = this.get_node(nodeid); + var updated_node = this.mind.move_node(node, beforeid, parentid, direction); + if (!!updated_node) { + this.view.update_node(updated_node); this.layout.layout(); this.view.show(false); this.invoke_event_handle(jm.event_type.edit, { evt: 'move_node', data: [nodeid, beforeid, parentid, direction], node: nodeid }); diff --git a/tests/jsmind.mind.test.js b/tests/jsmind.mind.test.js index d1d985ea..a92d57c0 100644 --- a/tests/jsmind.mind.test.js +++ b/tests/jsmind.mind.test.js @@ -119,10 +119,47 @@ test('get node before/after', () => { const node1 = mind.add_node(root, '1', 'node1'); const node2 = mind.add_node(root, '2', 'node2'); const node3 = mind.add_node(root, '3', 'node3'); - expect(mind.get_node_before(node1)).toBe(null) - expect(mind.get_node_before(node2)).toBe(node1) - expect(mind.get_node_before(node3)).toBe(node2) - expect(mind.get_node_after(node1)).toBe(node2) - expect(mind.get_node_after(node2)).toBe(node3) - expect(mind.get_node_after(node3)).toBe(null) + expect(mind.get_node_before(node1)).toBe(null); + expect(mind.get_node_before(node2)).toBe(node1); + expect(mind.get_node_before(node3)).toBe(node2); + expect(mind.get_node_after(node1)).toBe(node2); + expect(mind.get_node_after(node2)).toBe(node3); + expect(mind.get_node_after(node3)).toBe(null); }) + +test('move node', () => { + const mind = new jm.mind(); + const root = mind.set_root('0', 'root'); + const node1 = mind.add_node(root, '1', 'node1', null); + const node2 = mind.add_node(root, '2', 'node2', null); + const node3 = mind.add_node(root, '3', 'node3', null); + + mind.move_node(node3, node2.id); + expect(mind.get_node_after(node1)).toBe(node3); + expect(mind.get_node_after(node3)).toBe(node2); + + mind.move_node(node3, '_first_'); + expect(mind.get_node_after(node3)).toBe(node1); + expect(mind.get_node_before(node3)).toBe(null); + + mind.move_node(node3, '_last_'); + expect(mind.get_node_before(node3)).toBe(node2); + expect(mind.get_node_after(node3)).toBe(null); + + mind.move_node(node3, '_last_', node1.id); + expect(node3.parent).toBe(node1); + expect(root.children.length).toBe(2); + expect(node1.children[0]).toBe(node3); + + mind.move_node(node2, '_first_', node1.id); + expect(node2.parent).toBe(node1); + expect(root.children.length).toBe(1); + expect(node1.children[0]).toBe(node2); + expect(node1.children[1]).toBe(node3); + + jest.spyOn(console, "error").mockImplementation(() => { }); + mind.move_node(node1, '_first_', node2.id); + expect(node1.parent).toBe(root); + expect(node2.children.length).toBe(0); + +}); \ No newline at end of file From 8095c2c89a618536ca937f90c72546838d4a4890 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sat, 4 Jun 2022 09:56:52 +0800 Subject: [PATCH 033/274] refactor mind.remove_node, and add ut for it (#338) --- js/jsmind.js | 25 ++++++++----------------- tests/jsmind.mind.test.js | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/js/jsmind.js b/js/jsmind.js index bd90abb3..9b6e204a 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -224,7 +224,7 @@ add_node: function (parent_node, nodeid, topic, data, direction, expanded, idx) { if (!jm.util.is_node(parent_node)) { - logger.error('the parent_node '+parent_node+' is not a node.'); + logger.error('the parent_node ' + parent_node + ' is not a node.'); return null; } var node_index = idx || -1; @@ -244,7 +244,7 @@ insert_node_before: function (node_before, nodeid, topic, data, direction) { if (!jm.util.is_node(node_before)) { - logger.error('the node_before '+node_before+' is not a node.'); + logger.error('the node_before ' + node_before + ' is not a node.'); return null; } var node_index = node_before.index - 0.5; @@ -272,7 +272,7 @@ insert_node_after: function (node_after, nodeid, topic, data, direction) { if (!jm.util.is_node(node_after)) { - logger.error('the node_after '+node_after+' is not a node.'); + logger.error('the node_after ' + node_after + ' is not a node.'); return null; } var node_index = node_after.index + 0.5; @@ -301,7 +301,7 @@ move_node: function (node, before_id, parent_id, direction) { if (!jm.util.is_node(node)) { - logger.error('the parameter node '+node+' is not a node.'); + logger.error('the parameter node ' + node + ' is not a node.'); return null; } if (!parent_id) { @@ -344,7 +344,7 @@ _move_node: function (node, beforeid, parentid, direction) { if (!!node && !!parentid) { var parent_node = this.get_node(parentid) - if(jm.node.inherited(node, parent_node)){ + if (jm.node.inherited(node, parent_node)) { logger.error('can not move a node to its children'); return null; } @@ -379,16 +379,7 @@ remove_node: function (node) { if (!jm.util.is_node(node)) { - var the_node = this.get_node(node); - if (!the_node) { - logger.error('the node[id=' + node + '] can not be found.'); - return false; - } else { - return this.remove_node(the_node); - } - } - if (!node) { - logger.error('fail, the node can not be found'); + logger.error('the parameter node ' + node + ' is not a node.'); return false; } if (node.isroot) { @@ -1318,7 +1309,7 @@ }, get_node: function (node) { - if(jm.util.is_node(node)){ + if (jm.util.is_node(node)) { return node; } return this.mind.get_node(node); @@ -1751,7 +1742,7 @@ this.bounds = { n: 0, s: 0, w: 0, e: 0 }; }, - calculate_next_child_direction: function(node) { + calculate_next_child_direction: function (node) { if (this.isside) { return jm.direction.right; } diff --git a/tests/jsmind.mind.test.js b/tests/jsmind.mind.test.js index a92d57c0..43dd4f6d 100644 --- a/tests/jsmind.mind.test.js +++ b/tests/jsmind.mind.test.js @@ -162,4 +162,23 @@ test('move node', () => { expect(node1.parent).toBe(root); expect(node2.children.length).toBe(0); +}); + +test('remove node', () => { + const mind = new jm.mind(); + const root = mind.set_root('0', 'root'); + const node1 = mind.add_node(root, '1', 'node1', null); + const node2 = mind.add_node(node1, '2', 'node2', null); + const node3 = mind.add_node(node2, '3', 'node3', null); + mind.selected = node3 + + mind.remove_node(root); + expect(mind.get_node('0')).toBe(root) + mind.remove_node(node1); + expect(root.children.length).toBe(0) + jest.spyOn(console, "warn").mockImplementation(() => { }); + expect(mind.get_node('1')).toBe(null) + expect(mind.get_node('2')).toBe(null) + expect(mind.get_node('3')).toBe(null) + expect(mind.selected).toBe(null) }); \ No newline at end of file From d5f56d9a6be06eeefae826ae7343b79d9aed212e Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Mon, 6 Jun 2022 00:31:56 +0800 Subject: [PATCH 034/274] update license --- LICENSE | 4 ++-- js/jsmind.draggable.js | 6 +++--- js/jsmind.js | 6 +++--- js/jsmind.screenshot.js | 6 +++--- style/jsmind.css | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/LICENSE b/LICENSE index 4335582c..5912b7b9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2014-2021, ZHANG ZHIGANG +Copyright (c) 2014-2022, ZHANG ZHIGANG All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -11,7 +11,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -版权所有 (c) 2014-2021, 张志刚 +版权所有 (c) 2014-2022, 张志刚 保留一切权利。 在满足下列条件的前提下,授予使用者使用及再发布本软件的源代码或二进制形式的权利,无论是否修改皆然: diff --git a/js/jsmind.draggable.js b/js/jsmind.draggable.js index f1208aa3..f2531334 100644 --- a/js/jsmind.draggable.js +++ b/js/jsmind.draggable.js @@ -1,6 +1,6 @@ -/* - * Released under BSD License - * Copyright (c) 2014-2021 hizzgdev@163.com +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com * * Project Home: * https://github.com/hizzgdev/jsmind/ diff --git a/js/jsmind.js b/js/jsmind.js index 9b6e204a..7fefcde2 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -1,6 +1,6 @@ -/* - * Released under BSD License - * Copyright (c) 2014-2021 hizzgdev@163.com +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com * * Project Home: * https://github.com/hizzgdev/jsmind/ diff --git a/js/jsmind.screenshot.js b/js/jsmind.screenshot.js index c5651d13..49c62e3d 100644 --- a/js/jsmind.screenshot.js +++ b/js/jsmind.screenshot.js @@ -1,6 +1,6 @@ -/* - * Released under BSD License - * Copyright (c) 2014-2021 hizzgdev@163.com +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com * * Project Home: * https://github.com/hizzgdev/jsmind/ diff --git a/style/jsmind.css b/style/jsmind.css index f178c832..4cdec39e 100644 --- a/style/jsmind.css +++ b/style/jsmind.css @@ -1,6 +1,6 @@ -/* - * Released under BSD License - * Copyright (c) 2014-2021 hizzgdev@163.com +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com * * Project Home: * https://github.com/hizzgdev/jsmind/ From 04e1a346a8aa34e89cc915b5f24e0f5a83505a6f Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Mon, 6 Jun 2022 00:44:36 +0800 Subject: [PATCH 035/274] es6 version (#339) --- .npmignore | 8 + es6/jsmind.draggable.js | 9 + es6/jsmind.draggable.js.map | 1 + es6/jsmind.js | 9 + es6/jsmind.js.map | 1 + es6/jsmind.screenshot.js | 9 + es6/jsmind.screenshot.js.map | 1 + example/2_features_es6.html | 528 +++++++++++ package-lock.json | 1529 +++++++++++++++++++++++++++++- package.json | 13 +- rollup.config.js | 60 ++ src/jsmind.common.js | 22 + src/jsmind.data_provider.js | 62 ++ src/jsmind.dom.js | 39 + src/jsmind.format.js | 420 ++++++++ src/jsmind.graph.js | 115 +++ src/jsmind.js | 633 +++++++++++++ src/jsmind.layout_provider.js | 414 ++++++++ src/jsmind.mind.js | 244 +++++ src/jsmind.node.js | 83 ++ src/jsmind.option.js | 65 ++ src/jsmind.plugin.js | 44 + src/jsmind.shortcut_provider.js | 182 ++++ src/jsmind.util.js | 176 ++++ src/jsmind.view_provider.js | 529 +++++++++++ src/plugins/jsmind.draggable.js | 330 +++++++ src/plugins/jsmind.screenshot.js | 330 +++++++ 27 files changed, 5851 insertions(+), 5 deletions(-) create mode 100644 .npmignore create mode 100644 es6/jsmind.draggable.js create mode 100644 es6/jsmind.draggable.js.map create mode 100644 es6/jsmind.js create mode 100644 es6/jsmind.js.map create mode 100644 es6/jsmind.screenshot.js create mode 100644 es6/jsmind.screenshot.js.map create mode 100644 example/2_features_es6.html create mode 100644 rollup.config.js create mode 100644 src/jsmind.common.js create mode 100644 src/jsmind.data_provider.js create mode 100644 src/jsmind.dom.js create mode 100644 src/jsmind.format.js create mode 100644 src/jsmind.graph.js create mode 100644 src/jsmind.js create mode 100644 src/jsmind.layout_provider.js create mode 100644 src/jsmind.mind.js create mode 100644 src/jsmind.node.js create mode 100644 src/jsmind.option.js create mode 100644 src/jsmind.plugin.js create mode 100644 src/jsmind.shortcut_provider.js create mode 100644 src/jsmind.util.js create mode 100644 src/jsmind.view_provider.js create mode 100644 src/plugins/jsmind.draggable.js create mode 100644 src/plugins/jsmind.screenshot.js diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..8649f823 --- /dev/null +++ b/.npmignore @@ -0,0 +1,8 @@ +.github +example +features +node_modules +screenshots +src +tests +.gitignore diff --git a/es6/jsmind.draggable.js b/es6/jsmind.draggable.js new file mode 100644 index 00000000..22dcbc55 --- /dev/null +++ b/es6/jsmind.draggable.js @@ -0,0 +1,9 @@ +/** +* @license BSD-3-Clause +* @copyright 2014-2022 hizzgdev@163.com +* +* Project Home: +* https://github.com/hizzgdev/jsmind/ +*/ +!function(){"use strict";if(!jsMind)throw new Error("jsMind is not defined");const t=jsMind,e=t.$,i="getSelection"in e.w?function(){e.w.getSelection().removeAllRanges()}:function(){e.d.selection.empty()},s=5,o=500,n=80;class h{constructor(t){this.jm=t,this.e_canvas=null,this.canvas_ctx=null,this.shadow=null,this.shadow_w=0,this.shadow_h=0,this.active_node=null,this.target_node=null,this.target_direct=null,this.client_w=0,this.client_h=0,this.offset_x=0,this.offset_y=0,this.hlookup_delay=0,this.hlookup_timer=0,this.capture=!1,this.moved=!1}init(){this._create_canvas(),this._create_shadow(),this._event_bind()}resize(){this.jm.view.e_nodes.appendChild(this.shadow),this.e_canvas.width=this.jm.view.size.w,this.e_canvas.height=this.jm.view.size.h}_create_canvas(){var t=e.c("canvas");this.jm.view.e_panel.appendChild(t);var i=t.getContext("2d");this.e_canvas=t,this.canvas_ctx=i}_create_shadow(){var t=e.c("jmnode");t.style.visibility="hidden",t.style.zIndex="3",t.style.cursor="move",t.style.opacity="0.7",this.shadow=t}reset_shadow(t){var e=this.shadow.style;this.shadow.innerHTML=t.innerHTML,e.left=t.style.left,e.top=t.style.top,e.width=t.style.width,e.height=t.style.height,e.backgroundImage=t.style.backgroundImage,e.backgroundSize=t.style.backgroundSize,e.transform=t.style.transform,this.shadow_w=this.shadow.clientWidth,this.shadow_h=this.shadow.clientHeight}show_shadow(){this.moved||(this.shadow.style.visibility="visible")}hide_shadow(){this.shadow.style.visibility="hidden"}_magnet_shadow(t){t&&(this.canvas_ctx.lineWidth=s,this.canvas_ctx.strokeStyle="rgba(0,0,0,0.3)",this.canvas_ctx.lineCap="round",this._clear_lines(),this._canvas_lineto(t.sp.x,t.sp.y,t.np.x,t.np.y))}_clear_lines(){this.canvas_ctx.clearRect(0,0,this.jm.view.size.w,this.jm.view.size.h)}_canvas_lineto(t,e,i,s){this.canvas_ctx.beginPath(),this.canvas_ctx.moveTo(t,e),this.canvas_ctx.lineTo(i,s),this.canvas_ctx.stroke()}_lookup_close_node(){var t,e,i=this.jm.get_root(),o=i.get_location(),n=i.get_size(),h=o.x+n.w/2,a=this.shadow_w,l=this.shadow_h,d=this.shadow.offsetLeft,c=this.shadow.offsetTop,r=d+a/2>=h?jsMind.direction.right:jsMind.direction.left,_=this.jm.mind.nodes,v=null,u=this.jm.layout,w=Number.MAX_VALUE,f=0,m=null,g=null,p=null;for(var y in _){var j,x;if((v=_[y]).isroot||v.direction==r){if(v.id==this.active_node.id)continue;if(!u.is_visible(v))continue;if(t=v.get_size(),e=v.get_location(),r==jsMind.direction.right){if(d-e.x-t.w<=0)continue;f=Math.abs(d-e.x-t.w)+Math.abs(c+l/2-e.y-t.h/2),j={x:e.x+t.w-s,y:e.y+t.h/2},x={x:d+s,y:c+l/2}}else{if(e.x-d-a<=0)continue;f=Math.abs(d+a-e.x)+Math.abs(c+l/2-e.y-t.h/2),j={x:e.x+s,y:e.y+t.h/2},x={x:d+a-s,y:c+l/2}}f0&&c= root_x ?\n jsMind.direction.right : jsMind.direction.left;\n var nodes = this.jm.mind.nodes;\n var node = null;\n var layout = this.jm.layout;\n var min_distance = Number.MAX_VALUE;\n var distance = 0;\n var closest_node = null;\n var closest_p = null;\n var shadow_p = null;\n for (var nodeid in nodes) {\n var np, sp;\n node = nodes[nodeid];\n if (node.isroot || node.direction == direct) {\n if (node.id == this.active_node.id) {\n continue;\n }\n if (!layout.is_visible(node)) {\n continue;\n }\n ns = node.get_size();\n nl = node.get_location();\n if (direct == jsMind.direction.right) {\n if (sx - nl.x - ns.w <= 0) { continue; }\n distance = Math.abs(sx - nl.x - ns.w) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + ns.w - options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + options.line_width, y: sy + sh / 2 };\n } else {\n if (nl.x - sx - sw <= 0) { continue; }\n distance = Math.abs(sx + sw - nl.x) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + sw - options.line_width, y: sy + sh / 2 };\n }\n if (distance < min_distance) {\n closest_node = node;\n closest_p = np;\n shadow_p = sp;\n min_distance = distance;\n }\n }\n }\n var result_node = null;\n if (!!closest_node) {\n result_node = {\n node: closest_node,\n direction: direct,\n sp: shadow_p,\n np: closest_p\n };\n }\n return result_node;\n }\n lookup_close_node() {\n var node_data = this._lookup_close_node();\n if (!!node_data) {\n this._magnet_shadow(node_data);\n this.target_node = node_data.node;\n this.target_direct = node_data.direction;\n }\n }\n _event_bind() {\n var jd = this;\n var container = this.jm.view.container;\n $.on(container, 'mousedown', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'mousemove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'mouseup', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n $.on(container, 'touchstart', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'touchmove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'touchend', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n }\n dragstart(e) {\n if (!this.jm.get_editable()) { return; }\n if (this.capture) { return; }\n this.active_node = null;\n\n var jview = this.jm.view;\n var el = e.target || event.srcElement;\n if (el.tagName.toLowerCase() != 'jmnode') { return; }\n var nodeid = jview.get_binded_nodeid(el);\n if (!!nodeid) {\n var node = this.jm.get_node(nodeid);\n if (!node.isroot) {\n this.reset_shadow(el);\n this.active_node = node;\n this.offset_x = (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft;\n this.offset_y = (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop;\n this.client_hw = Math.floor(el.clientWidth / 2);\n this.client_hh = Math.floor(el.clientHeight / 2);\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n }\n var jd = this;\n this.hlookup_delay = $.w.setTimeout(function () {\n jd.hlookup_delay = 0;\n jd.hlookup_timer = $.w.setInterval(function () {\n jd.lookup_close_node.call(jd);\n }, options.lookup_interval);\n }, options.lookup_delay);\n this.capture = true;\n }\n }\n }\n drag(e) {\n if (!this.jm.get_editable()) { return; }\n if (this.capture) {\n e.preventDefault();\n this.show_shadow();\n this.moved = true;\n clear_selection();\n var jview = this.jm.view;\n var px = (e.clientX || e.touches[0].clientX) / jview.actualZoom - this.offset_x;\n var py = (e.clientY || e.touches[0].clientY) / jview.actualZoom - this.offset_y;\n this.shadow.style.left = px + 'px';\n this.shadow.style.top = py + 'px';\n clear_selection();\n }\n }\n dragend(e) {\n if (!this.jm.get_editable()) { return; }\n if (this.capture) {\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n this.hlookup_delay = 0;\n this._clear_lines();\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n this.hlookup_timer = 0;\n this._clear_lines();\n }\n if (this.moved) {\n var src_node = this.active_node;\n var target_node = this.target_node;\n var target_direct = this.target_direct;\n this.move_node(src_node, target_node, target_direct);\n }\n this.hide_shadow();\n }\n this.moved = false;\n this.capture = false;\n }\n move_node(src_node, target_node, target_direct) {\n var shadow_h = this.shadow.offsetTop;\n if (!!target_node && !!src_node && !jsMind.node.inherited(src_node, target_node)) {\n // lookup before_node\n var sibling_nodes = target_node.children;\n var sc = sibling_nodes.length;\n var node = null;\n var delta_y = Number.MAX_VALUE;\n var node_before = null;\n var beforeid = '_last_';\n while (sc--) {\n node = sibling_nodes[sc];\n if (node.direction == target_direct && node.id != src_node.id) {\n var dy = node.get_location().y - shadow_h;\n if (dy > 0 && dy < delta_y) {\n delta_y = dy;\n node_before = node;\n beforeid = '_first_';\n }\n }\n }\n if (!!node_before) { beforeid = node_before.id; }\n this.jm.move_node(src_node.id, beforeid, target_node.id, target_direct);\n }\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\n\nvar draggable_plugin = new jm.plugin('draggable', function (jm) {\n var jd = new draggable(jm);\n jd.init();\n jm.add_event_listener(function (type, data) {\n jd.jm_event_handle.call(jd, type, data);\n });\n});\n\njsMind.register_plugin(draggable_plugin);\n"],"names":["jsMind","Error","jm","$","clear_selection","w","getSelection","removeAllRanges","d","selection","empty","options","draggable","constructor","this","e_canvas","canvas_ctx","shadow","shadow_w","shadow_h","active_node","target_node","target_direct","client_w","client_h","offset_x","offset_y","hlookup_delay","hlookup_timer","capture","moved","init","_create_canvas","_create_shadow","_event_bind","resize","view","e_nodes","appendChild","width","size","height","h","c","e_panel","ctx","getContext","s","style","visibility","zIndex","cursor","opacity","reset_shadow","el","innerHTML","left","top","backgroundImage","backgroundSize","transform","clientWidth","clientHeight","show_shadow","hide_shadow","_magnet_shadow","node","lineWidth","strokeStyle","lineCap","_clear_lines","_canvas_lineto","sp","x","y","np","clearRect","x1","y1","x2","y2","beginPath","moveTo","lineTo","stroke","_lookup_close_node","ns","nl","root","get_root","root_location","get_location","root_size","get_size","root_x","sw","sh","sx","offsetLeft","sy","offsetTop","direct","direction","right","nodes","mind","layout","min_distance","Number","MAX_VALUE","distance","closest_node","closest_p","shadow_p","nodeid","isroot","id","is_visible","Math","abs","result_node","lookup_close_node","node_data","jd","container","on","e","evt","event","dragstart","call","drag","dragend","get_editable","jview","target","srcElement","tagName","toLowerCase","get_binded_nodeid","get_node","clientX","touches","actualZoom","clientY","client_hw","floor","client_hh","clearTimeout","clearInterval","setTimeout","setInterval","preventDefault","px","py","src_node","move_node","inherited","sibling_nodes","children","sc","length","delta_y","node_before","beforeid","dy","jm_event_handle","type","data","event_type","draggable_plugin","plugin","add_event_listener","register_plugin"],"mappings":"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"} \ No newline at end of file diff --git a/es6/jsmind.js b/es6/jsmind.js new file mode 100644 index 00000000..51b865e6 --- /dev/null +++ b/es6/jsmind.js @@ -0,0 +1,9 @@ +/** +* @license BSD-3-Clause +* @copyright 2014-2022 hizzgdev@163.com +* +* Project Home: +* https://github.com/hizzgdev/jsmind/ +*/ +var jsMind=function(){"use strict";const e="0.4.9",t="hizzgdev@163.com";"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e){return this.slice(0,e.length)===e});var i=function(){};let n="undefined"==typeof console?{log:i,debug:i,error:i,warn:i,info:i}:console;const o={left:-1,center:0,right:1},s={show:1,resize:2,edit:3,select:4};const a=new class{constructor(e){this.w=e,this.d=e.document,this.g=function(e){return this.d.getElementById(e)},this.c=function(e){return this.d.createElement(e)},this.t=function(e,t){e.hasChildNodes()?e.firstChild.nodeValue=t:e.appendChild(this.d.createTextNode(t))},this.h=function(e,t){t instanceof HTMLElement?(e.innerHTML="",e.appendChild(t)):e.innerHTML=t},this.i=function(e){return!!e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument},this.on=function(e,t,i){e.addEventListener?e.addEventListener(t,i,!1):e.attachEvent("on"+t,i)}}}(window),r={ajax:{_xhr:function(){var e=null;if(window.XMLHttpRequest)e=new XMLHttpRequest;else try{e=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}return e},_eurl:function(e){return encodeURIComponent(e)},request:function(e,t,i,o,s){var a=r.ajax,d=null,l=[];for(var h in t)l.push(a._eurl(h)+"="+a._eurl(t[h]));l.length>0&&(d=l.join("&"));var _=a._xhr();_&&(_.onreadystatechange=function(){if(4==_.readyState)if(200==_.status||0==_.status){if("function"==typeof o){var e=r.json.string2json(_.responseText);o(null!=e?e:_.responseText)}}else"function"==typeof s?s(_):n.error("xhr request failed.",_)},i=i||"GET",_.open(i,e,!0),_.setRequestHeader("If-Modified-Since","0"),"POST"==i?(_.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),_.send(d)):_.send())},get:function(e,t){return r.ajax.request(e,{},"GET",t)},post:function(e,t,i){return r.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof a.w.Blob)n=new Blob([e],{type:t});else{var o=new(a.w.BlobBuilder||a.w.MozBlobBuilder||a.w.WebKitBlobBuilder||a.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(a.w.URL||a.w.webkitURL).createObjectURL(n),r=a.c("a");if("download"in r){r.style.visibility="hidden",r.href=s,r.download=i,a.d.body.appendChild(r);var d=a.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),r.dispatchEvent(d),a.d.body.removeChild(r)}else location.href=s}}},json:{json2string:function(e){if(JSON)try{return JSON.stringify(e)}catch(e){return n.warn(e),n.warn("can not convert to string"),null}},string2json:function(e){if(JSON)try{return JSON.parse(e)}catch(e){return n.warn(e),n.warn("can not parse to json"),null}},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:r.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substr(2)).substr(2,16)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},d={container:"",editable:!1,theme:null,mode:"full",support_html:!0,view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:45,addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class l{constructor(e,t,i,n,o,s,a,r){e?"number"==typeof t?(void 0===r&&(r=!0),this.id=e,this.index=t,this.topic=i,this.data=n||{},this.isroot=o,this.parent=s,this.direction=a,this.expanded=!!r,this.children=[],this._data={}):jm.logger.error("invalid node index"):jm.logger.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?"Up":"Down")?this.view.zoomIn():this.view.zoomOut())}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;r= 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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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\n","/**\n * @license BSD\n * @copyright 2014-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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(nodeid, node_index, topic, data, false, parent_node, parent_node.direction, expanded);\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._reindex(parent_node);\n } else {\n logger.error('fail, the nodeid \\'' + node.id + '\\' has been already exist.');\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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) { return null; }\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, nodeid, 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, nodeid, 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) { return null; }\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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = (!!beforeid) ? this.get_node(beforeid) : null;\n if (node_before != null && node_before.parent != null && node_before.parent.id == node.parent.id) {\n node.index = node_before.index - 0.5;\n this._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn('the nodeid \\'' + node.id + '\\' has been already exist.');\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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\n","/**\n * @license BSD\n * @copyright 2014-2022 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\";\n\nexport const format = {\n node_tree: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_tree simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_tree\",\n \"data\": { \"id\": \"root\", \"topic\": \"jsMind 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._buildnode(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 (k == 'id' || k == 'topic' || k == 'children' || k == 'direction' || k == 'expanded') {\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(node_parent, node_json.id, node_json.topic, data, d, node_json.expanded);\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 _buildnode: function (node) {\n var df = format.node_tree;\n if (!(node instanceof Node)) { return; }\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._buildnode(children[i]));\n }\n }\n return o;\n }\n },\n\n node_array: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_array simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_array\",\n \"data\": [\n { \"id\": \"root\", \"topic\": \"jsMind Example\", \"isroot\": true }\n ]\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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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(parent_node, node_json.id, node_json.topic, data, d, node_json.expanded);\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 (k == 'id' || k == 'topic' || k == 'parentid' || k == 'isroot' || k == 'direction' || k == 'expanded') {\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)) { return; }\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\": {\n \"name\": 'jsMind freemind example',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"freemind\",\n \"data\": \"\"\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 { // 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 // 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 = ('expanded' in node_data) ? (node_data.expanded == 'true') : true;\n delete node_data.expanded;\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(parent_node, node_id, node_topic, node_data, node_direction, node_expanded);\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n }\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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++) { if (children[i].direction === Direction.left) { r--; } else { r++; } }\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 layout_data.outer_height = node_outer_height;\n layout_data.offset_y = base_y - node_outer_height / 2;\n layout_data.offset_x = this.opts.hspace * layout_data.direction + 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\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 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 = 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 nodeid in nodes) {\n node = nodes[nodeid];\n pout = this.get_node_point_out(node);\n if (pout.x > this.bounds.e) { this.bounds.e = pout.x; }\n if (pout.x < this.bounds.w) { this.bounds.w = pout.x; }\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, { evt: 'expand_node', data: [], node: node.id });\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, { evt: 'collapse_node', data: [], node: node.id });\n }\n expand_all() {\n var nodes = this.jm.mind.nodes;\n var c = 0;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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) { return; }\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(root_layout_data.right_nodes);\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n } else {\n if (node._data.layout.direction == Direction.right) {\n root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes);\n } else {\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n }\n }\n this.bounds.s = Math.max(root_layout_data.outer_height_left, root_layout_data.outer_height_right);\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\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from \"./jsmind.dom.js\";\n\nclass graph_svg {\n constructor(view) {\n this.view = view;\n this.opts = view.opts;\n this.e_svg = graph_svg.c('svg');\n this.e_svg.setAttribute('class', 'jsmind');\n this.size = { w: 0, h: 0 };\n this.lines = [];\n }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = graph_svg.c('path');\n line.setAttribute('stroke', 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._bezier_to(line, 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 var img = new Image();\n img.onload = function () {\n dest_canvas_ctx.drawImage(img, 0, 0);\n !!callback && callback();\n };\n img.src = 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg));\n }\n _bezier_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M' + x1 + ' ' + y1 + ' C ' + (x1 + (x2 - x1) * 2 / 3) + ' ' + y1 + ', ' + x1 + ' ' + y2 + ', ' + x2 + ' ' + y2);\n }\n _line_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2);\n }\n}\n\n\nclass graph_canvas {\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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y);\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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 const graph = { svg: graph_svg, canvas: graph_canvas };\n","/**\n * @license BSD\n * @copyright 2014-2022 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 { 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 }\n init() {\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.e_panel = $.c('div');\n this.e_nodes = $.c('jmnodes');\n this.e_editor = $.c('input');\n\n this.graph = this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this);\n\n this.e_panel.className = 'jsmind-inner';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\n\n var v = this;\n $.on(this.e_editor, 'keydown', function (e) {\n var evt = e || event;\n if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); }\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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) { client_w = min_width; }\n if (client_h < min_height) { client_h = min_height; }\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\n }\n select_node(node) {\n if (!!this.selected_node) {\n this.selected_node._data.view.element.className =\n this.selected_node._data.view.element.className.replace(/\\s*selected\\b/i, '');\n this.reset_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_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 = (element.clientWidth - parseInt(ncs.getPropertyValue('padding-left')) - parseInt(ncs.getPropertyValue('padding-right'))) + '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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if ((zoom < this.minZoom) || (zoom > this.maxZoom)) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n };\n this.show(true);\n return true;\n\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = (_offset.x + p.x) + 'px';\n node_element.style.top = (_offset.y + p.y) + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = (_offset.x + p_expander.x) + 'px';\n expander.style.top = (_offset.y + p_expander.y) + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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(img, 2, 2, node_element.clientWidth, node_element.clientHeight);\n var scaledImageData = c.toDataURL();\n node_element.style.backgroundImage = 'url(' + scaledImageData + ')';\n }\n };\n img.src = backgroundImage;\n\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 = 'rotate(' + node_data['background-rotation'] + 'deg)';\n }\n }\n }\n clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) { continue; }\n if (('visible' in node._data.layout) && !node._data.layout.visible) { continue; }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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) { e.preventDefault(); } //prevent tab to change focus in browser\n if (this.jm.view.is_editing()) { return; }\n var evt = e || event;\n if (!this.opts.enable) { return true; }\n var kc = evt.keyCode + (evt.metaKey << 13) + (evt.ctrlKey << 12) + (evt.altKey << 11) + (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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 }\n else if (selected_node.direction === d) {\n var children = selected_node.children;\n var childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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\n","/**\n * @license BSD\n * @copyright 2014-2022 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('plugin ' + plugin + ' is not a supported plugin')\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } from \"./jsmind.common.js\";\nimport { merge_option } from \"./jsmind.option.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\n\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\n this.init();\n }\n\n init() {\n if (!!this.initialized) { return; }\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n // call enable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // call disable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n get_editable() {\n return this.options.editable;\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, \"mousewheel\", this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(event) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n if (!this.options.default_event_handle[\"enable_mousewheel_handle\"] || !window.event.ctrlKey) {\n return;\n }\n // Avoid default page scrolling behavior.\n event.preventDefault();\n\n var dir = event.deltaY > 0 ? \"Up\" : \"Down\";\n if (dir == \"Up\") {\n this.view.zoomIn();\n } else {\n this.view.zoomOut();\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) { return; }\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) { return; }\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) { return; }\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, { evt: 'add_node', data: [the_parent_node.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(the_node_before, nodeid, topic, data, direction);\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, { evt: 'insert_node_before', data: [the_node_before.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, { evt: 'insert_node_after', data: [the_node_after.id, nodeid, topic, data], node: nodeid });\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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, { evt: 'remove_node', data: [nodeid], node: parentid });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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, { evt: 'update_node', data: [nodeid, topic], node: nodeid });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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, { evt: 'move_node', data: [nodeid, beforeid, parentid, direction], node: nodeid });\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 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) { return null; }\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) { return null; }\n var n = null;\n if (node.parent.isroot) {\n var c = node.parent.children;\n var getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!node.data['background-image']) {\n logger.error('fail, only can change rotation angle of node with background image');\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jsMind = jm;\n// window.jsMind = jsMind;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","_xhr","xhr","XMLHttpRequest","ActiveXObject","_eurl","url","encodeURIComponent","request","param","method","callback","fail_callback","a","tmp_param","k","push","join","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","o","Object","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substr","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","jm","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","DataProvider","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","graph_svg","e_svg","setAttribute","size","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","graph","svg","canvas","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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","jsMind"],"mappings":"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"} \ No newline at end of file diff --git a/es6/jsmind.screenshot.js b/es6/jsmind.screenshot.js new file mode 100644 index 00000000..f07fd85f --- /dev/null +++ b/es6/jsmind.screenshot.js @@ -0,0 +1,9 @@ +/** +* @license BSD-3-Clause +* @copyright 2014-2022 hizzgdev@163.com +* +* Project Home: +* https://github.com/hizzgdev/jsmind/ +*/ +!function(){"use strict";if(!jsMind)throw new Error("jsMind is not defined");const t=jsMind.$;var e=function(t,e){return t.getPropertyValue(e)},i=function(t){var i=e(t,"visibility"),n=e(t,"display");return"hidden"!==i&&"none"!==n},n={rect:function(t,e,i,n,a,s){n<2*s&&(s=n/2),a<2*s&&(s=a/2),t.moveTo(e+s,i),t.arcTo(e+n,i,e+n,i+a,s),t.arcTo(e+n,i+a,e,i+a,s),t.arcTo(e,i+a,e,i,s),t.arcTo(e,i,e+n,i,s)},text_multiline:function(t,e,i,n,a,s,o){var r="",l=e.length,d=e.split(""),h=null;t.textAlign="left",t.textBaseline="top";for(var c=0;ca&&c>0?(t.fillText(r,i,n),r=d[c],n+=o):r=h;t.fillText(r,i,n)},text_ellipsis:function(t,e,i,a,s,o){var r=a+o/2;e=n.fittingString(t,e,s);t.textAlign="left",t.textBaseline="middle",t.fillText(e,i,r,s)},fittingString:function(t,e,i){var n=t.measureText(e).width,a=t.measureText("…").width;if(n<=i||n<=a)return e;for(var s=e.length;n>=i-a&&s-- >0;)e=e.substring(0,s),n=t.measureText(e).width;return e+"…"},image:function(t,e,i,a,s,o,r,l,d){var h=new Image;h.onload=function(){t.save(),t.translate(i,a),t.save(),t.beginPath(),n.rect(t,0,0,s,o,r),t.closePath(),t.clip(),t.translate(s/2,o/2),t.rotate(l*Math.PI/180),t.drawImage(h,-s/2,-o/2),t.restore(),t.restore(),d&&d()},h.src=e}};class a{constructor(t){this.jm=t,this.canvas_elem=null,this.canvas_ctx=null,this._inited=!1}init(){if(!this._inited){console.log("init");var e=t.c("canvas"),i=e.getContext("2d");this.canvas_elem=e,this.canvas_ctx=i,this.jm.view.e_panel.appendChild(e),this._inited=!0,this.resize()}}shoot(t){this.init(),this._draw(function(){t&&t(),this.clean()}.bind(this)),this._watermark()}shootDownload(){this.shoot(function(){this._download()}.bind(this))}shootAsDataURL(t){this.shoot(function(){t&&t(this.canvas_elem.toDataURL())}.bind(this))}resize(){this._inited&&(this.canvas_elem.width=this.jm.view.size.w,this.canvas_elem.height=this.jm.view.size.h)}clean(){var t=this.canvas_elem;this.canvas_ctx.clearRect(0,0,t.width,t.height)}_draw(t){var e=this.canvas_ctx;e.textAlign="left",e.textBaseline="top",this._draw_lines(function(){this._draw_nodes(t)}.bind(this))}_watermark(){var e=this.canvas_elem,i=this.canvas_ctx;i.textAlign="right",i.textBaseline="bottom",i.fillStyle="#000",i.font="11px Verdana,Arial,Helvetica,sans-serif",i.fillText("hizzgdev.github.io/jsmind",e.width-5.5,e.height-2.5),i.textAlign="left",i.fillText(t.w.location,5.5,e.height-2.5)}_draw_lines(t){this.jm.view.graph.copy_to(this.canvas_ctx,t)}_draw_nodes(e){var i,n=this.jm.mind.nodes;for(var a in n)i=n[a],this._draw_node(i);!function a(){console.log("check_node_ready"+new Date);var s=!0;for(var o in n)s&=(i=n[o]).ready;s?t.w.setTimeout(e,200):t.w.setTimeout(a,200)}()}_draw_node(t){var a=this.canvas_ctx,s=t._data.view,o=s.element,r=getComputedStyle(o);if(i(r)){var l=e(r,"background-color"),d=parseInt(e(r,"border-top-left-radius")),h=e(r,"color"),c=parseInt(e(r,"padding-left")),v=parseInt(e(r,"padding-right")),f=parseInt(e(r,"padding-top")),_=parseInt(e(r,"padding-bottom")),g=e(r,"text-overflow"),m=e(r,"font-style")+" "+e(r,"font-variant")+" "+e(r,"font-weight")+" "+e(r,"font-size")+"/"+e(r,"line-height")+" "+e(r,"font-family"),u={x:s.abs_x,y:s.abs_y,w:s.width+1,h:s.height+1},w={x:u.x+c,y:u.y+f,w:u.w-c-v,h:u.h-f-_};if(a.font=m,a.fillStyle=l,a.beginPath(),n.rect(a,u.x,u.y,u.w,u.h,d),a.closePath(),a.fill(),a.fillStyle=h,"background-image"in t.data){var p=e(r,"background-image").slice(5,-2);t.ready=!1;var x=0;"background-rotation"in t.data&&(x=t.data["background-rotation"]),n.image(a,p,u.x,u.y,u.w,u.h,d,x,(function(){t.ready=!0}))}if(t.topic)if("ellipsis"===g)n.text_ellipsis(a,t.topic,w.x,w.y,w.w,w.h);else{var y=parseInt(e(r,"line-height"));n.text_multiline(a,t.topic,w.x,w.y,w.w,w.h,y)}s.expander&&this._draw_expander(s.expander),"background-image"in t.data||(t.ready=!0)}else t.ready=!0}_draw_expander(t){var n=this.canvas_ctx,a=getComputedStyle(t);if(i(a)){var s=e(a,"left"),o=e(a,"top");e(a,"font");var r=parseInt(s),l=parseInt(o),d="+"===t.innerHTML;n.lineWidth=1,n.beginPath(),n.arc(r+7,l+7,5,0,2*Math.PI,!0),n.moveTo(r+10,l+7),n.lineTo(r+4,l+7),d&&(n.moveTo(r+7,l+4),n.lineTo(r+7,l+10)),n.closePath(),n.stroke()}}_download(){var e=this.canvas_elem,i=this.jm.mind.name+".png";if(navigator.msSaveBlob&&e.msToBlob){var n=e.msToBlob();navigator.msSaveBlob(n,i)}else{var a=this.canvas_elem.toDataURL(),s=t.c("a");if("download"in s){s.style.visibility="hidden",s.href=a,s.download=i,t.d.body.appendChild(s);var o=t.d.createEvent("MouseEvents");o.initEvent("click",!0,!0),s.dispatchEvent(o),t.d.body.removeChild(s)}else location.href=a}}jm_event_handle(t,e){t===jsMind.event_type.resize&&this.resize()}}var s=new jsMind.plugin("screenshot",(function(t){var e=new a(t);t.screenshot=e,t.shoot=function(){e.shoot()},t.add_event_listener((function(t,i){e.jm_event_handle.call(e,t,i)}))}));jsMind.register_plugin(s)}(); +//# sourceMappingURL=jsmind.screenshot.js.map diff --git a/es6/jsmind.screenshot.js.map b/es6/jsmind.screenshot.js.map new file mode 100644 index 00000000..6f4f2b57 --- /dev/null +++ b/es6/jsmind.screenshot.js.map @@ -0,0 +1 @@ +{"version":3,"file":"jsmind.screenshot.js","sources":["../src/plugins/jsmind.screenshot.js"],"sourcesContent":["/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n * \n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\n\nif (!jsMind) { throw new Error('jsMind is not defined'); }\n\nconst $ = jsMind.$;\n\nvar css = function (cStyle, property_name) {\n return cStyle.getPropertyValue(property_name);\n};\nvar is_visible = function (cStyle) {\n var visibility = css(cStyle, 'visibility');\n var display = css(cStyle, 'display');\n return (visibility !== 'hidden' && display !== 'none');\n};\nvar jcanvas = {};\njcanvas.rect = function (ctx, x, y, w, h, r) {\n if (w < 2 * r) r = w / 2;\n if (h < 2 * r) r = h / 2;\n ctx.moveTo(x + r, y);\n ctx.arcTo(x + w, y, x + w, y + h, r);\n ctx.arcTo(x + w, y + h, x, y + h, r);\n ctx.arcTo(x, y + h, x, y, r);\n ctx.arcTo(x, y, x + w, y, r);\n};\n\njcanvas.text_multiline = function (ctx, text, x, y, w, h, lineheight) {\n var line = '';\n var text_len = text.length;\n var chars = text.split('');\n var test_line = null;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n for (var i = 0; i < text_len; i++) {\n test_line = line + chars[i];\n if (ctx.measureText(test_line).width > w && i > 0) {\n ctx.fillText(line, x, y);\n line = chars[i];\n y += lineheight;\n } else {\n line = test_line;\n }\n }\n ctx.fillText(line, x, y);\n};\n\njcanvas.text_ellipsis = function (ctx, text, x, y, w, h) {\n var center_y = y + h / 2;\n var text = jcanvas.fittingString(ctx, text, w);\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, x, center_y, w);\n};\n\njcanvas.fittingString = function (ctx, text, max_width) {\n var width = ctx.measureText(text).width;\n var ellipsis = '…';\n var ellipsis_width = ctx.measureText(ellipsis).width;\n if (width <= max_width || width <= ellipsis_width) {\n return text;\n } else {\n var len = text.length;\n while (width >= max_width - ellipsis_width && len-- > 0) {\n text = text.substring(0, len);\n width = ctx.measureText(text).width;\n }\n return text + ellipsis;\n }\n};\n\njcanvas.image = function (ctx, url, x, y, w, h, r, rotation, callback) {\n var img = new Image();\n img.onload = function () {\n ctx.save();\n ctx.translate(x, y);\n ctx.save();\n ctx.beginPath();\n jcanvas.rect(ctx, 0, 0, w, h, r);\n ctx.closePath();\n ctx.clip();\n ctx.translate(w / 2, h / 2);\n ctx.rotate(rotation * Math.PI / 180);\n ctx.drawImage(img, -w / 2, -h / 2);\n ctx.restore();\n ctx.restore();\n !!callback && callback();\n }\n img.src = url;\n};\n\nclass screenshot {\n constructor(jm) {\n this.jm = jm;\n this.canvas_elem = null;\n this.canvas_ctx = null;\n this._inited = false;\n }\n init() {\n if (this._inited) { return; }\n console.log('init');\n var c = $.c('canvas');\n var ctx = c.getContext('2d');\n\n this.canvas_elem = c;\n this.canvas_ctx = ctx;\n this.jm.view.e_panel.appendChild(c);\n this._inited = true;\n this.resize();\n }\n shoot(callback) {\n this.init();\n this._draw(function () {\n !!callback && callback();\n this.clean();\n }.bind(this));\n this._watermark();\n }\n shootDownload() {\n this.shoot(function () {\n this._download();\n }.bind(this));\n }\n shootAsDataURL(callback) {\n this.shoot(function () {\n !!callback && callback(this.canvas_elem.toDataURL());\n }.bind(this));\n }\n resize() {\n if (this._inited) {\n this.canvas_elem.width = this.jm.view.size.w;\n this.canvas_elem.height = this.jm.view.size.h;\n }\n }\n clean() {\n var c = this.canvas_elem;\n this.canvas_ctx.clearRect(0, 0, c.width, c.height);\n }\n _draw(callback) {\n var ctx = this.canvas_ctx;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n this._draw_lines(function () {\n this._draw_nodes(callback);\n }.bind(this));\n }\n _watermark() {\n var c = this.canvas_elem;\n var ctx = this.canvas_ctx;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'bottom';\n ctx.fillStyle = '#000';\n ctx.font = '11px Verdana,Arial,Helvetica,sans-serif';\n ctx.fillText('hizzgdev.github.io/jsmind', c.width - 5.5, c.height - 2.5);\n ctx.textAlign = 'left';\n ctx.fillText($.w.location, 5.5, c.height - 2.5);\n }\n _draw_lines(callback) {\n this.jm.view.graph.copy_to(this.canvas_ctx, callback);\n }\n _draw_nodes(callback) {\n var nodes = this.jm.mind.nodes;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n this._draw_node(node);\n }\n\n function check_nodes_ready() {\n console.log('check_node_ready' + new Date());\n var allOk = true;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n allOk = allOk & node.ready;\n }\n\n if (!allOk) {\n $.w.setTimeout(check_nodes_ready, 200);\n } else {\n $.w.setTimeout(callback, 200);\n }\n }\n check_nodes_ready();\n }\n _draw_node(node) {\n var ctx = this.canvas_ctx;\n var view_data = node._data.view;\n var node_element = view_data.element;\n var ncs = getComputedStyle(node_element);\n if (!is_visible(ncs)) {\n node.ready = true;\n return;\n }\n\n var bgcolor = css(ncs, 'background-color');\n var round_radius = parseInt(css(ncs, 'border-top-left-radius'));\n var color = css(ncs, 'color');\n var padding_left = parseInt(css(ncs, 'padding-left'));\n var padding_right = parseInt(css(ncs, 'padding-right'));\n var padding_top = parseInt(css(ncs, 'padding-top'));\n var padding_bottom = parseInt(css(ncs, 'padding-bottom'));\n var text_overflow = css(ncs, 'text-overflow');\n var font = css(ncs, 'font-style') + ' ' +\n css(ncs, 'font-variant') + ' ' +\n css(ncs, 'font-weight') + ' ' +\n css(ncs, 'font-size') + '/' + css(ncs, 'line-height') + ' ' +\n css(ncs, 'font-family');\n\n var rb = {\n x: view_data.abs_x,\n y: view_data.abs_y,\n w: view_data.width + 1,\n h: view_data.height + 1\n };\n var tb = {\n x: rb.x + padding_left,\n y: rb.y + padding_top,\n w: rb.w - padding_left - padding_right,\n h: rb.h - padding_top - padding_bottom\n };\n\n ctx.font = font;\n ctx.fillStyle = bgcolor;\n ctx.beginPath();\n jcanvas.rect(ctx, rb.x, rb.y, rb.w, rb.h, round_radius);\n ctx.closePath();\n ctx.fill();\n\n ctx.fillStyle = color;\n if ('background-image' in node.data) {\n var backgroundUrl = css(ncs, 'background-image').slice(5, -2);\n node.ready = false;\n var rotation = 0;\n if ('background-rotation' in node.data) {\n rotation = node.data['background-rotation'];\n }\n jcanvas.image(ctx, backgroundUrl, rb.x, rb.y, rb.w, rb.h, round_radius, rotation,\n function () {\n node.ready = true;\n });\n }\n if (!!node.topic) {\n if (text_overflow === 'ellipsis') {\n jcanvas.text_ellipsis(ctx, node.topic, tb.x, tb.y, tb.w, tb.h);\n } else {\n var line_height = parseInt(css(ncs, 'line-height'));\n jcanvas.text_multiline(ctx, node.topic, tb.x, tb.y, tb.w, tb.h, line_height);\n }\n }\n if (!!view_data.expander) {\n this._draw_expander(view_data.expander);\n }\n if (!('background-image' in node.data)) {\n node.ready = true;\n }\n }\n _draw_expander(expander) {\n var ctx = this.canvas_ctx;\n var ncs = getComputedStyle(expander);\n if (!is_visible(ncs)) { return; }\n\n var style_left = css(ncs, 'left');\n var style_top = css(ncs, 'top');\n var font = css(ncs, 'font');\n var left = parseInt(style_left);\n var top = parseInt(style_top);\n var is_plus = expander.innerHTML === '+';\n\n ctx.lineWidth = 1;\n\n ctx.beginPath();\n ctx.arc(left + 7, top + 7, 5, 0, Math.PI * 2, true);\n ctx.moveTo(left + 10, top + 7);\n ctx.lineTo(left + 4, top + 7);\n if (is_plus) {\n ctx.moveTo(left + 7, top + 4);\n ctx.lineTo(left + 7, top + 10);\n }\n ctx.closePath();\n ctx.stroke();\n }\n _download() {\n var c = this.canvas_elem;\n var name = this.jm.mind.name + '.png';\n\n if (navigator.msSaveBlob && (!!c.msToBlob)) {\n var blob = c.msToBlob();\n navigator.msSaveBlob(blob, name);\n } else {\n var bloburl = this.canvas_elem.toDataURL();\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\n }\n }\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\n\nvar screenshot_plugin = new jsMind.plugin('screenshot', function (jm) {\n var jss = new screenshot(jm);\n jm.screenshot = jss;\n jm.shoot = function () {\n jss.shoot();\n };\n jm.add_event_listener(function (type, data) {\n jss.jm_event_handle.call(jss, type, data);\n });\n});\n\njsMind.register_plugin(screenshot_plugin);\n"],"names":["jsMind","Error","$","css","cStyle","property_name","getPropertyValue","is_visible","visibility","display","jcanvas","ctx","x","y","w","h","r","moveTo","arcTo","text","lineheight","line","text_len","length","chars","split","test_line","textAlign","textBaseline","i","measureText","width","fillText","center_y","fittingString","max_width","ellipsis_width","len","substring","url","rotation","callback","img","Image","onload","save","translate","beginPath","rect","closePath","clip","rotate","Math","PI","drawImage","restore","src","screenshot","constructor","jm","this","canvas_elem","canvas_ctx","_inited","init","console","log","c","getContext","view","e_panel","appendChild","resize","shoot","_draw","clean","bind","_watermark","shootDownload","_download","shootAsDataURL","toDataURL","size","height","clearRect","_draw_lines","_draw_nodes","fillStyle","font","location","graph","copy_to","node","nodes","mind","nodeid","_draw_node","check_nodes_ready","Date","allOk","ready","setTimeout","view_data","_data","node_element","element","ncs","getComputedStyle","bgcolor","round_radius","parseInt","color","padding_left","padding_right","padding_top","padding_bottom","text_overflow","rb","abs_x","abs_y","tb","fill","data","backgroundUrl","slice","image","topic","text_ellipsis","line_height","text_multiline","expander","_draw_expander","style_left","style_top","left","top","is_plus","innerHTML","lineWidth","arc","lineTo","stroke","name","navigator","msSaveBlob","msToBlob","blob","bloburl","anchor","style","href","download","d","body","evt","createEvent","initEvent","dispatchEvent","removeChild","jm_event_handle","type","event_type","screenshot_plugin","plugin","jss","add_event_listener","call","register_plugin"],"mappings":"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"} \ No newline at end of file diff --git a/example/2_features_es6.html b/example/2_features_es6.html new file mode 100644 index 00000000..8a739487 --- /dev/null +++ b/example/2_features_es6.html @@ -0,0 +1,528 @@ + + + + + + jsMind + + + + +
    +
    +
    1. Open
    +
      +
    1. +
    2. +
    3. +
    4. +
    5. +
    + +
    2. Select & Toggle
    +
      +
    1. +
    2. +
    3. +
    +
    3. Edit
    +
      +
    1. +
    2. +
    3. +
    4. +
    5. +
    6. +
    7. +
    8. +
    9. +
    +
    4. Style
    +
      +
    1. +
    2. +
    3. +
    4. +
    +
    5. Theme
    +
      +
    1. + +
    2. +
    +
    6. Adjusting
    +
      +
    1. +
    2. +
    3. expand/collapse
    4. +
        +
      1. +
      2. +
      3. +
      4. +
      5. +
      6. +
      7. +
      +
    5. zoom(ctrl+mousewheel)
    6. + + +
    + +
    7. Multi Format
    +
      +
    1. node_tree(default)
    2. +
        +
      1. +
      2. +
      3. +
      4. +
      +
    3. node_array
    4. +
        +
      1. +
      2. +
      3. +
      4. +
      +
    5. freemind(.mm)
    6. +
        +
      1. +
      2. +
      3. +
      4. +
      +
    +
    +
    +
    + +
    + +
    + + + + + + diff --git a/package-lock.json b/package-lock.json index 1ba811ae..f864ddc0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,11 @@ "version": "0.4.8", "license": "BSD-3-Clause", "devDependencies": { - "jest": "^28.1.0" + "jest": "^28.1.0", + "jest-environment-jsdom": "^28.1.0", + "rollup": "^2.75.5", + "rollup-plugin-cleanup": "^3.2.1", + "rollup-plugin-terser": "^7.0.2" } }, "node_modules/@ampproject/remapping": { @@ -899,6 +903,30 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.13", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", @@ -939,6 +967,15 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/@types/babel__core": { "version": "7.1.19", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", @@ -1013,12 +1050,29 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jsdom": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.14.tgz", + "integrity": "sha512-6BAy1xXEmMuHeAJ4Fv4yXKwBDTGTOseExKE3OaHiNycdHdZw59KfYzrt0DkDluvwmik1HRt6QS7bImxUmpSy+w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/parse5": "*", + "@types/tough-cookie": "*" + } + }, "node_modules/@types/node": { "version": "17.0.38", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==", "dev": true }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true + }, "node_modules/@types/prettier": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", @@ -1031,6 +1085,12 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, "node_modules/@types/yargs": { "version": "17.0.10", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", @@ -1046,6 +1106,67 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1107,6 +1228,12 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "node_modules/babel-jest": { "version": "28.1.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.0.tgz", @@ -1226,6 +1353,12 @@ "node": ">=8" } }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "node_modules/browserslist": { "version": "4.20.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", @@ -1386,6 +1519,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1415,6 +1566,57 @@ "node": ">= 8" } }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1432,12 +1634,24 @@ } } }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -1447,6 +1661,15 @@ "node": ">=0.10.0" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -1465,6 +1688,18 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.143", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz", @@ -1516,6 +1751,28 @@ "node": ">=8" } }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1529,6 +1786,30 @@ "node": ">=4" } }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -1583,6 +1864,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -1617,6 +1904,20 @@ "node": ">=8" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1738,12 +2039,51 @@ "node": ">=8" } }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -1753,6 +2093,18 @@ "node": ">=10.17.0" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -1842,6 +2194,12 @@ "node": ">=0.12.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -2116,6 +2474,25 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, + "node_modules/jest-environment-jsdom": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.0.tgz", + "integrity": "sha512-8n6P4xiDjNVqTWv6W6vJPuQdLx+ZiA3dbYg7YJ+DPzR+9B61K6pMVJrSs2IxfGRG4J7pyAUA5shQ9G0KEun78w==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.0", + "@jest/fake-timers": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/jsdom": "^16.2.4", + "@types/node": "*", + "jest-mock": "^28.1.0", + "jest-util": "^28.1.0", + "jsdom": "^19.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, "node_modules/jest-environment-node": { "version": "28.1.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.0.tgz", @@ -2495,6 +2872,20 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-cleanup": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/js-cleanup/-/js-cleanup-1.2.0.tgz", + "integrity": "sha512-JeDD0yiiSt80fXzAVa/crrS0JDPQljyBG/RpOtaSbyDq03VHa9szJWMaWOYU/bcTn412uMN2MxApXq8v79cUiQ==", + "dev": true, + "dependencies": { + "magic-string": "^0.25.7", + "perf-regexes": "^1.0.1", + "skip-regex": "^1.0.2" + }, + "engines": { + "node": "^10.14.2 || >=12.0.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2514,6 +2905,52 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -2562,6 +2999,19 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -2592,6 +3042,15 @@ "node": ">=10" } }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2635,6 +3094,27 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -2701,6 +3181,12 @@ "node": ">=8" } }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2725,6 +3211,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -2779,7 +3282,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-exists": { + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", @@ -2812,6 +3321,15 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/perf-regexes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/perf-regexes/-/perf-regexes-1.0.1.tgz", + "integrity": "sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==", + "dev": true, + "engines": { + "node": ">=6.14" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -2851,6 +3369,15 @@ "node": ">=8" } }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-format": { "version": "28.1.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz", @@ -2891,6 +3418,30 @@ "node": ">= 6" } }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/react-is": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", @@ -2968,12 +3519,99 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "2.75.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.5.tgz", + "integrity": "sha512-JzNlJZDison3o2mOxVmb44Oz7t74EfSd1SQrplQk0wSaXV7uLQXtVdHbxlcT3w+8tZ1TL4r/eLfc7nAbz38BBA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-cleanup": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-3.2.1.tgz", + "integrity": "sha512-zuv8EhoO3TpnrU8MX8W7YxSbO4gmOR0ny06Lm3nkFfq0IVKdBUtHwhVzY1OAJyNCIAdLiyPnOrU0KnO0Fri1GQ==", + "dev": true, + "dependencies": { + "js-cleanup": "^1.2.0", + "rollup-pluginutils": "^2.8.2" + }, + "engines": { + "node": "^10.14.2 || >=12.0.0" + }, + "peerDependencies": { + "rollup": ">=2.0" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2983,6 +3621,15 @@ "semver": "bin/semver.js" } }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3016,6 +3663,15 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, + "node_modules/skip-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/skip-regex/-/skip-regex-1.0.2.tgz", + "integrity": "sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA==", + "dev": true, + "engines": { + "node": ">=4.2" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3044,6 +3700,12 @@ "source-map": "^0.6.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3168,6 +3830,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -3184,6 +3852,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/terser": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", + "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -3231,6 +3927,44 @@ "node": ">=8.0" } }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -3252,6 +3986,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/v8-to-istanbul": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", @@ -3266,6 +4009,27 @@ "node": ">=10.12.0" } }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -3275,6 +4039,49 @@ "makeerror": "1.0.12" } }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3290,6 +4097,15 @@ "node": ">= 8" } }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3326,6 +4142,42 @@ "node": "^12.13.0 || ^14.15.0 || >=16" } }, + "node_modules/ws": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", + "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -4049,6 +4901,29 @@ "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", "dev": true }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, "@jridgewell/sourcemap-codec": { "version": "1.4.13", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", @@ -4089,6 +4964,12 @@ "@sinonjs/commons": "^1.7.0" } }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, "@types/babel__core": { "version": "7.1.19", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", @@ -4163,12 +5044,29 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jsdom": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.14.tgz", + "integrity": "sha512-6BAy1xXEmMuHeAJ4Fv4yXKwBDTGTOseExKE3OaHiNycdHdZw59KfYzrt0DkDluvwmik1HRt6QS7bImxUmpSy+w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/parse5": "*", + "@types/tough-cookie": "*" + } + }, "@types/node": { "version": "17.0.38", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==", "dev": true }, + "@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true + }, "@types/prettier": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", @@ -4181,6 +5079,12 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, "@types/yargs": { "version": "17.0.10", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", @@ -4196,6 +5100,51 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -4239,6 +5188,12 @@ "sprintf-js": "~1.0.2" } }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "babel-jest": { "version": "28.1.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.0.tgz", @@ -4334,6 +5289,12 @@ "fill-range": "^7.0.1" } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "browserslist": { "version": "4.20.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", @@ -4446,6 +5407,21 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4472,6 +5448,52 @@ "which": "^2.0.1" } }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4481,18 +5503,36 @@ "ms": "2.1.2" } }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -4505,6 +5545,15 @@ "integrity": "sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ==", "dev": true }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, "electron-to-chromium": { "version": "1.4.143", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz", @@ -4544,12 +5593,43 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -4592,6 +5672,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -4620,6 +5706,17 @@ "path-exists": "^4.0.0" } }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4704,18 +5801,57 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -4781,6 +5917,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -4976,6 +6118,22 @@ "pretty-format": "^28.1.0" } }, + "jest-environment-jsdom": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.0.tgz", + "integrity": "sha512-8n6P4xiDjNVqTWv6W6vJPuQdLx+ZiA3dbYg7YJ+DPzR+9B61K6pMVJrSs2IxfGRG4J7pyAUA5shQ9G0KEun78w==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.0", + "@jest/fake-timers": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/jsdom": "^16.2.4", + "@types/node": "*", + "jest-mock": "^28.1.0", + "jest-util": "^28.1.0", + "jsdom": "^19.0.0" + } + }, "jest-environment-node": { "version": "28.1.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.0.tgz", @@ -5280,6 +6438,17 @@ } } }, + "js-cleanup": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/js-cleanup/-/js-cleanup-1.2.0.tgz", + "integrity": "sha512-JeDD0yiiSt80fXzAVa/crrS0JDPQljyBG/RpOtaSbyDq03VHa9szJWMaWOYU/bcTn412uMN2MxApXq8v79cUiQ==", + "dev": true, + "requires": { + "magic-string": "^0.25.7", + "perf-regexes": "^1.0.1", + "skip-regex": "^1.0.2" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5296,6 +6465,41 @@ "esprima": "^4.0.0" } }, + "jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -5326,6 +6530,16 @@ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -5350,6 +6564,15 @@ "yallist": "^4.0.0" } }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -5384,6 +6607,21 @@ "picomatch": "^2.3.1" } }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -5438,6 +6676,12 @@ "path-key": "^3.0.0" } }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5456,6 +6700,20 @@ "mimic-fn": "^2.1.0" } }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -5492,6 +6750,12 @@ "lines-and-columns": "^1.1.6" } }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5516,6 +6780,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "perf-regexes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/perf-regexes/-/perf-regexes-1.0.1.tgz", + "integrity": "sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -5543,6 +6813,12 @@ "find-up": "^4.0.0" } }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, "pretty-format": { "version": "28.1.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz", @@ -5573,6 +6849,27 @@ "sisteransi": "^1.0.5" } }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "react-is": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", @@ -5626,18 +6923,95 @@ "glob": "^7.1.3" } }, + "rollup": { + "version": "2.75.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.5.tgz", + "integrity": "sha512-JzNlJZDison3o2mOxVmb44Oz7t74EfSd1SQrplQk0wSaXV7uLQXtVdHbxlcT3w+8tZ1TL4r/eLfc7nAbz38BBA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-cleanup": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-3.2.1.tgz", + "integrity": "sha512-zuv8EhoO3TpnrU8MX8W7YxSbO4gmOR0ny06Lm3nkFfq0IVKdBUtHwhVzY1OAJyNCIAdLiyPnOrU0KnO0Fri1GQ==", + "dev": true, + "requires": { + "js-cleanup": "^1.2.0", + "rollup-pluginutils": "^2.8.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5665,6 +7039,12 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, + "skip-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/skip-regex/-/skip-regex-1.0.2.tgz", + "integrity": "sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5687,6 +7067,12 @@ "source-map": "^0.6.0" } }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -5775,6 +7161,12 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -5785,6 +7177,30 @@ "supports-hyperlinks": "^2.0.0" } }, + "terser": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", + "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -5823,6 +7239,35 @@ "is-number": "^7.0.0" } }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -5835,6 +7280,12 @@ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "v8-to-istanbul": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", @@ -5846,6 +7297,24 @@ "convert-source-map": "^1.6.0" } }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -5855,6 +7324,37 @@ "makeerror": "1.0.12" } }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true + }, + "whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5864,6 +7364,12 @@ "isexe": "^2.0.0" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -5891,6 +7397,25 @@ "signal-exit": "^3.0.7" } }, + "ws": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", + "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 207a2d26..9dfd623d 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "example": "example" }, "scripts": { + "build": "rollup -c", "test": "jest" }, "repository": { @@ -23,7 +24,8 @@ }, "homepage": "https://github.com/hizzgdev/jsmind#readme", "keywords": [ - "jsmind", "mindmap" + "jsmind", + "mindmap" ], "maintainers": [ { @@ -32,9 +34,14 @@ } ], "devDependencies": { - "jest": "^28.1.0" + "jest": "^28.1.0", + "jest-environment-jsdom": "^28.1.0", + "rollup": "^2.75.5", + "rollup-plugin-cleanup": "^3.2.1", + "rollup-plugin-terser": "^7.0.2" }, "jest": { - "verbose": true + "verbose": true, + "testEnvironment": "jsdom" } } diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000..92998c89 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,60 @@ +import cleanup from 'rollup-plugin-cleanup'; +import { terser } from 'rollup-plugin-terser'; + +export default [{ + input: 'src/jsmind.js', + output: { + name: 'jsMind', + file: 'es6/jsmind.js', + format: 'iife', + banner: "/**\n* @license BSD-3-Clause\n* @copyright 2014-2022 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/", + sourcemap: true, + }, + plugins: [ + cleanup({ + comments: "none" + }), + terser({ + output: { + comments: "all", + }, + }) + ], +}, { + input: 'src/plugins/jsmind.draggable.js', + output: { + file: 'es6/jsmind.draggable.js', + format: 'iife', + banner: "/**\n* @license BSD-3-Clause\n* @copyright 2014-2022 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/", + sourcemap: true, + }, + plugins: [ + cleanup({ + comments: "none" + }), + terser({ + output: { + comments: "all", + }, + }) + ], +}, { + input: 'src/plugins/jsmind.screenshot.js', + output: { + file: 'es6/jsmind.screenshot.js', + format: 'iife', + banner: "/**\n* @license BSD-3-Clause\n* @copyright 2014-2022 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/", + sourcemap: true, + }, + plugins: [ + cleanup({ + comments: "none" + }), + terser({ + output: { + comments: "all", + }, + }) + ], +} +] diff --git a/src/jsmind.common.js b/src/jsmind.common.js new file mode 100644 index 00000000..d71f2b27 --- /dev/null +++ b/src/jsmind.common.js @@ -0,0 +1,22 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +export const __version__ = '0.4.9'; +export const __author__ = 'hizzgdev@163.com'; + +if (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (p) { return this.slice(0, p.length) === p; }; } + +// an noop function define +var _noop = function () { }; +export let logger = (typeof console === 'undefined') ? { + log: _noop, debug: _noop, error: _noop, warn: _noop, info: _noop +} : console; + +export const Direction = { left: -1, center: 0, right: 1 }; +export const EventType = { show: 1, resize: 2, edit: 3, select: 4 }; +export const Key = { meta: 1 << 13, ctrl: 1 << 12, alt: 1 << 11, shift: 1 << 10 }; \ No newline at end of file diff --git a/src/jsmind.data_provider.js b/src/jsmind.data_provider.js new file mode 100644 index 00000000..469a08dc --- /dev/null +++ b/src/jsmind.data_provider.js @@ -0,0 +1,62 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +import { logger } from "./jsmind.common.js"; +import { format } from "./jsmind.format.js"; + +export class DataProvider { + constructor(jm) { + this.jm = jm; + } + + init() { + logger.debug('data.init'); + } + reset() { + logger.debug('data.reset'); + } + load(mind_data) { + var df = null; + var mind = null; + if (typeof mind_data === 'object') { + if (!!mind_data.format) { + df = mind_data.format; + } else { + df = 'node_tree'; + } + } else { + df = 'freemind'; + } + + if (df == 'node_array') { + mind = format.node_array.get_mind(mind_data); + } else if (df == 'node_tree') { + mind = format.node_tree.get_mind(mind_data); + } else if (df == 'freemind') { + mind = format.freemind.get_mind(mind_data); + } else { + logger.warn('unsupported format'); + } + return mind; + } + get_data(data_format) { + var data = null; + if (data_format == 'node_array') { + data = format.node_array.get_data(this.jm.mind); + } else if (data_format == 'node_tree') { + data = format.node_tree.get_data(this.jm.mind); + } else if (data_format == 'freemind') { + data = format.freemind.get_data(this.jm.mind); + } else { + logger.error('unsupported ' + data_format + ' format'); + } + return data; + } +} + + diff --git a/src/jsmind.dom.js b/src/jsmind.dom.js new file mode 100644 index 00000000..d4a052b1 --- /dev/null +++ b/src/jsmind.dom.js @@ -0,0 +1,39 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +class Dom { + constructor(w) { + this.w = w; + this.d = w.document; + this.g = function (id) { return this.d.getElementById(id); }; + this.c = function (tag) { return this.d.createElement(tag); }; + this.t = function (n, t) { if (n.hasChildNodes()) { n.firstChild.nodeValue = t; } else { n.appendChild(this.d.createTextNode(t)); } }; + + this.h = function (n, t) { + if (t instanceof HTMLElement) { + n.innerHTML = ''; + n.appendChild(t); + } else { + n.innerHTML = t; + } + }; + // detect isElement + this.i = function (el) { return !!el && (typeof el === 'object') && (el.nodeType === 1) && (typeof el.style === 'object') && (typeof el.ownerDocument === 'object'); }; + + //target,eventType,handler + this.on = function (t, e, h) { + if (!!t.addEventListener) { + t.addEventListener(e, h, false); + } else { + t.attachEvent('on' + e, h); + } + }; + } +} + +export const $ = new Dom(window); diff --git a/src/jsmind.format.js b/src/jsmind.format.js new file mode 100644 index 00000000..9574ecf2 --- /dev/null +++ b/src/jsmind.format.js @@ -0,0 +1,420 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +import { __author__, __version__ , logger, Direction} from "./jsmind.common.js"; +import { Mind } from "./jsmind.mind.js"; +import { Node } from "./jsmind.node.js"; + +export const format = { + node_tree: { + example: { + "meta": { + "name": 'jsMind node_tree simple', + "author": __author__, + "version": __version__ + }, + "format": "node_tree", + "data": { "id": "root", "topic": "jsMind Example" } + }, + get_mind: function (source) { + var df = format.node_tree; + var mind = new Mind(); + mind.name = source.meta.name; + mind.author = source.meta.author; + mind.version = source.meta.version; + df._parse(mind, source.data); + return mind; + }, + get_data: function (mind) { + var df = format.node_tree; + var json = {}; + json.meta = { + name: mind.name, + author: mind.author, + version: mind.version + }; + json.format = 'node_tree'; + json.data = df._buildnode(mind.root); + return json; + }, + + _parse: function (mind, node_root) { + var df = format.node_tree; + var data = df._extract_data(node_root); + mind.set_root(node_root.id, node_root.topic, data); + if ('children' in node_root) { + var children = node_root.children; + for (var i = 0; i < children.length; i++) { + df._extract_subnode(mind, mind.root, children[i]); + } + } + }, + + _extract_data: function (node_json) { + var data = {}; + for (var k in node_json) { + if (k == 'id' || k == 'topic' || k == 'children' || k == 'direction' || k == 'expanded') { + continue; + } + data[k] = node_json[k]; + } + return data; + }, + + _extract_subnode: function (mind, node_parent, node_json) { + var df = format.node_tree; + var data = df._extract_data(node_json); + var d = null; + if (node_parent.isroot) { + d = node_json.direction == 'left' ? Direction.left : Direction.right; + } + var node = mind.add_node(node_parent, node_json.id, node_json.topic, data, d, node_json.expanded); + if (!!node_json['children']) { + var children = node_json.children; + for (var i = 0; i < children.length; i++) { + df._extract_subnode(mind, node, children[i]); + } + } + }, + + _buildnode: function (node) { + var df = format.node_tree; + if (!(node instanceof Node)) { return; } + var o = { + id: node.id, + topic: node.topic, + expanded: node.expanded + }; + if (!!node.parent && node.parent.isroot) { + o.direction = node.direction == Direction.left ? 'left' : 'right'; + } + if (node.data != null) { + var node_data = node.data; + for (var k in node_data) { + o[k] = node_data[k]; + } + } + var children = node.children; + if (children.length > 0) { + o.children = []; + for (var i = 0; i < children.length; i++) { + o.children.push(df._buildnode(children[i])); + } + } + return o; + } + }, + + node_array: { + example: { + "meta": { + "name": 'jsMind node_array simple', + "author": __author__, + "version": __version__ + }, + "format": "node_array", + "data": [ + { "id": "root", "topic": "jsMind Example", "isroot": true } + ] + }, + + get_mind: function (source) { + var df = format.node_array; + var mind = new Mind(); + mind.name = source.meta.name; + mind.author = source.meta.author; + mind.version = source.meta.version; + df._parse(mind, source.data); + return mind; + }, + + get_data: function (mind) { + var df = format.node_array; + var json = {}; + json.meta = { + name: mind.name, + author: mind.author, + version: mind.version + }; + json.format = 'node_array'; + json.data = []; + df._array(mind, json.data); + return json; + }, + + _parse: function (mind, node_array) { + var df = format.node_array; + var narray = node_array.slice(0); + // reverse array for improving looping performance + narray.reverse(); + var root_node = df._extract_root(mind, narray); + if (!!root_node) { + df._extract_subnode(mind, root_node, narray); + } else { + logger.error('root node can not be found'); + } + }, + + _extract_root: function (mind, node_array) { + var df = format.node_array; + var i = node_array.length; + while (i--) { + if ('isroot' in node_array[i] && node_array[i].isroot) { + var root_json = node_array[i]; + var data = df._extract_data(root_json); + var node = mind.set_root(root_json.id, root_json.topic, data); + node_array.splice(i, 1); + return node; + } + } + return null; + }, + + _extract_subnode: function (mind, parent_node, node_array) { + var df = format.node_array; + var i = node_array.length; + var node_json = null; + var data = null; + var extract_count = 0; + while (i--) { + node_json = node_array[i]; + if (node_json.parentid == parent_node.id) { + data = df._extract_data(node_json); + var d = null; + var node_direction = node_json.direction; + if (!!node_direction) { + d = node_direction == 'left' ? Direction.left : Direction.right; + } + var node = mind.add_node(parent_node, node_json.id, node_json.topic, data, d, node_json.expanded); + node_array.splice(i, 1); + extract_count++; + var sub_extract_count = df._extract_subnode(mind, node, node_array); + if (sub_extract_count > 0) { + // reset loop index after extract subordinate node + i = node_array.length; + extract_count += sub_extract_count; + } + } + } + return extract_count; + }, + + _extract_data: function (node_json) { + var data = {}; + for (var k in node_json) { + if (k == 'id' || k == 'topic' || k == 'parentid' || k == 'isroot' || k == 'direction' || k == 'expanded') { + continue; + } + data[k] = node_json[k]; + } + return data; + }, + + _array: function (mind, node_array) { + var df = format.node_array; + df._array_node(mind.root, node_array); + }, + + _array_node: function (node, node_array) { + var df = format.node_array; + if (!(node instanceof Node)) { return; } + var o = { + id: node.id, + topic: node.topic, + expanded: node.expanded + }; + if (!!node.parent) { + o.parentid = node.parent.id; + } + if (node.isroot) { + o.isroot = true; + } + if (!!node.parent && node.parent.isroot) { + o.direction = node.direction == Direction.left ? 'left' : 'right'; + } + if (node.data != null) { + var node_data = node.data; + for (var k in node_data) { + o[k] = node_data[k]; + } + } + node_array.push(o); + var ci = node.children.length; + for (var i = 0; i < ci; i++) { + df._array_node(node.children[i], node_array); + } + }, + }, + + freemind: { + example: { + "meta": { + "name": 'jsMind freemind example', + "author": __author__, + "version": __version__ + }, + "format": "freemind", + "data": "" + }, + get_mind: function (source) { + var df = format.freemind; + var mind = new Mind(); + mind.name = source.meta.name; + mind.author = source.meta.author; + mind.version = source.meta.version; + var xml = source.data; + var xml_doc = df._parse_xml(xml); + var xml_root = df._find_root(xml_doc); + df._load_node(mind, null, xml_root); + return mind; + }, + + get_data: function (mind) { + var df = format.freemind; + var json = {}; + json.meta = { + name: mind.name, + author: mind.author, + version: mind.version + }; + json.format = 'freemind'; + var xmllines = []; + xmllines.push(''); + df._buildmap(mind.root, xmllines); + xmllines.push(''); + json.data = xmllines.join(' '); + return json; + }, + + _parse_xml: function (xml) { + var xml_doc = null; + if (window.DOMParser) { + var parser = new DOMParser(); + xml_doc = parser.parseFromString(xml, 'text/xml'); + } else { // Internet Explorer + xml_doc = new ActiveXObject('Microsoft.XMLDOM'); + xml_doc.async = false; + xml_doc.loadXML(xml); + } + return xml_doc; + }, + + _find_root: function (xml_doc) { + var nodes = xml_doc.childNodes; + var node = null; + var root = null; + var n = null; + for (var i = 0; i < nodes.length; i++) { + n = nodes[i]; + if (n.nodeType == 1 && n.tagName == 'map') { + node = n; + break; + } + } + if (!!node) { + var ns = node.childNodes; + node = null; + for (var i = 0; i < ns.length; i++) { + n = ns[i]; + if (n.nodeType == 1 && n.tagName == 'node') { + node = n; + break; + } + } + } + return node; + }, + + _load_node: function (mind, parent_node, xml_node) { + var df = format.freemind; + var node_id = xml_node.getAttribute('ID'); + var node_topic = xml_node.getAttribute('TEXT'); + // look for richcontent + if (node_topic == null) { + var topic_children = xml_node.childNodes; + var topic_child = null; + for (var i = 0; i < topic_children.length; i++) { + topic_child = topic_children[i]; + if (topic_child.nodeType == 1 && topic_child.tagName === 'richcontent') { + node_topic = topic_child.textContent; + break; + } + } + } + var node_data = df._load_attributes(xml_node); + var node_expanded = ('expanded' in node_data) ? (node_data.expanded == 'true') : true; + delete node_data.expanded; + + var node_position = xml_node.getAttribute('POSITION'); + var node_direction = null; + if (!!node_position) { + node_direction = node_position == 'left' ? Direction.left : Direction.right; + } + var node = null; + if (!!parent_node) { + node = mind.add_node(parent_node, node_id, node_topic, node_data, node_direction, node_expanded); + } else { + node = mind.set_root(node_id, node_topic, node_data); + } + var children = xml_node.childNodes; + var child = null; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeType == 1 && child.tagName == 'node') { + df._load_node(mind, node, child); + } + } + }, + + _load_attributes: function (xml_node) { + var children = xml_node.childNodes; + var attr = null; + var attr_data = {}; + for (var i = 0; i < children.length; i++) { + attr = children[i]; + if (attr.nodeType == 1 && attr.tagName === 'attribute') { + attr_data[attr.getAttribute('NAME')] = attr.getAttribute('VALUE'); + } + } + return attr_data; + }, + + _buildmap: function (node, xmllines) { + var df = format.freemind; + var pos = null; + if (!!node.parent && node.parent.isroot) { + pos = node.direction === Direction.left ? 'left' : 'right'; + } + xmllines.push(''); + + // store expanded status as an attribute + xmllines.push(''); + + // for attributes + var node_data = node.data; + if (node_data != null) { + for (var k in node_data) { + xmllines.push(''); + } + } + + // for children + var children = node.children; + for (var i = 0; i < children.length; i++) { + df._buildmap(children[i], xmllines); + } + + xmllines.push(''); + }, + } +}; diff --git a/src/jsmind.graph.js b/src/jsmind.graph.js new file mode 100644 index 00000000..764a3346 --- /dev/null +++ b/src/jsmind.graph.js @@ -0,0 +1,115 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +import { $ } from "./jsmind.dom.js"; + +class graph_svg { + constructor(view) { + this.view = view; + this.opts = view.opts; + this.e_svg = graph_svg.c('svg'); + this.e_svg.setAttribute('class', 'jsmind'); + this.size = { w: 0, h: 0 }; + this.lines = []; + } + static c(tag) { + return $.d.createElementNS('http://www.w3.org/2000/svg', tag); + } + element() { + return this.e_svg; + } + set_size(w, h) { + this.size.w = w; + this.size.h = h; + this.e_svg.setAttribute('width', w); + this.e_svg.setAttribute('height', h); + } + clear() { + var len = this.lines.length; + while (len--) { + this.e_svg.removeChild(this.lines[len]); + } + this.lines.length = 0; + } + draw_line(pout, pin, offset) { + var line = graph_svg.c('path'); + line.setAttribute('stroke', this.opts.line_color); + line.setAttribute('stroke-width', this.opts.line_width); + line.setAttribute('fill', 'transparent'); + this.lines.push(line); + this.e_svg.appendChild(line); + this._bezier_to(line, pin.x + offset.x, pin.y + offset.y, pout.x + offset.x, pout.y + offset.y); + } + copy_to(dest_canvas_ctx, callback) { + var img = new Image(); + img.onload = function () { + dest_canvas_ctx.drawImage(img, 0, 0); + !!callback && callback(); + }; + img.src = 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg)); + } + _bezier_to(path, x1, y1, x2, y2) { + path.setAttribute('d', 'M' + x1 + ' ' + y1 + ' C ' + (x1 + (x2 - x1) * 2 / 3) + ' ' + y1 + ', ' + x1 + ' ' + y2 + ', ' + x2 + ' ' + y2); + } + _line_to(path, x1, y1, x2, y2) { + path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2); + } +} + + +class graph_canvas { + constructor(view) { + this.opts = view.opts; + this.e_canvas = $.c('canvas'); + this.e_canvas.className = 'jsmind'; + this.canvas_ctx = this.e_canvas.getContext('2d'); + this.size = { w: 0, h: 0 }; + } + element() { + return this.e_canvas; + } + set_size(w, h) { + this.size.w = w; + this.size.h = h; + this.e_canvas.width = w; + this.e_canvas.height = h; + } + clear() { + this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h); + } + draw_line(pout, pin, offset) { + var ctx = this.canvas_ctx; + ctx.strokeStyle = this.opts.line_color; + ctx.lineWidth = this.opts.line_width; + ctx.lineCap = 'round'; + + this._bezier_to(ctx, + pin.x + offset.x, + pin.y + offset.y, + pout.x + offset.x, + pout.y + offset.y); + } + copy_to(dest_canvas_ctx, callback) { + dest_canvas_ctx.drawImage(this.e_canvas, 0, 0); + !!callback && callback(); + } + _bezier_to(ctx, x1, y1, x2, y2) { + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.bezierCurveTo(x1 + (x2 - x1) * 2 / 3, y1, x1, y2, x2, y2); + ctx.stroke(); + } + _line_to(ctx, x1, y1, x2, y2) { + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + } +} + +export const graph = { svg: graph_svg, canvas: graph_canvas }; diff --git a/src/jsmind.js b/src/jsmind.js new file mode 100644 index 00000000..dac73d2f --- /dev/null +++ b/src/jsmind.js @@ -0,0 +1,633 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +import { __version__, logger, EventType, Direction } from "./jsmind.common.js"; +import { merge_option } from "./jsmind.option.js"; +import { Node } from "./jsmind.node.js"; +import { DataProvider } from "./jsmind.data_provider.js"; +import { LayoutProvider } from "./jsmind.layout_provider.js"; +import { ViewProvider } from "./jsmind.view_provider.js"; +import { ShortcutProvider } from "./jsmind.shortcut_provider.js"; +import { Plugin, register as _register_plugin, apply as apply_plugins } from "./jsmind.plugin.js"; +import { format } from "./jsmind.format.js"; +import { $ } from "./jsmind.dom.js"; +import { util as _util } from "./jsmind.util.js" + + +class jm { + static node = Node; + static direction = Direction; + static event_type = EventType; + static $ = $; + static plugin = Plugin + static register_plugin = _register_plugin + static util = _util + + constructor(options) { + jm.current = this; + this.version = __version__; + this.initialized = false; + this.mind = null; + this.event_handles = []; + this.options = merge_option(options); + this.init(); + } + + init() { + if (!!this.initialized) { return; } + this.initialized = true; + var opts_layout = { + mode: this.options.mode, + hspace: this.options.layout.hspace, + vspace: this.options.layout.vspace, + pspace: this.options.layout.pspace + }; + var opts_view = { + container: this.options.container, + support_html: this.options.support_html, + engine: this.options.view.engine, + hmargin: this.options.view.hmargin, + vmargin: this.options.view.vmargin, + line_width: this.options.view.line_width, + line_color: this.options.view.line_color, + draggable: this.options.view.draggable, + hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable + }; + // create instance of function provider + this.data = new DataProvider(this); + this.layout = new LayoutProvider(this, opts_layout); + this.view = new ViewProvider(this, opts_view); + this.shortcut = new ShortcutProvider(this, this.options.shortcut); + + this.data.init(); + this.layout.init(); + this.view.init(); + this.shortcut.init(); + + this._event_bind(); + + apply_plugins(this); + } + enable_edit() { + this.options.editable = true; + } + disable_edit() { + this.options.editable = false; + } + // call enable_event_handle('dblclick') + // options are 'mousedown', 'click', 'dblclick' + enable_event_handle(event_handle) { + this.options.default_event_handle['enable_' + event_handle + '_handle'] = true; + } + // call disable_event_handle('dblclick') + // options are 'mousedown', 'click', 'dblclick' + disable_event_handle(event_handle) { + this.options.default_event_handle['enable_' + event_handle + '_handle'] = false; + } + get_editable() { + return this.options.editable; + } + set_theme(theme) { + var theme_old = this.options.theme; + this.options.theme = (!!theme) ? theme : null; + if (theme_old != this.options.theme) { + this.view.reset_theme(); + this.view.reset_custom_style(); + } + } + _event_bind() { + this.view.add_event(this, 'mousedown', this.mousedown_handle); + this.view.add_event(this, 'click', this.click_handle); + this.view.add_event(this, 'dblclick', this.dblclick_handle); + this.view.add_event(this, "mousewheel", this.mousewheel_handle); + } + mousedown_handle(e) { + if (!this.options.default_event_handle['enable_mousedown_handle']) { + return; + } + var element = e.target || event.srcElement; + var nodeid = this.view.get_binded_nodeid(element); + if (!!nodeid) { + if (element.tagName.toLowerCase() == 'jmnode') { + this.select_node(nodeid); + } + } else { + this.select_clear(); + } + } + click_handle(e) { + if (!this.options.default_event_handle['enable_click_handle']) { + return; + } + var element = e.target || event.srcElement; + var isexpander = this.view.is_expander(element); + if (isexpander) { + var nodeid = this.view.get_binded_nodeid(element); + if (!!nodeid) { + this.toggle_node(nodeid); + } + } + } + dblclick_handle(e) { + if (!this.options.default_event_handle['enable_dblclick_handle']) { + return; + } + if (this.get_editable()) { + var element = e.target || event.srcElement; + var nodeid = this.view.get_binded_nodeid(element); + if (!!nodeid) { + this.begin_edit(nodeid); + } + } + } + // Use [Ctrl] + Mousewheel, to zoom in/out. + mousewheel_handle(event) { + // Test if mousewheel option is enabled and Ctrl key is pressed. + if (!this.options.default_event_handle["enable_mousewheel_handle"] || !window.event.ctrlKey) { + return; + } + // Avoid default page scrolling behavior. + event.preventDefault(); + + var dir = event.deltaY > 0 ? "Up" : "Down"; + if (dir == "Up") { + this.view.zoomIn(); + } else { + this.view.zoomOut(); + } + } + begin_edit(node) { + if (!Node.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return false; + } else { + return this.begin_edit(the_node); + } + } + if (this.get_editable()) { + this.view.edit_node_begin(node); + } else { + logger.error('fail, this mind map is not editable.'); + return; + } + } + end_edit() { + this.view.edit_node_end(); + } + toggle_node(node) { + if (!Node.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.toggle_node(the_node); + } + } + if (node.isroot) { return; } + this.view.save_location(node); + this.layout.toggle_node(node); + this.view.relayout(); + this.view.restore_location(node); + } + expand_node(node) { + if (!Node.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.expand_node(the_node); + } + } + if (node.isroot) { return; } + this.view.save_location(node); + this.layout.expand_node(node); + this.view.relayout(); + this.view.restore_location(node); + } + collapse_node(node) { + if (!Node.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.collapse_node(the_node); + } + } + if (node.isroot) { return; } + this.view.save_location(node); + this.layout.collapse_node(node); + this.view.relayout(); + this.view.restore_location(node); + } + expand_all() { + this.layout.expand_all(); + this.view.relayout(); + } + collapse_all() { + this.layout.collapse_all(); + this.view.relayout(); + } + expand_to_depth(depth) { + this.layout.expand_to_depth(depth); + this.view.relayout(); + } + _reset() { + this.view.reset(); + this.layout.reset(); + this.data.reset(); + } + _show(mind) { + var m = mind || format.node_array.example; + + this.mind = this.data.load(m); + if (!this.mind) { + logger.error('data.load error'); + return; + } else { + logger.debug('data.load ok'); + } + + this.view.load(); + logger.debug('view.load ok'); + + this.layout.layout(); + logger.debug('layout.layout ok'); + + this.view.show(true); + logger.debug('view.show ok'); + + this.invoke_event_handle(EventType.show, { data: [mind] }); + } + show(mind) { + this._reset(); + this._show(mind); + } + get_meta() { + return { + name: this.mind.name, + author: this.mind.author, + version: this.mind.version + }; + } + get_data(data_format) { + var df = data_format || 'node_tree'; + return this.data.get_data(df); + } + get_root() { + return this.mind.root; + } + get_node(node) { + if (Node.is_node(node)) { + return node; + } + return this.mind.get_node(node); + } + add_node(parent_node, nodeid, topic, data) { + if (this.get_editable()) { + var the_parent_node = this.get_node(parent_node); + var direction = this.layout.calculate_next_child_direction(the_parent_node); + var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction); + if (!!node) { + this.view.add_node(node); + this.layout.layout(); + this.view.show(false); + this.view.reset_node_custom_style(node); + this.expand_node(the_parent_node); + this.invoke_event_handle(EventType.edit, { evt: 'add_node', data: [the_parent_node.id, nodeid, topic, data], node: nodeid }); + } + return node; + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + } + insert_node_before(node_before, nodeid, topic, data) { + if (this.get_editable()) { + var the_node_before = this.get_node(node_before); + var direction = this.layout.calculate_next_child_direction(the_node_before.parent); + var node = this.mind.insert_node_before(the_node_before, nodeid, topic, data, direction); + if (!!node) { + this.view.add_node(node); + this.layout.layout(); + this.view.show(false); + this.invoke_event_handle(EventType.edit, { evt: 'insert_node_before', data: [the_node_before.id, nodeid, topic, data], node: nodeid }); + } + return node; + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + } + insert_node_after(node_after, nodeid, topic, data) { + if (this.get_editable()) { + var the_node_after = this.get_node(node_after); + var direction = this.layout.calculate_next_child_direction(the_node_after.parent); + var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction); + if (!!node) { + this.view.add_node(node); + this.layout.layout(); + this.view.show(false); + this.invoke_event_handle(EventType.edit, { evt: 'insert_node_after', data: [the_node_after.id, nodeid, topic, data], node: nodeid }); + } + return node; + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + } + remove_node(node) { + if (!Node.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return false; + } else { + return this.remove_node(the_node); + } + } + if (this.get_editable()) { + if (node.isroot) { + logger.error('fail, can not remove root node'); + return false; + } + var nodeid = node.id; + var parentid = node.parent.id; + var parent_node = this.get_node(parentid); + this.view.save_location(parent_node); + this.view.remove_node(node); + this.mind.remove_node(node); + this.layout.layout(); + this.view.show(false); + this.view.restore_location(parent_node); + this.invoke_event_handle(EventType.edit, { evt: 'remove_node', data: [nodeid], node: parentid }); + return true; + } else { + logger.error('fail, this mind map is not editable'); + return false; + } + } + update_node(nodeid, topic) { + if (this.get_editable()) { + if (_util.text.is_empty(topic)) { + logger.warn('fail, topic can not be empty'); + return; + } + var node = this.get_node(nodeid); + if (!!node) { + if (node.topic === topic) { + logger.info('nothing changed'); + this.view.update_node(node); + return; + } + node.topic = topic; + this.view.update_node(node); + this.layout.layout(); + this.view.show(false); + this.invoke_event_handle(EventType.edit, { evt: 'update_node', data: [nodeid, topic], node: nodeid }); + } + } else { + logger.error('fail, this mind map is not editable'); + return; + } + } + move_node(nodeid, beforeid, parentid, direction) { + if (this.get_editable()) { + var node = this.get_node(nodeid); + var updated_node = this.mind.move_node(node, beforeid, parentid, direction); + if (!!updated_node) { + this.view.update_node(updated_node); + this.layout.layout(); + this.view.show(false); + this.invoke_event_handle(EventType.edit, { evt: 'move_node', data: [nodeid, beforeid, parentid, direction], node: nodeid }); + } + } else { + logger.error('fail, this mind map is not editable'); + return; + } + } + select_node(node) { + if (!Node.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.select_node(the_node); + } + } + if (!this.layout.is_visible(node)) { + return; + } + this.mind.selected = node; + this.view.select_node(node); + this.invoke_event_handle(EventType.select, { evt: 'select_node', data: [], node: node.id }); + } + get_selected_node() { + if (!!this.mind) { + return this.mind.selected; + } else { + return null; + } + } + select_clear() { + if (!!this.mind) { + this.mind.selected = null; + this.view.select_clear(); + } + } + is_node_visible(node) { + return this.layout.is_visible(node); + } + find_node_before(node) { + if (!Node.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.find_node_before(the_node); + } + } + if (node.isroot) { return null; } + var n = null; + if (node.parent.isroot) { + var c = node.parent.children; + var prev = null; + var ni = null; + for (var i = 0; i < c.length; i++) { + ni = c[i]; + if (node.direction === ni.direction) { + if (node.id === ni.id) { + n = prev; + } + prev = ni; + } + } + } else { + n = this.mind.get_node_before(node); + } + return n; + } + find_node_after(node) { + if (!Node.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.find_node_after(the_node); + } + } + if (node.isroot) { return null; } + var n = null; + if (node.parent.isroot) { + var c = node.parent.children; + var getthis = false; + var ni = null; + for (var i = 0; i < c.length; i++) { + ni = c[i]; + if (node.direction === ni.direction) { + if (getthis) { + n = ni; + break; + } + if (node.id === ni.id) { + getthis = true; + } + } + } + } else { + n = this.mind.get_node_after(node); + } + return n; + } + set_node_color(nodeid, bgcolor, fgcolor) { + if (this.get_editable()) { + var node = this.mind.get_node(nodeid); + if (!!node) { + if (!!bgcolor) { + node.data['background-color'] = bgcolor; + } + if (!!fgcolor) { + node.data['foreground-color'] = fgcolor; + } + this.view.reset_node_custom_style(node); + } + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + } + set_node_font_style(nodeid, size, weight, style) { + if (this.get_editable()) { + var node = this.mind.get_node(nodeid); + if (!!node) { + if (!!size) { + node.data['font-size'] = size; + } + if (!!weight) { + node.data['font-weight'] = weight; + } + if (!!style) { + node.data['font-style'] = style; + } + this.view.reset_node_custom_style(node); + this.view.update_node(node); + this.layout.layout(); + this.view.show(false); + } + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + } + set_node_background_image(nodeid, image, width, height, rotation) { + if (this.get_editable()) { + var node = this.mind.get_node(nodeid); + if (!!node) { + if (!!image) { + node.data['background-image'] = image; + } + if (!!width) { + node.data['width'] = width; + } + if (!!height) { + node.data['height'] = height; + } + if (!!rotation) { + node.data['background-rotation'] = rotation; + } + this.view.reset_node_custom_style(node); + this.view.update_node(node); + this.layout.layout(); + this.view.show(false); + } + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + } + set_node_background_rotation(nodeid, rotation) { + if (this.get_editable()) { + var node = this.mind.get_node(nodeid); + if (!!node) { + if (!node.data['background-image']) { + logger.error('fail, only can change rotation angle of node with background image'); + return null; + } + node.data['background-rotation'] = rotation; + this.view.reset_node_custom_style(node); + this.view.update_node(node); + this.layout.layout(); + this.view.show(false); + } + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + } + resize() { + this.view.resize(); + } + // callback(type ,data) + add_event_listener(callback) { + if (typeof callback === 'function') { + this.event_handles.push(callback); + } + } + clear_event_listener() { + this.event_handles = []; + } + invoke_event_handle(type, data) { + var j = this; + $.w.setTimeout(function () { + j._invoke_event_handle(type, data); + }, 0); + } + _invoke_event_handle(type, data) { + var l = this.event_handles.length; + for (var i = 0; i < l; i++) { + this.event_handles[i](type, data); + } + } + + // quick way + static show(options, mind) { + var _jm = new jm(options); + _jm.show(mind); + return _jm; + } +} + +export default jsMind = jm; +// window.jsMind = jsMind; diff --git a/src/jsmind.layout_provider.js b/src/jsmind.layout_provider.js new file mode 100644 index 00000000..b0613bd2 --- /dev/null +++ b/src/jsmind.layout_provider.js @@ -0,0 +1,414 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ +import { logger, Direction, EventType } from "./jsmind.common.js"; + +export class LayoutProvider { + constructor(jm, options) { + this.opts = options; + this.jm = jm; + this.isside = (this.opts.mode == 'side'); + this.bounds = null; + + this.cache_valid = false; + } + init() { + logger.debug('layout.init'); + } + reset() { + logger.debug('layout.reset'); + this.bounds = { n: 0, s: 0, w: 0, e: 0 }; + } + calculate_next_child_direction(node) { + if (this.isside) { + return Direction.right; + } + var children = node.children || []; + var children_len = children.length; + var r = 0; + for (var i = 0; i < children_len; i++) { if (children[i].direction === Direction.left) { r--; } else { r++; } } + return (children_len > 1 && r > 0) ? Direction.left : Direction.right; + } + layout() { + logger.debug('layout.layout'); + this.layout_direction(); + this.layout_offset(); + } + layout_direction() { + this._layout_direction_root(); + } + _layout_direction_root() { + var node = this.jm.mind.root; + var layout_data = null; + if ('layout' in node._data) { + layout_data = node._data.layout; + } else { + layout_data = {}; + node._data.layout = layout_data; + } + var children = node.children; + var children_count = children.length; + layout_data.direction = Direction.center; + layout_data.side_index = 0; + if (this.isside) { + var i = children_count; + while (i--) { + this._layout_direction_side(children[i], Direction.right, i); + } + } else { + var i = children_count; + var subnode = null; + while (i--) { + subnode = children[i]; + if (subnode.direction == Direction.left) { + this._layout_direction_side(subnode, Direction.left, i); + } else { + this._layout_direction_side(subnode, Direction.right, i); + } + } + } + } + _layout_direction_side(node, direction, side_index) { + var layout_data = null; + if ('layout' in node._data) { + layout_data = node._data.layout; + } else { + layout_data = {}; + node._data.layout = layout_data; + } + var children = node.children; + var children_count = children.length; + + layout_data.direction = direction; + layout_data.side_index = side_index; + var i = children_count; + while (i--) { + this._layout_direction_side(children[i], direction, i); + } + } + layout_offset() { + var node = this.jm.mind.root; + var layout_data = node._data.layout; + layout_data.offset_x = 0; + layout_data.offset_y = 0; + layout_data.outer_height = 0; + var children = node.children; + var i = children.length; + var left_nodes = []; + var right_nodes = []; + var subnode = null; + while (i--) { + subnode = children[i]; + if (subnode._data.layout.direction == Direction.right) { + right_nodes.unshift(subnode); + } else { + left_nodes.unshift(subnode); + } + } + layout_data.left_nodes = left_nodes; + layout_data.right_nodes = right_nodes; + layout_data.outer_height_left = this._layout_offset_subnodes(left_nodes); + layout_data.outer_height_right = this._layout_offset_subnodes(right_nodes); + this.bounds.e = node._data.view.width / 2; + this.bounds.w = 0 - this.bounds.e; + this.bounds.n = 0; + this.bounds.s = Math.max(layout_data.outer_height_left, layout_data.outer_height_right); + } + // layout both the x and y axis + _layout_offset_subnodes(nodes) { + var total_height = 0; + var nodes_count = nodes.length; + var i = nodes_count; + var node = null; + var node_outer_height = 0; + var layout_data = null; + var base_y = 0; + var pd = null; // parent._data + while (i--) { + node = nodes[i]; + layout_data = node._data.layout; + if (pd == null) { + pd = node.parent._data; + } + + node_outer_height = this._layout_offset_subnodes(node.children); + if (!node.expanded) { + node_outer_height = 0; + this.set_visible(node.children, false); + } + node_outer_height = Math.max(node._data.view.height, node_outer_height); + + layout_data.outer_height = node_outer_height; + layout_data.offset_y = base_y - node_outer_height / 2; + layout_data.offset_x = this.opts.hspace * layout_data.direction + pd.view.width * (pd.layout.direction + layout_data.direction) / 2; + if (!node.parent.isroot) { + layout_data.offset_x += this.opts.pspace * layout_data.direction; + } + + base_y = base_y - node_outer_height - this.opts.vspace; + total_height += node_outer_height; + } + if (nodes_count > 1) { + total_height += this.opts.vspace * (nodes_count - 1); + } + i = nodes_count; + var middle_height = total_height / 2; + while (i--) { + node = nodes[i]; + node._data.layout.offset_y += middle_height; + } + return total_height; + } + // layout the y axis only, for collapse/expand a node + _layout_offset_subnodes_height(nodes) { + var total_height = 0; + var nodes_count = nodes.length; + var i = nodes_count; + var node = null; + var node_outer_height = 0; + var layout_data = null; + var base_y = 0; + var pd = null; // parent._data + while (i--) { + node = nodes[i]; + layout_data = node._data.layout; + if (pd == null) { + pd = node.parent._data; + } + + node_outer_height = this._layout_offset_subnodes_height(node.children); + if (!node.expanded) { + node_outer_height = 0; + } + node_outer_height = Math.max(node._data.view.height, node_outer_height); + + layout_data.outer_height = node_outer_height; + layout_data.offset_y = base_y - node_outer_height / 2; + base_y = base_y - node_outer_height - this.opts.vspace; + total_height += node_outer_height; + } + if (nodes_count > 1) { + total_height += this.opts.vspace * (nodes_count - 1); + } + i = nodes_count; + var middle_height = total_height / 2; + while (i--) { + node = nodes[i]; + node._data.layout.offset_y += middle_height; + } + return total_height; + } + get_node_offset(node) { + var layout_data = node._data.layout; + var offset_cache = null; + if (('_offset_' in layout_data) && this.cache_valid) { + offset_cache = layout_data._offset_; + } else { + offset_cache = { x: -1, y: -1 }; + layout_data._offset_ = offset_cache; + } + if (offset_cache.x == -1 || offset_cache.y == -1) { + var x = layout_data.offset_x; + var y = layout_data.offset_y; + if (!node.isroot) { + var offset_p = this.get_node_offset(node.parent); + x += offset_p.x; + y += offset_p.y; + } + offset_cache.x = x; + offset_cache.y = y; + } + return offset_cache; + } + get_node_point(node) { + var view_data = node._data.view; + var offset_p = this.get_node_offset(node); + var p = {}; + p.x = offset_p.x + view_data.width * (node._data.layout.direction - 1) / 2; + p.y = offset_p.y - view_data.height / 2; + return p; + } + get_node_point_in(node) { + var p = this.get_node_offset(node); + return p; + } + get_node_point_out(node) { + var layout_data = node._data.layout; + var pout_cache = null; + if (('_pout_' in layout_data) && this.cache_valid) { + pout_cache = layout_data._pout_; + } else { + pout_cache = { x: -1, y: -1 }; + layout_data._pout_ = pout_cache; + } + if (pout_cache.x == -1 || pout_cache.y == -1) { + if (node.isroot) { + pout_cache.x = 0; + pout_cache.y = 0; + } else { + var view_data = node._data.view; + var offset_p = this.get_node_offset(node); + pout_cache.x = offset_p.x + (view_data.width + this.opts.pspace) * node._data.layout.direction; + pout_cache.y = offset_p.y; + } + } + return pout_cache; + } + get_expander_point(node) { + var p = this.get_node_point_out(node); + var ex_p = {}; + if (node._data.layout.direction == Direction.right) { + ex_p.x = p.x - this.opts.pspace; + } else { + ex_p.x = p.x; + } + ex_p.y = p.y - Math.ceil(this.opts.pspace / 2); + return ex_p; + } + get_min_size() { + var nodes = this.jm.mind.nodes; + var node = null; + var pout = null; + for (var nodeid in nodes) { + node = nodes[nodeid]; + pout = this.get_node_point_out(node); + if (pout.x > this.bounds.e) { this.bounds.e = pout.x; } + if (pout.x < this.bounds.w) { this.bounds.w = pout.x; } + } + return { + w: this.bounds.e - this.bounds.w, + h: this.bounds.s - this.bounds.n + }; + } + toggle_node(node) { + if (node.isroot) { + return; + } + if (node.expanded) { + this.collapse_node(node); + } else { + this.expand_node(node); + } + } + expand_node(node) { + node.expanded = true; + this.part_layout(node); + this.set_visible(node.children, true); + this.jm.invoke_event_handle(EventType.show, { evt: 'expand_node', data: [], node: node.id }); + } + collapse_node(node) { + node.expanded = false; + this.part_layout(node); + this.set_visible(node.children, false); + this.jm.invoke_event_handle(EventType.show, { evt: 'collapse_node', data: [], node: node.id }); + } + expand_all() { + var nodes = this.jm.mind.nodes; + var c = 0; + var node; + for (var nodeid in nodes) { + node = nodes[nodeid]; + if (!node.expanded) { + node.expanded = true; + c++; + } + } + if (c > 0) { + var root = this.jm.mind.root; + this.part_layout(root); + this.set_visible(root.children, true); + } + } + collapse_all() { + var nodes = this.jm.mind.nodes; + var c = 0; + var node; + for (var nodeid in nodes) { + node = nodes[nodeid]; + if (node.expanded && !node.isroot) { + node.expanded = false; + c++; + } + } + if (c > 0) { + var root = this.jm.mind.root; + this.part_layout(root); + this.set_visible(root.children, true); + } + } + expand_to_depth(target_depth, curr_nodes, curr_depth) { + if (target_depth < 1) { return; } + var nodes = curr_nodes || this.jm.mind.root.children; + var depth = curr_depth || 1; + var i = nodes.length; + var node = null; + while (i--) { + node = nodes[i]; + if (depth < target_depth) { + if (!node.expanded) { + this.expand_node(node); + } + this.expand_to_depth(target_depth, node.children, depth + 1); + } + if (depth == target_depth) { + if (node.expanded) { + this.collapse_node(node); + } + } + } + } + part_layout(node) { + var root = this.jm.mind.root; + if (!!root) { + var root_layout_data = root._data.layout; + if (node.isroot) { + root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes); + root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes); + } else { + if (node._data.layout.direction == Direction.right) { + root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes); + } else { + root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes); + } + } + this.bounds.s = Math.max(root_layout_data.outer_height_left, root_layout_data.outer_height_right); + this.cache_valid = false; + } else { + logger.warn('can not found root node'); + } + } + set_visible(nodes, visible) { + var i = nodes.length; + var node = null; + var layout_data = null; + while (i--) { + node = nodes[i]; + layout_data = node._data.layout; + if (node.expanded) { + this.set_visible(node.children, visible); + } else { + this.set_visible(node.children, false); + } + if (!node.isroot) { + node._data.layout.visible = visible; + } + } + } + is_expand(node) { + return node.expanded; + } + is_visible(node) { + var layout_data = node._data.layout; + if (('visible' in layout_data) && !layout_data.visible) { + return false; + } else { + return true; + } + } +} + + diff --git a/src/jsmind.mind.js b/src/jsmind.mind.js new file mode 100644 index 00000000..c956c4d5 --- /dev/null +++ b/src/jsmind.mind.js @@ -0,0 +1,244 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +import { Node } from "./jsmind.node.js"; +import { logger, Direction } from "./jsmind.common.js"; + +export class Mind { + constructor() { + this.name = null; + this.author = null; + this.version = null; + this.root = null; + this.selected = null; + this.nodes = {}; + } + get_node(nodeid) { + if (nodeid in this.nodes) { + return this.nodes[nodeid]; + } else { + logger.warn('the node[id=' + nodeid + '] can not be found'); + return null; + } + } + set_root(nodeid, topic, data) { + if (this.root == null) { + this.root = new Node(nodeid, 0, topic, data, true); + this._put_node(this.root); + return this.root; + } else { + logger.error('root node is already exist'); + return null; + } + } + add_node(parent_node, nodeid, topic, data, direction, expanded, idx) { + if (!Node.is_node(parent_node)) { + logger.error('the parent_node ' + parent_node + ' is not a node.'); + return null; + } + var node_index = idx || -1; + var node = new Node(nodeid, node_index, topic, data, false, parent_node, parent_node.direction, expanded); + if (parent_node.isroot) { + node.direction = direction || Direction.right; + } + if (this._put_node(node)) { + parent_node.children.push(node); + this._reindex(parent_node); + } else { + logger.error('fail, the nodeid \'' + node.id + '\' has been already exist.'); + node = null; + } + return node; + } + insert_node_before(node_before, nodeid, topic, data, direction) { + if (!Node.is_node(node_before)) { + logger.error('the node_before ' + node_before + ' is not a node.'); + return null; + } + var node_index = node_before.index - 0.5; + return this.add_node(node_before.parent, nodeid, topic, data, direction, true, node_index); + } + get_node_before(node) { + if (!Node.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return null; + } else { + return this.get_node_before(the_node); + } + } + if (node.isroot) { return null; } + var idx = node.index - 2; + if (idx >= 0) { + return node.parent.children[idx]; + } else { + return null; + } + } + insert_node_after(node_after, nodeid, topic, data, direction) { + if (!Node.is_node(node_after)) { + logger.error('the node_after ' + node_after + ' is not a node.'); + return null; + } + var node_index = node_after.index + 0.5; + return this.add_node(node_after.parent, nodeid, topic, data, direction, true, node_index); + } + get_node_after(node) { + if (!Node.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return null; + } else { + return this.get_node_after(the_node); + } + } + if (node.isroot) { return null; } + var idx = node.index; + var brothers = node.parent.children; + if (brothers.length > idx) { + return node.parent.children[idx]; + } else { + return null; + } + } + move_node(node, before_id, parent_id, direction) { + if (!Node.is_node(node)) { + logger.error('the parameter node ' + node + ' is not a node.'); + return null; + } + if (!parent_id) { + parent_id = node.parent.id; + } + return this._move_node(node, before_id, parent_id, direction); + } + _flow_node_direction(node, direction) { + if (typeof direction === 'undefined') { + direction = node.direction; + } else { + node.direction = direction; + } + var len = node.children.length; + while (len--) { + this._flow_node_direction(node.children[len], direction); + } + } + _move_node_internal(node, beforeid) { + if (!!node && !!beforeid) { + if (beforeid == '_last_') { + node.index = -1; + this._reindex(node.parent); + } else if (beforeid == '_first_') { + node.index = 0; + this._reindex(node.parent); + } else { + var node_before = (!!beforeid) ? this.get_node(beforeid) : null; + if (node_before != null && node_before.parent != null && node_before.parent.id == node.parent.id) { + node.index = node_before.index - 0.5; + this._reindex(node.parent); + } + } + } + return node; + } + _move_node(node, beforeid, parentid, direction) { + if (!!node && !!parentid) { + var parent_node = this.get_node(parentid); + if (Node.inherited(node, parent_node)) { + logger.error('can not move a node to its children'); + return null; + } + if (node.parent.id != parentid) { + // remove from parent's children + var sibling = node.parent.children; + var si = sibling.length; + while (si--) { + if (sibling[si].id == node.id) { + sibling.splice(si, 1); + break; + } + } + node.parent = parent_node; + parent_node.children.push(node); + } + + if (node.parent.isroot) { + if (direction == Direction.left) { + node.direction = direction; + } else { + node.direction = Direction.right; + } + } else { + node.direction = node.parent.direction; + } + this._move_node_internal(node, beforeid); + this._flow_node_direction(node); + } + return node; + } + remove_node(node) { + if (!Node.is_node(node)) { + logger.error('the parameter node ' + node + ' is not a node.'); + return false; + } + if (node.isroot) { + logger.error('fail, can not remove root node'); + return false; + } + if (this.selected != null && this.selected.id == node.id) { + this.selected = null; + } + // clean all subordinate nodes + var children = node.children; + var ci = children.length; + while (ci--) { + this.remove_node(children[ci]); + } + // clean all children + children.length = 0; + // remove from parent's children + var sibling = node.parent.children; + var si = sibling.length; + while (si--) { + if (sibling[si].id == node.id) { + sibling.splice(si, 1); + break; + } + } + // remove from global nodes + delete this.nodes[node.id]; + // clean all properties + for (var k in node) { + delete node[k]; + } + // remove it's self + node = null; + //delete node; + return true; + } + _put_node(node) { + if (node.id in this.nodes) { + logger.warn('the nodeid \'' + node.id + '\' has been already exist.'); + return false; + } else { + this.nodes[node.id] = node; + return true; + } + } + _reindex(node) { + if (node instanceof Node) { + node.children.sort(Node.compare); + for (var i = 0; i < node.children.length; i++) { + node.children[i].index = i + 1; + } + } + } +} + + diff --git a/src/jsmind.node.js b/src/jsmind.node.js new file mode 100644 index 00000000..0406de53 --- /dev/null +++ b/src/jsmind.node.js @@ -0,0 +1,83 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +export class Node { + constructor(sId, iIndex, sTopic, oData, bIsRoot, oParent, eDirection, bExpanded) { + if (!sId) { jm.logger.error('invalid node id'); return; } + if (typeof iIndex != 'number') { jm.logger.error('invalid node index'); return; } + if (typeof bExpanded === 'undefined') { bExpanded = true; } + this.id = sId; + this.index = iIndex; + this.topic = sTopic; + this.data = oData || {}; + this.isroot = bIsRoot; + this.parent = oParent; + this.direction = eDirection; + this.expanded = !!bExpanded; + this.children = []; + this._data = {}; + } + + get_location() { + var vd = this._data.view; + return { + x: vd.abs_x, + y: vd.abs_y + }; + } + get_size() { + var vd = this._data.view; + return { + w: vd.width, + h: vd.height + } + } + + static compare(node1, node2) { + // '-1' is alwary the last + var r = 0; + var i1 = node1.index; + var i2 = node2.index; + if (i1 >= 0 && i2 >= 0) { + r = i1 - i2; + } else if (i1 == -1 && i2 == -1) { + r = 0; + } else if (i1 == -1) { + r = 1; + } else if (i2 == -1) { + r = -1; + } else { + r = 0; + } + return r; + } + static inherited(pnode, node) { + if (!!pnode && !!node) { + if (pnode.id === node.id) { + return true; + } + if (pnode.isroot) { + return true; + } + var pid = pnode.id; + var p = node; + while (!p.isroot) { + p = p.parent; + if (p.id === pid) { + return true; + } + } + } + return false; + } + static is_node(n) { + return !!n && n instanceof Node; + } +} + + diff --git a/src/jsmind.option.js b/src/jsmind.option.js new file mode 100644 index 00000000..4605fb5a --- /dev/null +++ b/src/jsmind.option.js @@ -0,0 +1,65 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +import { util } from "./jsmind.util.js"; + +const default_options = { + container: '', // id of the container + editable: false, // you can change it in your options + theme: null, + mode: 'full', // full or side + support_html: true, + + view: { + engine: 'canvas', + hmargin: 100, + vmargin: 50, + line_width: 2, + line_color: '#555', + draggable: false, // drag the mind map with your mouse, when it's larger that the container + hide_scrollbars_when_draggable: false // hide container scrollbars, when mind map is larger than container and draggable option is true. + }, + layout: { + hspace: 30, + vspace: 20, + pspace: 13 + }, + default_event_handle: { + enable_mousedown_handle: true, + enable_click_handle: true, + enable_dblclick_handle: true, + enable_mousewheel_handle: true + }, + shortcut: { + enable: true, + handles: { + }, + mapping: { + addchild: 45, // Insert + addbrother: 13, // Enter + editnode: 113,// F2 + delnode: 46, // Delete + toggle: 32, // Space + left: 37, // Left + up: 38, // Up + right: 39, // Right + down: 40, // Down + } + }, +}; + +export function merge_option (options) { + var opts = {}; + util.json.merge(opts, default_options); + util.json.merge(opts, options); + + if (!opts.container) { + throw new Error('the options.container should not be null or empty.') + } + return opts; +} diff --git a/src/jsmind.plugin.js b/src/jsmind.plugin.js new file mode 100644 index 00000000..ed153806 --- /dev/null +++ b/src/jsmind.plugin.js @@ -0,0 +1,44 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +import { $ } from "./jsmind.dom.js"; + +const plugin_data = { + plugins: [] +} + +export function register(plugin) { + if (!plugin instanceof Plugin) { + throw new Error('plugin ' + plugin + ' is not a supported plugin') + } + plugin_data.plugins.push(plugin); +} + +export function apply(jm) { + $.w.setTimeout(function () { + _apply(jm); + }, 0); +} + +function _apply(jm) { + var l = plugin_data.plugins.length; + var fn_init = null; + for (var i = 0; i < l; i++) { + fn_init = plugin_data.plugins[i].init; + if (typeof fn_init === 'function') { + fn_init(jm); + } + } +} + +export class Plugin { + constructor(name, init) { + this.name = name; + this.init = init; + } +} diff --git a/src/jsmind.shortcut_provider.js b/src/jsmind.shortcut_provider.js new file mode 100644 index 00000000..b5a066b7 --- /dev/null +++ b/src/jsmind.shortcut_provider.js @@ -0,0 +1,182 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +import { $ } from "./jsmind.dom.js"; +import { util } from "./jsmind.util.js"; +import { Direction } from "./jsmind.common.js"; + +export class ShortcutProvider { + constructor(jm, options) { + this.jm = jm; + this.opts = options; + this.mapping = options.mapping; + this.handles = options.handles; + this._newid = null; + this._mapping = {}; + } + init() { + $.on(this.jm.view.e_panel, 'keydown', this.handler.bind(this)); + + this.handles['addchild'] = this.handle_addchild; + this.handles['addbrother'] = this.handle_addbrother; + this.handles['editnode'] = this.handle_editnode; + this.handles['delnode'] = this.handle_delnode; + this.handles['toggle'] = this.handle_toggle; + this.handles['up'] = this.handle_up; + this.handles['down'] = this.handle_down; + this.handles['left'] = this.handle_left; + this.handles['right'] = this.handle_right; + + for (var handle in this.mapping) { + if (!!this.mapping[handle] && (handle in this.handles)) { + this._mapping[this.mapping[handle]] = this.handles[handle]; + } + } + + if (typeof this.opts.id_generator === 'function') { + this._newid = this.opts.id_generator; + } else { + this._newid = util.uuid.newid; + } + } + enable_shortcut() { + this.opts.enable = true; + } + disable_shortcut() { + this.opts.enable = false; + } + handler(e) { + if (e.which == 9) { e.preventDefault(); } //prevent tab to change focus in browser + if (this.jm.view.is_editing()) { return; } + var evt = e || event; + if (!this.opts.enable) { return true; } + var kc = evt.keyCode + (evt.metaKey << 13) + (evt.ctrlKey << 12) + (evt.altKey << 11) + (evt.shiftKey << 10); + if (kc in this._mapping) { + this._mapping[kc].call(this, this.jm, e); + } + } + handle_addchild(_jm, e) { + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + var nodeid = this._newid(); + var node = _jm.add_node(selected_node, nodeid, 'New Node'); + if (!!node) { + _jm.select_node(nodeid); + _jm.begin_edit(nodeid); + } + } + } + handle_addbrother(_jm, e) { + var selected_node = _jm.get_selected_node(); + if (!!selected_node && !selected_node.isroot) { + var nodeid = this._newid(); + var node = _jm.insert_node_after(selected_node, nodeid, 'New Node'); + if (!!node) { + _jm.select_node(nodeid); + _jm.begin_edit(nodeid); + } + } + } + handle_editnode(_jm, e) { + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + _jm.begin_edit(selected_node); + } + } + handle_delnode(_jm, e) { + var selected_node = _jm.get_selected_node(); + if (!!selected_node && !selected_node.isroot) { + _jm.select_node(selected_node.parent); + _jm.remove_node(selected_node); + } + } + handle_toggle(_jm, e) { + var evt = e || event; + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + _jm.toggle_node(selected_node.id); + evt.stopPropagation(); + evt.preventDefault(); + } + } + handle_up(_jm, e) { + var evt = e || event; + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + var up_node = _jm.find_node_before(selected_node); + if (!up_node) { + var np = _jm.find_node_before(selected_node.parent); + if (!!np && np.children.length > 0) { + up_node = np.children[np.children.length - 1]; + } + } + if (!!up_node) { + _jm.select_node(up_node); + } + evt.stopPropagation(); + evt.preventDefault(); + } + } + handle_down(_jm, e) { + var evt = e || event; + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + var down_node = _jm.find_node_after(selected_node); + if (!down_node) { + var np = _jm.find_node_after(selected_node.parent); + if (!!np && np.children.length > 0) { + down_node = np.children[0]; + } + } + if (!!down_node) { + _jm.select_node(down_node); + } + evt.stopPropagation(); + evt.preventDefault(); + } + } + handle_left(_jm, e) { + this._handle_direction(_jm, e, Direction.left); + } + handle_right(_jm, e) { + this._handle_direction(_jm, e, Direction.right); + } + _handle_direction(_jm, e, d) { + var evt = e || event; + var selected_node = _jm.get_selected_node(); + var node = null; + if (!!selected_node) { + if (selected_node.isroot) { + var c = selected_node.children; + var children = []; + for (var i = 0; i < c.length; i++) { + if (c[i].direction === d) { + children.push(i); + } + } + node = c[children[Math.floor((children.length - 1) / 2)]]; + } + else if (selected_node.direction === d) { + var children = selected_node.children; + var childrencount = children.length; + if (childrencount > 0) { + node = children[Math.floor((childrencount - 1) / 2)]; + } + } else { + node = selected_node.parent; + } + if (!!node) { + _jm.select_node(node); + } + evt.stopPropagation(); + evt.preventDefault(); + } + } +} + + diff --git a/src/jsmind.util.js b/src/jsmind.util.js new file mode 100644 index 00000000..67b3edf1 --- /dev/null +++ b/src/jsmind.util.js @@ -0,0 +1,176 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +import { $ } from "./jsmind.dom.js"; +import { logger } from "./jsmind.common.js"; + +export const util = { + ajax: { + _xhr: function () { + var xhr = null; + if (window.XMLHttpRequest) { + xhr = new XMLHttpRequest(); + } else { + try { + xhr = new ActiveXObject('Microsoft.XMLHTTP'); + } catch (e) { } + } + return xhr; + }, + _eurl: function (url) { + return encodeURIComponent(url); + }, + request: function (url, param, method, callback, fail_callback) { + var a = util.ajax; + var p = null; + var tmp_param = []; + for (var k in param) { + tmp_param.push(a._eurl(k) + '=' + a._eurl(param[k])); + } + if (tmp_param.length > 0) { + p = tmp_param.join('&'); + } + var xhr = a._xhr(); + if (!xhr) { return; } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + if (xhr.status == 200 || xhr.status == 0) { + if (typeof callback === 'function') { + var data = util.json.string2json(xhr.responseText); + if (data != null) { + callback(data); + } else { + callback(xhr.responseText); + } + } + } else { + if (typeof fail_callback === 'function') { + fail_callback(xhr); + } else { + logger.error('xhr request failed.', xhr); + } + } + } + } + method = method || 'GET'; + xhr.open(method, url, true); + xhr.setRequestHeader('If-Modified-Since', '0'); + if (method == 'POST') { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8'); + xhr.send(p); + } else { + xhr.send(); + } + }, + get: function (url, callback) { + return util.ajax.request(url, {}, 'GET', callback); + }, + post: function (url, param, callback) { + return util.ajax.request(url, param, 'POST', callback); + } + }, + + file: { + read: function (file_data, fn_callback) { + var reader = new FileReader(); + reader.onload = function () { + if (typeof fn_callback === 'function') { + fn_callback(this.result, file_data.name); + } + }; + reader.readAsText(file_data); + }, + + save: function (file_data, type, name) { + var blob; + if (typeof $.w.Blob === 'function') { + blob = new Blob([file_data], { type: type }); + } else { + var BlobBuilder = $.w.BlobBuilder || $.w.MozBlobBuilder || $.w.WebKitBlobBuilder || $.w.MSBlobBuilder; + var bb = new BlobBuilder(); + bb.append(file_data); + blob = bb.getBlob(type); + } + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, name); + } else { + var URL = $.w.URL || $.w.webkitURL; + var bloburl = URL.createObjectURL(blob); + var anchor = $.c('a'); + if ('download' in anchor) { + anchor.style.visibility = 'hidden'; + anchor.href = bloburl; + anchor.download = name; + $.d.body.appendChild(anchor); + var evt = $.d.createEvent('MouseEvents'); + evt.initEvent('click', true, true); + anchor.dispatchEvent(evt); + $.d.body.removeChild(anchor); + } else { + location.href = bloburl; + } + } + } + }, + + json: { + json2string: function (json) { + if (!!JSON) { + try { + var json_str = JSON.stringify(json); + return json_str; + } catch (e) { + logger.warn(e); + logger.warn('can not convert to string'); + return null; + } + } + }, + string2json: function (json_str) { + if (!!JSON) { + try { + var json = JSON.parse(json_str); + return json; + } catch (e) { + logger.warn(e); + logger.warn('can not parse to json'); + return null; + } + } + }, + merge: function (b, a) { + for (var o in a) { + if (o in b) { + if (typeof b[o] === 'object' && + Object.prototype.toString.call(b[o]).toLowerCase() == '[object object]' && + !b[o].length) { + util.json.merge(b[o], a[o]); + } else { + b[o] = a[o]; + } + } else { + b[o] = a[o]; + } + } + return b; + } + }, + + uuid: { + newid: function () { + return (new Date().getTime().toString(16) + Math.random().toString(16).substr(2)).substr(2, 16); + } + }, + + text: { + is_empty: function (s) { + if (!s) { return true; } + return s.replace(/\s*/, '').length == 0; + } + } +}; diff --git a/src/jsmind.view_provider.js b/src/jsmind.view_provider.js new file mode 100644 index 00000000..93ca0b38 --- /dev/null +++ b/src/jsmind.view_provider.js @@ -0,0 +1,529 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ +import { logger, EventType } from "./jsmind.common.js"; +import { $ } from "./jsmind.dom.js"; +import { graph } from "./jsmind.graph.js"; +import { util } from "./jsmind.util.js"; + +export class ViewProvider { + constructor(jm, options) { + this.opts = options; + this.jm = jm; + this.layout = jm.layout; + + this.container = null; + this.e_panel = null; + this.e_nodes = null; + + this.size = { w: 0, h: 0 }; + + this.selected_node = null; + this.editing_node = null; + + this.graph = null; + } + init() { + logger.debug('view.init'); + + this.container = $.i(this.opts.container) ? this.opts.container : $.g(this.opts.container); + if (!this.container) { + logger.error('the options.view.container was not be found in dom'); + return; + } + this.e_panel = $.c('div'); + this.e_nodes = $.c('jmnodes'); + this.e_editor = $.c('input'); + + this.graph = this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this); + + this.e_panel.className = 'jsmind-inner'; + this.e_panel.tabIndex = 1; + this.e_panel.appendChild(this.graph.element()); + this.e_panel.appendChild(this.e_nodes); + + this.e_editor.className = 'jsmind-editor'; + this.e_editor.type = 'text'; + + this.actualZoom = 1; + this.zoomStep = 0.1; + this.minZoom = 0.5; + this.maxZoom = 2; + + var v = this; + $.on(this.e_editor, 'keydown', function (e) { + var evt = e || event; + if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); } + }); + $.on(this.e_editor, 'blur', function (e) { + v.edit_node_end(); + }); + + this.container.appendChild(this.e_panel); + + this.enable_draggable_canvas(); + } + add_event(obj, event_name, event_handle) { + $.on(this.e_nodes, event_name, function (e) { + var evt = e || event; + event_handle.call(obj, evt); + }); + } + get_binded_nodeid(element) { + if (element == null) { + return null; + } + var tagName = element.tagName.toLowerCase(); + if (tagName == 'jmnodes' || tagName == 'body' || tagName == 'html') { + return null; + } + if (tagName == 'jmnode' || tagName == 'jmexpander') { + return element.getAttribute('nodeid'); + } else { + return this.get_binded_nodeid(element.parentElement); + } + } + is_expander(element) { + return (element.tagName.toLowerCase() == 'jmexpander'); + } + reset() { + logger.debug('view.reset'); + this.selected_node = null; + this.clear_lines(); + this.clear_nodes(); + this.reset_theme(); + } + reset_theme() { + var theme_name = this.jm.options.theme; + if (!!theme_name) { + this.e_nodes.className = 'theme-' + theme_name; + } else { + this.e_nodes.className = ''; + } + } + reset_custom_style() { + var nodes = this.jm.mind.nodes; + for (var nodeid in nodes) { + this.reset_node_custom_style(nodes[nodeid]); + } + } + load() { + logger.debug('view.load'); + this.init_nodes(); + } + expand_size() { + var min_size = this.layout.get_min_size(); + var min_width = min_size.w + this.opts.hmargin * 2; + var min_height = min_size.h + this.opts.vmargin * 2; + var client_w = this.e_panel.clientWidth; + var client_h = this.e_panel.clientHeight; + if (client_w < min_width) { client_w = min_width; } + if (client_h < min_height) { client_h = min_height; } + this.size.w = client_w; + this.size.h = client_h; + } + init_nodes_size(node) { + var view_data = node._data.view; + view_data.width = view_data.element.clientWidth; + view_data.height = view_data.element.clientHeight; + } + init_nodes() { + var nodes = this.jm.mind.nodes; + var doc_frag = $.d.createDocumentFragment(); + for (var nodeid in nodes) { + this.create_node_element(nodes[nodeid], doc_frag); + } + this.e_nodes.appendChild(doc_frag); + for (var nodeid in nodes) { + this.init_nodes_size(nodes[nodeid]); + } + } + add_node(node) { + this.create_node_element(node, this.e_nodes); + this.init_nodes_size(node); + } + create_node_element(node, parent_node) { + var view_data = null; + if ('view' in node._data) { + view_data = node._data.view; + } else { + view_data = {}; + node._data.view = view_data; + } + + var d = $.c('jmnode'); + if (node.isroot) { + d.className = 'root'; + } else { + var d_e = $.c('jmexpander'); + $.t(d_e, '-'); + d_e.setAttribute('nodeid', node.id); + d_e.style.visibility = 'hidden'; + parent_node.appendChild(d_e); + view_data.expander = d_e; + } + if (!!node.topic) { + if (this.opts.support_html) { + $.h(d, node.topic); + } else { + $.t(d, node.topic); + } + } + d.setAttribute('nodeid', node.id); + d.style.visibility = 'hidden'; + this._reset_node_custom_style(d, node.data); + + parent_node.appendChild(d); + view_data.element = d; + } + remove_node(node) { + if (this.selected_node != null && this.selected_node.id == node.id) { + this.selected_node = null; + } + if (this.editing_node != null && this.editing_node.id == node.id) { + node._data.view.element.removeChild(this.e_editor); + this.editing_node = null; + } + var children = node.children; + var i = children.length; + while (i--) { + this.remove_node(children[i]); + } + if (node._data.view) { + var element = node._data.view.element; + var expander = node._data.view.expander; + this.e_nodes.removeChild(element); + this.e_nodes.removeChild(expander); + node._data.view.element = null; + node._data.view.expander = null; + } + } + update_node(node) { + var view_data = node._data.view; + var element = view_data.element; + if (!!node.topic) { + if (this.opts.support_html) { + $.h(element, node.topic); + } else { + $.t(element, node.topic); + } + } + view_data.width = element.clientWidth; + view_data.height = element.clientHeight; + } + select_node(node) { + if (!!this.selected_node) { + this.selected_node._data.view.element.className = + this.selected_node._data.view.element.className.replace(/\s*selected\b/i, ''); + this.reset_node_custom_style(this.selected_node); + } + if (!!node) { + this.selected_node = node; + node._data.view.element.className += ' selected'; + this.clear_node_custom_style(node); + } + } + select_clear() { + this.select_node(null); + } + get_editing_node() { + return this.editing_node; + } + is_editing() { + return (!!this.editing_node); + } + edit_node_begin(node) { + if (!node.topic) { + logger.warn("don't edit image nodes"); + return; + } + if (this.editing_node != null) { + this.edit_node_end(); + } + this.editing_node = node; + var view_data = node._data.view; + var element = view_data.element; + var topic = node.topic; + var ncs = getComputedStyle(element); + this.e_editor.value = topic; + this.e_editor.style.width = (element.clientWidth - parseInt(ncs.getPropertyValue('padding-left')) - parseInt(ncs.getPropertyValue('padding-right'))) + 'px'; + element.innerHTML = ''; + element.appendChild(this.e_editor); + element.style.zIndex = 5; + this.e_editor.focus(); + this.e_editor.select(); + } + edit_node_end() { + if (this.editing_node != null) { + var node = this.editing_node; + this.editing_node = null; + var view_data = node._data.view; + var element = view_data.element; + var topic = this.e_editor.value; + element.style.zIndex = 'auto'; + element.removeChild(this.e_editor); + if (util.text.is_empty(topic) || node.topic === topic) { + if (this.opts.support_html) { + $.h(element, node.topic); + } else { + $.t(element, node.topic); + } + } else { + this.jm.update_node(node.id, topic); + } + } + this.e_panel.focus(); + } + get_view_offset() { + var bounds = this.layout.bounds; + var _x = (this.size.w - bounds.e - bounds.w) / 2; + var _y = this.size.h / 2; + return { x: _x, y: _y }; + } + resize() { + this.graph.set_size(1, 1); + this.e_nodes.style.width = '1px'; + this.e_nodes.style.height = '1px'; + + this.expand_size(); + this._show(); + } + _show() { + this.graph.set_size(this.size.w, this.size.h); + this.e_nodes.style.width = this.size.w + 'px'; + this.e_nodes.style.height = this.size.h + 'px'; + this.show_nodes(); + this.show_lines(); + //this.layout.cache_valid = true; + this.jm.invoke_event_handle(EventType.resize, { data: [] }); + } + zoomIn() { + return this.setZoom(this.actualZoom + this.zoomStep); + } + zoomOut() { + return this.setZoom(this.actualZoom - this.zoomStep); + } + setZoom(zoom) { + if ((zoom < this.minZoom) || (zoom > this.maxZoom)) { + return false; + } + this.actualZoom = zoom; + for (var i = 0; i < this.e_panel.children.length; i++) { + this.e_panel.children[i].style.transform = 'scale(' + zoom + ')'; + }; + this.show(true); + return true; + + } + _center_root() { + // center root node + var outer_w = this.e_panel.clientWidth; + var outer_h = this.e_panel.clientHeight; + if (this.size.w > outer_w) { + var _offset = this.get_view_offset(); + this.e_panel.scrollLeft = _offset.x - outer_w / 2; + } + if (this.size.h > outer_h) { + this.e_panel.scrollTop = (this.size.h - outer_h) / 2; + } + } + show(keep_center) { + logger.debug('view.show'); + this.expand_size(); + this._show(); + if (!!keep_center) { + this._center_root(); + } + } + relayout() { + this.expand_size(); + this._show(); + } + save_location(node) { + var vd = node._data.view; + vd._saved_location = { + x: parseInt(vd.element.style.left) - this.e_panel.scrollLeft, + y: parseInt(vd.element.style.top) - this.e_panel.scrollTop, + }; + } + restore_location(node) { + var vd = node._data.view; + this.e_panel.scrollLeft = parseInt(vd.element.style.left) - vd._saved_location.x; + this.e_panel.scrollTop = parseInt(vd.element.style.top) - vd._saved_location.y; + } + clear_nodes() { + var mind = this.jm.mind; + if (mind == null) { + return; + } + var nodes = mind.nodes; + var node = null; + for (var nodeid in nodes) { + node = nodes[nodeid]; + node._data.view.element = null; + node._data.view.expander = null; + } + this.e_nodes.innerHTML = ''; + } + show_nodes() { + var nodes = this.jm.mind.nodes; + var node = null; + var node_element = null; + var expander = null; + var p = null; + var p_expander = null; + var expander_text = '-'; + var view_data = null; + var _offset = this.get_view_offset(); + for (var nodeid in nodes) { + node = nodes[nodeid]; + view_data = node._data.view; + node_element = view_data.element; + expander = view_data.expander; + if (!this.layout.is_visible(node)) { + node_element.style.display = 'none'; + expander.style.display = 'none'; + continue; + } + this.reset_node_custom_style(node); + p = this.layout.get_node_point(node); + view_data.abs_x = _offset.x + p.x; + view_data.abs_y = _offset.y + p.y; + node_element.style.left = (_offset.x + p.x) + 'px'; + node_element.style.top = (_offset.y + p.y) + 'px'; + node_element.style.display = ''; + node_element.style.visibility = 'visible'; + if (!node.isroot && node.children.length > 0) { + expander_text = node.expanded ? '-' : '+'; + p_expander = this.layout.get_expander_point(node); + expander.style.left = (_offset.x + p_expander.x) + 'px'; + expander.style.top = (_offset.y + p_expander.y) + 'px'; + expander.style.display = ''; + expander.style.visibility = 'visible'; + $.t(expander, expander_text); + } + // hide expander while all children have been removed + if (!node.isroot && node.children.length == 0) { + expander.style.display = 'none'; + expander.style.visibility = 'hidden'; + } + } + } + reset_node_custom_style(node) { + this._reset_node_custom_style(node._data.view.element, node.data); + } + _reset_node_custom_style(node_element, node_data) { + if ('background-color' in node_data) { + node_element.style.backgroundColor = node_data['background-color']; + } + if ('foreground-color' in node_data) { + node_element.style.color = node_data['foreground-color']; + } + if ('width' in node_data) { + node_element.style.width = node_data['width'] + 'px'; + } + if ('height' in node_data) { + node_element.style.height = node_data['height'] + 'px'; + } + if ('font-size' in node_data) { + node_element.style.fontSize = node_data['font-size'] + 'px'; + } + if ('font-weight' in node_data) { + node_element.style.fontWeight = node_data['font-weight']; + } + if ('font-style' in node_data) { + node_element.style.fontStyle = node_data['font-style']; + } + if ('background-image' in node_data) { + var backgroundImage = node_data['background-image']; + if (backgroundImage.startsWith('data') && node_data['width'] && node_data['height']) { + var img = new Image(); + + img.onload = function () { + var c = $.c('canvas'); + c.width = node_element.clientWidth; + c.height = node_element.clientHeight; + var img = this; + if (c.getContext) { + var ctx = c.getContext('2d'); + ctx.drawImage(img, 2, 2, node_element.clientWidth, node_element.clientHeight); + var scaledImageData = c.toDataURL(); + node_element.style.backgroundImage = 'url(' + scaledImageData + ')'; + } + }; + img.src = backgroundImage; + + } else { + node_element.style.backgroundImage = 'url(' + backgroundImage + ')'; + } + node_element.style.backgroundSize = '99%'; + + if ('background-rotation' in node_data) { + node_element.style.transform = 'rotate(' + node_data['background-rotation'] + 'deg)'; + } + } + } + clear_node_custom_style(node) { + var node_element = node._data.view.element; + node_element.style.backgroundColor = ""; + node_element.style.color = ""; + } + clear_lines() { + this.graph.clear(); + } + show_lines() { + this.clear_lines(); + var nodes = this.jm.mind.nodes; + var node = null; + var pin = null; + var pout = null; + var _offset = this.get_view_offset(); + for (var nodeid in nodes) { + node = nodes[nodeid]; + if (!!node.isroot) { continue; } + if (('visible' in node._data.layout) && !node._data.layout.visible) { continue; } + pin = this.layout.get_node_point_in(node); + pout = this.layout.get_node_point_out(node.parent); + this.graph.draw_line(pout, pin, _offset); + } + } + // Drag the whole mind map with your mouse, when it's larger that the container + enable_draggable_canvas() { + // If draggable option is true. + if (this.opts.draggable) { + // Dragging disabled by default. + let dragging = false; + let x, y; + if (this.opts.hide_scrollbars_when_draggable) { + // Avoid scrollbars when mind map is larger than the container (e_panel = id jsmind-inner) + this.e_panel.style = 'overflow: hidden'; + } + // Move the whole mind map with mouse moves, while button is down. + $.on(this.container, 'mousedown', (eventDown) => { + dragging = true; + // Record current mouse position. + x = eventDown.clientX; + y = eventDown.clientY; + }); + // Stop moving mind map once mouse button is released. + $.on(this.container, 'mouseup', () => { + dragging = false; + }); + // Follow current mouse position and move mind map accordingly. + $.on(this.container, 'mousemove', (eventMove) => { + if (dragging) { + this.e_panel.scrollBy(x - eventMove.clientX, y - eventMove.clientY); + // Record new current position. + x = eventMove.clientX; + y = eventMove.clientY; + } + }); + } + } +} + + diff --git a/src/plugins/jsmind.draggable.js b/src/plugins/jsmind.draggable.js new file mode 100644 index 00000000..70761dd6 --- /dev/null +++ b/src/plugins/jsmind.draggable.js @@ -0,0 +1,330 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +if (!jsMind) { throw new Error('jsMind is not defined'); } + +const jm = jsMind; +const $ = jm.$; + +const clear_selection = 'getSelection' in $.w ? function () { + $.w.getSelection().removeAllRanges(); +} : function () { + $.d.selection.empty(); +}; + +const options = { + line_width: 5, + lookup_delay: 500, + lookup_interval: 80 +}; + +class draggable { + constructor(jm) { + this.jm = jm; + this.e_canvas = null; + this.canvas_ctx = null; + this.shadow = null; + this.shadow_w = 0; + this.shadow_h = 0; + this.active_node = null; + this.target_node = null; + this.target_direct = null; + this.client_w = 0; + this.client_h = 0; + this.offset_x = 0; + this.offset_y = 0; + this.hlookup_delay = 0; + this.hlookup_timer = 0; + this.capture = false; + this.moved = false; + } + init() { + this._create_canvas(); + this._create_shadow(); + this._event_bind(); + } + resize() { + this.jm.view.e_nodes.appendChild(this.shadow); + this.e_canvas.width = this.jm.view.size.w; + this.e_canvas.height = this.jm.view.size.h; + } + _create_canvas() { + var c = $.c('canvas'); + this.jm.view.e_panel.appendChild(c); + var ctx = c.getContext('2d'); + this.e_canvas = c; + this.canvas_ctx = ctx; + } + _create_shadow() { + var s = $.c('jmnode'); + s.style.visibility = 'hidden'; + s.style.zIndex = '3'; + s.style.cursor = 'move'; + s.style.opacity = '0.7'; + this.shadow = s; + } + reset_shadow(el) { + var s = this.shadow.style; + this.shadow.innerHTML = el.innerHTML; + s.left = el.style.left; + s.top = el.style.top; + s.width = el.style.width; + s.height = el.style.height; + s.backgroundImage = el.style.backgroundImage; + s.backgroundSize = el.style.backgroundSize; + s.transform = el.style.transform; + this.shadow_w = this.shadow.clientWidth; + this.shadow_h = this.shadow.clientHeight; + + } + show_shadow() { + if (!this.moved) { + this.shadow.style.visibility = 'visible'; + } + } + hide_shadow() { + this.shadow.style.visibility = 'hidden'; + } + _magnet_shadow(node) { + if (!!node) { + this.canvas_ctx.lineWidth = options.line_width; + this.canvas_ctx.strokeStyle = 'rgba(0,0,0,0.3)'; + this.canvas_ctx.lineCap = 'round'; + this._clear_lines(); + this._canvas_lineto(node.sp.x, node.sp.y, node.np.x, node.np.y); + } + } + _clear_lines() { + this.canvas_ctx.clearRect(0, 0, this.jm.view.size.w, this.jm.view.size.h); + } + _canvas_lineto(x1, y1, x2, y2) { + this.canvas_ctx.beginPath(); + this.canvas_ctx.moveTo(x1, y1); + this.canvas_ctx.lineTo(x2, y2); + this.canvas_ctx.stroke(); + } + _lookup_close_node() { + var root = this.jm.get_root(); + var root_location = root.get_location(); + var root_size = root.get_size(); + var root_x = root_location.x + root_size.w / 2; + + var sw = this.shadow_w; + var sh = this.shadow_h; + var sx = this.shadow.offsetLeft; + var sy = this.shadow.offsetTop; + + var ns, nl; + + var direct = (sx + sw / 2) >= root_x ? + jsMind.direction.right : jsMind.direction.left; + var nodes = this.jm.mind.nodes; + var node = null; + var layout = this.jm.layout; + var min_distance = Number.MAX_VALUE; + var distance = 0; + var closest_node = null; + var closest_p = null; + var shadow_p = null; + for (var nodeid in nodes) { + var np, sp; + node = nodes[nodeid]; + if (node.isroot || node.direction == direct) { + if (node.id == this.active_node.id) { + continue; + } + if (!layout.is_visible(node)) { + continue; + } + ns = node.get_size(); + nl = node.get_location(); + if (direct == jsMind.direction.right) { + if (sx - nl.x - ns.w <= 0) { continue; } + distance = Math.abs(sx - nl.x - ns.w) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2); + np = { x: nl.x + ns.w - options.line_width, y: nl.y + ns.h / 2 }; + sp = { x: sx + options.line_width, y: sy + sh / 2 }; + } else { + if (nl.x - sx - sw <= 0) { continue; } + distance = Math.abs(sx + sw - nl.x) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2); + np = { x: nl.x + options.line_width, y: nl.y + ns.h / 2 }; + sp = { x: sx + sw - options.line_width, y: sy + sh / 2 }; + } + if (distance < min_distance) { + closest_node = node; + closest_p = np; + shadow_p = sp; + min_distance = distance; + } + } + } + var result_node = null; + if (!!closest_node) { + result_node = { + node: closest_node, + direction: direct, + sp: shadow_p, + np: closest_p + }; + } + return result_node; + } + lookup_close_node() { + var node_data = this._lookup_close_node(); + if (!!node_data) { + this._magnet_shadow(node_data); + this.target_node = node_data.node; + this.target_direct = node_data.direction; + } + } + _event_bind() { + var jd = this; + var container = this.jm.view.container; + $.on(container, 'mousedown', function (e) { + var evt = e || event; + jd.dragstart.call(jd, evt); + }); + $.on(container, 'mousemove', function (e) { + var evt = e || event; + jd.drag.call(jd, evt); + }); + $.on(container, 'mouseup', function (e) { + var evt = e || event; + jd.dragend.call(jd, evt); + }); + $.on(container, 'touchstart', function (e) { + var evt = e || event; + jd.dragstart.call(jd, evt); + }); + $.on(container, 'touchmove', function (e) { + var evt = e || event; + jd.drag.call(jd, evt); + }); + $.on(container, 'touchend', function (e) { + var evt = e || event; + jd.dragend.call(jd, evt); + }); + } + dragstart(e) { + if (!this.jm.get_editable()) { return; } + if (this.capture) { return; } + this.active_node = null; + + var jview = this.jm.view; + var el = e.target || event.srcElement; + if (el.tagName.toLowerCase() != 'jmnode') { return; } + var nodeid = jview.get_binded_nodeid(el); + if (!!nodeid) { + var node = this.jm.get_node(nodeid); + if (!node.isroot) { + this.reset_shadow(el); + this.active_node = node; + this.offset_x = (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft; + this.offset_y = (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop; + this.client_hw = Math.floor(el.clientWidth / 2); + this.client_hh = Math.floor(el.clientHeight / 2); + if (this.hlookup_delay != 0) { + $.w.clearTimeout(this.hlookup_delay); + } + if (this.hlookup_timer != 0) { + $.w.clearInterval(this.hlookup_timer); + } + var jd = this; + this.hlookup_delay = $.w.setTimeout(function () { + jd.hlookup_delay = 0; + jd.hlookup_timer = $.w.setInterval(function () { + jd.lookup_close_node.call(jd); + }, options.lookup_interval); + }, options.lookup_delay); + this.capture = true; + } + } + } + drag(e) { + if (!this.jm.get_editable()) { return; } + if (this.capture) { + e.preventDefault(); + this.show_shadow(); + this.moved = true; + clear_selection(); + var jview = this.jm.view; + var px = (e.clientX || e.touches[0].clientX) / jview.actualZoom - this.offset_x; + var py = (e.clientY || e.touches[0].clientY) / jview.actualZoom - this.offset_y; + this.shadow.style.left = px + 'px'; + this.shadow.style.top = py + 'px'; + clear_selection(); + } + } + dragend(e) { + if (!this.jm.get_editable()) { return; } + if (this.capture) { + if (this.hlookup_delay != 0) { + $.w.clearTimeout(this.hlookup_delay); + this.hlookup_delay = 0; + this._clear_lines(); + } + if (this.hlookup_timer != 0) { + $.w.clearInterval(this.hlookup_timer); + this.hlookup_timer = 0; + this._clear_lines(); + } + if (this.moved) { + var src_node = this.active_node; + var target_node = this.target_node; + var target_direct = this.target_direct; + this.move_node(src_node, target_node, target_direct); + } + this.hide_shadow(); + } + this.moved = false; + this.capture = false; + } + move_node(src_node, target_node, target_direct) { + var shadow_h = this.shadow.offsetTop; + if (!!target_node && !!src_node && !jsMind.node.inherited(src_node, target_node)) { + // lookup before_node + var sibling_nodes = target_node.children; + var sc = sibling_nodes.length; + var node = null; + var delta_y = Number.MAX_VALUE; + var node_before = null; + var beforeid = '_last_'; + while (sc--) { + node = sibling_nodes[sc]; + if (node.direction == target_direct && node.id != src_node.id) { + var dy = node.get_location().y - shadow_h; + if (dy > 0 && dy < delta_y) { + delta_y = dy; + node_before = node; + beforeid = '_first_'; + } + } + } + if (!!node_before) { beforeid = node_before.id; } + this.jm.move_node(src_node.id, beforeid, target_node.id, target_direct); + } + this.active_node = null; + this.target_node = null; + this.target_direct = null; + } + jm_event_handle(type, data) { + if (type === jsMind.event_type.resize) { + this.resize(); + } + } +} + + +var draggable_plugin = new jm.plugin('draggable', function (jm) { + var jd = new draggable(jm); + jd.init(); + jm.add_event_listener(function (type, data) { + jd.jm_event_handle.call(jd, type, data); + }); +}); + +jsMind.register_plugin(draggable_plugin); diff --git a/src/plugins/jsmind.screenshot.js b/src/plugins/jsmind.screenshot.js new file mode 100644 index 00000000..55516f26 --- /dev/null +++ b/src/plugins/jsmind.screenshot.js @@ -0,0 +1,330 @@ +/** + * @license BSD + * @copyright 2014-2022 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + + +if (!jsMind) { throw new Error('jsMind is not defined'); } + +const $ = jsMind.$; + +var css = function (cStyle, property_name) { + return cStyle.getPropertyValue(property_name); +}; +var is_visible = function (cStyle) { + var visibility = css(cStyle, 'visibility'); + var display = css(cStyle, 'display'); + return (visibility !== 'hidden' && display !== 'none'); +}; +var jcanvas = {}; +jcanvas.rect = function (ctx, x, y, w, h, r) { + if (w < 2 * r) r = w / 2; + if (h < 2 * r) r = h / 2; + ctx.moveTo(x + r, y); + ctx.arcTo(x + w, y, x + w, y + h, r); + ctx.arcTo(x + w, y + h, x, y + h, r); + ctx.arcTo(x, y + h, x, y, r); + ctx.arcTo(x, y, x + w, y, r); +}; + +jcanvas.text_multiline = function (ctx, text, x, y, w, h, lineheight) { + var line = ''; + var text_len = text.length; + var chars = text.split(''); + var test_line = null; + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + for (var i = 0; i < text_len; i++) { + test_line = line + chars[i]; + if (ctx.measureText(test_line).width > w && i > 0) { + ctx.fillText(line, x, y); + line = chars[i]; + y += lineheight; + } else { + line = test_line; + } + } + ctx.fillText(line, x, y); +}; + +jcanvas.text_ellipsis = function (ctx, text, x, y, w, h) { + var center_y = y + h / 2; + var text = jcanvas.fittingString(ctx, text, w); + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + ctx.fillText(text, x, center_y, w); +}; + +jcanvas.fittingString = function (ctx, text, max_width) { + var width = ctx.measureText(text).width; + var ellipsis = '…'; + var ellipsis_width = ctx.measureText(ellipsis).width; + if (width <= max_width || width <= ellipsis_width) { + return text; + } else { + var len = text.length; + while (width >= max_width - ellipsis_width && len-- > 0) { + text = text.substring(0, len); + width = ctx.measureText(text).width; + } + return text + ellipsis; + } +}; + +jcanvas.image = function (ctx, url, x, y, w, h, r, rotation, callback) { + var img = new Image(); + img.onload = function () { + ctx.save(); + ctx.translate(x, y); + ctx.save(); + ctx.beginPath(); + jcanvas.rect(ctx, 0, 0, w, h, r); + ctx.closePath(); + ctx.clip(); + ctx.translate(w / 2, h / 2); + ctx.rotate(rotation * Math.PI / 180); + ctx.drawImage(img, -w / 2, -h / 2); + ctx.restore(); + ctx.restore(); + !!callback && callback(); + } + img.src = url; +}; + +class screenshot { + constructor(jm) { + this.jm = jm; + this.canvas_elem = null; + this.canvas_ctx = null; + this._inited = false; + } + init() { + if (this._inited) { return; } + console.log('init'); + var c = $.c('canvas'); + var ctx = c.getContext('2d'); + + this.canvas_elem = c; + this.canvas_ctx = ctx; + this.jm.view.e_panel.appendChild(c); + this._inited = true; + this.resize(); + } + shoot(callback) { + this.init(); + this._draw(function () { + !!callback && callback(); + this.clean(); + }.bind(this)); + this._watermark(); + } + shootDownload() { + this.shoot(function () { + this._download(); + }.bind(this)); + } + shootAsDataURL(callback) { + this.shoot(function () { + !!callback && callback(this.canvas_elem.toDataURL()); + }.bind(this)); + } + resize() { + if (this._inited) { + this.canvas_elem.width = this.jm.view.size.w; + this.canvas_elem.height = this.jm.view.size.h; + } + } + clean() { + var c = this.canvas_elem; + this.canvas_ctx.clearRect(0, 0, c.width, c.height); + } + _draw(callback) { + var ctx = this.canvas_ctx; + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + this._draw_lines(function () { + this._draw_nodes(callback); + }.bind(this)); + } + _watermark() { + var c = this.canvas_elem; + var ctx = this.canvas_ctx; + ctx.textAlign = 'right'; + ctx.textBaseline = 'bottom'; + ctx.fillStyle = '#000'; + ctx.font = '11px Verdana,Arial,Helvetica,sans-serif'; + ctx.fillText('hizzgdev.github.io/jsmind', c.width - 5.5, c.height - 2.5); + ctx.textAlign = 'left'; + ctx.fillText($.w.location, 5.5, c.height - 2.5); + } + _draw_lines(callback) { + this.jm.view.graph.copy_to(this.canvas_ctx, callback); + } + _draw_nodes(callback) { + var nodes = this.jm.mind.nodes; + var node; + for (var nodeid in nodes) { + node = nodes[nodeid]; + this._draw_node(node); + } + + function check_nodes_ready() { + console.log('check_node_ready' + new Date()); + var allOk = true; + for (var nodeid in nodes) { + node = nodes[nodeid]; + allOk = allOk & node.ready; + } + + if (!allOk) { + $.w.setTimeout(check_nodes_ready, 200); + } else { + $.w.setTimeout(callback, 200); + } + } + check_nodes_ready(); + } + _draw_node(node) { + var ctx = this.canvas_ctx; + var view_data = node._data.view; + var node_element = view_data.element; + var ncs = getComputedStyle(node_element); + if (!is_visible(ncs)) { + node.ready = true; + return; + } + + var bgcolor = css(ncs, 'background-color'); + var round_radius = parseInt(css(ncs, 'border-top-left-radius')); + var color = css(ncs, 'color'); + var padding_left = parseInt(css(ncs, 'padding-left')); + var padding_right = parseInt(css(ncs, 'padding-right')); + var padding_top = parseInt(css(ncs, 'padding-top')); + var padding_bottom = parseInt(css(ncs, 'padding-bottom')); + var text_overflow = css(ncs, 'text-overflow'); + var font = css(ncs, 'font-style') + ' ' + + css(ncs, 'font-variant') + ' ' + + css(ncs, 'font-weight') + ' ' + + css(ncs, 'font-size') + '/' + css(ncs, 'line-height') + ' ' + + css(ncs, 'font-family'); + + var rb = { + x: view_data.abs_x, + y: view_data.abs_y, + w: view_data.width + 1, + h: view_data.height + 1 + }; + var tb = { + x: rb.x + padding_left, + y: rb.y + padding_top, + w: rb.w - padding_left - padding_right, + h: rb.h - padding_top - padding_bottom + }; + + ctx.font = font; + ctx.fillStyle = bgcolor; + ctx.beginPath(); + jcanvas.rect(ctx, rb.x, rb.y, rb.w, rb.h, round_radius); + ctx.closePath(); + ctx.fill(); + + ctx.fillStyle = color; + if ('background-image' in node.data) { + var backgroundUrl = css(ncs, 'background-image').slice(5, -2); + node.ready = false; + var rotation = 0; + if ('background-rotation' in node.data) { + rotation = node.data['background-rotation']; + } + jcanvas.image(ctx, backgroundUrl, rb.x, rb.y, rb.w, rb.h, round_radius, rotation, + function () { + node.ready = true; + }); + } + if (!!node.topic) { + if (text_overflow === 'ellipsis') { + jcanvas.text_ellipsis(ctx, node.topic, tb.x, tb.y, tb.w, tb.h); + } else { + var line_height = parseInt(css(ncs, 'line-height')); + jcanvas.text_multiline(ctx, node.topic, tb.x, tb.y, tb.w, tb.h, line_height); + } + } + if (!!view_data.expander) { + this._draw_expander(view_data.expander); + } + if (!('background-image' in node.data)) { + node.ready = true; + } + } + _draw_expander(expander) { + var ctx = this.canvas_ctx; + var ncs = getComputedStyle(expander); + if (!is_visible(ncs)) { return; } + + var style_left = css(ncs, 'left'); + var style_top = css(ncs, 'top'); + var font = css(ncs, 'font'); + var left = parseInt(style_left); + var top = parseInt(style_top); + var is_plus = expander.innerHTML === '+'; + + ctx.lineWidth = 1; + + ctx.beginPath(); + ctx.arc(left + 7, top + 7, 5, 0, Math.PI * 2, true); + ctx.moveTo(left + 10, top + 7); + ctx.lineTo(left + 4, top + 7); + if (is_plus) { + ctx.moveTo(left + 7, top + 4); + ctx.lineTo(left + 7, top + 10); + } + ctx.closePath(); + ctx.stroke(); + } + _download() { + var c = this.canvas_elem; + var name = this.jm.mind.name + '.png'; + + if (navigator.msSaveBlob && (!!c.msToBlob)) { + var blob = c.msToBlob(); + navigator.msSaveBlob(blob, name); + } else { + var bloburl = this.canvas_elem.toDataURL(); + var anchor = $.c('a'); + if ('download' in anchor) { + anchor.style.visibility = 'hidden'; + anchor.href = bloburl; + anchor.download = name; + $.d.body.appendChild(anchor); + var evt = $.d.createEvent('MouseEvents'); + evt.initEvent('click', true, true); + anchor.dispatchEvent(evt); + $.d.body.removeChild(anchor); + } else { + location.href = bloburl; + } + } + } + jm_event_handle(type, data) { + if (type === jsMind.event_type.resize) { + this.resize(); + } + } +} + + +var screenshot_plugin = new jsMind.plugin('screenshot', function (jm) { + var jss = new screenshot(jm); + jm.screenshot = jss; + jm.shoot = function () { + jss.shoot(); + }; + jm.add_event_listener(function (type, data) { + jss.jm_event_handle.call(jss, type, data); + }); +}); + +jsMind.register_plugin(screenshot_plugin); From 33cefa13be1fcf5244632b358f9d3bbe7a220782 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Mon, 6 Jun 2022 00:52:37 +0800 Subject: [PATCH 036/274] update README --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index e2b3ca72..343297fe 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,12 @@ jsMind 是一个显示/编辑思维导图的纯 javascript 类库,其基于 ht jsMind is a pure javascript library for mindmap, it base on html5 canvas and svg. jsMind was released under BSD license, you can embed it in any project, if only you observe the license. You can read [the BSD license agreement for jsMind in English and Chinese version][3] here. +ES6 Pilot Version: +* 目前处于测试阶段,欢迎试用找bug +* ES6 代码位于 `/src` +* 可运行于浏览器的 js 文件位于 `/es6` +* Demo + Links: * App : From 960d345aa99c937926dc34230eb305c920345c46 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Mon, 6 Jun 2022 02:49:00 +0800 Subject: [PATCH 037/274] enable test on both es5 & es6 --- es6/jsmind.js | 2 +- es6/jsmind.js.map | 2 +- package.json | 2 +- rollup.config.js | 2 +- src/jsmind.js | 5 +++-- src/jsmind.node.js | 5 +++-- tests/jsmind.mind.test.js | 2 +- tests/jsmind.node.test.js | 2 +- tests/jsmind.versions.js | 7 +++++++ 9 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 tests/jsmind.versions.js diff --git a/es6/jsmind.js b/es6/jsmind.js index 51b865e6..430dff31 100644 --- a/es6/jsmind.js +++ b/es6/jsmind.js @@ -5,5 +5,5 @@ * Project Home: * https://github.com/hizzgdev/jsmind/ */ -var jsMind=function(){"use strict";const e="0.4.9",t="hizzgdev@163.com";"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e){return this.slice(0,e.length)===e});var i=function(){};let n="undefined"==typeof console?{log:i,debug:i,error:i,warn:i,info:i}:console;const o={left:-1,center:0,right:1},s={show:1,resize:2,edit:3,select:4};const a=new class{constructor(e){this.w=e,this.d=e.document,this.g=function(e){return this.d.getElementById(e)},this.c=function(e){return this.d.createElement(e)},this.t=function(e,t){e.hasChildNodes()?e.firstChild.nodeValue=t:e.appendChild(this.d.createTextNode(t))},this.h=function(e,t){t instanceof HTMLElement?(e.innerHTML="",e.appendChild(t)):e.innerHTML=t},this.i=function(e){return!!e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument},this.on=function(e,t,i){e.addEventListener?e.addEventListener(t,i,!1):e.attachEvent("on"+t,i)}}}(window),r={ajax:{_xhr:function(){var e=null;if(window.XMLHttpRequest)e=new XMLHttpRequest;else try{e=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}return e},_eurl:function(e){return encodeURIComponent(e)},request:function(e,t,i,o,s){var a=r.ajax,d=null,l=[];for(var h in t)l.push(a._eurl(h)+"="+a._eurl(t[h]));l.length>0&&(d=l.join("&"));var _=a._xhr();_&&(_.onreadystatechange=function(){if(4==_.readyState)if(200==_.status||0==_.status){if("function"==typeof o){var e=r.json.string2json(_.responseText);o(null!=e?e:_.responseText)}}else"function"==typeof s?s(_):n.error("xhr request failed.",_)},i=i||"GET",_.open(i,e,!0),_.setRequestHeader("If-Modified-Since","0"),"POST"==i?(_.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),_.send(d)):_.send())},get:function(e,t){return r.ajax.request(e,{},"GET",t)},post:function(e,t,i){return r.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof a.w.Blob)n=new Blob([e],{type:t});else{var o=new(a.w.BlobBuilder||a.w.MozBlobBuilder||a.w.WebKitBlobBuilder||a.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(a.w.URL||a.w.webkitURL).createObjectURL(n),r=a.c("a");if("download"in r){r.style.visibility="hidden",r.href=s,r.download=i,a.d.body.appendChild(r);var d=a.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),r.dispatchEvent(d),a.d.body.removeChild(r)}else location.href=s}}},json:{json2string:function(e){if(JSON)try{return JSON.stringify(e)}catch(e){return n.warn(e),n.warn("can not convert to string"),null}},string2json:function(e){if(JSON)try{return JSON.parse(e)}catch(e){return n.warn(e),n.warn("can not parse to json"),null}},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:r.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substr(2)).substr(2,16)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},d={container:"",editable:!1,theme:null,mode:"full",support_html:!0,view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:45,addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class l{constructor(e,t,i,n,o,s,a,r){e?"number"==typeof t?(void 0===r&&(r=!0),this.id=e,this.index=t,this.topic=i,this.data=n||{},this.isroot=o,this.parent=s,this.direction=a,this.expanded=!!r,this.children=[],this._data={}):jm.logger.error("invalid node index"):jm.logger.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?"Up":"Down")?this.view.zoomIn():this.view.zoomOut())}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;r=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?"Up":"Down")?this.view.zoomIn():this.view.zoomOut())}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;r= 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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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\n","/**\n * @license BSD\n * @copyright 2014-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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(nodeid, node_index, topic, data, false, parent_node, parent_node.direction, expanded);\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._reindex(parent_node);\n } else {\n logger.error('fail, the nodeid \\'' + node.id + '\\' has been already exist.');\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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) { return null; }\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, nodeid, 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, nodeid, 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) { return null; }\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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = (!!beforeid) ? this.get_node(beforeid) : null;\n if (node_before != null && node_before.parent != null && node_before.parent.id == node.parent.id) {\n node.index = node_before.index - 0.5;\n this._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn('the nodeid \\'' + node.id + '\\' has been already exist.');\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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\n","/**\n * @license BSD\n * @copyright 2014-2022 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\";\n\nexport const format = {\n node_tree: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_tree simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_tree\",\n \"data\": { \"id\": \"root\", \"topic\": \"jsMind 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._buildnode(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 (k == 'id' || k == 'topic' || k == 'children' || k == 'direction' || k == 'expanded') {\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(node_parent, node_json.id, node_json.topic, data, d, node_json.expanded);\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 _buildnode: function (node) {\n var df = format.node_tree;\n if (!(node instanceof Node)) { return; }\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._buildnode(children[i]));\n }\n }\n return o;\n }\n },\n\n node_array: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_array simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_array\",\n \"data\": [\n { \"id\": \"root\", \"topic\": \"jsMind Example\", \"isroot\": true }\n ]\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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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(parent_node, node_json.id, node_json.topic, data, d, node_json.expanded);\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 (k == 'id' || k == 'topic' || k == 'parentid' || k == 'isroot' || k == 'direction' || k == 'expanded') {\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)) { return; }\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\": {\n \"name\": 'jsMind freemind example',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"freemind\",\n \"data\": \"\"\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 { // 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 // 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 = ('expanded' in node_data) ? (node_data.expanded == 'true') : true;\n delete node_data.expanded;\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(parent_node, node_id, node_topic, node_data, node_direction, node_expanded);\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n }\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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++) { if (children[i].direction === Direction.left) { r--; } else { r++; } }\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 layout_data.outer_height = node_outer_height;\n layout_data.offset_y = base_y - node_outer_height / 2;\n layout_data.offset_x = this.opts.hspace * layout_data.direction + 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\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 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 = 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 nodeid in nodes) {\n node = nodes[nodeid];\n pout = this.get_node_point_out(node);\n if (pout.x > this.bounds.e) { this.bounds.e = pout.x; }\n if (pout.x < this.bounds.w) { this.bounds.w = pout.x; }\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, { evt: 'expand_node', data: [], node: node.id });\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, { evt: 'collapse_node', data: [], node: node.id });\n }\n expand_all() {\n var nodes = this.jm.mind.nodes;\n var c = 0;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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) { return; }\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(root_layout_data.right_nodes);\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n } else {\n if (node._data.layout.direction == Direction.right) {\n root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes);\n } else {\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n }\n }\n this.bounds.s = Math.max(root_layout_data.outer_height_left, root_layout_data.outer_height_right);\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\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from \"./jsmind.dom.js\";\n\nclass graph_svg {\n constructor(view) {\n this.view = view;\n this.opts = view.opts;\n this.e_svg = graph_svg.c('svg');\n this.e_svg.setAttribute('class', 'jsmind');\n this.size = { w: 0, h: 0 };\n this.lines = [];\n }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = graph_svg.c('path');\n line.setAttribute('stroke', 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._bezier_to(line, 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 var img = new Image();\n img.onload = function () {\n dest_canvas_ctx.drawImage(img, 0, 0);\n !!callback && callback();\n };\n img.src = 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg));\n }\n _bezier_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M' + x1 + ' ' + y1 + ' C ' + (x1 + (x2 - x1) * 2 / 3) + ' ' + y1 + ', ' + x1 + ' ' + y2 + ', ' + x2 + ' ' + y2);\n }\n _line_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2);\n }\n}\n\n\nclass graph_canvas {\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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y);\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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 const graph = { svg: graph_svg, canvas: graph_canvas };\n","/**\n * @license BSD\n * @copyright 2014-2022 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 { 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 }\n init() {\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.e_panel = $.c('div');\n this.e_nodes = $.c('jmnodes');\n this.e_editor = $.c('input');\n\n this.graph = this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this);\n\n this.e_panel.className = 'jsmind-inner';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\n\n var v = this;\n $.on(this.e_editor, 'keydown', function (e) {\n var evt = e || event;\n if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); }\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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) { client_w = min_width; }\n if (client_h < min_height) { client_h = min_height; }\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\n }\n select_node(node) {\n if (!!this.selected_node) {\n this.selected_node._data.view.element.className =\n this.selected_node._data.view.element.className.replace(/\\s*selected\\b/i, '');\n this.reset_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_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 = (element.clientWidth - parseInt(ncs.getPropertyValue('padding-left')) - parseInt(ncs.getPropertyValue('padding-right'))) + '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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if ((zoom < this.minZoom) || (zoom > this.maxZoom)) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n };\n this.show(true);\n return true;\n\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = (_offset.x + p.x) + 'px';\n node_element.style.top = (_offset.y + p.y) + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = (_offset.x + p_expander.x) + 'px';\n expander.style.top = (_offset.y + p_expander.y) + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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(img, 2, 2, node_element.clientWidth, node_element.clientHeight);\n var scaledImageData = c.toDataURL();\n node_element.style.backgroundImage = 'url(' + scaledImageData + ')';\n }\n };\n img.src = backgroundImage;\n\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 = 'rotate(' + node_data['background-rotation'] + 'deg)';\n }\n }\n }\n clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) { continue; }\n if (('visible' in node._data.layout) && !node._data.layout.visible) { continue; }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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) { e.preventDefault(); } //prevent tab to change focus in browser\n if (this.jm.view.is_editing()) { return; }\n var evt = e || event;\n if (!this.opts.enable) { return true; }\n var kc = evt.keyCode + (evt.metaKey << 13) + (evt.ctrlKey << 12) + (evt.altKey << 11) + (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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 }\n else if (selected_node.direction === d) {\n var children = selected_node.children;\n var childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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\n","/**\n * @license BSD\n * @copyright 2014-2022 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('plugin ' + plugin + ' is not a supported plugin')\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } from \"./jsmind.common.js\";\nimport { merge_option } from \"./jsmind.option.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\n\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\n this.init();\n }\n\n init() {\n if (!!this.initialized) { return; }\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n // call enable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // call disable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n get_editable() {\n return this.options.editable;\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, \"mousewheel\", this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(event) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n if (!this.options.default_event_handle[\"enable_mousewheel_handle\"] || !window.event.ctrlKey) {\n return;\n }\n // Avoid default page scrolling behavior.\n event.preventDefault();\n\n var dir = event.deltaY > 0 ? \"Up\" : \"Down\";\n if (dir == \"Up\") {\n this.view.zoomIn();\n } else {\n this.view.zoomOut();\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) { return; }\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) { return; }\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) { return; }\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, { evt: 'add_node', data: [the_parent_node.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(the_node_before, nodeid, topic, data, direction);\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, { evt: 'insert_node_before', data: [the_node_before.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, { evt: 'insert_node_after', data: [the_node_after.id, nodeid, topic, data], node: nodeid });\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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, { evt: 'remove_node', data: [nodeid], node: parentid });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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, { evt: 'update_node', data: [nodeid, topic], node: nodeid });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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, { evt: 'move_node', data: [nodeid, beforeid, parentid, direction], node: nodeid });\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 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) { return null; }\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) { return null; }\n var n = null;\n if (node.parent.isroot) {\n var c = node.parent.children;\n var getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!node.data['background-image']) {\n logger.error('fail, only can change rotation angle of node with background image');\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jsMind = jm;\n// window.jsMind = jsMind;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","_xhr","xhr","XMLHttpRequest","ActiveXObject","_eurl","url","encodeURIComponent","request","param","method","callback","fail_callback","a","tmp_param","k","push","join","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","o","Object","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substr","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","jm","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","DataProvider","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","graph_svg","e_svg","setAttribute","size","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","graph","svg","canvas","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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","jsMind"],"mappings":"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"} \ No newline at end of file +{"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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nexport const __version__ = '0.4.9';\nexport const __author__ = 'hizzgdev@163.com';\n\nif (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (p) { return this.slice(0, p.length) === p; }; }\n\n// an noop function define\nvar _noop = function () { };\nexport let logger = (typeof console === 'undefined') ? {\n log: _noop, debug: _noop, error: _noop, warn: _noop, info: _noop\n} : console;\n\nexport const Direction = { left: -1, center: 0, right: 1 };\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 };","/**\n * @license BSD\n * @copyright 2014-2022 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) { return this.d.getElementById(id); };\n this.c = function (tag) { return this.d.createElement(tag); };\n this.t = function (n, t) { if (n.hasChildNodes()) { n.firstChild.nodeValue = t; } else { n.appendChild(this.d.createTextNode(t)); } };\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) { return !!el && (typeof el === 'object') && (el.nodeType === 1) && (typeof el.style === 'object') && (typeof el.ownerDocument === 'object'); };\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-2022 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\nexport const util = {\n ajax: {\n _xhr: function () {\n var xhr = null;\n if (window.XMLHttpRequest) {\n xhr = new XMLHttpRequest();\n } else {\n try {\n xhr = new ActiveXObject('Microsoft.XMLHTTP');\n } catch (e) { }\n }\n return xhr;\n },\n _eurl: function (url) {\n return encodeURIComponent(url);\n },\n request: function (url, param, method, callback, fail_callback) {\n var a = util.ajax;\n var p = null;\n var tmp_param = [];\n for (var k in param) {\n tmp_param.push(a._eurl(k) + '=' + a._eurl(param[k]));\n }\n if (tmp_param.length > 0) {\n p = tmp_param.join('&');\n }\n var xhr = a._xhr();\n if (!xhr) { return; }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status == 0) {\n if (typeof callback === 'function') {\n var data = util.json.string2json(xhr.responseText);\n if (data != null) {\n callback(data);\n } else {\n callback(xhr.responseText);\n }\n }\n } else {\n if (typeof fail_callback === 'function') {\n fail_callback(xhr);\n } else {\n logger.error('xhr request failed.', xhr);\n }\n }\n }\n }\n method = method || 'GET';\n xhr.open(method, url, true);\n xhr.setRequestHeader('If-Modified-Since', '0');\n if (method == 'POST') {\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');\n xhr.send(p);\n } else {\n xhr.send();\n }\n },\n get: function (url, callback) {\n return util.ajax.request(url, {}, 'GET', callback);\n },\n post: function (url, param, callback) {\n return util.ajax.request(url, param, 'POST', callback);\n }\n },\n\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 = $.w.BlobBuilder || $.w.MozBlobBuilder || $.w.WebKitBlobBuilder || $.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 bloburl = URL.createObjectURL(blob);\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\n }\n }\n }\n },\n\n json: {\n json2string: function (json) {\n if (!!JSON) {\n try {\n var json_str = JSON.stringify(json);\n return json_str;\n } catch (e) {\n logger.warn(e);\n logger.warn('can not convert to string');\n return null;\n }\n }\n },\n string2json: function (json_str) {\n if (!!JSON) {\n try {\n var json = JSON.parse(json_str);\n return json;\n } catch (e) {\n logger.warn(e);\n logger.warn('can not parse to json');\n return null;\n }\n }\n },\n merge: function (b, a) {\n for (var o in a) {\n if (o in b) {\n if (typeof b[o] === 'object' &&\n Object.prototype.toString.call(b[o]).toLowerCase() == '[object object]' &&\n !b[o].length) {\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 (new Date().getTime().toString(16) + Math.random().toString(16).substr(2)).substr(2, 16);\n }\n },\n\n text: {\n is_empty: function (s) {\n if (!s) { return true; }\n return s.replace(/\\s*/, '').length == 0;\n }\n }\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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\n view: {\n engine: 'canvas',\n hmargin: 100,\n vmargin: 50,\n line_width: 2,\n line_color: '#555',\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 },\n layout: {\n hspace: 30,\n vspace: 20,\n pspace: 13\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 },\n mapping: {\n addchild: 45, // Insert\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};\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-2022 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) { logger.error('invalid node id'); return; }\n if (typeof iIndex != 'number') { logger.error('invalid node index'); return; }\n if (typeof bExpanded === 'undefined') { bExpanded = true; }\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 alwary the last\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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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\n","/**\n * @license BSD\n * @copyright 2014-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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(nodeid, node_index, topic, data, false, parent_node, parent_node.direction, expanded);\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._reindex(parent_node);\n } else {\n logger.error('fail, the nodeid \\'' + node.id + '\\' has been already exist.');\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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) { return null; }\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, nodeid, 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, nodeid, 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) { return null; }\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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = (!!beforeid) ? this.get_node(beforeid) : null;\n if (node_before != null && node_before.parent != null && node_before.parent.id == node.parent.id) {\n node.index = node_before.index - 0.5;\n this._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn('the nodeid \\'' + node.id + '\\' has been already exist.');\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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\n","/**\n * @license BSD\n * @copyright 2014-2022 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\";\n\nexport const format = {\n node_tree: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_tree simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_tree\",\n \"data\": { \"id\": \"root\", \"topic\": \"jsMind 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._buildnode(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 (k == 'id' || k == 'topic' || k == 'children' || k == 'direction' || k == 'expanded') {\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(node_parent, node_json.id, node_json.topic, data, d, node_json.expanded);\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 _buildnode: function (node) {\n var df = format.node_tree;\n if (!(node instanceof Node)) { return; }\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._buildnode(children[i]));\n }\n }\n return o;\n }\n },\n\n node_array: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_array simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_array\",\n \"data\": [\n { \"id\": \"root\", \"topic\": \"jsMind Example\", \"isroot\": true }\n ]\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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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(parent_node, node_json.id, node_json.topic, data, d, node_json.expanded);\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 (k == 'id' || k == 'topic' || k == 'parentid' || k == 'isroot' || k == 'direction' || k == 'expanded') {\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)) { return; }\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\": {\n \"name\": 'jsMind freemind example',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"freemind\",\n \"data\": \"\"\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 { // 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 // 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 = ('expanded' in node_data) ? (node_data.expanded == 'true') : true;\n delete node_data.expanded;\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(parent_node, node_id, node_topic, node_data, node_direction, node_expanded);\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n }\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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++) { if (children[i].direction === Direction.left) { r--; } else { r++; } }\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 layout_data.outer_height = node_outer_height;\n layout_data.offset_y = base_y - node_outer_height / 2;\n layout_data.offset_x = this.opts.hspace * layout_data.direction + 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\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 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 = 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 nodeid in nodes) {\n node = nodes[nodeid];\n pout = this.get_node_point_out(node);\n if (pout.x > this.bounds.e) { this.bounds.e = pout.x; }\n if (pout.x < this.bounds.w) { this.bounds.w = pout.x; }\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, { evt: 'expand_node', data: [], node: node.id });\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, { evt: 'collapse_node', data: [], node: node.id });\n }\n expand_all() {\n var nodes = this.jm.mind.nodes;\n var c = 0;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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) { return; }\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(root_layout_data.right_nodes);\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n } else {\n if (node._data.layout.direction == Direction.right) {\n root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes);\n } else {\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n }\n }\n this.bounds.s = Math.max(root_layout_data.outer_height_left, root_layout_data.outer_height_right);\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\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from \"./jsmind.dom.js\";\n\nclass graph_svg {\n constructor(view) {\n this.view = view;\n this.opts = view.opts;\n this.e_svg = graph_svg.c('svg');\n this.e_svg.setAttribute('class', 'jsmind');\n this.size = { w: 0, h: 0 };\n this.lines = [];\n }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = graph_svg.c('path');\n line.setAttribute('stroke', 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._bezier_to(line, 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 var img = new Image();\n img.onload = function () {\n dest_canvas_ctx.drawImage(img, 0, 0);\n !!callback && callback();\n };\n img.src = 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg));\n }\n _bezier_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M' + x1 + ' ' + y1 + ' C ' + (x1 + (x2 - x1) * 2 / 3) + ' ' + y1 + ', ' + x1 + ' ' + y2 + ', ' + x2 + ' ' + y2);\n }\n _line_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2);\n }\n}\n\n\nclass graph_canvas {\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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y);\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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 const graph = { svg: graph_svg, canvas: graph_canvas };\n","/**\n * @license BSD\n * @copyright 2014-2022 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 { 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 }\n init() {\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.e_panel = $.c('div');\n this.e_nodes = $.c('jmnodes');\n this.e_editor = $.c('input');\n\n this.graph = this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this);\n\n this.e_panel.className = 'jsmind-inner';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\n\n var v = this;\n $.on(this.e_editor, 'keydown', function (e) {\n var evt = e || event;\n if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); }\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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) { client_w = min_width; }\n if (client_h < min_height) { client_h = min_height; }\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\n }\n select_node(node) {\n if (!!this.selected_node) {\n this.selected_node._data.view.element.className =\n this.selected_node._data.view.element.className.replace(/\\s*selected\\b/i, '');\n this.reset_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_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 = (element.clientWidth - parseInt(ncs.getPropertyValue('padding-left')) - parseInt(ncs.getPropertyValue('padding-right'))) + '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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if ((zoom < this.minZoom) || (zoom > this.maxZoom)) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n };\n this.show(true);\n return true;\n\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = (_offset.x + p.x) + 'px';\n node_element.style.top = (_offset.y + p.y) + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = (_offset.x + p_expander.x) + 'px';\n expander.style.top = (_offset.y + p_expander.y) + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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(img, 2, 2, node_element.clientWidth, node_element.clientHeight);\n var scaledImageData = c.toDataURL();\n node_element.style.backgroundImage = 'url(' + scaledImageData + ')';\n }\n };\n img.src = backgroundImage;\n\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 = 'rotate(' + node_data['background-rotation'] + 'deg)';\n }\n }\n }\n clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) { continue; }\n if (('visible' in node._data.layout) && !node._data.layout.visible) { continue; }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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) { e.preventDefault(); } //prevent tab to change focus in browser\n if (this.jm.view.is_editing()) { return; }\n var evt = e || event;\n if (!this.opts.enable) { return true; }\n var kc = evt.keyCode + (evt.metaKey << 13) + (evt.ctrlKey << 12) + (evt.altKey << 11) + (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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 }\n else if (selected_node.direction === d) {\n var children = selected_node.children;\n var childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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\n","/**\n * @license BSD\n * @copyright 2014-2022 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('plugin ' + plugin + ' is not a supported plugin')\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } 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\n\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\n this.init();\n }\n\n init() {\n if (!!this.initialized) { return; }\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n // call enable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // call disable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n get_editable() {\n return this.options.editable;\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, \"mousewheel\", this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(event) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n if (!this.options.default_event_handle[\"enable_mousewheel_handle\"] || !window.event.ctrlKey) {\n return;\n }\n // Avoid default page scrolling behavior.\n event.preventDefault();\n\n var dir = event.deltaY > 0 ? \"Up\" : \"Down\";\n if (dir == \"Up\") {\n this.view.zoomIn();\n } else {\n this.view.zoomOut();\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) { return; }\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) { return; }\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) { return; }\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, { evt: 'add_node', data: [the_parent_node.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(the_node_before, nodeid, topic, data, direction);\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, { evt: 'insert_node_before', data: [the_node_before.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, { evt: 'insert_node_after', data: [the_node_after.id, nodeid, topic, data], node: nodeid });\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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, { evt: 'remove_node', data: [nodeid], node: parentid });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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, { evt: 'update_node', data: [nodeid, topic], node: nodeid });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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, { evt: 'move_node', data: [nodeid, beforeid, parentid, direction], node: nodeid });\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 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) { return null; }\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) { return null; }\n var n = null;\n if (node.parent.isroot) {\n var c = node.parent.children;\n var getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!node.data['background-image']) {\n logger.error('fail, only can change rotation angle of node with background image');\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jm;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","_xhr","xhr","XMLHttpRequest","ActiveXObject","_eurl","url","encodeURIComponent","request","param","method","callback","fail_callback","a","tmp_param","k","push","join","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","o","Object","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substr","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","graph_svg","e_svg","setAttribute","size","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","graph","svg","canvas","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 9dfd623d..94f7db7a 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ }, "scripts": { "build": "rollup -c", - "test": "jest" + "test": "jest && ES6=true jest" }, "repository": { "type": "git", diff --git a/rollup.config.js b/rollup.config.js index 92998c89..d7dfd3a5 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -6,7 +6,7 @@ export default [{ output: { name: 'jsMind', file: 'es6/jsmind.js', - format: 'iife', + format: 'umd', banner: "/**\n* @license BSD-3-Clause\n* @copyright 2014-2022 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/", sourcemap: true, }, diff --git a/src/jsmind.js b/src/jsmind.js index dac73d2f..3d22a69c 100644 --- a/src/jsmind.js +++ b/src/jsmind.js @@ -8,6 +8,7 @@ import { __version__, logger, EventType, Direction } from "./jsmind.common.js"; import { merge_option } from "./jsmind.option.js"; +import { Mind } from "./jsmind.mind.js"; import { Node } from "./jsmind.node.js"; import { DataProvider } from "./jsmind.data_provider.js"; import { LayoutProvider } from "./jsmind.layout_provider.js"; @@ -20,6 +21,7 @@ import { util as _util } from "./jsmind.util.js" class jm { + static mind = Mind; static node = Node; static direction = Direction; static event_type = EventType; @@ -629,5 +631,4 @@ class jm { } } -export default jsMind = jm; -// window.jsMind = jsMind; +export default jm; diff --git a/src/jsmind.node.js b/src/jsmind.node.js index 0406de53..93415c99 100644 --- a/src/jsmind.node.js +++ b/src/jsmind.node.js @@ -6,10 +6,11 @@ * https://github.com/hizzgdev/jsmind/ */ +import { logger } from "./jsmind.common.js"; export class Node { constructor(sId, iIndex, sTopic, oData, bIsRoot, oParent, eDirection, bExpanded) { - if (!sId) { jm.logger.error('invalid node id'); return; } - if (typeof iIndex != 'number') { jm.logger.error('invalid node index'); return; } + if (!sId) { logger.error('invalid node id'); return; } + if (typeof iIndex != 'number') { logger.error('invalid node index'); return; } if (typeof bExpanded === 'undefined') { bExpanded = true; } this.id = sId; this.index = iIndex; diff --git a/tests/jsmind.mind.test.js b/tests/jsmind.mind.test.js index 43dd4f6d..949b45ef 100644 --- a/tests/jsmind.mind.test.js +++ b/tests/jsmind.mind.test.js @@ -1,4 +1,4 @@ -const jm = require('../js/jsmind'); +const jm = require('./jsmind.versions') beforeEach(() => { jest.restoreAllMocks(); diff --git a/tests/jsmind.node.test.js b/tests/jsmind.node.test.js index 93e831ac..1a3eb7f9 100644 --- a/tests/jsmind.node.test.js +++ b/tests/jsmind.node.test.js @@ -1,4 +1,4 @@ -const jm = require('../js/jsmind'); +const jm = require('./jsmind.versions') beforeEach(() => { jest.restoreAllMocks(); diff --git a/tests/jsmind.versions.js b/tests/jsmind.versions.js new file mode 100644 index 00000000..5cc4a9fa --- /dev/null +++ b/tests/jsmind.versions.js @@ -0,0 +1,7 @@ +if (!!process.env.ES6) { + console.log('run test on ES6 version') + module.exports = require('../es6/jsmind'); +} else { + console.log('run test on ES5 version') + module.exports = require('../js/jsmind'); +} \ No newline at end of file From ade831c58b8f22f09292b4af230f7f7c18a93782 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Mon, 6 Jun 2022 13:21:18 +0800 Subject: [PATCH 038/274] add multiple test environments (#340) * add multiple test environments * update node versions --- .github/workflows/node.js.yml | 5 ++++- package.json | 3 ++- tests/jsmind.versions.js | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 6d2a0cd7..1373a870 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,7 +16,8 @@ jobs: strategy: matrix: - node-version: [12.x, 14.x, 16.x] + node-version: [16.x, 18.x] + jm-lang: [ES5, ES6] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: @@ -29,3 +30,5 @@ jobs: - run: npm ci - run: npm run build --if-present - run: npm test + env: + JM_LANG: ${{ matrix.jm-lang }} diff --git a/package.json b/package.json index 94f7db7a..f2a00c43 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ }, "scripts": { "build": "rollup -c", - "test": "jest && ES6=true jest" + "test": "jest", + "mt": "jest && JM_LANG=ES6 jest" }, "repository": { "type": "git", diff --git a/tests/jsmind.versions.js b/tests/jsmind.versions.js index 5cc4a9fa..c4d6f839 100644 --- a/tests/jsmind.versions.js +++ b/tests/jsmind.versions.js @@ -1,4 +1,4 @@ -if (!!process.env.ES6) { +if (process.env.JM_LANG === 'ES6') { console.log('run test on ES6 version') module.exports = require('../es6/jsmind'); } else { From f446e81ee32ffbdfce236a89fc90f9dea69c1419 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Tue, 7 Jun 2022 00:09:22 +0800 Subject: [PATCH 039/274] refactor jsmind util (#341) --- es6/jsmind.js | 2 +- es6/jsmind.js.map | 2 +- js/jsmind.js | 46 +++++++---------------------------- package.json | 2 +- src/jsmind.util.js | 50 ++++----------------------------------- tests/jsmind.mind.test.js | 1 + tests/jsmind.node.test.js | 9 +++++++ tests/jsmind.util.test.js | 38 +++++++++++++++++++++++++++++ 8 files changed, 65 insertions(+), 85 deletions(-) create mode 100644 tests/jsmind.util.test.js diff --git a/es6/jsmind.js b/es6/jsmind.js index 430dff31..7e2762ca 100644 --- a/es6/jsmind.js +++ b/es6/jsmind.js @@ -5,5 +5,5 @@ * Project Home: * https://github.com/hizzgdev/jsmind/ */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).jsMind=t()}(this,(function(){"use strict";const e="0.4.9",t="hizzgdev@163.com";"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e){return this.slice(0,e.length)===e});var i=function(){};let n="undefined"==typeof console?{log:i,debug:i,error:i,warn:i,info:i}:console;const o={left:-1,center:0,right:1},s={show:1,resize:2,edit:3,select:4};const a=new class{constructor(e){this.w=e,this.d=e.document,this.g=function(e){return this.d.getElementById(e)},this.c=function(e){return this.d.createElement(e)},this.t=function(e,t){e.hasChildNodes()?e.firstChild.nodeValue=t:e.appendChild(this.d.createTextNode(t))},this.h=function(e,t){t instanceof HTMLElement?(e.innerHTML="",e.appendChild(t)):e.innerHTML=t},this.i=function(e){return!!e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument},this.on=function(e,t,i){e.addEventListener?e.addEventListener(t,i,!1):e.attachEvent("on"+t,i)}}}(window),r={ajax:{_xhr:function(){var e=null;if(window.XMLHttpRequest)e=new XMLHttpRequest;else try{e=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}return e},_eurl:function(e){return encodeURIComponent(e)},request:function(e,t,i,o,s){var a=r.ajax,d=null,l=[];for(var h in t)l.push(a._eurl(h)+"="+a._eurl(t[h]));l.length>0&&(d=l.join("&"));var _=a._xhr();_&&(_.onreadystatechange=function(){if(4==_.readyState)if(200==_.status||0==_.status){if("function"==typeof o){var e=r.json.string2json(_.responseText);o(null!=e?e:_.responseText)}}else"function"==typeof s?s(_):n.error("xhr request failed.",_)},i=i||"GET",_.open(i,e,!0),_.setRequestHeader("If-Modified-Since","0"),"POST"==i?(_.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),_.send(d)):_.send())},get:function(e,t){return r.ajax.request(e,{},"GET",t)},post:function(e,t,i){return r.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof a.w.Blob)n=new Blob([e],{type:t});else{var o=new(a.w.BlobBuilder||a.w.MozBlobBuilder||a.w.WebKitBlobBuilder||a.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(a.w.URL||a.w.webkitURL).createObjectURL(n),r=a.c("a");if("download"in r){r.style.visibility="hidden",r.href=s,r.download=i,a.d.body.appendChild(r);var d=a.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),r.dispatchEvent(d),a.d.body.removeChild(r)}else location.href=s}}},json:{json2string:function(e){if(JSON)try{return JSON.stringify(e)}catch(e){return n.warn(e),n.warn("can not convert to string"),null}},string2json:function(e){if(JSON)try{return JSON.parse(e)}catch(e){return n.warn(e),n.warn("can not parse to json"),null}},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:r.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substr(2)).substr(2,16)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},d={container:"",editable:!1,theme:null,mode:"full",support_html:!0,view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:45,addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class l{constructor(e,t,i,o,s,a,r,d){e?"number"==typeof t?(void 0===d&&(d=!0),this.id=e,this.index=t,this.topic=i,this.data=o||{},this.isroot=s,this.parent=a,this.direction=r,this.expanded=!!d,this.children=[],this._data={}):n.error("invalid node index"):n.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?"Up":"Down")?this.view.zoomIn():this.view.zoomOut())}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;rencodeURIComponent(e)+"="+encodeURIComponent(t[e]))).join("&");console.log(a);var d=new XMLHttpRequest;d&&(d.onreadystatechange=function(){if(4==d.readyState)if(200==d.status||0==d.status){if("function"==typeof o){var e=r.json.string2json(d.responseText);o(null!=e?e:d.responseText)}}else"function"==typeof s?s(d):n.error("xhr request failed.",d)},i=i||"GET",d.open(i,e,!0),d.setRequestHeader("If-Modified-Since","0"),"POST"==i?(d.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),d.send(a)):d.send())},get:function(e,t){return r.ajax.request(e,{},"GET",t)},post:function(e,t,i){return r.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof a.w.Blob)n=new Blob([e],{type:t});else{var o=new(a.w.BlobBuilder||a.w.MozBlobBuilder||a.w.WebKitBlobBuilder||a.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(a.w.URL||a.w.webkitURL).createObjectURL(n),r=a.c("a");if("download"in r){r.style.visibility="hidden",r.href=s,r.download=i,a.d.body.appendChild(r);var d=a.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),r.dispatchEvent(d),a.d.body.removeChild(r)}else location.href=s}}},json:{json2string:function(e){if(JSON)try{return JSON.stringify(e)}catch(e){return n.warn(e),n.warn("can not convert to string"),null}},string2json:function(e){if(JSON)try{return JSON.parse(e)}catch(e){return n.warn(e),n.warn("can not parse to json"),null}},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:r.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substr(2)).substr(2,16)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},d={container:"",editable:!1,theme:null,mode:"full",support_html:!0,view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:45,addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class l{constructor(e,t,i,o,s,a,r,d){e?"number"==typeof t?(void 0===d&&(d=!0),this.id=e,this.index=t,this.topic=i,this.data=o||{},this.isroot=s,this.parent=a,this.direction=r,this.expanded=!!d,this.children=[],this._data={}):n.error("invalid node index"):n.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?"Up":"Down")?this.view.zoomIn():this.view.zoomOut())}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;r= 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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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\n","/**\n * @license BSD\n * @copyright 2014-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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(nodeid, node_index, topic, data, false, parent_node, parent_node.direction, expanded);\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._reindex(parent_node);\n } else {\n logger.error('fail, the nodeid \\'' + node.id + '\\' has been already exist.');\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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) { return null; }\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, nodeid, 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, nodeid, 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) { return null; }\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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = (!!beforeid) ? this.get_node(beforeid) : null;\n if (node_before != null && node_before.parent != null && node_before.parent.id == node.parent.id) {\n node.index = node_before.index - 0.5;\n this._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn('the nodeid \\'' + node.id + '\\' has been already exist.');\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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\n","/**\n * @license BSD\n * @copyright 2014-2022 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\";\n\nexport const format = {\n node_tree: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_tree simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_tree\",\n \"data\": { \"id\": \"root\", \"topic\": \"jsMind 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._buildnode(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 (k == 'id' || k == 'topic' || k == 'children' || k == 'direction' || k == 'expanded') {\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(node_parent, node_json.id, node_json.topic, data, d, node_json.expanded);\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 _buildnode: function (node) {\n var df = format.node_tree;\n if (!(node instanceof Node)) { return; }\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._buildnode(children[i]));\n }\n }\n return o;\n }\n },\n\n node_array: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_array simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_array\",\n \"data\": [\n { \"id\": \"root\", \"topic\": \"jsMind Example\", \"isroot\": true }\n ]\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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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(parent_node, node_json.id, node_json.topic, data, d, node_json.expanded);\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 (k == 'id' || k == 'topic' || k == 'parentid' || k == 'isroot' || k == 'direction' || k == 'expanded') {\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)) { return; }\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\": {\n \"name\": 'jsMind freemind example',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"freemind\",\n \"data\": \"\"\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 { // 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 // 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 = ('expanded' in node_data) ? (node_data.expanded == 'true') : true;\n delete node_data.expanded;\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(parent_node, node_id, node_topic, node_data, node_direction, node_expanded);\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n }\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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++) { if (children[i].direction === Direction.left) { r--; } else { r++; } }\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 layout_data.outer_height = node_outer_height;\n layout_data.offset_y = base_y - node_outer_height / 2;\n layout_data.offset_x = this.opts.hspace * layout_data.direction + 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\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 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 = 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 nodeid in nodes) {\n node = nodes[nodeid];\n pout = this.get_node_point_out(node);\n if (pout.x > this.bounds.e) { this.bounds.e = pout.x; }\n if (pout.x < this.bounds.w) { this.bounds.w = pout.x; }\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, { evt: 'expand_node', data: [], node: node.id });\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, { evt: 'collapse_node', data: [], node: node.id });\n }\n expand_all() {\n var nodes = this.jm.mind.nodes;\n var c = 0;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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) { return; }\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(root_layout_data.right_nodes);\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n } else {\n if (node._data.layout.direction == Direction.right) {\n root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes);\n } else {\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n }\n }\n this.bounds.s = Math.max(root_layout_data.outer_height_left, root_layout_data.outer_height_right);\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\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from \"./jsmind.dom.js\";\n\nclass graph_svg {\n constructor(view) {\n this.view = view;\n this.opts = view.opts;\n this.e_svg = graph_svg.c('svg');\n this.e_svg.setAttribute('class', 'jsmind');\n this.size = { w: 0, h: 0 };\n this.lines = [];\n }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = graph_svg.c('path');\n line.setAttribute('stroke', 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._bezier_to(line, 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 var img = new Image();\n img.onload = function () {\n dest_canvas_ctx.drawImage(img, 0, 0);\n !!callback && callback();\n };\n img.src = 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg));\n }\n _bezier_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M' + x1 + ' ' + y1 + ' C ' + (x1 + (x2 - x1) * 2 / 3) + ' ' + y1 + ', ' + x1 + ' ' + y2 + ', ' + x2 + ' ' + y2);\n }\n _line_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2);\n }\n}\n\n\nclass graph_canvas {\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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y);\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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 const graph = { svg: graph_svg, canvas: graph_canvas };\n","/**\n * @license BSD\n * @copyright 2014-2022 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 { 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 }\n init() {\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.e_panel = $.c('div');\n this.e_nodes = $.c('jmnodes');\n this.e_editor = $.c('input');\n\n this.graph = this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this);\n\n this.e_panel.className = 'jsmind-inner';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\n\n var v = this;\n $.on(this.e_editor, 'keydown', function (e) {\n var evt = e || event;\n if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); }\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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) { client_w = min_width; }\n if (client_h < min_height) { client_h = min_height; }\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\n }\n select_node(node) {\n if (!!this.selected_node) {\n this.selected_node._data.view.element.className =\n this.selected_node._data.view.element.className.replace(/\\s*selected\\b/i, '');\n this.reset_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_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 = (element.clientWidth - parseInt(ncs.getPropertyValue('padding-left')) - parseInt(ncs.getPropertyValue('padding-right'))) + '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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if ((zoom < this.minZoom) || (zoom > this.maxZoom)) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n };\n this.show(true);\n return true;\n\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = (_offset.x + p.x) + 'px';\n node_element.style.top = (_offset.y + p.y) + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = (_offset.x + p_expander.x) + 'px';\n expander.style.top = (_offset.y + p_expander.y) + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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(img, 2, 2, node_element.clientWidth, node_element.clientHeight);\n var scaledImageData = c.toDataURL();\n node_element.style.backgroundImage = 'url(' + scaledImageData + ')';\n }\n };\n img.src = backgroundImage;\n\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 = 'rotate(' + node_data['background-rotation'] + 'deg)';\n }\n }\n }\n clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) { continue; }\n if (('visible' in node._data.layout) && !node._data.layout.visible) { continue; }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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) { e.preventDefault(); } //prevent tab to change focus in browser\n if (this.jm.view.is_editing()) { return; }\n var evt = e || event;\n if (!this.opts.enable) { return true; }\n var kc = evt.keyCode + (evt.metaKey << 13) + (evt.ctrlKey << 12) + (evt.altKey << 11) + (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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 }\n else if (selected_node.direction === d) {\n var children = selected_node.children;\n var childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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\n","/**\n * @license BSD\n * @copyright 2014-2022 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('plugin ' + plugin + ' is not a supported plugin')\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } 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\n\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\n this.init();\n }\n\n init() {\n if (!!this.initialized) { return; }\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n // call enable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // call disable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n get_editable() {\n return this.options.editable;\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, \"mousewheel\", this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(event) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n if (!this.options.default_event_handle[\"enable_mousewheel_handle\"] || !window.event.ctrlKey) {\n return;\n }\n // Avoid default page scrolling behavior.\n event.preventDefault();\n\n var dir = event.deltaY > 0 ? \"Up\" : \"Down\";\n if (dir == \"Up\") {\n this.view.zoomIn();\n } else {\n this.view.zoomOut();\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) { return; }\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) { return; }\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) { return; }\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, { evt: 'add_node', data: [the_parent_node.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(the_node_before, nodeid, topic, data, direction);\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, { evt: 'insert_node_before', data: [the_node_before.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, { evt: 'insert_node_after', data: [the_node_after.id, nodeid, topic, data], node: nodeid });\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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, { evt: 'remove_node', data: [nodeid], node: parentid });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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, { evt: 'update_node', data: [nodeid, topic], node: nodeid });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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, { evt: 'move_node', data: [nodeid, beforeid, parentid, direction], node: nodeid });\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 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) { return null; }\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) { return null; }\n var n = null;\n if (node.parent.isroot) {\n var c = node.parent.children;\n var getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!node.data['background-image']) {\n logger.error('fail, only can change rotation angle of node with background image');\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jm;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","_xhr","xhr","XMLHttpRequest","ActiveXObject","_eurl","url","encodeURIComponent","request","param","method","callback","fail_callback","a","tmp_param","k","push","join","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","o","Object","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substr","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","graph_svg","e_svg","setAttribute","size","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","graph","svg","canvas","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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"],"mappings":";;;;;;;uOAQO,MAAMA,EAAc,QACdC,EAAa,mBAEgB,mBAA/BC,OAAOC,UAAUC,aAA4BF,OAAOC,UAAUC,WAAa,SAAUC,GAAK,OAAOC,KAAKC,MAAM,EAAGF,EAAEG,UAAYH,IAGxI,IAAII,EAAQ,aACL,IAAIC,EAA6B,oBAAZC,QAA2B,CACnDC,IAAKH,EAAOI,MAAOJ,EAAOK,MAAOL,EAAOM,KAAMN,EAAOO,KAAMP,GAC3DE,QAEG,MAAMM,EAAY,CAAEC,MAAO,EAAGC,OAAQ,EAAGC,MAAO,GAC1CC,EAAY,CAAEC,KAAM,EAAGC,OAAQ,EAAGC,KAAM,EAAGC,OAAQ,GCkBzD,MAAMC,EAAI,IA9BjB,MACIC,YAAYC,GACRtB,KAAKsB,EAAIA,EACTtB,KAAKuB,EAAID,EAAEE,SACXxB,KAAKyB,EAAI,SAAUC,GAAM,OAAO1B,KAAKuB,EAAEI,eAAeD,IACtD1B,KAAK4B,EAAI,SAAUC,GAAO,OAAO7B,KAAKuB,EAAEO,cAAcD,IACtD7B,KAAK+B,EAAI,SAAUC,EAAGD,GAASC,EAAEC,gBAAmBD,EAAEE,WAAWC,UAAYJ,EAAYC,EAAEI,YAAYpC,KAAKuB,EAAEc,eAAeN,KAE7H/B,KAAKsC,EAAI,SAAUN,EAAGD,GACdA,aAAaQ,aACbP,EAAEQ,UAAY,GACdR,EAAEI,YAAYL,IAEdC,EAAEQ,UAAYT,GAItB/B,KAAKyC,EAAI,SAAUC,GAAM,QAASA,GAAqB,iBAAPA,GAAqC,IAAhBA,EAAGC,UAAwC,iBAAbD,EAAGE,OAAoD,iBAArBF,EAAGG,eAGxI7C,KAAK8C,GAAK,SAAUf,EAAGgB,EAAGT,GAChBP,EAAEiB,iBACJjB,EAAEiB,iBAAiBD,EAAGT,GAAG,GAEzBP,EAAEkB,YAAY,KAAOF,EAAGT,MAMfY,QC3BZC,EAAO,CAChBC,KAAM,CACFC,KAAM,WACF,IAAIC,EAAM,KACV,GAAIJ,OAAOK,eACPD,EAAM,IAAIC,oBAEV,IACID,EAAM,IAAIE,cAAc,qBAC1B,MAAOT,IAEb,OAAOO,GAEXG,MAAO,SAAUC,GACb,OAAOC,mBAAmBD,IAE9BE,QAAS,SAAUF,EAAKG,EAAOC,EAAQC,EAAUC,GAC7C,IAAIC,EAAId,EAAKC,KACTrD,EAAI,KACJmE,EAAY,GAChB,IAAK,IAAIC,KAAKN,EACVK,EAAUE,KAAKH,EAAER,MAAMU,GAAK,IAAMF,EAAER,MAAMI,EAAMM,KAEhDD,EAAUhE,OAAS,IACnBH,EAAImE,EAAUG,KAAK,MAEvB,IAAIf,EAAMW,EAAEZ,OACPC,IACLA,EAAIgB,mBAAqB,WACrB,GAAsB,GAAlBhB,EAAIiB,WACJ,GAAkB,KAAdjB,EAAIkB,QAA+B,GAAdlB,EAAIkB,QACzB,GAAwB,mBAAbT,EAAyB,CAChC,IAAIU,EAAOtB,EAAKuB,KAAKC,YAAYrB,EAAIsB,cAEjCb,EADQ,MAARU,EACSA,EAEAnB,EAAIsB,mBAIQ,mBAAlBZ,EACPA,EAAcV,GAEdlD,EAAOI,MAAM,sBAAuB8C,IAKpDQ,EAASA,GAAU,MACnBR,EAAIuB,KAAKf,EAAQJ,GAAK,GACtBJ,EAAIwB,iBAAiB,oBAAqB,KAC5B,QAAVhB,GACAR,EAAIwB,iBAAiB,eAAgB,mDACrCxB,EAAIyB,KAAKhF,IAETuD,EAAIyB,SAGZC,IAAK,SAAUtB,EAAKK,GAChB,OAAOZ,EAAKC,KAAKQ,QAAQF,EAAK,GAAI,MAAOK,IAE7CkB,KAAM,SAAUvB,EAAKG,EAAOE,GACxB,OAAOZ,EAAKC,KAAKQ,QAAQF,EAAKG,EAAO,OAAQE,KAIrDmB,KAAM,CACFC,KAAM,SAAUC,EAAWC,GACvB,IAAIC,EAAS,IAAIC,WACjBD,EAAOE,OAAS,WACe,mBAAhBH,GACPA,EAAYrF,KAAKyF,OAAQL,EAAUM,OAG3CJ,EAAOK,WAAWP,IAGtBQ,KAAM,SAAUR,EAAWS,EAAMH,GAC7B,IAAII,EACJ,GAAwB,mBAAb1E,EAAEE,EAAEyE,KACXD,EAAO,IAAIC,KAAK,CAACX,GAAY,CAAES,KAAMA,QAClC,CACH,IACIG,EAAK,IADS5E,EAAEE,EAAE2E,aAAe7E,EAAEE,EAAE4E,gBAAkB9E,EAAEE,EAAE6E,mBAAqB/E,EAAEE,EAAE8E,eAExFJ,EAAGK,OAAOjB,GACVU,EAAOE,EAAGM,QAAQT,GAEtB,GAAIU,UAAUC,WACVD,UAAUC,WAAWV,EAAMJ,OACxB,CACH,IACIe,GADMrF,EAAEE,EAAEoF,KAAOtF,EAAEE,EAAEqF,WACPC,gBAAgBd,GAC9Be,EAASzF,EAAEQ,EAAE,KACjB,GAAI,aAAciF,EAAQ,CACtBA,EAAOjE,MAAMkE,WAAa,SAC1BD,EAAOE,KAAON,EACdI,EAAOG,SAAWtB,EAClBtE,EAAEG,EAAE0F,KAAK7E,YAAYyE,GACrB,IAAIK,EAAM9F,EAAEG,EAAE4F,YAAY,eAC1BD,EAAIE,UAAU,SAAS,GAAM,GAC7BP,EAAOQ,cAAcH,GACrB9F,EAAEG,EAAE0F,KAAKK,YAAYT,QAErBU,SAASR,KAAON,KAMhC/B,KAAM,CACF8C,YAAa,SAAU9C,GACnB,GAAM+C,KACF,IAEI,OADeA,KAAKC,UAAUhD,GAEhC,MAAO3B,GAGL,OAFA3C,EAAOK,KAAKsC,GACZ3C,EAAOK,KAAK,6BACL,OAInBkE,YAAa,SAAUgD,GACnB,GAAMF,KACF,IAEI,OADWA,KAAKG,MAAMD,GAExB,MAAO5E,GAGL,OAFA3C,EAAOK,KAAKsC,GACZ3C,EAAOK,KAAK,yBACL,OAInBoH,MAAO,SAAUC,EAAG7D,GAChB,IAAK,IAAI8D,KAAK9D,EACN8D,KAAKD,EACe,iBAATA,EAAEC,IAC6C,mBAAtDC,OAAOnI,UAAUoI,SAASC,KAAKJ,EAAEC,IAAII,eACpCL,EAAEC,GAAG7H,OAGN4H,EAAEC,GAAK9D,EAAE8D,GAFT5E,EAAKuB,KAAKmD,MAAMC,EAAEC,GAAI9D,EAAE8D,IAK5BD,EAAEC,GAAK9D,EAAE8D,GAGjB,OAAOD,IAIfM,KAAM,CACFC,MAAO,WACH,QAAQ,IAAIC,MAAOC,UAAUN,SAAS,IAAMO,KAAKC,SAASR,SAAS,IAAIS,OAAO,IAAIA,OAAO,EAAG,MAIpGC,KAAM,CACFC,SAAU,SAAUC,GAChB,OAAKA,GACiC,GAA/BA,EAAEC,QAAQ,MAAO,IAAI5I,UClKlC6I,EAAkB,CACpBC,UAAW,GACXC,UAAU,EACVC,MAAO,KACPC,KAAM,OACNC,cAAc,EAEdC,KAAM,CACFC,OAAQ,SACRC,QAAS,IACTC,QAAS,GACTC,WAAY,EACZC,WAAY,OACZC,WAAW,EACXC,gCAAgC,GAEpCC,OAAQ,CACJC,OAAQ,GACRC,OAAQ,GACRC,OAAQ,IAEZC,qBAAsB,CAClBC,yBAAyB,EACzBC,qBAAqB,EACrBC,wBAAwB,EACxBC,0BAA0B,GAE9BC,SAAU,CACNC,QAAQ,EACRC,QAAS,GAETC,QAAS,CACLC,SAAU,GACVC,WAAY,GACZC,SAAU,IACVC,QAAS,GACTC,OAAQ,GACRlK,KAAM,GACNmK,GAAI,GACJjK,MAAO,GACPkK,KAAM,MCzCX,MAAMC,EACT5J,YAAY6J,EAAKC,EAAQC,EAAQC,EAAOC,EAASC,EAASC,EAAYC,GAC7DP,EACgB,iBAAVC,QACc,IAAdM,IAA6BA,GAAY,GACpDzL,KAAK0B,GAAKwJ,EACVlL,KAAK0L,MAAQP,EACbnL,KAAK2L,MAAQP,EACbpL,KAAKyE,KAAO4G,GAAS,GACrBrL,KAAK4L,OAASN,EACdtL,KAAK6L,OAASN,EACdvL,KAAK8L,UAAYN,EACjBxL,KAAK+L,WAAaN,EAClBzL,KAAKgM,SAAW,GAChBhM,KAAKiM,MAAQ,IAXoB7L,EAAOI,MAAM,sBADlCJ,EAAOI,MAAM,mBAe7B0L,eACI,IAAIC,EAAKnM,KAAKiM,MAAM5C,KACpB,MAAO,CACH+C,EAAGD,EAAGE,MACNC,EAAGH,EAAGI,OAGdC,WACI,IAAIL,EAAKnM,KAAKiM,MAAM5C,KACpB,MAAO,CACH/H,EAAG6K,EAAGM,MACNnK,EAAG6J,EAAGO,QAIdC,eAAeC,EAAOC,GAElB,IACIC,EAAKF,EAAMlB,MACXqB,EAAKF,EAAMnB,MAYf,OAXIoB,GAAM,GAAKC,GAAM,EACbD,EAAKC,GACK,GAAPD,IAAmB,GAAPC,EACf,GACU,GAAPD,EACH,GACU,GAAPC,GACF,EAED,EAIZJ,iBAAiBK,EAAOC,GACpB,GAAMD,GAAWC,EAAM,CACnB,GAAID,EAAMtL,KAAOuL,EAAKvL,GAClB,OAAO,EAEX,GAAIsL,EAAMpB,OACN,OAAO,EAIX,IAFA,IAAIsB,EAAMF,EAAMtL,GACZ3B,EAAIkN,GACAlN,EAAE6L,QAEN,IADA7L,EAAIA,EAAE8L,QACAnK,KAAOwL,EACT,OAAO,EAInB,OAAO,EAEXP,eAAe3K,GACX,QAASA,GAAKA,aAAaiJ,GCpE5B,MAAMkC,EACT9L,cACIrB,KAAK0F,KAAO,KACZ1F,KAAKoN,OAAS,KACdpN,KAAKqN,QAAU,KACfrN,KAAKsN,KAAO,KACZtN,KAAKuN,SAAW,KAChBvN,KAAKwN,MAAQ,GAEjBC,SAASC,GACL,OAAIA,KAAU1N,KAAKwN,MACRxN,KAAKwN,MAAME,IAElBtN,EAAOK,KAAK,eAAiBiN,EAAS,sBAC/B,MAGfC,SAASD,EAAQ/B,EAAOlH,GACpB,OAAiB,MAAbzE,KAAKsN,MACLtN,KAAKsN,KAAO,IAAIrC,EAAKyC,EAAQ,EAAG/B,EAAOlH,GAAM,GAC7CzE,KAAK4N,UAAU5N,KAAKsN,MACbtN,KAAKsN,OAEZlN,EAAOI,MAAM,8BACN,MAGfqN,SAASC,EAAaJ,EAAQ/B,EAAOlH,EAAMqH,EAAWC,EAAUgC,GAC5D,IAAK9C,EAAK+C,QAAQF,GAEd,OADA1N,EAAOI,MAAM,mBAAqBsN,EAAc,mBACzC,KAEX,IACIb,EAAO,IAAIhC,EAAKyC,EADHK,IAAQ,EACepC,EAAOlH,GAAM,EAAOqJ,EAAaA,EAAYhC,UAAWC,GAWhG,OAVI+B,EAAYlC,SACZqB,EAAKnB,UAAYA,GAAanL,EAAUG,OAExCd,KAAK4N,UAAUX,IACfa,EAAY9B,SAAS5H,KAAK6I,GAC1BjN,KAAKiO,SAASH,KAEd1N,EAAOI,MAAM,qBAAwByM,EAAKvL,GAAK,6BAC/CuL,EAAO,MAEJA,EAEXiB,mBAAmBC,EAAaT,EAAQ/B,EAAOlH,EAAMqH,GACjD,IAAKb,EAAK+C,QAAQG,GAEd,OADA/N,EAAOI,MAAM,mBAAqB2N,EAAc,mBACzC,KAEX,IAAIC,EAAaD,EAAYzC,MAAQ,GACrC,OAAO1L,KAAK6N,SAASM,EAAYtC,OAAQ6B,EAAQ/B,EAAOlH,EAAMqH,GAAW,EAAMsC,GAEnFC,gBAAgBpB,GACZ,IAAKhC,EAAK+C,QAAQf,GAAO,CACrB,IAAIqB,EAAWtO,KAAKyN,SAASR,GAC7B,OAAKqB,EAIMtO,KAAKqO,gBAAgBC,IAH5BlO,EAAOI,MAAM,eAAiByM,EAAO,uBAC9B,MAKf,GAAIA,EAAKrB,OAAU,OAAO,KAC1B,IAAImC,EAAMd,EAAKvB,MAAQ,EACvB,OAAIqC,GAAO,EACAd,EAAKpB,OAAOG,SAAS+B,GAErB,KAGfQ,kBAAkBC,EAAYd,EAAQ/B,EAAOlH,EAAMqH,GAC/C,IAAKb,EAAK+C,QAAQQ,GAEd,OADApO,EAAOI,MAAM,kBAAoBgO,EAAa,mBACvC,KAEX,IAAIJ,EAAaI,EAAW9C,MAAQ,GACpC,OAAO1L,KAAK6N,SAASW,EAAW3C,OAAQ6B,EAAQ/B,EAAOlH,EAAMqH,GAAW,EAAMsC,GAElFK,eAAexB,GACX,IAAKhC,EAAK+C,QAAQf,GAAO,CACrB,IAAIqB,EAAWtO,KAAKyN,SAASR,GAC7B,OAAKqB,EAIMtO,KAAKyO,eAAeH,IAH3BlO,EAAOI,MAAM,eAAiByM,EAAO,uBAC9B,MAKf,GAAIA,EAAKrB,OAAU,OAAO,KAC1B,IAAImC,EAAMd,EAAKvB,MAEf,OADeuB,EAAKpB,OAAOG,SACd9L,OAAS6N,EACXd,EAAKpB,OAAOG,SAAS+B,GAErB,KAGfW,UAAUzB,EAAM0B,EAAWC,EAAW9C,GAClC,OAAKb,EAAK+C,QAAQf,IAIb2B,IACDA,EAAY3B,EAAKpB,OAAOnK,IAErB1B,KAAK6O,WAAW5B,EAAM0B,EAAWC,EAAW9C,KAN/C1L,EAAOI,MAAM,sBAAwByM,EAAO,mBACrC,MAOf6B,qBAAqB7B,EAAMnB,QACE,IAAdA,EACPA,EAAYmB,EAAKnB,UAEjBmB,EAAKnB,UAAYA,EAGrB,IADA,IAAIiD,EAAM9B,EAAKjB,SAAS9L,OACjB6O,KACH/O,KAAK8O,qBAAqB7B,EAAKjB,SAAS+C,GAAMjD,GAGtDkD,oBAAoB/B,EAAMgC,GACtB,GAAMhC,GAAUgC,EACZ,GAAgB,UAAZA,EACAhC,EAAKvB,OAAS,EACd1L,KAAKiO,SAAShB,EAAKpB,aAChB,GAAgB,WAAZoD,EACPhC,EAAKvB,MAAQ,EACb1L,KAAKiO,SAAShB,EAAKpB,YAChB,CACH,IAAIsC,EAAiBc,EAAYjP,KAAKyN,SAASwB,GAAY,KACxC,MAAfd,GAA6C,MAAtBA,EAAYtC,QAAkBsC,EAAYtC,OAAOnK,IAAMuL,EAAKpB,OAAOnK,KAC1FuL,EAAKvB,MAAQyC,EAAYzC,MAAQ,GACjC1L,KAAKiO,SAAShB,EAAKpB,SAI/B,OAAOoB,EAEX4B,WAAW5B,EAAMgC,EAAUC,EAAUpD,GACjC,GAAMmB,GAAUiC,EAAU,CACtB,IAAIpB,EAAc9N,KAAKyN,SAASyB,GAChC,GAAIjE,EAAKkE,UAAUlC,EAAMa,GAErB,OADA1N,EAAOI,MAAM,uCACN,KAEX,GAAIyM,EAAKpB,OAAOnK,IAAMwN,EAAU,CAI5B,IAFA,IAAIE,EAAUnC,EAAKpB,OAAOG,SACtBqD,EAAKD,EAAQlP,OACVmP,KACH,GAAID,EAAQC,GAAI3N,IAAMuL,EAAKvL,GAAI,CAC3B0N,EAAQE,OAAOD,EAAI,GACnB,MAGRpC,EAAKpB,OAASiC,EACdA,EAAY9B,SAAS5H,KAAK6I,GAG1BA,EAAKpB,OAAOD,OAERqB,EAAKnB,UADLA,GAAanL,EAAUC,KACNkL,EAEAnL,EAAUG,MAG/BmM,EAAKnB,UAAYmB,EAAKpB,OAAOC,UAEjC9L,KAAKgP,oBAAoB/B,EAAMgC,GAC/BjP,KAAK8O,qBAAqB7B,GAE9B,OAAOA,EAEXsC,YAAYtC,GACR,IAAKhC,EAAK+C,QAAQf,GAEd,OADA7M,EAAOI,MAAM,sBAAwByM,EAAO,oBACrC,EAEX,GAAIA,EAAKrB,OAEL,OADAxL,EAAOI,MAAM,mCACN,EAEU,MAAjBR,KAAKuN,UAAoBvN,KAAKuN,SAAS7L,IAAMuL,EAAKvL,KAClD1B,KAAKuN,SAAW,MAKpB,IAFA,IAAIvB,EAAWiB,EAAKjB,SAChBwD,EAAKxD,EAAS9L,OACXsP,KACHxP,KAAKuP,YAAYvD,EAASwD,IAG9BxD,EAAS9L,OAAS,EAIlB,IAFA,IAAIkP,EAAUnC,EAAKpB,OAAOG,SACtBqD,EAAKD,EAAQlP,OACVmP,KACH,GAAID,EAAQC,GAAI3N,IAAMuL,EAAKvL,GAAI,CAC3B0N,EAAQE,OAAOD,EAAI,GACnB,MAMR,IAAK,IAAIlL,YAFFnE,KAAKwN,MAAMP,EAAKvL,IAETuL,SACHA,EAAK9I,GAKhB,OAFA8I,EAAO,MAEA,EAEXW,UAAUX,GACN,OAAIA,EAAKvL,MAAM1B,KAAKwN,OAChBpN,EAAOK,KAAK,eAAkBwM,EAAKvL,GAAK,8BACjC,IAEP1B,KAAKwN,MAAMP,EAAKvL,IAAMuL,GACf,GAGfgB,SAAShB,GACL,GAAIA,aAAgBhC,EAAM,CACtBgC,EAAKjB,SAASyD,KAAKxE,EAAKyE,SACxB,IAAK,IAAIjN,EAAI,EAAGA,EAAIwK,EAAKjB,SAAS9L,OAAQuC,IACtCwK,EAAKjB,SAASvJ,GAAGiJ,MAAQjJ,EAAI,ICjOtC,MAAMkN,EAAS,CAClBC,UAAW,CACPC,QAAS,CACLC,KAAQ,CACJpK,KAAQ,0BACR0H,OAAUzN,EACV0N,QAAW3N,GAEfiQ,OAAU,YACVlL,KAAQ,CAAE/C,GAAM,OAAQiK,MAAS,mBAErCoE,SAAU,SAAUC,GAChB,IAAIC,EAAKN,EAAOC,UACZM,EAAO,IAAI/C,EAKf,OAJA+C,EAAKxK,KAAOsK,EAAOF,KAAKpK,KACxBwK,EAAK9C,OAAS4C,EAAOF,KAAK1C,OAC1B8C,EAAK7C,QAAU2C,EAAOF,KAAKzC,QAC3B4C,EAAGE,OAAOD,EAAMF,EAAOvL,MAChByL,GAEXE,SAAU,SAAUF,GAChB,IAAID,EAAKN,EAAOC,UACZlL,EAAO,GAQX,OAPAA,EAAKoL,KAAO,CACRpK,KAAMwK,EAAKxK,KACX0H,OAAQ8C,EAAK9C,OACbC,QAAS6C,EAAK7C,SAElB3I,EAAKiL,OAAS,YACdjL,EAAKD,KAAOwL,EAAGI,WAAWH,EAAK5C,MACxB5I,GAGXyL,OAAQ,SAAUD,EAAMI,GACpB,IAAIL,EAAKN,EAAOC,UACZnL,EAAOwL,EAAGM,cAAcD,GAE5B,GADAJ,EAAKvC,SAAS2C,EAAU5O,GAAI4O,EAAU3E,MAAOlH,GACzC,aAAc6L,EAEd,IADA,IAAItE,EAAWsE,EAAUtE,SAChBvJ,EAAI,EAAGA,EAAIuJ,EAAS9L,OAAQuC,IACjCwN,EAAGO,iBAAiBN,EAAMA,EAAK5C,KAAMtB,EAASvJ,KAK1D8N,cAAe,SAAUE,GACrB,IAAIhM,EAAO,GACX,IAAK,IAAIN,KAAKsM,EACD,MAALtM,GAAkB,SAALA,GAAqB,YAALA,GAAwB,aAALA,GAAyB,YAALA,IAGxEM,EAAKN,GAAKsM,EAAUtM,IAExB,OAAOM,GAGX+L,iBAAkB,SAAUN,EAAMQ,EAAaD,GAC3C,IAAIR,EAAKN,EAAOC,UACZnL,EAAOwL,EAAGM,cAAcE,GACxBlP,EAAI,KACJmP,EAAY9E,SACZrK,EAA2B,QAAvBkP,EAAU3E,UAAsBnL,EAAUC,KAAOD,EAAUG,OAEnE,IAAImM,EAAOiD,EAAKrC,SAAS6C,EAAaD,EAAU/O,GAAI+O,EAAU9E,MAAOlH,EAAMlD,EAAGkP,EAAU1E,UACxF,GAAM0E,EAAoB,SAEtB,IADA,IAAIzE,EAAWyE,EAAUzE,SAChBvJ,EAAI,EAAGA,EAAIuJ,EAAS9L,OAAQuC,IACjCwN,EAAGO,iBAAiBN,EAAMjD,EAAMjB,EAASvJ,KAKrD4N,WAAY,SAAUpD,GAClB,IAAIgD,EAAKN,EAAOC,UAChB,GAAM3C,aAAgBhC,EAAtB,CACA,IAAIlD,EAAI,CACJrG,GAAIuL,EAAKvL,GACTiK,MAAOsB,EAAKtB,MACZI,SAAUkB,EAAKlB,UAKnB,GAHMkB,EAAKpB,QAAUoB,EAAKpB,OAAOD,SAC7B7D,EAAE+D,UAAYmB,EAAKnB,WAAanL,EAAUC,KAAO,OAAS,SAE7C,MAAbqM,EAAKxI,KAAc,CACnB,IAAIkM,EAAY1D,EAAKxI,KACrB,IAAK,IAAIN,KAAKwM,EACV5I,EAAE5D,GAAKwM,EAAUxM,GAGzB,IAAI6H,EAAWiB,EAAKjB,SACpB,GAAIA,EAAS9L,OAAS,EAAG,CACrB6H,EAAEiE,SAAW,GACb,IAAK,IAAIvJ,EAAI,EAAGA,EAAIuJ,EAAS9L,OAAQuC,IACjCsF,EAAEiE,SAAS5H,KAAK6L,EAAGI,WAAWrE,EAASvJ,KAG/C,OAAOsF,KAIf6I,WAAY,CACRf,QAAS,CACLC,KAAQ,CACJpK,KAAQ,2BACR0H,OAAUzN,EACV0N,QAAW3N,GAEfiQ,OAAU,aACVlL,KAAQ,CACJ,CAAE/C,GAAM,OAAQiK,MAAS,iBAAkBC,QAAU,KAI7DmE,SAAU,SAAUC,GAChB,IAAIC,EAAKN,EAAOiB,WACZV,EAAO,IAAI/C,EAKf,OAJA+C,EAAKxK,KAAOsK,EAAOF,KAAKpK,KACxBwK,EAAK9C,OAAS4C,EAAOF,KAAK1C,OAC1B8C,EAAK7C,QAAU2C,EAAOF,KAAKzC,QAC3B4C,EAAGE,OAAOD,EAAMF,EAAOvL,MAChByL,GAGXE,SAAU,SAAUF,GAChB,IAAID,EAAKN,EAAOiB,WACZlM,EAAO,GASX,OARAA,EAAKoL,KAAO,CACRpK,KAAMwK,EAAKxK,KACX0H,OAAQ8C,EAAK9C,OACbC,QAAS6C,EAAK7C,SAElB3I,EAAKiL,OAAS,aACdjL,EAAKD,KAAO,GACZwL,EAAGY,OAAOX,EAAMxL,EAAKD,MACdC,GAGXyL,OAAQ,SAAUD,EAAMU,GACpB,IAAIX,EAAKN,EAAOiB,WACZE,EAASF,EAAW3Q,MAAM,GAE9B6Q,EAAOC,UACP,IAAIC,EAAYf,EAAGgB,cAAcf,EAAMY,GACjCE,EACFf,EAAGO,iBAAiBN,EAAMc,EAAWF,GAErC1Q,EAAOI,MAAM,+BAIrByQ,cAAe,SAAUf,EAAMU,GAG3B,IAFA,IAAIX,EAAKN,EAAOiB,WACZnO,EAAImO,EAAW1Q,OACZuC,KACH,GAAI,WAAYmO,EAAWnO,IAAMmO,EAAWnO,GAAGmJ,OAAQ,CACnD,IAAIsF,EAAYN,EAAWnO,GACvBgC,EAAOwL,EAAGM,cAAcW,GACxBjE,EAAOiD,EAAKvC,SAASuD,EAAUxP,GAAIwP,EAAUvF,MAAOlH,GAExD,OADAmM,EAAWtB,OAAO7M,EAAG,GACdwK,EAGf,OAAO,MAGXuD,iBAAkB,SAAUN,EAAMpC,EAAa8C,GAM3C,IALA,IAAIX,EAAKN,EAAOiB,WACZnO,EAAImO,EAAW1Q,OACfuQ,EAAY,KACZhM,EAAO,KACP0M,EAAgB,EACb1O,KAEH,IADAgO,EAAYG,EAAWnO,IACTyM,UAAYpB,EAAYpM,GAAI,CACtC+C,EAAOwL,EAAGM,cAAcE,GACxB,IAAIlP,EAAI,KACJ6P,EAAiBX,EAAU3E,UACzBsF,IACF7P,EAAsB,QAAlB6P,EAA2BzQ,EAAUC,KAAOD,EAAUG,OAE9D,IAAImM,EAAOiD,EAAKrC,SAASC,EAAa2C,EAAU/O,GAAI+O,EAAU9E,MAAOlH,EAAMlD,EAAGkP,EAAU1E,UACxF6E,EAAWtB,OAAO7M,EAAG,GACrB0O,IACA,IAAIE,EAAoBpB,EAAGO,iBAAiBN,EAAMjD,EAAM2D,GACpDS,EAAoB,IAEpB5O,EAAImO,EAAW1Q,OACfiR,GAAiBE,GAI7B,OAAOF,GAGXZ,cAAe,SAAUE,GACrB,IAAIhM,EAAO,GACX,IAAK,IAAIN,KAAKsM,EACD,MAALtM,GAAkB,SAALA,GAAqB,YAALA,GAAwB,UAALA,GAAsB,aAALA,GAAyB,YAALA,IAGzFM,EAAKN,GAAKsM,EAAUtM,IAExB,OAAOM,GAGXoM,OAAQ,SAAUX,EAAMU,GACXjB,EAAOiB,WACbU,YAAYpB,EAAK5C,KAAMsD,IAG9BU,YAAa,SAAUrE,EAAM2D,GACzB,IAAIX,EAAKN,EAAOiB,WAChB,GAAM3D,aAAgBhC,EAAtB,CACA,IAAIlD,EAAI,CACJrG,GAAIuL,EAAKvL,GACTiK,MAAOsB,EAAKtB,MACZI,SAAUkB,EAAKlB,UAWnB,GATMkB,EAAKpB,SACP9D,EAAEmH,SAAWjC,EAAKpB,OAAOnK,IAEzBuL,EAAKrB,SACL7D,EAAE6D,QAAS,GAETqB,EAAKpB,QAAUoB,EAAKpB,OAAOD,SACzB7D,EAAE+D,UAAYmB,EAAKnB,WAAanL,EAAUC,KAAO,OAAS,SAEjD,MAAbqM,EAAKxI,KAAc,CACnB,IAAIkM,EAAY1D,EAAKxI,KACrB,IAAK,IAAIN,KAAKwM,EACV5I,EAAE5D,GAAKwM,EAAUxM,GAGzByM,EAAWxM,KAAK2D,GAEhB,IADA,IAAIyH,EAAKvC,EAAKjB,SAAS9L,OACduC,EAAI,EAAGA,EAAI+M,EAAI/M,IACpBwN,EAAGqB,YAAYrE,EAAKjB,SAASvJ,GAAImO,MAK7CW,SAAU,CACN1B,QAAS,CACLC,KAAQ,CACJpK,KAAQ,0BACR0H,OAAUzN,EACV0N,QAAW3N,GAEfiQ,OAAU,WACVlL,KAAQ,wEAEZsL,SAAU,SAAUC,GAChB,IAAIC,EAAKN,EAAO4B,SACZrB,EAAO,IAAI/C,EACf+C,EAAKxK,KAAOsK,EAAOF,KAAKpK,KACxBwK,EAAK9C,OAAS4C,EAAOF,KAAK1C,OAC1B8C,EAAK7C,QAAU2C,EAAOF,KAAKzC,QAC3B,IAAImE,EAAMxB,EAAOvL,KACbgN,EAAUxB,EAAGyB,WAAWF,GACxBG,EAAW1B,EAAG2B,WAAWH,GAE7B,OADAxB,EAAG4B,WAAW3B,EAAM,KAAMyB,GACnBzB,GAGXE,SAAU,SAAUF,GAChB,IAAID,EAAKN,EAAO4B,SACZ7M,EAAO,GACXA,EAAKoL,KAAO,CACRpK,KAAMwK,EAAKxK,KACX0H,OAAQ8C,EAAK9C,OACbC,QAAS6C,EAAK7C,SAElB3I,EAAKiL,OAAS,WACd,IAAImC,EAAW,GAKf,OAJAA,EAAS1N,KAAK,yBACd6L,EAAG8B,UAAU7B,EAAK5C,KAAMwE,GACxBA,EAAS1N,KAAK,UACdM,EAAKD,KAAOqN,EAASzN,KAAK,KACnBK,GAGXgN,WAAY,SAAUF,GAClB,IAAIC,EAAU,KACVvO,OAAO8O,UAEPP,GADa,IAAIO,WACAC,gBAAgBT,EAAK,cAEtCC,EAAU,IAAIjO,cAAc,qBACpB0O,OAAQ,EAChBT,EAAQU,QAAQX,IAEpB,OAAOC,GAGXG,WAAY,SAAUH,GAKlB,IAJA,IAAIjE,EAAQiE,EAAQW,WAChBnF,EAAO,KAEPjL,EAAI,KACCS,EAAI,EAAGA,EAAI+K,EAAMtN,OAAQuC,IAE9B,GAAkB,IADlBT,EAAIwL,EAAM/K,IACJE,UAA8B,OAAbX,EAAEqQ,QAAkB,CACvCpF,EAAOjL,EACP,MAGR,GAAMiL,EAAM,CACR,IAAIqF,EAAKrF,EAAKmF,WACdnF,EAAO,KACP,IAASxK,EAAI,EAAGA,EAAI6P,EAAGpS,OAAQuC,IAE3B,GAAkB,IADlBT,EAAIsQ,EAAG7P,IACDE,UAA8B,QAAbX,EAAEqQ,QAAmB,CACxCpF,EAAOjL,EACP,OAIZ,OAAOiL,GAGX4E,WAAY,SAAU3B,EAAMpC,EAAayE,GACrC,IAAItC,EAAKN,EAAO4B,SACZiB,EAAUD,EAASE,aAAa,MAChCC,EAAaH,EAASE,aAAa,QAEvC,GAAkB,MAAdC,EAGA,IAFA,IAAIC,EAAiBJ,EAASH,WAC1BQ,EAAc,KACTnQ,EAAI,EAAGA,EAAIkQ,EAAezS,OAAQuC,IAEvC,GAA4B,IAD5BmQ,EAAcD,EAAelQ,IACbE,UAAyC,gBAAxBiQ,EAAYP,QAA2B,CACpEK,EAAaE,EAAYC,YACzB,MAIZ,IAAIlC,EAAYV,EAAG6C,iBAAiBP,GAChCQ,IAAiB,aAAcpC,IAAoC,QAAtBA,EAAU5E,gBACpD4E,EAAU5E,SAEjB,IAAIiH,EAAgBT,EAASE,aAAa,YACtCrB,EAAiB,KACf4B,IACF5B,EAAkC,QAAjB4B,EAA0BrS,EAAUC,KAAOD,EAAUG,OAE1E,IAAImM,EAAO,KAEPA,EADEa,EACKoC,EAAKrC,SAASC,EAAa0E,EAASE,EAAY/B,EAAWS,EAAgB2B,GAE3E7C,EAAKvC,SAAS6E,EAASE,EAAY/B,GAE9C,IAAI3E,EAAWuG,EAASH,WACpBa,EAAQ,KACZ,IAASxQ,EAAI,EAAGA,EAAIuJ,EAAS9L,OAAQuC,IAEX,IADtBwQ,EAAQjH,EAASvJ,IACPE,UAAkC,QAAjBsQ,EAAMZ,SAC7BpC,EAAG4B,WAAW3B,EAAMjD,EAAMgG,IAKtCH,iBAAkB,SAAUP,GAIxB,IAHA,IAAIvG,EAAWuG,EAASH,WACpBc,EAAO,KACPC,EAAY,GACP1Q,EAAI,EAAGA,EAAIuJ,EAAS9L,OAAQuC,IAEZ,IADrByQ,EAAOlH,EAASvJ,IACPE,UAAkC,cAAjBuQ,EAAKb,UAC3Bc,EAAUD,EAAKT,aAAa,SAAWS,EAAKT,aAAa,UAGjE,OAAOU,GAGXpB,UAAW,SAAU9E,EAAM6E,GACvB,IAAI7B,EAAKN,EAAO4B,SACZ6B,EAAM,KACJnG,EAAKpB,QAAUoB,EAAKpB,OAAOD,SAC7BwH,EAAMnG,EAAKnB,YAAcnL,EAAUC,KAAO,OAAS,SAEvDkR,EAAS1N,KAAK,SACd0N,EAAS1N,KAAK,OAAU6I,EAAKvL,GAAK,KAC5B0R,GACFtB,EAAS1N,KAAK,aAAgBgP,EAAM,KAExCtB,EAAS1N,KAAK,SAAY6I,EAAKtB,MAAQ,MAGvCmG,EAAS1N,KAAK,qCAA0C6I,EAAKlB,SAAW,OAGxE,IAAI4E,EAAY1D,EAAKxI,KACrB,GAAiB,MAAbkM,EACA,IAAK,IAAIxM,KAAKwM,EACVmB,EAAS1N,KAAK,oBAAuBD,EAAI,YAAgBwM,EAAUxM,GAAK,OAMhF,IADA,IAAI6H,EAAWiB,EAAKjB,SACXvJ,EAAI,EAAGA,EAAIuJ,EAAS9L,OAAQuC,IACjCwN,EAAG8B,UAAU/F,EAASvJ,GAAIqP,GAG9BA,EAAS1N,KAAK,cCrZnB,MAAMiP,EACThS,YAAYiS,GACRtT,KAAKsT,GAAKA,EAGdC,OACInT,EAAOG,MAAM,aAEjBiT,QACIpT,EAAOG,MAAM,cAEjBkT,KAAKC,GACD,IAAIzD,EAAK,KACLC,EAAO,KAoBX,MATU,eARFD,EAFiB,iBAAdyD,EACDA,EAAU/D,OACP+D,EAAU/D,OAEV,YAGJ,YAILO,EAAOP,EAAOiB,WAAWb,SAAS2D,GACrB,aAANzD,EACPC,EAAOP,EAAOC,UAAUG,SAAS2D,GACpB,YAANzD,EACPC,EAAOP,EAAO4B,SAASxB,SAAS2D,GAEhCtT,EAAOK,KAAK,sBAETyP,EAEXE,SAASuD,GACL,IAAIlP,EAAO,KAUX,MATmB,cAAfkP,EACAlP,EAAOkL,EAAOiB,WAAWR,SAASpQ,KAAKsT,GAAGpD,MACpB,aAAfyD,EACPlP,EAAOkL,EAAOC,UAAUQ,SAASpQ,KAAKsT,GAAGpD,MACnB,YAAfyD,EACPlP,EAAOkL,EAAO4B,SAASnB,SAASpQ,KAAKsT,GAAGpD,MAExC9P,EAAOI,MAAM,eAAiBmT,EAAc,WAEzClP,GChDR,MAAMmP,EACTvS,YAAYiS,EAAIO,GACZ7T,KAAK8T,KAAOD,EACZ7T,KAAKsT,GAAKA,EACVtT,KAAK+T,OAA4B,QAAlB/T,KAAK8T,KAAK3K,KACzBnJ,KAAKgU,OAAS,KAEdhU,KAAKiU,aAAc,EAEvBV,OACInT,EAAOG,MAAM,eAEjBiT,QACIpT,EAAOG,MAAM,gBACbP,KAAKgU,OAAS,CAAEhS,EAAG,EAAG6G,EAAG,EAAGvH,EAAG,EAAGyB,EAAG,GAEzCmR,+BAA+BjH,GAC3B,GAAIjN,KAAK+T,OACL,OAAOpT,EAAUG,MAKrB,IAHA,IAAIkL,EAAWiB,EAAKjB,UAAY,GAC5BmI,EAAenI,EAAS9L,OACxBkU,EAAI,EACC3R,EAAI,EAAGA,EAAI0R,EAAc1R,IAAWuJ,EAASvJ,GAAGqJ,YAAcnL,EAAUC,KAAQwT,IAAcA,IACvG,OAAQD,EAAe,GAAKC,EAAI,EAAKzT,EAAUC,KAAOD,EAAUG,MAEpE+I,SACIzJ,EAAOG,MAAM,iBACbP,KAAKqU,mBACLrU,KAAKsU,gBAETD,mBACIrU,KAAKuU,yBAETA,yBACI,IAAItH,EAAOjN,KAAKsT,GAAGpD,KAAK5C,KACpBkH,EAAc,KACd,WAAYvH,EAAKhB,MACjBuI,EAAcvH,EAAKhB,MAAMpC,QAEzB2K,EAAc,GACdvH,EAAKhB,MAAMpC,OAAS2K,GAExB,IAAIxI,EAAWiB,EAAKjB,SAChByI,EAAiBzI,EAAS9L,OAG9B,GAFAsU,EAAY1I,UAAYnL,EAAUE,OAClC2T,EAAYE,WAAa,EACrB1U,KAAK+T,OAEL,IADA,IAAItR,EAAIgS,EACDhS,KACHzC,KAAK2U,uBAAuB3I,EAASvJ,GAAI9B,EAAUG,MAAO2B,OAG9D,CAAIA,EAAIgS,EAER,IAFA,IACIG,EAAU,KACPnS,MACHmS,EAAU5I,EAASvJ,IACPqJ,WAAanL,EAAUC,KAC/BZ,KAAK2U,uBAAuBC,EAASjU,EAAUC,KAAM6B,GAErDzC,KAAK2U,uBAAuBC,EAASjU,EAAUG,MAAO2B,IAKtEkS,uBAAuB1H,EAAMnB,EAAW4I,GACpC,IAAIF,EAAc,KACd,WAAYvH,EAAKhB,MACjBuI,EAAcvH,EAAKhB,MAAMpC,QAEzB2K,EAAc,GACdvH,EAAKhB,MAAMpC,OAAS2K,GAExB,IAAIxI,EAAWiB,EAAKjB,SAChByI,EAAiBzI,EAAS9L,OAE9BsU,EAAY1I,UAAYA,EACxB0I,EAAYE,WAAaA,EAEzB,IADA,IAAIjS,EAAIgS,EACDhS,KACHzC,KAAK2U,uBAAuB3I,EAASvJ,GAAIqJ,EAAWrJ,GAG5D6R,gBACI,IAAIrH,EAAOjN,KAAKsT,GAAGpD,KAAK5C,KACpBkH,EAAcvH,EAAKhB,MAAMpC,OAC7B2K,EAAYK,SAAW,EACvBL,EAAYM,SAAW,EACvBN,EAAYO,aAAe,EAM3B,IALA,IAAI/I,EAAWiB,EAAKjB,SAChBvJ,EAAIuJ,EAAS9L,OACb8U,EAAa,GACbC,EAAc,GACdL,EAAU,KACPnS,MACHmS,EAAU5I,EAASvJ,IACPwJ,MAAMpC,OAAOiC,WAAanL,EAAUG,MAC5CmU,EAAYC,QAAQN,GAEpBI,EAAWE,QAAQN,GAG3BJ,EAAYQ,WAAaA,EACzBR,EAAYS,YAAcA,EAC1BT,EAAYW,kBAAoBnV,KAAKoV,wBAAwBJ,GAC7DR,EAAYa,mBAAqBrV,KAAKoV,wBAAwBH,GAC9DjV,KAAKgU,OAAOjR,EAAIkK,EAAKhB,MAAM5C,KAAKoD,MAAQ,EACxCzM,KAAKgU,OAAO1S,EAAI,EAAItB,KAAKgU,OAAOjR,EAChC/C,KAAKgU,OAAOhS,EAAI,EAChBhC,KAAKgU,OAAOnL,EAAIL,KAAK8M,IAAId,EAAYW,kBAAmBX,EAAYa,oBAGxED,wBAAwB5H,GASpB,IARA,IAAI+H,EAAe,EACfC,EAAchI,EAAMtN,OACpBuC,EAAI+S,EACJvI,EAAO,KACPwI,EAAoB,EACpBjB,EAAc,KACdkB,EAAS,EACTC,EAAK,KACFlT,KAEH+R,GADAvH,EAAOO,EAAM/K,IACMwJ,MAAMpC,OACf,MAAN8L,IACAA,EAAK1I,EAAKpB,OAAOI,OAGrBwJ,EAAoBzV,KAAKoV,wBAAwBnI,EAAKjB,UACjDiB,EAAKlB,WACN0J,EAAoB,EACpBzV,KAAK4V,YAAY3I,EAAKjB,UAAU,IAEpCyJ,EAAoBjN,KAAK8M,IAAIrI,EAAKhB,MAAM5C,KAAKqD,OAAQ+I,GAErDjB,EAAYO,aAAeU,EAC3BjB,EAAYM,SAAWY,EAASD,EAAoB,EACpDjB,EAAYK,SAAW7U,KAAK8T,KAAKhK,OAAS0K,EAAY1I,UAAY6J,EAAGtM,KAAKoD,OAASkJ,EAAG9L,OAAOiC,UAAY0I,EAAY1I,WAAa,EAC7HmB,EAAKpB,OAAOD,SACb4I,EAAYK,UAAY7U,KAAK8T,KAAK9J,OAASwK,EAAY1I,WAG3D4J,EAASA,EAASD,EAAoBzV,KAAK8T,KAAK/J,OAChDwL,GAAgBE,EAEhBD,EAAc,IACdD,GAAgBvV,KAAK8T,KAAK/J,QAAUyL,EAAc,IAEtD/S,EAAI+S,EAEJ,IADA,IAAIK,EAAgBN,EAAe,EAC5B9S,MACHwK,EAAOO,EAAM/K,IACRwJ,MAAMpC,OAAOiL,UAAYe,EAElC,OAAON,EAGXO,+BAA+BtI,GAS3B,IARA,IAAI+H,EAAe,EACfC,EAAchI,EAAMtN,OACpBuC,EAAI+S,EACJvI,EAAO,KACPwI,EAAoB,EACpBjB,EAAc,KACdkB,EAAS,EACTC,EAAK,KACFlT,KAEH+R,GADAvH,EAAOO,EAAM/K,IACMwJ,MAAMpC,OACf,MAAN8L,IACAA,EAAK1I,EAAKpB,OAAOI,OAGrBwJ,EAAoBzV,KAAK8V,+BAA+B7I,EAAKjB,UACxDiB,EAAKlB,WACN0J,EAAoB,GAExBA,EAAoBjN,KAAK8M,IAAIrI,EAAKhB,MAAM5C,KAAKqD,OAAQ+I,GAErDjB,EAAYO,aAAeU,EAC3BjB,EAAYM,SAAWY,EAASD,EAAoB,EACpDC,EAASA,EAASD,EAAoBzV,KAAK8T,KAAK/J,OAChDwL,GAAgBE,EAEhBD,EAAc,IACdD,GAAgBvV,KAAK8T,KAAK/J,QAAUyL,EAAc,IAEtD/S,EAAI+S,EAEJ,IADA,IAAIK,EAAgBN,EAAe,EAC5B9S,MACHwK,EAAOO,EAAM/K,IACRwJ,MAAMpC,OAAOiL,UAAYe,EAElC,OAAON,EAEXQ,gBAAgB9I,GACZ,IAAIuH,EAAcvH,EAAKhB,MAAMpC,OACzBmM,EAAe,KAOnB,GANK,aAAcxB,GAAgBxU,KAAKiU,YACpC+B,EAAexB,EAAYyB,UAE3BD,EAAe,CAAE5J,GAAI,EAAGE,GAAI,GAC5BkI,EAAYyB,SAAWD,IAEJ,GAAnBA,EAAa5J,IAA8B,GAAnB4J,EAAa1J,EAAS,CAC9C,IAAIF,EAAIoI,EAAYK,SAChBvI,EAAIkI,EAAYM,SACpB,IAAK7H,EAAKrB,OAAQ,CACd,IAAIsK,EAAWlW,KAAK+V,gBAAgB9I,EAAKpB,QACzCO,GAAK8J,EAAS9J,EACdE,GAAK4J,EAAS5J,EAElB0J,EAAa5J,EAAIA,EACjB4J,EAAa1J,EAAIA,EAErB,OAAO0J,EAEXG,eAAelJ,GACX,IAAImJ,EAAYnJ,EAAKhB,MAAM5C,KACvB6M,EAAWlW,KAAK+V,gBAAgB9I,GAChClN,EAAI,GAGR,OAFAA,EAAEqM,EAAI8J,EAAS9J,EAAIgK,EAAU3J,OAASQ,EAAKhB,MAAMpC,OAAOiC,UAAY,GAAK,EACzE/L,EAAEuM,EAAI4J,EAAS5J,EAAI8J,EAAU1J,OAAS,EAC/B3M,EAEXsW,kBAAkBpJ,GAEd,OADQjN,KAAK+V,gBAAgB9I,GAGjCqJ,mBAAmBrJ,GACf,IAAIuH,EAAcvH,EAAKhB,MAAMpC,OACzB0M,EAAa,KAOjB,GANK,WAAY/B,GAAgBxU,KAAKiU,YAClCsC,EAAa/B,EAAYgC,QAEzBD,EAAa,CAAEnK,GAAI,EAAGE,GAAI,GAC1BkI,EAAYgC,OAASD,IAEJ,GAAjBA,EAAWnK,IAA4B,GAAjBmK,EAAWjK,EACjC,GAAIW,EAAKrB,OACL2K,EAAWnK,EAAI,EACfmK,EAAWjK,EAAI,MACZ,CACH,IAAI8J,EAAYnJ,EAAKhB,MAAM5C,KACvB6M,EAAWlW,KAAK+V,gBAAgB9I,GACpCsJ,EAAWnK,EAAI8J,EAAS9J,GAAKgK,EAAU3J,MAAQzM,KAAK8T,KAAK9J,QAAUiD,EAAKhB,MAAMpC,OAAOiC,UACrFyK,EAAWjK,EAAI4J,EAAS5J,EAGhC,OAAOiK,EAEXE,mBAAmBxJ,GACf,IAAIlN,EAAIC,KAAKsW,mBAAmBrJ,GAC5ByJ,EAAO,GAOX,OANIzJ,EAAKhB,MAAMpC,OAAOiC,WAAanL,EAAUG,MACzC4V,EAAKtK,EAAIrM,EAAEqM,EAAIpM,KAAK8T,KAAK9J,OAEzB0M,EAAKtK,EAAIrM,EAAEqM,EAEfsK,EAAKpK,EAAIvM,EAAEuM,EAAI9D,KAAKmO,KAAK3W,KAAK8T,KAAK9J,OAAS,GACrC0M,EAEXE,eACI,IAAIpJ,EAAQxN,KAAKsT,GAAGpD,KAAK1C,MACrBP,EAAO,KACP4J,EAAO,KACX,IAAK,IAAInJ,KAAUF,EACfP,EAAOO,EAAME,IACbmJ,EAAO7W,KAAKsW,mBAAmBrJ,IACtBb,EAAIpM,KAAKgU,OAAOjR,IAAK/C,KAAKgU,OAAOjR,EAAI8T,EAAKzK,GAC/CyK,EAAKzK,EAAIpM,KAAKgU,OAAO1S,IAAKtB,KAAKgU,OAAO1S,EAAIuV,EAAKzK,GAEvD,MAAO,CACH9K,EAAGtB,KAAKgU,OAAOjR,EAAI/C,KAAKgU,OAAO1S,EAC/BgB,EAAGtC,KAAKgU,OAAOnL,EAAI7I,KAAKgU,OAAOhS,GAGvC8U,YAAY7J,GACJA,EAAKrB,SAGLqB,EAAKlB,SACL/L,KAAK+W,cAAc9J,GAEnBjN,KAAKgX,YAAY/J,IAGzB+J,YAAY/J,GACRA,EAAKlB,UAAW,EAChB/L,KAAKiX,YAAYhK,GACjBjN,KAAK4V,YAAY3I,EAAKjB,UAAU,GAChChM,KAAKsT,GAAG4D,oBAAoBnW,EAAUC,KAAM,CAAEkG,IAAK,cAAezC,KAAM,GAAIwI,KAAMA,EAAKvL,KAE3FqV,cAAc9J,GACVA,EAAKlB,UAAW,EAChB/L,KAAKiX,YAAYhK,GACjBjN,KAAK4V,YAAY3I,EAAKjB,UAAU,GAChChM,KAAKsT,GAAG4D,oBAAoBnW,EAAUC,KAAM,CAAEkG,IAAK,gBAAiBzC,KAAM,GAAIwI,KAAMA,EAAKvL,KAE7FyV,aACI,IAEIlK,EAFAO,EAAQxN,KAAKsT,GAAGpD,KAAK1C,MACrB5L,EAAI,EAER,IAAK,IAAI8L,KAAUF,GACfP,EAAOO,EAAME,IACH3B,WACNkB,EAAKlB,UAAW,EAChBnK,KAGR,GAAIA,EAAI,EAAG,CACP,IAAI0L,EAAOtN,KAAKsT,GAAGpD,KAAK5C,KACxBtN,KAAKiX,YAAY3J,GACjBtN,KAAK4V,YAAYtI,EAAKtB,UAAU,IAGxCoL,eACI,IAEInK,EAFAO,EAAQxN,KAAKsT,GAAGpD,KAAK1C,MACrB5L,EAAI,EAER,IAAK,IAAI8L,KAAUF,GACfP,EAAOO,EAAME,IACJ3B,WAAakB,EAAKrB,SACvBqB,EAAKlB,UAAW,EAChBnK,KAGR,GAAIA,EAAI,EAAG,CACP,IAAI0L,EAAOtN,KAAKsT,GAAGpD,KAAK5C,KACxBtN,KAAKiX,YAAY3J,GACjBtN,KAAK4V,YAAYtI,EAAKtB,UAAU,IAGxCqL,gBAAgBC,EAAcC,EAAYC,GACtC,KAAIF,EAAe,GAKnB,IAJA,IAAI9J,EAAQ+J,GAAcvX,KAAKsT,GAAGpD,KAAK5C,KAAKtB,SACxCyL,EAAQD,GAAc,EACtB/U,EAAI+K,EAAMtN,OACV+M,EAAO,KACJxK,KACHwK,EAAOO,EAAM/K,GACTgV,EAAQH,IACHrK,EAAKlB,UACN/L,KAAKgX,YAAY/J,GAErBjN,KAAKqX,gBAAgBC,EAAcrK,EAAKjB,SAAUyL,EAAQ,IAE1DA,GAASH,GACLrK,EAAKlB,UACL/L,KAAK+W,cAAc9J,GAKnCgK,YAAYhK,GACR,IAAIK,EAAOtN,KAAKsT,GAAGpD,KAAK5C,KACxB,GAAMA,EAAM,CACR,IAAIoK,EAAmBpK,EAAKrB,MAAMpC,OAC9BoD,EAAKrB,QACL8L,EAAiBrC,mBAAqBrV,KAAK8V,+BAA+B4B,EAAiBzC,aAC3FyC,EAAiBvC,kBAAoBnV,KAAK8V,+BAA+B4B,EAAiB1C,aAEtF/H,EAAKhB,MAAMpC,OAAOiC,WAAanL,EAAUG,MACzC4W,EAAiBrC,mBAAqBrV,KAAK8V,+BAA+B4B,EAAiBzC,aAE3FyC,EAAiBvC,kBAAoBnV,KAAK8V,+BAA+B4B,EAAiB1C,YAGlGhV,KAAKgU,OAAOnL,EAAIL,KAAK8M,IAAIoC,EAAiBvC,kBAAmBuC,EAAiBrC,oBAC9ErV,KAAKiU,aAAc,OAEnB7T,EAAOK,KAAK,2BAGpBmV,YAAYpI,EAAOmK,GAIf,IAHA,IAAIlV,EAAI+K,EAAMtN,OACV+M,EAAO,KAEJxK,MACHwK,EAAOO,EAAM/K,IACMwJ,MAAMpC,OACrBoD,EAAKlB,SACL/L,KAAK4V,YAAY3I,EAAKjB,SAAU2L,GAEhC3X,KAAK4V,YAAY3I,EAAKjB,UAAU,GAE/BiB,EAAKrB,SACNqB,EAAKhB,MAAMpC,OAAO8N,QAAUA,GAIxCC,UAAU3K,GACN,OAAOA,EAAKlB,SAEhB8L,WAAW5K,GACP,IAAIuH,EAAcvH,EAAKhB,MAAMpC,OAC7B,QAAK,YAAa2K,IAAiBA,EAAYmD,UC3YvD,MAAMG,EACFzW,YAAYgI,GACRrJ,KAAKqJ,KAAOA,EACZrJ,KAAK8T,KAAOzK,EAAKyK,KACjB9T,KAAK+X,MAAQD,EAAUlW,EAAE,OACzB5B,KAAK+X,MAAMC,aAAa,QAAS,UACjChY,KAAKiY,KAAO,CAAE3W,EAAG,EAAGgB,EAAG,GACvBtC,KAAKkY,MAAQ,GAEjBvL,SAAS9K,GACL,OAAOT,EAAEG,EAAE4W,gBAAgB,6BAA8BtW,GAE7DuW,UACI,OAAOpY,KAAK+X,MAEhBM,SAAS/W,EAAGgB,GACRtC,KAAKiY,KAAK3W,EAAIA,EACdtB,KAAKiY,KAAK3V,EAAIA,EACdtC,KAAK+X,MAAMC,aAAa,QAAS1W,GACjCtB,KAAK+X,MAAMC,aAAa,SAAU1V,GAEtCgW,QAEI,IADA,IAAIvJ,EAAM/O,KAAKkY,MAAMhY,OACd6O,KACH/O,KAAK+X,MAAMzQ,YAAYtH,KAAKkY,MAAMnJ,IAEtC/O,KAAKkY,MAAMhY,OAAS,EAExBqY,UAAU1B,EAAM2B,EAAKC,GACjB,IAAIC,EAAOZ,EAAUlW,EAAE,QACvB8W,EAAKV,aAAa,SAAUhY,KAAK8T,KAAKpK,YACtCgP,EAAKV,aAAa,eAAgBhY,KAAK8T,KAAKrK,YAC5CiP,EAAKV,aAAa,OAAQ,eAC1BhY,KAAKkY,MAAM9T,KAAKsU,GAChB1Y,KAAK+X,MAAM3V,YAAYsW,GACvB1Y,KAAK2Y,WAAWD,EAAMF,EAAIpM,EAAIqM,EAAOrM,EAAGoM,EAAIlM,EAAImM,EAAOnM,EAAGuK,EAAKzK,EAAIqM,EAAOrM,EAAGyK,EAAKvK,EAAImM,EAAOnM,GAEjGsM,QAAQC,EAAiB9U,GACrB,IAAI+U,EAAM,IAAIC,MACdD,EAAItT,OAAS,WACTqT,EAAgBG,UAAUF,EAAK,EAAG,GAChC/U,GAAYA,KAElB+U,EAAIG,IAAM,6BAA+BC,MAAK,IAAIC,eAAgBC,kBAAkBpZ,KAAK+X,QAE7FY,WAAWU,EAAMC,EAAIC,EAAIC,EAAIC,GACzBJ,EAAKrB,aAAa,IAAK,IAAMsB,EAAK,IAAMC,EAAK,OAASD,EAAiB,GAAXE,EAAKF,GAAU,GAAK,IAAMC,EAAK,KAAOD,EAAK,IAAMG,EAAK,KAAOD,EAAK,IAAMC,GAExIC,SAASL,EAAMC,EAAIC,EAAIC,EAAIC,GACvBJ,EAAKrB,aAAa,IAAK,KAAOsB,EAAK,IAAMC,EAAK,MAAQC,EAAK,IAAMC,IAuDlE,MAAME,EAAQ,CAAEC,IAAK9B,EAAW+B,OAlDvC,MACIxY,YAAYgI,GACRrJ,KAAK8T,KAAOzK,EAAKyK,KACjB9T,KAAK8Z,SAAW1Y,EAAEQ,EAAE,UACpB5B,KAAK8Z,SAASC,UAAY,SAC1B/Z,KAAKga,WAAaha,KAAK8Z,SAASG,WAAW,MAC3Cja,KAAKiY,KAAO,CAAE3W,EAAG,EAAGgB,EAAG,GAE3B8V,UACI,OAAOpY,KAAK8Z,SAEhBzB,SAAS/W,EAAGgB,GACRtC,KAAKiY,KAAK3W,EAAIA,EACdtB,KAAKiY,KAAK3V,EAAIA,EACdtC,KAAK8Z,SAASrN,MAAQnL,EACtBtB,KAAK8Z,SAASpN,OAASpK,EAE3BgW,QACItY,KAAKga,WAAWE,UAAU,EAAG,EAAGla,KAAKiY,KAAK3W,EAAGtB,KAAKiY,KAAK3V,GAE3DiW,UAAU1B,EAAM2B,EAAKC,GACjB,IAAI0B,EAAMna,KAAKga,WACfG,EAAIC,YAAcpa,KAAK8T,KAAKpK,WAC5ByQ,EAAIE,UAAYra,KAAK8T,KAAKrK,WAC1B0Q,EAAIG,QAAU,QAEdta,KAAK2Y,WAAWwB,EACZ3B,EAAIpM,EAAIqM,EAAOrM,EACfoM,EAAIlM,EAAImM,EAAOnM,EACfuK,EAAKzK,EAAIqM,EAAOrM,EAChByK,EAAKvK,EAAImM,EAAOnM,GAExBsM,QAAQC,EAAiB9U,GACrB8U,EAAgBG,UAAUhZ,KAAK8Z,SAAU,EAAG,GAC1C/V,GAAYA,IAElB4U,WAAWwB,EAAKb,EAAIC,EAAIC,EAAIC,GACxBU,EAAII,YACJJ,EAAIK,OAAOlB,EAAIC,GACfY,EAAIM,cAAcnB,EAAiB,GAAXE,EAAKF,GAAU,EAAGC,EAAID,EAAIG,EAAID,EAAIC,GAC1DU,EAAIO,SAERhB,SAASS,EAAKb,EAAIC,EAAIC,EAAIC,GACtBU,EAAII,YACJJ,EAAIK,OAAOlB,EAAIC,GACfY,EAAIQ,OAAOnB,EAAIC,GACfU,EAAIO,YClGL,MAAME,EACTvZ,YAAYiS,EAAIO,GACZ7T,KAAK8T,KAAOD,EACZ7T,KAAKsT,GAAKA,EACVtT,KAAK6J,OAASyJ,EAAGzJ,OAEjB7J,KAAKgJ,UAAY,KACjBhJ,KAAK6a,QAAU,KACf7a,KAAK8a,QAAU,KAEf9a,KAAKiY,KAAO,CAAE3W,EAAG,EAAGgB,EAAG,GAEvBtC,KAAK+a,cAAgB,KACrB/a,KAAKgb,aAAe,KAEpBhb,KAAK2Z,MAAQ,KAEjBpG,OAII,GAHAnT,EAAOG,MAAM,aAEbP,KAAKgJ,UAAY5H,EAAEqB,EAAEzC,KAAK8T,KAAK9K,WAAahJ,KAAK8T,KAAK9K,UAAY5H,EAAEK,EAAEzB,KAAK8T,KAAK9K,WAC3EhJ,KAAKgJ,UAAV,CAIAhJ,KAAK6a,QAAUzZ,EAAEQ,EAAE,OACnB5B,KAAK8a,QAAU1Z,EAAEQ,EAAE,WACnB5B,KAAKib,SAAW7Z,EAAEQ,EAAE,SAEpB5B,KAAK2Z,MAA2C,QAAnC3Z,KAAK8T,KAAKxK,OAAOnB,cAA0B,IAAIwR,EAAMC,IAAI5Z,MAAQ,IAAI2Z,EAAME,OAAO7Z,MAE/FA,KAAK6a,QAAQd,UAAY,eACzB/Z,KAAK6a,QAAQK,SAAW,EACxBlb,KAAK6a,QAAQzY,YAAYpC,KAAK2Z,MAAMvB,WACpCpY,KAAK6a,QAAQzY,YAAYpC,KAAK8a,SAE9B9a,KAAKib,SAASlB,UAAY,gBAC1B/Z,KAAKib,SAASpV,KAAO,OAErB7F,KAAKmb,WAAa,EAClBnb,KAAKob,SAAW,GAChBpb,KAAKqb,QAAU,GACfrb,KAAKsb,QAAU,EAEf,IAAIC,EAAIvb,KACRoB,EAAE0B,GAAG9C,KAAKib,SAAU,WAAW,SAAUlY,GACrC,IAAImE,EAAMnE,GAAKyY,MACI,IAAftU,EAAIuU,UAAiBF,EAAEG,gBAAiBxU,EAAIyU,sBAEpDva,EAAE0B,GAAG9C,KAAKib,SAAU,QAAQ,SAAUlY,GAClCwY,EAAEG,mBAGN1b,KAAKgJ,UAAU5G,YAAYpC,KAAK6a,SAEhC7a,KAAK4b,+BAjCDxb,EAAOI,MAAM,sDAmCrBqb,UAAUC,EAAKC,EAAYC,GACvB5a,EAAE0B,GAAG9C,KAAK8a,QAASiB,GAAY,SAAUhZ,GACrC,IAAImE,EAAMnE,GAAKyY,MACfQ,EAAa9T,KAAK4T,EAAK5U,MAG/B+U,kBAAkB7D,GACd,GAAe,MAAXA,EACA,OAAO,KAEX,IAAI/F,EAAU+F,EAAQ/F,QAAQlK,cAC9B,MAAe,WAAXkK,GAAmC,QAAXA,GAAgC,QAAXA,EACtC,KAEI,UAAXA,GAAkC,cAAXA,EAChB+F,EAAQ3F,aAAa,UAErBzS,KAAKic,kBAAkB7D,EAAQ8D,eAG9CC,YAAY/D,GACR,MAAyC,cAAjCA,EAAQ/F,QAAQlK,cAE5BqL,QACIpT,EAAOG,MAAM,cACbP,KAAK+a,cAAgB,KACrB/a,KAAKoc,cACLpc,KAAKqc,cACLrc,KAAKsc,cAETA,cACI,IAAIC,EAAavc,KAAKsT,GAAGO,QAAQ3K,MAE7BlJ,KAAK8a,QAAQf,UADXwC,EACuB,SAAWA,EAEX,GAGjCC,qBACI,IAAIhP,EAAQxN,KAAKsT,GAAGpD,KAAK1C,MACzB,IAAK,IAAIE,KAAUF,EACfxN,KAAKyc,wBAAwBjP,EAAME,IAG3C+F,OACIrT,EAAOG,MAAM,aACbP,KAAK0c,aAETC,cACI,IAAIC,EAAW5c,KAAK6J,OAAO+M,eACvBiG,EAAYD,EAAStb,EAAwB,EAApBtB,KAAK8T,KAAKvK,QACnCuT,EAAaF,EAASta,EAAwB,EAApBtC,KAAK8T,KAAKtK,QACpCuT,EAAW/c,KAAK6a,QAAQmC,YACxBC,EAAWjd,KAAK6a,QAAQqC,aACxBH,EAAWF,IAAaE,EAAWF,GACnCI,EAAWH,IAAcG,EAAWH,GACxC9c,KAAKiY,KAAK3W,EAAIyb,EACd/c,KAAKiY,KAAK3V,EAAI2a,EAElBE,gBAAgBlQ,GACZ,IAAImJ,EAAYnJ,EAAKhB,MAAM5C,KAC3B+M,EAAU3J,MAAQ2J,EAAUgC,QAAQ4E,YACpC5G,EAAU1J,OAAS0J,EAAUgC,QAAQ8E,aAEzCR,aACI,IAAIlP,EAAQxN,KAAKsT,GAAGpD,KAAK1C,MACrB4P,EAAWhc,EAAEG,EAAE8b,yBACnB,IAAK,IAAI3P,KAAUF,EACfxN,KAAKsd,oBAAoB9P,EAAME,GAAS0P,GAG5C,IAAK,IAAI1P,KADT1N,KAAK8a,QAAQ1Y,YAAYgb,GACN5P,EACfxN,KAAKmd,gBAAgB3P,EAAME,IAGnCG,SAASZ,GACLjN,KAAKsd,oBAAoBrQ,EAAMjN,KAAK8a,SACpC9a,KAAKmd,gBAAgBlQ,GAEzBqQ,oBAAoBrQ,EAAMa,GACtB,IAAIsI,EAAY,KACZ,SAAUnJ,EAAKhB,MACfmK,EAAYnJ,EAAKhB,MAAM5C,MAEvB+M,EAAY,GACZnJ,EAAKhB,MAAM5C,KAAO+M,GAGtB,IAAI7U,EAAIH,EAAEQ,EAAE,UACZ,GAAIqL,EAAKrB,OACLrK,EAAEwY,UAAY,WACX,CACH,IAAIwD,EAAMnc,EAAEQ,EAAE,cACdR,EAAEW,EAAEwb,EAAK,KACTA,EAAIvF,aAAa,SAAU/K,EAAKvL,IAChC6b,EAAI3a,MAAMkE,WAAa,SACvBgH,EAAY1L,YAAYmb,GACxBnH,EAAUoH,SAAWD,EAEnBtQ,EAAKtB,QACH3L,KAAK8T,KAAK1K,aACVhI,EAAEkB,EAAEf,EAAG0L,EAAKtB,OAEZvK,EAAEW,EAAER,EAAG0L,EAAKtB,QAGpBpK,EAAEyW,aAAa,SAAU/K,EAAKvL,IAC9BH,EAAEqB,MAAMkE,WAAa,SACrB9G,KAAKyd,yBAAyBlc,EAAG0L,EAAKxI,MAEtCqJ,EAAY1L,YAAYb,GACxB6U,EAAUgC,QAAU7W,EAExBgO,YAAYtC,GACkB,MAAtBjN,KAAK+a,eAAyB/a,KAAK+a,cAAcrZ,IAAMuL,EAAKvL,KAC5D1B,KAAK+a,cAAgB,MAEA,MAArB/a,KAAKgb,cAAwBhb,KAAKgb,aAAatZ,IAAMuL,EAAKvL,KAC1DuL,EAAKhB,MAAM5C,KAAK+O,QAAQ9Q,YAAYtH,KAAKib,UACzCjb,KAAKgb,aAAe,MAIxB,IAFA,IAAIhP,EAAWiB,EAAKjB,SAChBvJ,EAAIuJ,EAAS9L,OACVuC,KACHzC,KAAKuP,YAAYvD,EAASvJ,IAE9B,GAAIwK,EAAKhB,MAAM5C,KAAM,CACjB,IAAI+O,EAAUnL,EAAKhB,MAAM5C,KAAK+O,QAC1BoF,EAAWvQ,EAAKhB,MAAM5C,KAAKmU,SAC/Bxd,KAAK8a,QAAQxT,YAAY8Q,GACzBpY,KAAK8a,QAAQxT,YAAYkW,GACzBvQ,EAAKhB,MAAM5C,KAAK+O,QAAU,KAC1BnL,EAAKhB,MAAM5C,KAAKmU,SAAW,MAGnCE,YAAYzQ,GACR,IAAImJ,EAAYnJ,EAAKhB,MAAM5C,KACvB+O,EAAUhC,EAAUgC,QAClBnL,EAAKtB,QACH3L,KAAK8T,KAAK1K,aACVhI,EAAEkB,EAAE8V,EAASnL,EAAKtB,OAElBvK,EAAEW,EAAEqW,EAASnL,EAAKtB,QAG1ByK,EAAU3J,MAAQ2L,EAAQ4E,YAC1B5G,EAAU1J,OAAS0L,EAAQ8E,aAE/BS,YAAY1Q,GACFjN,KAAK+a,gBACP/a,KAAK+a,cAAc9O,MAAM5C,KAAK+O,QAAQ2B,UAClC/Z,KAAK+a,cAAc9O,MAAM5C,KAAK+O,QAAQ2B,UAAUjR,QAAQ,iBAAkB,IAC9E9I,KAAKyc,wBAAwBzc,KAAK+a,gBAEhC9N,IACFjN,KAAK+a,cAAgB9N,EACrBA,EAAKhB,MAAM5C,KAAK+O,QAAQ2B,WAAa,YACrC/Z,KAAK4d,wBAAwB3Q,IAGrC4Q,eACI7d,KAAK2d,YAAY,MAErBG,mBACI,OAAO9d,KAAKgb,aAEhB+C,aACI,QAAU/d,KAAKgb,aAEnBgD,gBAAgB/Q,GACZ,GAAKA,EAAKtB,MAAV,CAIyB,MAArB3L,KAAKgb,cACLhb,KAAK0b,gBAET1b,KAAKgb,aAAe/N,EACpB,IACImL,EADYnL,EAAKhB,MAAM5C,KACH+O,QACpBzM,EAAQsB,EAAKtB,MACbsS,EAAMC,iBAAiB9F,GAC3BpY,KAAKib,SAASkD,MAAQxS,EACtB3L,KAAKib,SAASrY,MAAM6J,MAAS2L,EAAQ4E,YAAcoB,SAASH,EAAII,iBAAiB,iBAAmBD,SAASH,EAAII,iBAAiB,kBAAqB,KACvJjG,EAAQ5V,UAAY,GACpB4V,EAAQhW,YAAYpC,KAAKib,UACzB7C,EAAQxV,MAAM0b,OAAS,EACvBte,KAAKib,SAASsD,QACdve,KAAKib,SAAS9Z,cAjBVf,EAAOK,KAAK,0BAmBpBib,gBACI,GAAyB,MAArB1b,KAAKgb,aAAsB,CAC3B,IAAI/N,EAAOjN,KAAKgb,aAChBhb,KAAKgb,aAAe,KACpB,IACI5C,EADYnL,EAAKhB,MAAM5C,KACH+O,QACpBzM,EAAQ3L,KAAKib,SAASkD,MAC1B/F,EAAQxV,MAAM0b,OAAS,OACvBlG,EAAQ9Q,YAAYtH,KAAKib,UACrB9X,EAAKwF,KAAKC,SAAS+C,IAAUsB,EAAKtB,QAAUA,EACxC3L,KAAK8T,KAAK1K,aACVhI,EAAEkB,EAAE8V,EAASnL,EAAKtB,OAElBvK,EAAEW,EAAEqW,EAASnL,EAAKtB,OAGtB3L,KAAKsT,GAAGoK,YAAYzQ,EAAKvL,GAAIiK,GAGrC3L,KAAK6a,QAAQ0D,QAEjBC,kBACI,IAAIxK,EAAShU,KAAK6J,OAAOmK,OAGzB,MAAO,CAAE5H,GAFCpM,KAAKiY,KAAK3W,EAAI0S,EAAOjR,EAAIiR,EAAO1S,GAAK,EAE/BgL,EADPtM,KAAKiY,KAAK3V,EAAI,GAG3BrB,SACIjB,KAAK2Z,MAAMtB,SAAS,EAAG,GACvBrY,KAAK8a,QAAQlY,MAAM6J,MAAQ,MAC3BzM,KAAK8a,QAAQlY,MAAM8J,OAAS,MAE5B1M,KAAK2c,cACL3c,KAAKye,QAETA,QACIze,KAAK2Z,MAAMtB,SAASrY,KAAKiY,KAAK3W,EAAGtB,KAAKiY,KAAK3V,GAC3CtC,KAAK8a,QAAQlY,MAAM6J,MAAQzM,KAAKiY,KAAK3W,EAAI,KACzCtB,KAAK8a,QAAQlY,MAAM8J,OAAS1M,KAAKiY,KAAK3V,EAAI,KAC1CtC,KAAK0e,aACL1e,KAAK2e,aAEL3e,KAAKsT,GAAG4D,oBAAoBnW,EAAUE,OAAQ,CAAEwD,KAAM,KAE1Dma,SACI,OAAO5e,KAAK6e,QAAQ7e,KAAKmb,WAAanb,KAAKob,UAE/C0D,UACI,OAAO9e,KAAK6e,QAAQ7e,KAAKmb,WAAanb,KAAKob,UAE/CyD,QAAQE,GACJ,GAAKA,EAAO/e,KAAKqb,SAAa0D,EAAO/e,KAAKsb,QACtC,OAAO,EAEXtb,KAAKmb,WAAa4D,EAClB,IAAK,IAAItc,EAAI,EAAGA,EAAIzC,KAAK6a,QAAQ7O,SAAS9L,OAAQuC,IAC9CzC,KAAK6a,QAAQ7O,SAASvJ,GAAGG,MAAMoc,UAAY,SAAWD,EAAO,IAGjE,OADA/e,KAAKgB,MAAK,IACH,EAGXie,eAEI,IAAIC,EAAUlf,KAAK6a,QAAQmC,YACvBmC,EAAUnf,KAAK6a,QAAQqC,aAC3B,GAAIld,KAAKiY,KAAK3W,EAAI4d,EAAS,CACvB,IAAIE,EAAUpf,KAAKwe,kBACnBxe,KAAK6a,QAAQwE,WAAaD,EAAQhT,EAAI8S,EAAU,EAEhDlf,KAAKiY,KAAK3V,EAAI6c,IACdnf,KAAK6a,QAAQyE,WAAatf,KAAKiY,KAAK3V,EAAI6c,GAAW,GAG3Dne,KAAKue,GACDnf,EAAOG,MAAM,aACbP,KAAK2c,cACL3c,KAAKye,QACCc,GACFvf,KAAKif,eAGbO,WACIxf,KAAK2c,cACL3c,KAAKye,QAETgB,cAAcxS,GACV,IAAId,EAAKc,EAAKhB,MAAM5C,KACpB8C,EAAGuT,gBAAkB,CACjBtT,EAAGgS,SAASjS,EAAGiM,QAAQxV,MAAMhC,MAAQZ,KAAK6a,QAAQwE,WAClD/S,EAAG8R,SAASjS,EAAGiM,QAAQxV,MAAM+c,KAAO3f,KAAK6a,QAAQyE,WAGzDM,iBAAiB3S,GACb,IAAId,EAAKc,EAAKhB,MAAM5C,KACpBrJ,KAAK6a,QAAQwE,WAAajB,SAASjS,EAAGiM,QAAQxV,MAAMhC,MAAQuL,EAAGuT,gBAAgBtT,EAC/EpM,KAAK6a,QAAQyE,UAAYlB,SAASjS,EAAGiM,QAAQxV,MAAM+c,KAAOxT,EAAGuT,gBAAgBpT,EAEjF+P,cACI,IAAInM,EAAOlQ,KAAKsT,GAAGpD,KACnB,GAAY,MAARA,EAAJ,CAGA,IAAI1C,EAAQ0C,EAAK1C,MACbP,EAAO,KACX,IAAK,IAAIS,KAAUF,GACfP,EAAOO,EAAME,IACRzB,MAAM5C,KAAK+O,QAAU,KAC1BnL,EAAKhB,MAAM5C,KAAKmU,SAAW,KAE/Bxd,KAAK8a,QAAQtY,UAAY,IAE7Bkc,aACI,IAAIlR,EAAQxN,KAAKsT,GAAGpD,KAAK1C,MACrBP,EAAO,KACP4S,EAAe,KACfrC,EAAW,KACXzd,EAAI,KACJ+f,EAAa,KACbC,EAAgB,IAChB3J,EAAY,KACZgJ,EAAUpf,KAAKwe,kBACnB,IAAK,IAAI9Q,KAAUF,EAGfqS,GADAzJ,GADAnJ,EAAOO,EAAME,IACIzB,MAAM5C,MACE+O,QACzBoF,EAAWpH,EAAUoH,SAChBxd,KAAK6J,OAAOgO,WAAW5K,IAK5BjN,KAAKyc,wBAAwBxP,GAC7BlN,EAAIC,KAAK6J,OAAOsM,eAAelJ,GAC/BmJ,EAAU/J,MAAQ+S,EAAQhT,EAAIrM,EAAEqM,EAChCgK,EAAU7J,MAAQ6S,EAAQ9S,EAAIvM,EAAEuM,EAChCuT,EAAajd,MAAMhC,KAAQwe,EAAQhT,EAAIrM,EAAEqM,EAAK,KAC9CyT,EAAajd,MAAM+c,IAAOP,EAAQ9S,EAAIvM,EAAEuM,EAAK,KAC7CuT,EAAajd,MAAMod,QAAU,GAC7BH,EAAajd,MAAMkE,WAAa,WAC3BmG,EAAKrB,QAAUqB,EAAKjB,SAAS9L,OAAS,IACvC6f,EAAgB9S,EAAKlB,SAAW,IAAM,IACtC+T,EAAa9f,KAAK6J,OAAO4M,mBAAmBxJ,GAC5CuQ,EAAS5a,MAAMhC,KAAQwe,EAAQhT,EAAI0T,EAAW1T,EAAK,KACnDoR,EAAS5a,MAAM+c,IAAOP,EAAQ9S,EAAIwT,EAAWxT,EAAK,KAClDkR,EAAS5a,MAAMod,QAAU,GACzBxC,EAAS5a,MAAMkE,WAAa,UAC5B1F,EAAEW,EAAEyb,EAAUuC,IAGb9S,EAAKrB,QAAkC,GAAxBqB,EAAKjB,SAAS9L,SAC9Bsd,EAAS5a,MAAMod,QAAU,OACzBxC,EAAS5a,MAAMkE,WAAa,YAxB5B+Y,EAAajd,MAAMod,QAAU,OAC7BxC,EAAS5a,MAAMod,QAAU,QA2BrCvD,wBAAwBxP,GACpBjN,KAAKyd,yBAAyBxQ,EAAKhB,MAAM5C,KAAK+O,QAASnL,EAAKxI,MAEhEgZ,yBAAyBoC,EAAclP,GAsBnC,GArBI,qBAAsBA,IACtBkP,EAAajd,MAAMqd,gBAAkBtP,EAAU,qBAE/C,qBAAsBA,IACtBkP,EAAajd,MAAMsd,MAAQvP,EAAU,qBAErC,UAAWA,IACXkP,EAAajd,MAAM6J,MAAQkE,EAAiB,MAAI,MAEhD,WAAYA,IACZkP,EAAajd,MAAM8J,OAASiE,EAAkB,OAAI,MAElD,cAAeA,IACfkP,EAAajd,MAAMud,SAAWxP,EAAU,aAAe,MAEvD,gBAAiBA,IACjBkP,EAAajd,MAAMwd,WAAazP,EAAU,gBAE1C,eAAgBA,IAChBkP,EAAajd,MAAMyd,UAAY1P,EAAU,eAEzC,qBAAsBA,EAAW,CACjC,IAAI2P,EAAkB3P,EAAU,oBAChC,GAAI2P,EAAgBxgB,WAAW,SAAW6Q,EAAiB,OAAKA,EAAkB,OAAG,CACjF,IAAImI,EAAM,IAAIC,MAEdD,EAAItT,OAAS,WACT,IAAI5D,EAAIR,EAAEQ,EAAE,UACZA,EAAE6K,MAAQoT,EAAa7C,YACvBpb,EAAE8K,OAASmT,EAAa3C,aAExB,GAAItb,EAAEqY,WAAY,CACJrY,EAAEqY,WAAW,MACnBjB,UAHEhZ,KAGa,EAAG,EAAG6f,EAAa7C,YAAa6C,EAAa3C,cAChE,IAAIqD,EAAkB3e,EAAE4e,YACxBX,EAAajd,MAAM0d,gBAAkB,OAASC,EAAkB,MAGxEzH,EAAIG,IAAMqH,OAGVT,EAAajd,MAAM0d,gBAAkB,OAASA,EAAkB,IAEpET,EAAajd,MAAM6d,eAAiB,MAEhC,wBAAyB9P,IACzBkP,EAAajd,MAAMoc,UAAY,UAAYrO,EAAU,uBAAyB,SAI1FiN,wBAAwB3Q,GACpB,IAAI4S,EAAe5S,EAAKhB,MAAM5C,KAAK+O,QACnCyH,EAAajd,MAAMqd,gBAAkB,GACrCJ,EAAajd,MAAMsd,MAAQ,GAE/B9D,cACIpc,KAAK2Z,MAAMrB,QAEfqG,aACI3e,KAAKoc,cACL,IAAI5O,EAAQxN,KAAKsT,GAAGpD,KAAK1C,MACrBP,EAAO,KACPuL,EAAM,KACN3B,EAAO,KACPuI,EAAUpf,KAAKwe,kBACnB,IAAK,IAAI9Q,KAAUF,GACfP,EAAOO,EAAME,IACF9B,QACN,YAAaqB,EAAKhB,MAAMpC,SAAYoD,EAAKhB,MAAMpC,OAAO8N,UAC3Da,EAAMxY,KAAK6J,OAAOwM,kBAAkBpJ,GACpC4J,EAAO7W,KAAK6J,OAAOyM,mBAAmBrJ,EAAKpB,QAC3C7L,KAAK2Z,MAAMpB,UAAU1B,EAAM2B,EAAK4G,IAIxCxD,0BAEI,GAAI5b,KAAK8T,KAAKnK,UAAW,CAErB,IACIyC,EAAGE,EADHoU,GAAW,EAEX1gB,KAAK8T,KAAKlK,iCAEV5J,KAAK6a,QAAQjY,MAAQ,oBAGzBxB,EAAE0B,GAAG9C,KAAKgJ,UAAW,aAAc2X,IAC/BD,GAAW,EAEXtU,EAAIuU,EAAUC,QACdtU,EAAIqU,EAAUE,WAGlBzf,EAAE0B,GAAG9C,KAAKgJ,UAAW,WAAW,KAC5B0X,GAAW,KAGftf,EAAE0B,GAAG9C,KAAKgJ,UAAW,aAAc8X,IAC3BJ,IACA1gB,KAAK6a,QAAQkG,SAAS3U,EAAI0U,EAAUF,QAAStU,EAAIwU,EAAUD,SAE3DzU,EAAI0U,EAAUF,QACdtU,EAAIwU,EAAUD,cC7f3B,MAAMG,EACT3f,YAAYiS,EAAIO,GACZ7T,KAAKsT,GAAKA,EACVtT,KAAK8T,KAAOD,EACZ7T,KAAKyK,QAAUoJ,EAAQpJ,QACvBzK,KAAKwK,QAAUqJ,EAAQrJ,QACvBxK,KAAKihB,OAAS,KACdjhB,KAAKkhB,SAAW,GAEpB3N,OAaI,IAAK,IAAI4N,KAZT/f,EAAE0B,GAAG9C,KAAKsT,GAAGjK,KAAKwR,QAAS,UAAW7a,KAAKohB,QAAQC,KAAKrhB,OAExDA,KAAKwK,QAAkB,SAAIxK,KAAKshB,gBAChCthB,KAAKwK,QAAoB,WAAIxK,KAAKuhB,kBAClCvhB,KAAKwK,QAAkB,SAAIxK,KAAKwhB,gBAChCxhB,KAAKwK,QAAiB,QAAIxK,KAAKyhB,eAC/BzhB,KAAKwK,QAAgB,OAAIxK,KAAK0hB,cAC9B1hB,KAAKwK,QAAY,GAAIxK,KAAK2hB,UAC1B3hB,KAAKwK,QAAc,KAAIxK,KAAK4hB,YAC5B5hB,KAAKwK,QAAc,KAAIxK,KAAK6hB,YAC5B7hB,KAAKwK,QAAe,MAAIxK,KAAK8hB,aAEV9hB,KAAKyK,QACdzK,KAAKyK,QAAQ0W,IAAYA,KAAUnhB,KAAKwK,UAC1CxK,KAAKkhB,SAASlhB,KAAKyK,QAAQ0W,IAAWnhB,KAAKwK,QAAQ2W,IAIrB,mBAA3BnhB,KAAK8T,KAAKiO,aACjB/hB,KAAKihB,OAASjhB,KAAK8T,KAAKiO,aAExB/hB,KAAKihB,OAAS9d,EAAKiF,KAAKC,MAGhC2Z,kBACIhiB,KAAK8T,KAAKvJ,QAAS,EAEvB0X,mBACIjiB,KAAK8T,KAAKvJ,QAAS,EAEvB6W,QAAQre,GAEJ,GADe,GAAXA,EAAEmf,OAAcnf,EAAEof,kBAClBniB,KAAKsT,GAAGjK,KAAK0U,aAAjB,CACA,IAAI7W,EAAMnE,GAAKyY,MACf,IAAKxb,KAAK8T,KAAKvJ,OAAU,OAAO,EAChC,IAAI6X,EAAKlb,EAAIuU,SAAWvU,EAAImb,SAAW,KAAOnb,EAAIob,SAAW,KAAOpb,EAAIqb,QAAU,KAAOrb,EAAIsb,UAAY,IACrGJ,KAAMpiB,KAAKkhB,UACXlhB,KAAKkhB,SAASkB,GAAIla,KAAKlI,KAAMA,KAAKsT,GAAIvQ,IAG9Cue,gBAAgBmB,EAAK1f,GACjB,IAAIgY,EAAgB0H,EAAIC,oBACxB,GAAM3H,EAAe,CACjB,IAAIrN,EAAS1N,KAAKihB,SACPwB,EAAI5U,SAASkN,EAAerN,EAAQ,cAE3C+U,EAAI9E,YAAYjQ,GAChB+U,EAAIE,WAAWjV,KAI3B6T,kBAAkBkB,EAAK1f,GACnB,IAAIgY,EAAgB0H,EAAIC,oBACxB,GAAM3H,IAAkBA,EAAcnP,OAAQ,CAC1C,IAAI8B,EAAS1N,KAAKihB,SACPwB,EAAIlU,kBAAkBwM,EAAerN,EAAQ,cAEpD+U,EAAI9E,YAAYjQ,GAChB+U,EAAIE,WAAWjV,KAI3B8T,gBAAgBiB,EAAK1f,GACjB,IAAIgY,EAAgB0H,EAAIC,oBAClB3H,GACF0H,EAAIE,WAAW5H,GAGvB0G,eAAegB,EAAK1f,GAChB,IAAIgY,EAAgB0H,EAAIC,oBAClB3H,IAAkBA,EAAcnP,SAClC6W,EAAI9E,YAAY5C,EAAclP,QAC9B4W,EAAIlT,YAAYwL,IAGxB2G,cAAce,EAAK1f,GACf,IAAImE,EAAMnE,GAAKyY,MACXT,EAAgB0H,EAAIC,oBAClB3H,IACF0H,EAAI3L,YAAYiE,EAAcrZ,IAC9BwF,EAAIyU,kBACJzU,EAAIib,kBAGZR,UAAUc,EAAK1f,GACX,IAAImE,EAAMnE,GAAKyY,MACXT,EAAgB0H,EAAIC,oBACxB,GAAM3H,EAAe,CACjB,IAAI6H,EAAUH,EAAII,iBAAiB9H,GACnC,IAAK6H,EAAS,CACV,IAAIE,EAAKL,EAAII,iBAAiB9H,EAAclP,QACtCiX,GAAMA,EAAG9W,SAAS9L,OAAS,IAC7B0iB,EAAUE,EAAG9W,SAAS8W,EAAG9W,SAAS9L,OAAS,IAG7C0iB,GACFH,EAAI9E,YAAYiF,GAEpB1b,EAAIyU,kBACJzU,EAAIib,kBAGZP,YAAYa,EAAK1f,GACb,IAAImE,EAAMnE,GAAKyY,MACXT,EAAgB0H,EAAIC,oBACxB,GAAM3H,EAAe,CACjB,IAAIgI,EAAYN,EAAIO,gBAAgBjI,GACpC,IAAKgI,EAAW,CACZ,IAAID,EAAKL,EAAIO,gBAAgBjI,EAAclP,QACrCiX,GAAMA,EAAG9W,SAAS9L,OAAS,IAC7B6iB,EAAYD,EAAG9W,SAAS,IAG1B+W,GACFN,EAAI9E,YAAYoF,GAEpB7b,EAAIyU,kBACJzU,EAAIib,kBAGZN,YAAYY,EAAK1f,GACb/C,KAAKijB,kBAAkBR,EAAK1f,EAAGpC,EAAUC,MAE7CkhB,aAAaW,EAAK1f,GACd/C,KAAKijB,kBAAkBR,EAAK1f,EAAGpC,EAAUG,OAE7CmiB,kBAAkBR,EAAK1f,EAAGxB,GACtB,IAAI2F,EAAMnE,GAAKyY,MACXT,EAAgB0H,EAAIC,oBACpBzV,EAAO,KACX,GAAM8N,EAAe,CACjB,GAAIA,EAAcnP,OAAQ,CAGtB,IAFA,IAAIhK,EAAImZ,EAAc/O,SAClBA,EAAW,GACNvJ,EAAI,EAAGA,EAAIb,EAAE1B,OAAQuC,IACtBb,EAAEa,GAAGqJ,YAAcvK,GACnByK,EAAS5H,KAAK3B,GAGtBwK,EAAOrL,EAAEoK,EAASxD,KAAK0a,OAAOlX,EAAS9L,OAAS,GAAK,UAEpD,GAAI6a,EAAcjP,YAAcvK,EAAG,CACpC,IACI4hB,GADAnX,EAAW+O,EAAc/O,UACA9L,OACzBijB,EAAgB,IAChBlW,EAAOjB,EAASxD,KAAK0a,OAAOC,EAAgB,GAAK,UAGrDlW,EAAO8N,EAAclP,OAEnBoB,GACFwV,EAAI9E,YAAY1Q,GAEpB/F,EAAIyU,kBACJzU,EAAIib,mBCtKhB,MAAMiB,EAAc,CAChBC,QAAS,IAGN,SAASC,EAASC,GACrB,IAAKA,aAAkBC,EACnB,MAAM,IAAIC,MAAM,UAAYF,EAAS,8BAEzCH,EAAYC,QAAQjf,KAAKmf,GAGtB,SAASG,EAAMpQ,GAClBlS,EAAEE,EAAEqiB,YAAW,YAKnB,SAAgBrQ,GAGZ,IAFA,IAAIsQ,EAAIR,EAAYC,QAAQnjB,OACxB2jB,EAAU,KACLphB,EAAI,EAAGA,EAAImhB,EAAGnhB,IAEI,mBADvBohB,EAAUT,EAAYC,QAAQ5gB,GAAG8Q,OAE7BsQ,EAAQvQ,GAVZwQ,CAAOxQ,KACR,GAcA,MAAMkQ,EACTniB,YAAYqE,EAAM6N,GACdvT,KAAK0F,KAAOA,EACZ1F,KAAKuT,KAAOA,GCnBpB,MAAMD,EACF3G,YAAcQ,EACdR,YAAc1B,EACd0B,iBAAmBhM,EACnBgM,kBAAoB5L,EACpB4L,SAAWvL,EACXuL,cAAgB6W,EAChB7W,uBAAyBoX,EACzBpX,YAAcqX,EAEd3iB,YAAYwS,GACRP,EAAG2Q,QAAUjkB,KACbA,KAAKqN,QAAU3N,EACfM,KAAKkkB,aAAc,EACnBlkB,KAAKkQ,KAAO,KACZlQ,KAAKmkB,cAAgB,GACrBnkB,KAAK6T,QViBN,SAAuBA,GAC1B,IAAIC,EAAO,GAIX,GAHA3Q,EAAKuB,KAAKmD,MAAMiM,EAAM/K,GACtB5F,EAAKuB,KAAKmD,MAAMiM,EAAMD,IAEjBC,EAAK9K,UACN,MAAM,IAAIya,MAAM,sDAEpB,OAAO3P,EUzBYsQ,CAAavQ,GAC5B7T,KAAKuT,OAGTA,OACI,IAAMvT,KAAKkkB,YAAX,CACAlkB,KAAKkkB,aAAc,EACnB,IAAIG,EAAc,CACdlb,KAAMnJ,KAAK6T,QAAQ1K,KACnBW,OAAQ9J,KAAK6T,QAAQhK,OAAOC,OAC5BC,OAAQ/J,KAAK6T,QAAQhK,OAAOE,OAC5BC,OAAQhK,KAAK6T,QAAQhK,OAAOG,QAE5Bsa,EAAY,CACZtb,UAAWhJ,KAAK6T,QAAQ7K,UACxBI,aAAcpJ,KAAK6T,QAAQzK,aAC3BE,OAAQtJ,KAAK6T,QAAQxK,KAAKC,OAC1BC,QAASvJ,KAAK6T,QAAQxK,KAAKE,QAC3BC,QAASxJ,KAAK6T,QAAQxK,KAAKG,QAC3BC,WAAYzJ,KAAK6T,QAAQxK,KAAKI,WAC9BC,WAAY1J,KAAK6T,QAAQxK,KAAKK,WAC9BC,UAAW3J,KAAK6T,QAAQxK,KAAKM,UAC7BC,+BAAgC5J,KAAK6T,QAAQxK,KAAKO,gCAGtD5J,KAAKyE,KAAO,IAAI4O,EAAarT,MAC7BA,KAAK6J,OAAS,IAAI+J,EAAe5T,KAAMqkB,GACvCrkB,KAAKqJ,KAAO,IAAIuR,EAAa5a,KAAMskB,GACnCtkB,KAAKsK,SAAW,IAAI0W,EAAiBhhB,KAAMA,KAAK6T,QAAQvJ,UAExDtK,KAAKyE,KAAK8O,OACVvT,KAAK6J,OAAO0J,OACZvT,KAAKqJ,KAAKkK,OACVvT,KAAKsK,SAASiJ,OAEdvT,KAAKukB,cAELC,EAAcxkB,OAElBykB,cACIzkB,KAAK6T,QAAQ5K,UAAW,EAE5Byb,eACI1kB,KAAK6T,QAAQ5K,UAAW,EAI5B0b,oBAAoB3I,GAChBhc,KAAK6T,QAAQ5J,qBAAqB,UAAY+R,EAAe,YAAa,EAI9E4I,qBAAqB5I,GACjBhc,KAAK6T,QAAQ5J,qBAAqB,UAAY+R,EAAe,YAAa,EAE9E6I,eACI,OAAO7kB,KAAK6T,QAAQ5K,SAExB6b,UAAU5b,GACN,IAAI6b,EAAY/kB,KAAK6T,QAAQ3K,MAC7BlJ,KAAK6T,QAAQ3K,MAAWA,GAAiB,KACrC6b,GAAa/kB,KAAK6T,QAAQ3K,QAC1BlJ,KAAKqJ,KAAKiT,cACVtc,KAAKqJ,KAAKmT,sBAGlB+H,cACIvkB,KAAKqJ,KAAKwS,UAAU7b,KAAM,YAAaA,KAAKglB,kBAC5ChlB,KAAKqJ,KAAKwS,UAAU7b,KAAM,QAASA,KAAKilB,cACxCjlB,KAAKqJ,KAAKwS,UAAU7b,KAAM,WAAYA,KAAKklB,iBAC3CllB,KAAKqJ,KAAKwS,UAAU7b,KAAM,aAAcA,KAAKmlB,mBAEjDH,iBAAiBjiB,GACb,GAAK/C,KAAK6T,QAAQ5J,qBAA8C,wBAAhE,CAGA,IAAImO,EAAUrV,EAAEqiB,QAAU5J,MAAM6J,WAC5B3X,EAAS1N,KAAKqJ,KAAK4S,kBAAkB7D,GACnC1K,EACmC,UAAjC0K,EAAQ/F,QAAQlK,eAChBnI,KAAK2d,YAAYjQ,GAGrB1N,KAAK6d,gBAGboH,aAAaliB,GACT,GAAK/C,KAAK6T,QAAQ5J,qBAA0C,oBAA5D,CAGA,IAAImO,EAAUrV,EAAEqiB,QAAU5J,MAAM6J,WAEhC,GADiBrlB,KAAKqJ,KAAK8S,YAAY/D,GACvB,CACZ,IAAI1K,EAAS1N,KAAKqJ,KAAK4S,kBAAkB7D,GACnC1K,GACF1N,KAAK8W,YAAYpJ,KAI7BwX,gBAAgBniB,GACZ,GAAK/C,KAAK6T,QAAQ5J,qBAA6C,wBAG3DjK,KAAK6kB,eAAgB,CACrB,IAAIzM,EAAUrV,EAAEqiB,QAAU5J,MAAM6J,WAC5B3X,EAAS1N,KAAKqJ,KAAK4S,kBAAkB7D,GACnC1K,GACF1N,KAAK2iB,WAAWjV,IAK5ByX,kBAAkB3J,GAETxb,KAAK6T,QAAQ5J,qBAA+C,0BAAM/G,OAAOsY,MAAM8G,UAIpF9G,EAAM2G,iBAGK,OADD3G,EAAM8J,OAAS,EAAI,KAAO,QAEhCtlB,KAAKqJ,KAAKuV,SAEV5e,KAAKqJ,KAAKyV,WAGlB6D,WAAW1V,GACP,IAAKhC,EAAK+C,QAAQf,GAAO,CACrB,IAAIqB,EAAWtO,KAAKyN,SAASR,GAC7B,OAAKqB,EAIMtO,KAAK2iB,WAAWrU,IAHvBlO,EAAOI,MAAM,eAAiByM,EAAO,wBAC9B,GAKXjN,KAAK6kB,eACL7kB,KAAKqJ,KAAK2U,gBAAgB/Q,GAE1B7M,EAAOI,MAAM,wCAIrB+kB,WACIvlB,KAAKqJ,KAAKqS,gBAEd5E,YAAY7J,GACR,IAAKhC,EAAK+C,QAAQf,GAAO,CACrB,IAAIqB,EAAWtO,KAAKyN,SAASR,GAC7B,OAAKqB,EAIMtO,KAAK8W,YAAYxI,QAHxBlO,EAAOI,MAAM,eAAiByM,EAAO,uBAMzCA,EAAKrB,SACT5L,KAAKqJ,KAAKoW,cAAcxS,GACxBjN,KAAK6J,OAAOiN,YAAY7J,GACxBjN,KAAKqJ,KAAKmW,WACVxf,KAAKqJ,KAAKuW,iBAAiB3S,IAE/B+J,YAAY/J,GACR,IAAKhC,EAAK+C,QAAQf,GAAO,CACrB,IAAIqB,EAAWtO,KAAKyN,SAASR,GAC7B,OAAKqB,EAIMtO,KAAKgX,YAAY1I,QAHxBlO,EAAOI,MAAM,eAAiByM,EAAO,uBAMzCA,EAAKrB,SACT5L,KAAKqJ,KAAKoW,cAAcxS,GACxBjN,KAAK6J,OAAOmN,YAAY/J,GACxBjN,KAAKqJ,KAAKmW,WACVxf,KAAKqJ,KAAKuW,iBAAiB3S,IAE/B8J,cAAc9J,GACV,IAAKhC,EAAK+C,QAAQf,GAAO,CACrB,IAAIqB,EAAWtO,KAAKyN,SAASR,GAC7B,OAAKqB,EAIMtO,KAAK+W,cAAczI,QAH1BlO,EAAOI,MAAM,eAAiByM,EAAO,uBAMzCA,EAAKrB,SACT5L,KAAKqJ,KAAKoW,cAAcxS,GACxBjN,KAAK6J,OAAOkN,cAAc9J,GAC1BjN,KAAKqJ,KAAKmW,WACVxf,KAAKqJ,KAAKuW,iBAAiB3S,IAE/BkK,aACInX,KAAK6J,OAAOsN,aACZnX,KAAKqJ,KAAKmW,WAEdpI,eACIpX,KAAK6J,OAAOuN,eACZpX,KAAKqJ,KAAKmW,WAEdnI,gBAAgBI,GACZzX,KAAK6J,OAAOwN,gBAAgBI,GAC5BzX,KAAKqJ,KAAKmW,WAEdgG,SACIxlB,KAAKqJ,KAAKmK,QACVxT,KAAK6J,OAAO2J,QACZxT,KAAKyE,KAAK+O,QAEdiL,MAAMvO,GACF,IAAIuV,EAAIvV,GAAQP,EAAOiB,WAAWf,QAElC7P,KAAKkQ,KAAOlQ,KAAKyE,KAAKgP,KAAKgS,GACtBzlB,KAAKkQ,MAIN9P,EAAOG,MAAM,gBAGjBP,KAAKqJ,KAAKoK,OACVrT,EAAOG,MAAM,gBAEbP,KAAK6J,OAAOA,SACZzJ,EAAOG,MAAM,oBAEbP,KAAKqJ,KAAKrI,MAAK,GACfZ,EAAOG,MAAM,gBAEbP,KAAKkX,oBAAoBnW,EAAUC,KAAM,CAAEyD,KAAM,CAACyL,MAf9C9P,EAAOI,MAAM,mBAiBrBQ,KAAKkP,GACDlQ,KAAKwlB,SACLxlB,KAAKye,MAAMvO,GAEfwV,WACI,MAAO,CACHhgB,KAAM1F,KAAKkQ,KAAKxK,KAChB0H,OAAQpN,KAAKkQ,KAAK9C,OAClBC,QAASrN,KAAKkQ,KAAK7C,SAG3B+C,SAASuD,GACL,IAAI1D,EAAK0D,GAAe,YACxB,OAAO3T,KAAKyE,KAAK2L,SAASH,GAE9B0V,WACI,OAAO3lB,KAAKkQ,KAAK5C,KAErBG,SAASR,GACL,OAAIhC,EAAK+C,QAAQf,GACNA,EAEJjN,KAAKkQ,KAAKzC,SAASR,GAE9BY,SAASC,EAAaJ,EAAQ/B,EAAOlH,GACjC,GAAIzE,KAAK6kB,eAAgB,CACrB,IAAIe,EAAkB5lB,KAAKyN,SAASK,GAChChC,EAAY9L,KAAK6J,OAAOqK,+BAA+B0R,GACvD3Y,EAAOjN,KAAKkQ,KAAKrC,SAAS+X,EAAiBlY,EAAQ/B,EAAOlH,EAAMqH,GASpE,OARMmB,IACFjN,KAAKqJ,KAAKwE,SAASZ,GACnBjN,KAAK6J,OAAOA,SACZ7J,KAAKqJ,KAAKrI,MAAK,GACfhB,KAAKqJ,KAAKoT,wBAAwBxP,GAClCjN,KAAKgX,YAAY4O,GACjB5lB,KAAKkX,oBAAoBnW,EAAUG,KAAM,CAAEgG,IAAK,WAAYzC,KAAM,CAACmhB,EAAgBlkB,GAAIgM,EAAQ/B,EAAOlH,GAAOwI,KAAMS,KAEhHT,EAGP,OADA7M,EAAOI,MAAM,uCACN,KAGf0N,mBAAmBC,EAAaT,EAAQ/B,EAAOlH,GAC3C,GAAIzE,KAAK6kB,eAAgB,CACrB,IAAIgB,EAAkB7lB,KAAKyN,SAASU,GAChCrC,EAAY9L,KAAK6J,OAAOqK,+BAA+B2R,EAAgBha,QACvEoB,EAAOjN,KAAKkQ,KAAKhC,mBAAmB2X,EAAiBnY,EAAQ/B,EAAOlH,EAAMqH,GAO9E,OANMmB,IACFjN,KAAKqJ,KAAKwE,SAASZ,GACnBjN,KAAK6J,OAAOA,SACZ7J,KAAKqJ,KAAKrI,MAAK,GACfhB,KAAKkX,oBAAoBnW,EAAUG,KAAM,CAAEgG,IAAK,qBAAsBzC,KAAM,CAACohB,EAAgBnkB,GAAIgM,EAAQ/B,EAAOlH,GAAOwI,KAAMS,KAE1HT,EAGP,OADA7M,EAAOI,MAAM,uCACN,KAGf+N,kBAAkBC,EAAYd,EAAQ/B,EAAOlH,GACzC,GAAIzE,KAAK6kB,eAAgB,CACrB,IAAIiB,EAAiB9lB,KAAKyN,SAASe,GAC/B1C,EAAY9L,KAAK6J,OAAOqK,+BAA+B4R,EAAeja,QACtEoB,EAAOjN,KAAKkQ,KAAK3B,kBAAkBuX,EAAgBpY,EAAQ/B,EAAOlH,EAAMqH,GAO5E,OANMmB,IACFjN,KAAKqJ,KAAKwE,SAASZ,GACnBjN,KAAK6J,OAAOA,SACZ7J,KAAKqJ,KAAKrI,MAAK,GACfhB,KAAKkX,oBAAoBnW,EAAUG,KAAM,CAAEgG,IAAK,oBAAqBzC,KAAM,CAACqhB,EAAepkB,GAAIgM,EAAQ/B,EAAOlH,GAAOwI,KAAMS,KAExHT,EAGP,OADA7M,EAAOI,MAAM,uCACN,KAGf+O,YAAYtC,GACR,IAAKhC,EAAK+C,QAAQf,GAAO,CACrB,IAAIqB,EAAWtO,KAAKyN,SAASR,GAC7B,OAAKqB,EAIMtO,KAAKuP,YAAYjB,IAHxBlO,EAAOI,MAAM,eAAiByM,EAAO,wBAC9B,GAKf,GAAIjN,KAAK6kB,eAAgB,CACrB,GAAI5X,EAAKrB,OAEL,OADAxL,EAAOI,MAAM,mCACN,EAEX,IAAIkN,EAAST,EAAKvL,GACdwN,EAAWjC,EAAKpB,OAAOnK,GACvBoM,EAAc9N,KAAKyN,SAASyB,GAQhC,OAPAlP,KAAKqJ,KAAKoW,cAAc3R,GACxB9N,KAAKqJ,KAAKkG,YAAYtC,GACtBjN,KAAKkQ,KAAKX,YAAYtC,GACtBjN,KAAK6J,OAAOA,SACZ7J,KAAKqJ,KAAKrI,MAAK,GACfhB,KAAKqJ,KAAKuW,iBAAiB9R,GAC3B9N,KAAKkX,oBAAoBnW,EAAUG,KAAM,CAAEgG,IAAK,cAAezC,KAAM,CAACiJ,GAAST,KAAMiC,KAC9E,EAGP,OADA9O,EAAOI,MAAM,wCACN,EAGfkd,YAAYhQ,EAAQ/B,GAChB,GAAI3L,KAAK6kB,eACL,GAAIb,EAAMrb,KAAKC,SAAS+C,GACpBvL,EAAOK,KAAK,oCADhB,CAIA,IAAIwM,EAAOjN,KAAKyN,SAASC,GACzB,GAAMT,EAAM,CACR,GAAIA,EAAKtB,QAAUA,EAGf,OAFAvL,EAAOM,KAAK,wBACZV,KAAKqJ,KAAKqU,YAAYzQ,GAG1BA,EAAKtB,MAAQA,EACb3L,KAAKqJ,KAAKqU,YAAYzQ,GACtBjN,KAAK6J,OAAOA,SACZ7J,KAAKqJ,KAAKrI,MAAK,GACfhB,KAAKkX,oBAAoBnW,EAAUG,KAAM,CAAEgG,IAAK,cAAezC,KAAM,CAACiJ,EAAQ/B,GAAQsB,KAAMS,UAGhGtN,EAAOI,MAAM,uCAIrBkO,UAAUhB,EAAQuB,EAAUC,EAAUpD,GAClC,GAAI9L,KAAK6kB,eAAT,CACI,IAAI5X,EAAOjN,KAAKyN,SAASC,GACrBqY,EAAe/lB,KAAKkQ,KAAKxB,UAAUzB,EAAMgC,EAAUC,EAAUpD,GAC3Dia,IACF/lB,KAAKqJ,KAAKqU,YAAYqI,GACtB/lB,KAAK6J,OAAOA,SACZ7J,KAAKqJ,KAAKrI,MAAK,GACfhB,KAAKkX,oBAAoBnW,EAAUG,KAAM,CAAEgG,IAAK,YAAazC,KAAM,CAACiJ,EAAQuB,EAAUC,EAAUpD,GAAYmB,KAAMS,UAGtHtN,EAAOI,MAAM,uCAIrBmd,YAAY1Q,GACR,IAAKhC,EAAK+C,QAAQf,GAAO,CACrB,IAAIqB,EAAWtO,KAAKyN,SAASR,GAC7B,OAAKqB,EAIMtO,KAAK2d,YAAYrP,QAHxBlO,EAAOI,MAAM,eAAiByM,EAAO,uBAMxCjN,KAAK6J,OAAOgO,WAAW5K,KAG5BjN,KAAKkQ,KAAK3C,SAAWN,EACrBjN,KAAKqJ,KAAKsU,YAAY1Q,GACtBjN,KAAKkX,oBAAoBnW,EAAUI,OAAQ,CAAE+F,IAAK,cAAezC,KAAM,GAAIwI,KAAMA,EAAKvL,MAE1FghB,oBACI,OAAM1iB,KAAKkQ,KACAlQ,KAAKkQ,KAAK3C,SAEV,KAGfsQ,eACU7d,KAAKkQ,OACPlQ,KAAKkQ,KAAK3C,SAAW,KACrBvN,KAAKqJ,KAAKwU,gBAGlBmI,gBAAgB/Y,GACZ,OAAOjN,KAAK6J,OAAOgO,WAAW5K,GAElC4V,iBAAiB5V,GACb,IAAKhC,EAAK+C,QAAQf,GAAO,CACrB,IAAIqB,EAAWtO,KAAKyN,SAASR,GAC7B,OAAKqB,EAIMtO,KAAK6iB,iBAAiBvU,QAH7BlO,EAAOI,MAAM,eAAiByM,EAAO,uBAM7C,GAAIA,EAAKrB,OAAU,OAAO,KAC1B,IAAI5J,EAAI,KACR,GAAIiL,EAAKpB,OAAOD,OAIZ,IAHA,IAAIhK,EAAIqL,EAAKpB,OAAOG,SAChBia,EAAO,KACPC,EAAK,KACAzjB,EAAI,EAAGA,EAAIb,EAAE1B,OAAQuC,IAC1ByjB,EAAKtkB,EAAEa,GACHwK,EAAKnB,YAAcoa,EAAGpa,YAClBmB,EAAKvL,KAAOwkB,EAAGxkB,KACfM,EAAIikB,GAERA,EAAOC,QAIflkB,EAAIhC,KAAKkQ,KAAK7B,gBAAgBpB,GAElC,OAAOjL,EAEXghB,gBAAgB/V,GACZ,IAAKhC,EAAK+C,QAAQf,GAAO,CACrB,IAAIqB,EAAWtO,KAAKyN,SAASR,GAC7B,OAAKqB,EAIMtO,KAAKgjB,gBAAgB1U,QAH5BlO,EAAOI,MAAM,eAAiByM,EAAO,uBAM7C,GAAIA,EAAKrB,OAAU,OAAO,KAC1B,IAAI5J,EAAI,KACR,GAAIiL,EAAKpB,OAAOD,QAIZ,IAHA,IAAIhK,EAAIqL,EAAKpB,OAAOG,SAChBma,GAAU,EACVD,EAAK,KACAzjB,EAAI,EAAGA,EAAIb,EAAE1B,OAAQuC,IAE1B,GADAyjB,EAAKtkB,EAAEa,GACHwK,EAAKnB,YAAcoa,EAAGpa,UAAW,CACjC,GAAIqa,EAAS,CACTnkB,EAAIkkB,EACJ,MAEAjZ,EAAKvL,KAAOwkB,EAAGxkB,KACfykB,GAAU,SAKtBnkB,EAAIhC,KAAKkQ,KAAKzB,eAAexB,GAEjC,OAAOjL,EAEXokB,eAAe1Y,EAAQ2Y,EAASC,GAC5B,IAAItmB,KAAK6kB,eAaL,OADAzkB,EAAOI,MAAM,uCACN,KAZP,IAAIyM,EAAOjN,KAAKkQ,KAAKzC,SAASC,GACxBT,IACIoZ,IACFpZ,EAAKxI,KAAK,oBAAsB4hB,GAE9BC,IACFrZ,EAAKxI,KAAK,oBAAsB6hB,GAEpCtmB,KAAKqJ,KAAKoT,wBAAwBxP,IAO9CsZ,oBAAoB7Y,EAAQuK,EAAMuO,EAAQ5jB,GACtC,IAAI5C,KAAK6kB,eAmBL,OADAzkB,EAAOI,MAAM,uCACN,KAlBP,IAAIyM,EAAOjN,KAAKkQ,KAAKzC,SAASC,GACxBT,IACIgL,IACFhL,EAAKxI,KAAK,aAAewT,GAEvBuO,IACFvZ,EAAKxI,KAAK,eAAiB+hB,GAEzB5jB,IACFqK,EAAKxI,KAAK,cAAgB7B,GAE9B5C,KAAKqJ,KAAKoT,wBAAwBxP,GAClCjN,KAAKqJ,KAAKqU,YAAYzQ,GACtBjN,KAAK6J,OAAOA,SACZ7J,KAAKqJ,KAAKrI,MAAK,IAO3BylB,0BAA0B/Y,EAAQgZ,EAAOja,EAAOC,EAAQia,GACpD,IAAI3mB,KAAK6kB,eAsBL,OADAzkB,EAAOI,MAAM,uCACN,KArBP,IAAIyM,EAAOjN,KAAKkQ,KAAKzC,SAASC,GACxBT,IACIyZ,IACFzZ,EAAKxI,KAAK,oBAAsBiiB,GAE9Bja,IACFQ,EAAKxI,KAAY,MAAIgI,GAEnBC,IACFO,EAAKxI,KAAa,OAAIiI,GAEpBia,IACF1Z,EAAKxI,KAAK,uBAAyBkiB,GAEvC3mB,KAAKqJ,KAAKoT,wBAAwBxP,GAClCjN,KAAKqJ,KAAKqU,YAAYzQ,GACtBjN,KAAK6J,OAAOA,SACZ7J,KAAKqJ,KAAKrI,MAAK,IAO3B4lB,6BAA6BlZ,EAAQiZ,GACjC,IAAI3mB,KAAK6kB,eAeL,OADAzkB,EAAOI,MAAM,uCACN,KAdP,IAAIyM,EAAOjN,KAAKkQ,KAAKzC,SAASC,GAC9B,GAAMT,EAAM,CACR,IAAKA,EAAKxI,KAAK,oBAEX,OADArE,EAAOI,MAAM,sEACN,KAEXyM,EAAKxI,KAAK,uBAAyBkiB,EACnC3mB,KAAKqJ,KAAKoT,wBAAwBxP,GAClCjN,KAAKqJ,KAAKqU,YAAYzQ,GACtBjN,KAAK6J,OAAOA,SACZ7J,KAAKqJ,KAAKrI,MAAK,IAO3BC,SACIjB,KAAKqJ,KAAKpI,SAGd4lB,mBAAmB9iB,GACS,mBAAbA,GACP/D,KAAKmkB,cAAc/f,KAAKL,GAGhC+iB,uBACI9mB,KAAKmkB,cAAgB,GAEzBjN,oBAAoBrR,EAAMpB,GACtB,IAAIsiB,EAAI/mB,KACRoB,EAAEE,EAAEqiB,YAAW,WACXoD,EAAEC,qBAAqBnhB,EAAMpB,KAC9B,GAEPuiB,qBAAqBnhB,EAAMpB,GAEvB,IADA,IAAImf,EAAI5jB,KAAKmkB,cAAcjkB,OAClBuC,EAAI,EAAGA,EAAImhB,EAAGnhB,IACnBzC,KAAKmkB,cAAc1hB,GAAGoD,EAAMpB,GAKpCkI,YAAYkH,EAAS3D,GACjB,IAAIuS,EAAM,IAAInP,EAAGO,GAEjB,OADA4O,EAAIzhB,KAAKkP,GACFuS"} \ No newline at end of file +{"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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nexport const __version__ = '0.4.9';\nexport const __author__ = 'hizzgdev@163.com';\n\nif (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (p) { return this.slice(0, p.length) === p; }; }\n\n// an noop function define\nvar _noop = function () { };\nexport let logger = (typeof console === 'undefined') ? {\n log: _noop, debug: _noop, error: _noop, warn: _noop, info: _noop\n} : console;\n\nexport const Direction = { left: -1, center: 0, right: 1 };\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 };","/**\n * @license BSD\n * @copyright 2014-2022 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) { return this.d.getElementById(id); };\n this.c = function (tag) { return this.d.createElement(tag); };\n this.t = function (n, t) { if (n.hasChildNodes()) { n.firstChild.nodeValue = t; } else { n.appendChild(this.d.createTextNode(t)); } };\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) { return !!el && (typeof el === 'object') && (el.nodeType === 1) && (typeof el.style === 'object') && (typeof el.ownerDocument === 'object'); };\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-2022 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\nexport const util = {\n ajax: {\n request: function (url, param, method, callback, fail_callback) {\n var p = Object.keys(param).map(k => encodeURIComponent(k) + '=' + encodeURIComponent(param[k])).join('&');\n console.log(p);\n var xhr = new XMLHttpRequest();\n if (!xhr) { return; }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status == 0) {\n if (typeof callback === 'function') {\n var data = util.json.string2json(xhr.responseText);\n if (data != null) {\n callback(data);\n } else {\n callback(xhr.responseText);\n }\n }\n } else {\n if (typeof fail_callback === 'function') {\n fail_callback(xhr);\n } else {\n logger.error('xhr request failed.', xhr);\n }\n }\n }\n }\n method = method || 'GET';\n xhr.open(method, url, true);\n xhr.setRequestHeader('If-Modified-Since', '0');\n if (method == 'POST') {\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');\n xhr.send(p);\n } else {\n xhr.send();\n }\n },\n get: function (url, callback) {\n return util.ajax.request(url, {}, 'GET', callback);\n },\n post: function (url, param, callback) {\n return util.ajax.request(url, param, 'POST', callback);\n }\n },\n\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 = $.w.BlobBuilder || $.w.MozBlobBuilder || $.w.WebKitBlobBuilder || $.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 bloburl = URL.createObjectURL(blob);\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\n }\n }\n }\n },\n\n json: {\n json2string: function (json) {\n if (!!JSON) {\n try {\n var json_str = JSON.stringify(json);\n return json_str;\n } catch (e) {\n logger.warn(e);\n logger.warn('can not convert to string');\n return null;\n }\n }\n },\n string2json: function (json_str) {\n if (!!JSON) {\n try {\n var json = JSON.parse(json_str);\n return json;\n } catch (e) {\n logger.warn(e);\n logger.warn('can not parse to json');\n return null;\n }\n }\n },\n merge: function (b, a) {\n for (var o in a) {\n if (o in b) {\n if (typeof b[o] === 'object' &&\n Object.prototype.toString.call(b[o]).toLowerCase() == '[object object]' &&\n !b[o].length) {\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 (new Date().getTime().toString(16) + Math.random().toString(16).substr(2)).substr(2, 16);\n }\n },\n\n text: {\n is_empty: function (s) {\n if (!s) { return true; }\n return s.replace(/\\s*/, '').length == 0;\n }\n }\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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\n view: {\n engine: 'canvas',\n hmargin: 100,\n vmargin: 50,\n line_width: 2,\n line_color: '#555',\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 },\n layout: {\n hspace: 30,\n vspace: 20,\n pspace: 13\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 },\n mapping: {\n addchild: 45, // Insert\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};\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-2022 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) { logger.error('invalid node id'); return; }\n if (typeof iIndex != 'number') { logger.error('invalid node index'); return; }\n if (typeof bExpanded === 'undefined') { bExpanded = true; }\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 alwary the last\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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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\n","/**\n * @license BSD\n * @copyright 2014-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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(nodeid, node_index, topic, data, false, parent_node, parent_node.direction, expanded);\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._reindex(parent_node);\n } else {\n logger.error('fail, the nodeid \\'' + node.id + '\\' has been already exist.');\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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) { return null; }\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, nodeid, 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, nodeid, 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) { return null; }\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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = (!!beforeid) ? this.get_node(beforeid) : null;\n if (node_before != null && node_before.parent != null && node_before.parent.id == node.parent.id) {\n node.index = node_before.index - 0.5;\n this._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn('the nodeid \\'' + node.id + '\\' has been already exist.');\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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\n","/**\n * @license BSD\n * @copyright 2014-2022 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\";\n\nexport const format = {\n node_tree: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_tree simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_tree\",\n \"data\": { \"id\": \"root\", \"topic\": \"jsMind 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._buildnode(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 (k == 'id' || k == 'topic' || k == 'children' || k == 'direction' || k == 'expanded') {\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(node_parent, node_json.id, node_json.topic, data, d, node_json.expanded);\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 _buildnode: function (node) {\n var df = format.node_tree;\n if (!(node instanceof Node)) { return; }\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._buildnode(children[i]));\n }\n }\n return o;\n }\n },\n\n node_array: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_array simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_array\",\n \"data\": [\n { \"id\": \"root\", \"topic\": \"jsMind Example\", \"isroot\": true }\n ]\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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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(parent_node, node_json.id, node_json.topic, data, d, node_json.expanded);\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 (k == 'id' || k == 'topic' || k == 'parentid' || k == 'isroot' || k == 'direction' || k == 'expanded') {\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)) { return; }\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\": {\n \"name\": 'jsMind freemind example',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"freemind\",\n \"data\": \"\"\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 { // 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 // 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 = ('expanded' in node_data) ? (node_data.expanded == 'true') : true;\n delete node_data.expanded;\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(parent_node, node_id, node_topic, node_data, node_direction, node_expanded);\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n }\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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++) { if (children[i].direction === Direction.left) { r--; } else { r++; } }\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 layout_data.outer_height = node_outer_height;\n layout_data.offset_y = base_y - node_outer_height / 2;\n layout_data.offset_x = this.opts.hspace * layout_data.direction + 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\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 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 = 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 nodeid in nodes) {\n node = nodes[nodeid];\n pout = this.get_node_point_out(node);\n if (pout.x > this.bounds.e) { this.bounds.e = pout.x; }\n if (pout.x < this.bounds.w) { this.bounds.w = pout.x; }\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, { evt: 'expand_node', data: [], node: node.id });\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, { evt: 'collapse_node', data: [], node: node.id });\n }\n expand_all() {\n var nodes = this.jm.mind.nodes;\n var c = 0;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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) { return; }\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(root_layout_data.right_nodes);\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n } else {\n if (node._data.layout.direction == Direction.right) {\n root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes);\n } else {\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n }\n }\n this.bounds.s = Math.max(root_layout_data.outer_height_left, root_layout_data.outer_height_right);\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\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from \"./jsmind.dom.js\";\n\nclass graph_svg {\n constructor(view) {\n this.view = view;\n this.opts = view.opts;\n this.e_svg = graph_svg.c('svg');\n this.e_svg.setAttribute('class', 'jsmind');\n this.size = { w: 0, h: 0 };\n this.lines = [];\n }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = graph_svg.c('path');\n line.setAttribute('stroke', 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._bezier_to(line, 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 var img = new Image();\n img.onload = function () {\n dest_canvas_ctx.drawImage(img, 0, 0);\n !!callback && callback();\n };\n img.src = 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg));\n }\n _bezier_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M' + x1 + ' ' + y1 + ' C ' + (x1 + (x2 - x1) * 2 / 3) + ' ' + y1 + ', ' + x1 + ' ' + y2 + ', ' + x2 + ' ' + y2);\n }\n _line_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2);\n }\n}\n\n\nclass graph_canvas {\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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y);\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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 const graph = { svg: graph_svg, canvas: graph_canvas };\n","/**\n * @license BSD\n * @copyright 2014-2022 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 { 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 }\n init() {\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.e_panel = $.c('div');\n this.e_nodes = $.c('jmnodes');\n this.e_editor = $.c('input');\n\n this.graph = this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this);\n\n this.e_panel.className = 'jsmind-inner';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\n\n var v = this;\n $.on(this.e_editor, 'keydown', function (e) {\n var evt = e || event;\n if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); }\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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) { client_w = min_width; }\n if (client_h < min_height) { client_h = min_height; }\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\n }\n select_node(node) {\n if (!!this.selected_node) {\n this.selected_node._data.view.element.className =\n this.selected_node._data.view.element.className.replace(/\\s*selected\\b/i, '');\n this.reset_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_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 = (element.clientWidth - parseInt(ncs.getPropertyValue('padding-left')) - parseInt(ncs.getPropertyValue('padding-right'))) + '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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if ((zoom < this.minZoom) || (zoom > this.maxZoom)) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n };\n this.show(true);\n return true;\n\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = (_offset.x + p.x) + 'px';\n node_element.style.top = (_offset.y + p.y) + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = (_offset.x + p_expander.x) + 'px';\n expander.style.top = (_offset.y + p_expander.y) + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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(img, 2, 2, node_element.clientWidth, node_element.clientHeight);\n var scaledImageData = c.toDataURL();\n node_element.style.backgroundImage = 'url(' + scaledImageData + ')';\n }\n };\n img.src = backgroundImage;\n\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 = 'rotate(' + node_data['background-rotation'] + 'deg)';\n }\n }\n }\n clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) { continue; }\n if (('visible' in node._data.layout) && !node._data.layout.visible) { continue; }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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) { e.preventDefault(); } //prevent tab to change focus in browser\n if (this.jm.view.is_editing()) { return; }\n var evt = e || event;\n if (!this.opts.enable) { return true; }\n var kc = evt.keyCode + (evt.metaKey << 13) + (evt.ctrlKey << 12) + (evt.altKey << 11) + (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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 }\n else if (selected_node.direction === d) {\n var children = selected_node.children;\n var childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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\n","/**\n * @license BSD\n * @copyright 2014-2022 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('plugin ' + plugin + ' is not a supported plugin')\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } 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\n\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\n this.init();\n }\n\n init() {\n if (!!this.initialized) { return; }\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n // call enable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // call disable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n get_editable() {\n return this.options.editable;\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, \"mousewheel\", this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(event) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n if (!this.options.default_event_handle[\"enable_mousewheel_handle\"] || !window.event.ctrlKey) {\n return;\n }\n // Avoid default page scrolling behavior.\n event.preventDefault();\n\n var dir = event.deltaY > 0 ? \"Up\" : \"Down\";\n if (dir == \"Up\") {\n this.view.zoomIn();\n } else {\n this.view.zoomOut();\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) { return; }\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) { return; }\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) { return; }\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, { evt: 'add_node', data: [the_parent_node.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(the_node_before, nodeid, topic, data, direction);\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, { evt: 'insert_node_before', data: [the_node_before.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, { evt: 'insert_node_after', data: [the_node_after.id, nodeid, topic, data], node: nodeid });\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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, { evt: 'remove_node', data: [nodeid], node: parentid });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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, { evt: 'update_node', data: [nodeid, topic], node: nodeid });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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, { evt: 'move_node', data: [nodeid, beforeid, parentid, direction], node: nodeid });\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 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) { return null; }\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) { return null; }\n var n = null;\n if (node.parent.isroot) {\n var c = node.parent.children;\n var getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!node.data['background-image']) {\n logger.error('fail, only can change rotation angle of node with background image');\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jm;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","request","url","param","method","callback","fail_callback","Object","keys","map","k","encodeURIComponent","join","xhr","XMLHttpRequest","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","a","o","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substr","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","push","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","ActiveXObject","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","graph_svg","e_svg","setAttribute","size","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","graph","svg","canvas","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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"],"mappings":"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"} \ No newline at end of file diff --git a/js/jsmind.js b/js/jsmind.js index 7fefcde2..b11a1afd 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -174,6 +174,10 @@ return false; }; + jm.node.is_node = function (n) { + return !!n && n instanceof jm.node; + }; + jm.node.prototype = { get_location: function () { var vd = this._data.view; @@ -856,31 +860,17 @@ return !!node && node instanceof jm.node; }, ajax: { - _xhr: function () { - var xhr = null; - if (window.XMLHttpRequest) { - xhr = new XMLHttpRequest(); - } else { - try { - xhr = new ActiveXObject('Microsoft.XMLHTTP'); - } catch (e) { } - } - return xhr; - }, - _eurl: function (url) { - return encodeURIComponent(url); - }, request: function (url, param, method, callback, fail_callback) { var a = jm.util.ajax; var p = null; var tmp_param = []; for (var k in param) { - tmp_param.push(a._eurl(k) + '=' + a._eurl(param[k])); + tmp_param.push(encodeURIComponent(k) + '=' + encodeURIComponent(param[k])); } if (tmp_param.length > 0) { p = tmp_param.join('&'); } - var xhr = a._xhr(); + var xhr = new XMLHttpRequest(); if (!xhr) { return; } xhr.onreadystatechange = function () { if (xhr.readyState == 4) { @@ -976,28 +966,10 @@ json: { json2string: function (json) { - if (!!JSON) { - try { - var json_str = JSON.stringify(json); - return json_str; - } catch (e) { - logger.warn(e); - logger.warn('can not convert to string'); - return null; - } - } + return JSON.stringify(json); }, string2json: function (json_str) { - if (!!JSON) { - try { - var json = JSON.parse(json_str); - return json; - } catch (e) { - logger.warn(e); - logger.warn('can not parse to json'); - return null; - } - } + return JSON.parse(json_str); }, merge: function (b, a) { for (var o in a) { @@ -1019,7 +991,7 @@ uuid: { newid: function () { - return (new Date().getTime().toString(16) + Math.random().toString(16).substr(2)).substr(2, 16); + return (new Date().getTime().toString(16) + Math.random().toString(16).substring(2)).substring(2, 18); } }, diff --git a/package.json b/package.json index f2a00c43..babc67cb 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "rollup -c", "test": "jest", - "mt": "jest && JM_LANG=ES6 jest" + "test6": "JM_LANG=ES6 jest" }, "repository": { "type": "git", diff --git a/src/jsmind.util.js b/src/jsmind.util.js index 67b3edf1..1bf8eff6 100644 --- a/src/jsmind.util.js +++ b/src/jsmind.util.js @@ -11,31 +11,9 @@ import { logger } from "./jsmind.common.js"; export const util = { ajax: { - _xhr: function () { - var xhr = null; - if (window.XMLHttpRequest) { - xhr = new XMLHttpRequest(); - } else { - try { - xhr = new ActiveXObject('Microsoft.XMLHTTP'); - } catch (e) { } - } - return xhr; - }, - _eurl: function (url) { - return encodeURIComponent(url); - }, request: function (url, param, method, callback, fail_callback) { - var a = util.ajax; - var p = null; - var tmp_param = []; - for (var k in param) { - tmp_param.push(a._eurl(k) + '=' + a._eurl(param[k])); - } - if (tmp_param.length > 0) { - p = tmp_param.join('&'); - } - var xhr = a._xhr(); + var p = Object.keys(param).map(k => encodeURIComponent(k) + '=' + encodeURIComponent(param[k])).join('&'); + var xhr = new XMLHttpRequest(); if (!xhr) { return; } xhr.onreadystatechange = function () { if (xhr.readyState == 4) { @@ -120,28 +98,10 @@ export const util = { json: { json2string: function (json) { - if (!!JSON) { - try { - var json_str = JSON.stringify(json); - return json_str; - } catch (e) { - logger.warn(e); - logger.warn('can not convert to string'); - return null; - } - } + return JSON.stringify(json); }, string2json: function (json_str) { - if (!!JSON) { - try { - var json = JSON.parse(json_str); - return json; - } catch (e) { - logger.warn(e); - logger.warn('can not parse to json'); - return null; - } - } + return JSON.parse(json_str); }, merge: function (b, a) { for (var o in a) { @@ -163,7 +123,7 @@ export const util = { uuid: { newid: function () { - return (new Date().getTime().toString(16) + Math.random().toString(16).substr(2)).substr(2, 16); + return (new Date().getTime().toString(16) + Math.random().toString(16).substring(2)).substring(2, 18); } }, diff --git a/tests/jsmind.mind.test.js b/tests/jsmind.mind.test.js index 949b45ef..330257c9 100644 --- a/tests/jsmind.mind.test.js +++ b/tests/jsmind.mind.test.js @@ -172,6 +172,7 @@ test('remove node', () => { const node3 = mind.add_node(node2, '3', 'node3', null); mind.selected = node3 + jest.spyOn(console, "error").mockImplementation(() => { }); mind.remove_node(root); expect(mind.get_node('0')).toBe(root) mind.remove_node(node1); diff --git a/tests/jsmind.node.test.js b/tests/jsmind.node.test.js index 1a3eb7f9..d029fe40 100644 --- a/tests/jsmind.node.test.js +++ b/tests/jsmind.node.test.js @@ -66,3 +66,12 @@ test('get location and size', () => { expect(fakeNode.get_location()).toEqual({ x: 1, y: 2 }) expect(fakeNode.get_size()).toEqual({ w: 3, h: 4 }) }); + +test('check if it is a node', ()=>{ + const fakeNode = new jm.node('1', 1) + expect(jm.node.is_node({})).toBeFalsy() + expect(jm.node.is_node(null)).toBeFalsy() + expect(jm.node.is_node()).toBeFalsy() + expect(jm.node.is_node('node')).toBeFalsy() + expect(jm.node.is_node(fakeNode)).toBeTruthy() +}); diff --git a/tests/jsmind.util.test.js b/tests/jsmind.util.test.js new file mode 100644 index 00000000..c151d464 --- /dev/null +++ b/tests/jsmind.util.test.js @@ -0,0 +1,38 @@ +const jm = require('./jsmind.versions') + +test('json serialization', () => { + const jsonObject = { name: 'jsMind' }; + const jsonString = '{"name":"jsMind"}'; + + expect(jm.util.json.json2string(jsonObject)).toEqual(jsonString); + expect(jm.util.json.string2json(jsonString)).toEqual(jsonObject); +}); + +test('json merge', () => { + const o1 = { name: 'jsMind', license: 'BSD' }; + const o2 = { name: 'jsMind ES6', lang: 'ES6' }; + const o3 = jm.util.json.merge({}, o1) + const o4 = jm.util.json.merge(o3, o2) + const o5 = jm.util.json.merge({}, o4) + + expect(o3).toBe(o4) + expect(o4).toEqual({ name: 'jsMind ES6', lang: 'ES6', license: 'BSD' }) + expect(o5).toEqual(o4) + expect(jm.util.json.merge(o5, {})).toEqual(o4) +}); + +test('uuid newid', () => { + const uuid1 = jm.util.uuid.newid(); + const uuid2 = jm.util.uuid.newid(); + expect(uuid1 === uuid2).toBeFalsy(); + expect(uuid1.length).toBe(16); +}); + +test('string is empty', () => { + expect(jm.util.text.is_empty()).toBeTruthy(); + expect(jm.util.text.is_empty(null)).toBeTruthy(); + expect(jm.util.text.is_empty('')).toBeTruthy(); + expect(jm.util.text.is_empty('\n\t\r ')).toBeTruthy(); + expect(jm.util.text.is_empty(' hello ')).toBeFalsy(); + expect(jm.util.text.is_empty('hello world')).toBeFalsy(); +}); \ No newline at end of file From 0f6185920a5af0c51951d9fd9f5d9a271573fb73 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Fri, 10 Jun 2022 19:04:04 +0800 Subject: [PATCH 040/274] add code format plugin (#345) * build * install plugin prettier * format code * update source map * add format check into workflow --- .github/workflows/node.js.yml | 21 +- .gitignore | 2 +- .npmignore | 1 + .prettierignore | 10 + .prettierrc.json | 13 + README.md | 57 +- es6/jsmind.draggable.js.map | 2 +- es6/jsmind.js | 2 +- es6/jsmind.js.map | 2 +- es6/jsmind.screenshot.js.map | 2 +- example/1_basic.html | 122 ++-- example/2_features.html | 1164 +++++++++++++++++------------- example/2_features_es6.html | 1164 +++++++++++++++++------------- example/3_mathjax.html | 188 ++--- example/data_example.json | 137 ++-- example/demo.html | 184 ++--- features/jsmind.shell.js | 20 +- package-lock.json | 22 + package.json | 93 +-- rollup.config.js | 111 +-- src/jsmind.common.js | 23 +- src/jsmind.data_provider.js | 6 +- src/jsmind.dom.js | 26 +- src/jsmind.format.js | 129 ++-- src/jsmind.graph.js | 42 +- src/jsmind.js | 122 +++- src/jsmind.layout_provider.js | 78 +- src/jsmind.mind.js | 37 +- src/jsmind.node.js | 24 +- src/jsmind.option.js | 23 +- src/jsmind.plugin.js | 8 +- src/jsmind.shortcut_provider.js | 32 +- src/jsmind.util.js | 51 +- src/jsmind.view_provider.js | 82 ++- src/plugins/jsmind.draggable.js | 66 +- src/plugins/jsmind.screenshot.js | 90 ++- style/jsmind.css | 462 +++++++++--- tests/jsmind.mind.test.js | 87 ++- tests/jsmind.node.test.js | 55 +- tests/jsmind.util.test.js | 18 +- tests/jsmind.versions.js | 6 +- 41 files changed, 2841 insertions(+), 1943 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc.json diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 1373a870..2205f446 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -10,13 +10,30 @@ on: branches: [ master ] jobs: - build: + static_check: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.x] + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run format-check + + test: runs-on: ubuntu-latest strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x] jm-lang: [ES5, ES6] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.gitignore b/.gitignore index d5700888..c8fcd164 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ node_modules/ - +.vscode diff --git a/.npmignore b/.npmignore index 8649f823..a81c2c2e 100644 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,5 @@ .github +.vscode example features node_modules diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..fd2673a1 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,10 @@ +.github +.vscode +docs +es6 +js +node_modules +screenshots +.* +LICENSE +package-lock.json diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..3734fd29 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,13 @@ +{ + "printWidth": 100, + "tabWidth": 4, + "useTabs": false, + "semi": true, + "singleQuote": true, + "quoteProps": "consistent", + "trailingComma": "es5", + "bracketSpacing": true, + "arrowParens": "avoid", + "proseWrap": "preserve", + "singleAttributePerLine": false +} diff --git a/README.md b/README.md index 343297fe..a5770a3e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -jsMind -====== +# jsMind + ![build-test](https://github.com/hizzgdev/jsmind/actions/workflows/node.js.yml/badge.svg) jsMind 是一个显示/编辑思维导图的纯 javascript 类库,其基于 html5 canvas (和 svg) 进行设计。jsMind 以 BSD 协议开源,在此基础上你可以在你的项目上任意使用。你可以在此浏览[适用于 jsMind 的 BSD 许可协议(中英文版本)][3]。 @@ -7,28 +7,29 @@ jsMind 是一个显示/编辑思维导图的纯 javascript 类库,其基于 ht jsMind is a pure javascript library for mindmap, it base on html5 canvas and svg. jsMind was released under BSD license, you can embed it in any project, if only you observe the license. You can read [the BSD license agreement for jsMind in English and Chinese version][3] here. ES6 Pilot Version: -* 目前处于测试阶段,欢迎试用找bug -* ES6 代码位于 `/src` -* 可运行于浏览器的 js 文件位于 `/es6` -* Demo + +- 目前处于测试阶段,欢迎试用找 bug +- ES6 代码位于 `/src` +- 可运行于浏览器的 js 文件位于 `/es6` +- Demo Links: -* App : -* Home : -* npm : -* Demo : - * - * - * -* Documents : - * [简体中文][1] - * [English][2] -* Wiki : - * [邮件列表 Mailing List](../../wiki/MailingList) - * [热点问题 Hot Topics](../../wiki/HotTopics) -* Donate : - * [资助本项目的开发][4] +- App : +- Home : +- npm : +- Demo : + - + - + - +- Documents : + - [简体中文][1] + - [English][2] +- Wiki : + - [邮件列表 Mailing List](../../wiki/MailingList) + - [热点问题 Hot Topics](../../wiki/HotTopics) +- Donate : + - [资助本项目的开发][4] Get Started: @@ -51,9 +52,9 @@ Get Started: // see Documents for more information }; var options = { - container:'jsmind_container', - theme:'orange', - editable:true + container: 'jsmind_container', + theme: 'orange', + editable: true, }; var jm = new jsMind(options); jm.show(mind); @@ -62,7 +63,7 @@ Get Started: ``` -[1]:docs/zh/index.md -[2]:docs/en/index.md -[3]:LICENSE -[4]:http://hizzgdev.github.io/jsmind/donate.html +[1]: docs/zh/index.md +[2]: docs/en/index.md +[3]: LICENSE +[4]: http://hizzgdev.github.io/jsmind/donate.html diff --git a/es6/jsmind.draggable.js.map b/es6/jsmind.draggable.js.map index 17f7fb21..907c3f0f 100644 --- a/es6/jsmind.draggable.js.map +++ b/es6/jsmind.draggable.js.map @@ -1 +1 @@ -{"version":3,"file":"jsmind.draggable.js","sources":["../src/plugins/jsmind.draggable.js"],"sourcesContent":["/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n * \n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nif (!jsMind) { throw new Error('jsMind is not defined'); }\n\nconst jm = jsMind;\nconst $ = jm.$;\n\nconst clear_selection = 'getSelection' in $.w ? function () {\n $.w.getSelection().removeAllRanges();\n} : function () {\n $.d.selection.empty();\n};\n\nconst options = {\n line_width: 5,\n lookup_delay: 500,\n lookup_interval: 80\n};\n\nclass draggable {\n constructor(jm) {\n this.jm = jm;\n this.e_canvas = null;\n this.canvas_ctx = null;\n this.shadow = null;\n this.shadow_w = 0;\n this.shadow_h = 0;\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n this.client_w = 0;\n this.client_h = 0;\n this.offset_x = 0;\n this.offset_y = 0;\n this.hlookup_delay = 0;\n this.hlookup_timer = 0;\n this.capture = false;\n this.moved = false;\n }\n init() {\n this._create_canvas();\n this._create_shadow();\n this._event_bind();\n }\n resize() {\n this.jm.view.e_nodes.appendChild(this.shadow);\n this.e_canvas.width = this.jm.view.size.w;\n this.e_canvas.height = this.jm.view.size.h;\n }\n _create_canvas() {\n var c = $.c('canvas');\n this.jm.view.e_panel.appendChild(c);\n var ctx = c.getContext('2d');\n this.e_canvas = c;\n this.canvas_ctx = ctx;\n }\n _create_shadow() {\n var s = $.c('jmnode');\n s.style.visibility = 'hidden';\n s.style.zIndex = '3';\n s.style.cursor = 'move';\n s.style.opacity = '0.7';\n this.shadow = s;\n }\n reset_shadow(el) {\n var s = this.shadow.style;\n this.shadow.innerHTML = el.innerHTML;\n s.left = el.style.left;\n s.top = el.style.top;\n s.width = el.style.width;\n s.height = el.style.height;\n s.backgroundImage = el.style.backgroundImage;\n s.backgroundSize = el.style.backgroundSize;\n s.transform = el.style.transform;\n this.shadow_w = this.shadow.clientWidth;\n this.shadow_h = this.shadow.clientHeight;\n\n }\n show_shadow() {\n if (!this.moved) {\n this.shadow.style.visibility = 'visible';\n }\n }\n hide_shadow() {\n this.shadow.style.visibility = 'hidden';\n }\n _magnet_shadow(node) {\n if (!!node) {\n this.canvas_ctx.lineWidth = options.line_width;\n this.canvas_ctx.strokeStyle = 'rgba(0,0,0,0.3)';\n this.canvas_ctx.lineCap = 'round';\n this._clear_lines();\n this._canvas_lineto(node.sp.x, node.sp.y, node.np.x, node.np.y);\n }\n }\n _clear_lines() {\n this.canvas_ctx.clearRect(0, 0, this.jm.view.size.w, this.jm.view.size.h);\n }\n _canvas_lineto(x1, y1, x2, y2) {\n this.canvas_ctx.beginPath();\n this.canvas_ctx.moveTo(x1, y1);\n this.canvas_ctx.lineTo(x2, y2);\n this.canvas_ctx.stroke();\n }\n _lookup_close_node() {\n var root = this.jm.get_root();\n var root_location = root.get_location();\n var root_size = root.get_size();\n var root_x = root_location.x + root_size.w / 2;\n\n var sw = this.shadow_w;\n var sh = this.shadow_h;\n var sx = this.shadow.offsetLeft;\n var sy = this.shadow.offsetTop;\n\n var ns, nl;\n\n var direct = (sx + sw / 2) >= root_x ?\n jsMind.direction.right : jsMind.direction.left;\n var nodes = this.jm.mind.nodes;\n var node = null;\n var layout = this.jm.layout;\n var min_distance = Number.MAX_VALUE;\n var distance = 0;\n var closest_node = null;\n var closest_p = null;\n var shadow_p = null;\n for (var nodeid in nodes) {\n var np, sp;\n node = nodes[nodeid];\n if (node.isroot || node.direction == direct) {\n if (node.id == this.active_node.id) {\n continue;\n }\n if (!layout.is_visible(node)) {\n continue;\n }\n ns = node.get_size();\n nl = node.get_location();\n if (direct == jsMind.direction.right) {\n if (sx - nl.x - ns.w <= 0) { continue; }\n distance = Math.abs(sx - nl.x - ns.w) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + ns.w - options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + options.line_width, y: sy + sh / 2 };\n } else {\n if (nl.x - sx - sw <= 0) { continue; }\n distance = Math.abs(sx + sw - nl.x) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + sw - options.line_width, y: sy + sh / 2 };\n }\n if (distance < min_distance) {\n closest_node = node;\n closest_p = np;\n shadow_p = sp;\n min_distance = distance;\n }\n }\n }\n var result_node = null;\n if (!!closest_node) {\n result_node = {\n node: closest_node,\n direction: direct,\n sp: shadow_p,\n np: closest_p\n };\n }\n return result_node;\n }\n lookup_close_node() {\n var node_data = this._lookup_close_node();\n if (!!node_data) {\n this._magnet_shadow(node_data);\n this.target_node = node_data.node;\n this.target_direct = node_data.direction;\n }\n }\n _event_bind() {\n var jd = this;\n var container = this.jm.view.container;\n $.on(container, 'mousedown', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'mousemove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'mouseup', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n $.on(container, 'touchstart', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'touchmove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'touchend', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n }\n dragstart(e) {\n if (!this.jm.get_editable()) { return; }\n if (this.capture) { return; }\n this.active_node = null;\n\n var jview = this.jm.view;\n var el = e.target || event.srcElement;\n if (el.tagName.toLowerCase() != 'jmnode') { return; }\n var nodeid = jview.get_binded_nodeid(el);\n if (!!nodeid) {\n var node = this.jm.get_node(nodeid);\n if (!node.isroot) {\n this.reset_shadow(el);\n this.active_node = node;\n this.offset_x = (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft;\n this.offset_y = (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop;\n this.client_hw = Math.floor(el.clientWidth / 2);\n this.client_hh = Math.floor(el.clientHeight / 2);\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n }\n var jd = this;\n this.hlookup_delay = $.w.setTimeout(function () {\n jd.hlookup_delay = 0;\n jd.hlookup_timer = $.w.setInterval(function () {\n jd.lookup_close_node.call(jd);\n }, options.lookup_interval);\n }, options.lookup_delay);\n this.capture = true;\n }\n }\n }\n drag(e) {\n if (!this.jm.get_editable()) { return; }\n if (this.capture) {\n e.preventDefault();\n this.show_shadow();\n this.moved = true;\n clear_selection();\n var jview = this.jm.view;\n var px = (e.clientX || e.touches[0].clientX) / jview.actualZoom - this.offset_x;\n var py = (e.clientY || e.touches[0].clientY) / jview.actualZoom - this.offset_y;\n this.shadow.style.left = px + 'px';\n this.shadow.style.top = py + 'px';\n clear_selection();\n }\n }\n dragend(e) {\n if (!this.jm.get_editable()) { return; }\n if (this.capture) {\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n this.hlookup_delay = 0;\n this._clear_lines();\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n this.hlookup_timer = 0;\n this._clear_lines();\n }\n if (this.moved) {\n var src_node = this.active_node;\n var target_node = this.target_node;\n var target_direct = this.target_direct;\n this.move_node(src_node, target_node, target_direct);\n }\n this.hide_shadow();\n }\n this.moved = false;\n this.capture = false;\n }\n move_node(src_node, target_node, target_direct) {\n var shadow_h = this.shadow.offsetTop;\n if (!!target_node && !!src_node && !jsMind.node.inherited(src_node, target_node)) {\n // lookup before_node\n var sibling_nodes = target_node.children;\n var sc = sibling_nodes.length;\n var node = null;\n var delta_y = Number.MAX_VALUE;\n var node_before = null;\n var beforeid = '_last_';\n while (sc--) {\n node = sibling_nodes[sc];\n if (node.direction == target_direct && node.id != src_node.id) {\n var dy = node.get_location().y - shadow_h;\n if (dy > 0 && dy < delta_y) {\n delta_y = dy;\n node_before = node;\n beforeid = '_first_';\n }\n }\n }\n if (!!node_before) { beforeid = node_before.id; }\n this.jm.move_node(src_node.id, beforeid, target_node.id, target_direct);\n }\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\n\nvar draggable_plugin = new jm.plugin('draggable', function (jm) {\n var jd = new draggable(jm);\n jd.init();\n jm.add_event_listener(function (type, data) {\n jd.jm_event_handle.call(jd, type, data);\n });\n});\n\njsMind.register_plugin(draggable_plugin);\n"],"names":["jsMind","Error","jm","$","clear_selection","w","getSelection","removeAllRanges","d","selection","empty","options","draggable","constructor","this","e_canvas","canvas_ctx","shadow","shadow_w","shadow_h","active_node","target_node","target_direct","client_w","client_h","offset_x","offset_y","hlookup_delay","hlookup_timer","capture","moved","init","_create_canvas","_create_shadow","_event_bind","resize","view","e_nodes","appendChild","width","size","height","h","c","e_panel","ctx","getContext","s","style","visibility","zIndex","cursor","opacity","reset_shadow","el","innerHTML","left","top","backgroundImage","backgroundSize","transform","clientWidth","clientHeight","show_shadow","hide_shadow","_magnet_shadow","node","lineWidth","strokeStyle","lineCap","_clear_lines","_canvas_lineto","sp","x","y","np","clearRect","x1","y1","x2","y2","beginPath","moveTo","lineTo","stroke","_lookup_close_node","ns","nl","root","get_root","root_location","get_location","root_size","get_size","root_x","sw","sh","sx","offsetLeft","sy","offsetTop","direct","direction","right","nodes","mind","layout","min_distance","Number","MAX_VALUE","distance","closest_node","closest_p","shadow_p","nodeid","isroot","id","is_visible","Math","abs","result_node","lookup_close_node","node_data","jd","container","on","e","evt","event","dragstart","call","drag","dragend","get_editable","jview","target","srcElement","tagName","toLowerCase","get_binded_nodeid","get_node","clientX","touches","actualZoom","clientY","client_hw","floor","client_hh","clearTimeout","clearInterval","setTimeout","setInterval","preventDefault","px","py","src_node","move_node","inherited","sibling_nodes","children","sc","length","delta_y","node_before","beforeid","dy","jm_event_handle","type","data","event_type","draggable_plugin","plugin","add_event_listener","register_plugin"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"jsmind.draggable.js","sources":["../src/plugins/jsmind.draggable.js"],"sourcesContent":["/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nif (!jsMind) {\n throw new Error('jsMind is not defined');\n}\n\nconst jm = jsMind;\nconst $ = jm.$;\n\nconst clear_selection =\n 'getSelection' in $.w\n ? function () {\n $.w.getSelection().removeAllRanges();\n }\n : function () {\n $.d.selection.empty();\n };\n\nconst options = {\n line_width: 5,\n lookup_delay: 500,\n lookup_interval: 80,\n};\n\nclass draggable {\n constructor(jm) {\n this.jm = jm;\n this.e_canvas = null;\n this.canvas_ctx = null;\n this.shadow = null;\n this.shadow_w = 0;\n this.shadow_h = 0;\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n this.client_w = 0;\n this.client_h = 0;\n this.offset_x = 0;\n this.offset_y = 0;\n this.hlookup_delay = 0;\n this.hlookup_timer = 0;\n this.capture = false;\n this.moved = false;\n }\n init() {\n this._create_canvas();\n this._create_shadow();\n this._event_bind();\n }\n resize() {\n this.jm.view.e_nodes.appendChild(this.shadow);\n this.e_canvas.width = this.jm.view.size.w;\n this.e_canvas.height = this.jm.view.size.h;\n }\n _create_canvas() {\n var c = $.c('canvas');\n this.jm.view.e_panel.appendChild(c);\n var ctx = c.getContext('2d');\n this.e_canvas = c;\n this.canvas_ctx = ctx;\n }\n _create_shadow() {\n var s = $.c('jmnode');\n s.style.visibility = 'hidden';\n s.style.zIndex = '3';\n s.style.cursor = 'move';\n s.style.opacity = '0.7';\n this.shadow = s;\n }\n reset_shadow(el) {\n var s = this.shadow.style;\n this.shadow.innerHTML = el.innerHTML;\n s.left = el.style.left;\n s.top = el.style.top;\n s.width = el.style.width;\n s.height = el.style.height;\n s.backgroundImage = el.style.backgroundImage;\n s.backgroundSize = el.style.backgroundSize;\n s.transform = el.style.transform;\n this.shadow_w = this.shadow.clientWidth;\n this.shadow_h = this.shadow.clientHeight;\n }\n show_shadow() {\n if (!this.moved) {\n this.shadow.style.visibility = 'visible';\n }\n }\n hide_shadow() {\n this.shadow.style.visibility = 'hidden';\n }\n _magnet_shadow(node) {\n if (!!node) {\n this.canvas_ctx.lineWidth = options.line_width;\n this.canvas_ctx.strokeStyle = 'rgba(0,0,0,0.3)';\n this.canvas_ctx.lineCap = 'round';\n this._clear_lines();\n this._canvas_lineto(node.sp.x, node.sp.y, node.np.x, node.np.y);\n }\n }\n _clear_lines() {\n this.canvas_ctx.clearRect(0, 0, this.jm.view.size.w, this.jm.view.size.h);\n }\n _canvas_lineto(x1, y1, x2, y2) {\n this.canvas_ctx.beginPath();\n this.canvas_ctx.moveTo(x1, y1);\n this.canvas_ctx.lineTo(x2, y2);\n this.canvas_ctx.stroke();\n }\n _lookup_close_node() {\n var root = this.jm.get_root();\n var root_location = root.get_location();\n var root_size = root.get_size();\n var root_x = root_location.x + root_size.w / 2;\n\n var sw = this.shadow_w;\n var sh = this.shadow_h;\n var sx = this.shadow.offsetLeft;\n var sy = this.shadow.offsetTop;\n\n var ns, nl;\n\n var direct = sx + sw / 2 >= root_x ? jsMind.direction.right : jsMind.direction.left;\n var nodes = this.jm.mind.nodes;\n var node = null;\n var layout = this.jm.layout;\n var min_distance = Number.MAX_VALUE;\n var distance = 0;\n var closest_node = null;\n var closest_p = null;\n var shadow_p = null;\n for (var nodeid in nodes) {\n var np, sp;\n node = nodes[nodeid];\n if (node.isroot || node.direction == direct) {\n if (node.id == this.active_node.id) {\n continue;\n }\n if (!layout.is_visible(node)) {\n continue;\n }\n ns = node.get_size();\n nl = node.get_location();\n if (direct == jsMind.direction.right) {\n if (sx - nl.x - ns.w <= 0) {\n continue;\n }\n distance = Math.abs(sx - nl.x - ns.w) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + ns.w - options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + options.line_width, y: sy + sh / 2 };\n } else {\n if (nl.x - sx - sw <= 0) {\n continue;\n }\n distance = Math.abs(sx + sw - nl.x) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + sw - options.line_width, y: sy + sh / 2 };\n }\n if (distance < min_distance) {\n closest_node = node;\n closest_p = np;\n shadow_p = sp;\n min_distance = distance;\n }\n }\n }\n var result_node = null;\n if (!!closest_node) {\n result_node = {\n node: closest_node,\n direction: direct,\n sp: shadow_p,\n np: closest_p,\n };\n }\n return result_node;\n }\n lookup_close_node() {\n var node_data = this._lookup_close_node();\n if (!!node_data) {\n this._magnet_shadow(node_data);\n this.target_node = node_data.node;\n this.target_direct = node_data.direction;\n }\n }\n _event_bind() {\n var jd = this;\n var container = this.jm.view.container;\n $.on(container, 'mousedown', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'mousemove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'mouseup', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n $.on(container, 'touchstart', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'touchmove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'touchend', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n }\n dragstart(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n return;\n }\n this.active_node = null;\n\n var jview = this.jm.view;\n var el = e.target || event.srcElement;\n if (el.tagName.toLowerCase() != 'jmnode') {\n return;\n }\n var nodeid = jview.get_binded_nodeid(el);\n if (!!nodeid) {\n var node = this.jm.get_node(nodeid);\n if (!node.isroot) {\n this.reset_shadow(el);\n this.active_node = node;\n this.offset_x =\n (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft;\n this.offset_y =\n (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop;\n this.client_hw = Math.floor(el.clientWidth / 2);\n this.client_hh = Math.floor(el.clientHeight / 2);\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n }\n var jd = this;\n this.hlookup_delay = $.w.setTimeout(function () {\n jd.hlookup_delay = 0;\n jd.hlookup_timer = $.w.setInterval(function () {\n jd.lookup_close_node.call(jd);\n }, options.lookup_interval);\n }, options.lookup_delay);\n this.capture = true;\n }\n }\n }\n drag(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n e.preventDefault();\n this.show_shadow();\n this.moved = true;\n clear_selection();\n var jview = this.jm.view;\n var px = (e.clientX || e.touches[0].clientX) / jview.actualZoom - this.offset_x;\n var py = (e.clientY || e.touches[0].clientY) / jview.actualZoom - this.offset_y;\n this.shadow.style.left = px + 'px';\n this.shadow.style.top = py + 'px';\n clear_selection();\n }\n }\n dragend(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n this.hlookup_delay = 0;\n this._clear_lines();\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n this.hlookup_timer = 0;\n this._clear_lines();\n }\n if (this.moved) {\n var src_node = this.active_node;\n var target_node = this.target_node;\n var target_direct = this.target_direct;\n this.move_node(src_node, target_node, target_direct);\n }\n this.hide_shadow();\n }\n this.moved = false;\n this.capture = false;\n }\n move_node(src_node, target_node, target_direct) {\n var shadow_h = this.shadow.offsetTop;\n if (!!target_node && !!src_node && !jsMind.node.inherited(src_node, target_node)) {\n // lookup before_node\n var sibling_nodes = target_node.children;\n var sc = sibling_nodes.length;\n var node = null;\n var delta_y = Number.MAX_VALUE;\n var node_before = null;\n var beforeid = '_last_';\n while (sc--) {\n node = sibling_nodes[sc];\n if (node.direction == target_direct && node.id != src_node.id) {\n var dy = node.get_location().y - shadow_h;\n if (dy > 0 && dy < delta_y) {\n delta_y = dy;\n node_before = node;\n beforeid = '_first_';\n }\n }\n }\n if (!!node_before) {\n beforeid = node_before.id;\n }\n this.jm.move_node(src_node.id, beforeid, target_node.id, target_direct);\n }\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\nvar draggable_plugin = new jm.plugin('draggable', function (jm) {\n var jd = new draggable(jm);\n jd.init();\n jm.add_event_listener(function (type, data) {\n jd.jm_event_handle.call(jd, type, data);\n });\n});\n\njsMind.register_plugin(draggable_plugin);\n"],"names":["jsMind","Error","jm","$","clear_selection","w","getSelection","removeAllRanges","d","selection","empty","options","draggable","constructor","this","e_canvas","canvas_ctx","shadow","shadow_w","shadow_h","active_node","target_node","target_direct","client_w","client_h","offset_x","offset_y","hlookup_delay","hlookup_timer","capture","moved","init","_create_canvas","_create_shadow","_event_bind","resize","view","e_nodes","appendChild","width","size","height","h","c","e_panel","ctx","getContext","s","style","visibility","zIndex","cursor","opacity","reset_shadow","el","innerHTML","left","top","backgroundImage","backgroundSize","transform","clientWidth","clientHeight","show_shadow","hide_shadow","_magnet_shadow","node","lineWidth","strokeStyle","lineCap","_clear_lines","_canvas_lineto","sp","x","y","np","clearRect","x1","y1","x2","y2","beginPath","moveTo","lineTo","stroke","_lookup_close_node","ns","nl","root","get_root","root_location","get_location","root_size","get_size","root_x","sw","sh","sx","offsetLeft","sy","offsetTop","direct","direction","right","nodes","mind","layout","min_distance","Number","MAX_VALUE","distance","closest_node","closest_p","shadow_p","nodeid","isroot","id","is_visible","Math","abs","result_node","lookup_close_node","node_data","jd","container","on","e","evt","event","dragstart","call","drag","dragend","get_editable","jview","target","srcElement","tagName","toLowerCase","get_binded_nodeid","get_node","clientX","touches","actualZoom","clientY","client_hw","floor","client_hh","clearTimeout","clearInterval","setTimeout","setInterval","preventDefault","px","py","src_node","move_node","inherited","sibling_nodes","children","sc","length","delta_y","node_before","beforeid","dy","jm_event_handle","type","data","event_type","draggable_plugin","plugin","add_event_listener","register_plugin"],"mappings":"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"} \ No newline at end of file diff --git a/es6/jsmind.js b/es6/jsmind.js index 7e2762ca..130829af 100644 --- a/es6/jsmind.js +++ b/es6/jsmind.js @@ -5,5 +5,5 @@ * Project Home: * https://github.com/hizzgdev/jsmind/ */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).jsMind=t()}(this,(function(){"use strict";const e="0.4.9",t="hizzgdev@163.com";"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e){return this.slice(0,e.length)===e});var i=function(){};let n="undefined"==typeof console?{log:i,debug:i,error:i,warn:i,info:i}:console;const o={left:-1,center:0,right:1},s={show:1,resize:2,edit:3,select:4};const a=new class{constructor(e){this.w=e,this.d=e.document,this.g=function(e){return this.d.getElementById(e)},this.c=function(e){return this.d.createElement(e)},this.t=function(e,t){e.hasChildNodes()?e.firstChild.nodeValue=t:e.appendChild(this.d.createTextNode(t))},this.h=function(e,t){t instanceof HTMLElement?(e.innerHTML="",e.appendChild(t)):e.innerHTML=t},this.i=function(e){return!!e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument},this.on=function(e,t,i){e.addEventListener?e.addEventListener(t,i,!1):e.attachEvent("on"+t,i)}}}(window),r={ajax:{request:function(e,t,i,o,s){var a=Object.keys(t).map((e=>encodeURIComponent(e)+"="+encodeURIComponent(t[e]))).join("&");console.log(a);var d=new XMLHttpRequest;d&&(d.onreadystatechange=function(){if(4==d.readyState)if(200==d.status||0==d.status){if("function"==typeof o){var e=r.json.string2json(d.responseText);o(null!=e?e:d.responseText)}}else"function"==typeof s?s(d):n.error("xhr request failed.",d)},i=i||"GET",d.open(i,e,!0),d.setRequestHeader("If-Modified-Since","0"),"POST"==i?(d.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),d.send(a)):d.send())},get:function(e,t){return r.ajax.request(e,{},"GET",t)},post:function(e,t,i){return r.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof a.w.Blob)n=new Blob([e],{type:t});else{var o=new(a.w.BlobBuilder||a.w.MozBlobBuilder||a.w.WebKitBlobBuilder||a.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(a.w.URL||a.w.webkitURL).createObjectURL(n),r=a.c("a");if("download"in r){r.style.visibility="hidden",r.href=s,r.download=i,a.d.body.appendChild(r);var d=a.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),r.dispatchEvent(d),a.d.body.removeChild(r)}else location.href=s}}},json:{json2string:function(e){if(JSON)try{return JSON.stringify(e)}catch(e){return n.warn(e),n.warn("can not convert to string"),null}},string2json:function(e){if(JSON)try{return JSON.parse(e)}catch(e){return n.warn(e),n.warn("can not parse to json"),null}},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:r.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substr(2)).substr(2,16)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},d={container:"",editable:!1,theme:null,mode:"full",support_html:!0,view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:45,addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class l{constructor(e,t,i,o,s,a,r,d){e?"number"==typeof t?(void 0===d&&(d=!0),this.id=e,this.index=t,this.topic=i,this.data=o||{},this.isroot=s,this.parent=a,this.direction=r,this.expanded=!!d,this.children=[],this._data={}):n.error("invalid node index"):n.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?"Up":"Down")?this.view.zoomIn():this.view.zoomOut())}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;rencodeURIComponent(e)+"="+encodeURIComponent(t[e]))).join("&"),d=new XMLHttpRequest;d&&(d.onreadystatechange=function(){if(4==d.readyState)if(200==d.status||0==d.status){if("function"==typeof o){var e=r.json.string2json(d.responseText);o(null!=e?e:d.responseText)}}else"function"==typeof s?s(d):n.error("xhr request failed.",d)},i=i||"GET",d.open(i,e,!0),d.setRequestHeader("If-Modified-Since","0"),"POST"==i?(d.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),d.send(a)):d.send())},get:function(e,t){return r.ajax.request(e,{},"GET",t)},post:function(e,t,i){return r.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof a.w.Blob)n=new Blob([e],{type:t});else{var o=new(a.w.BlobBuilder||a.w.MozBlobBuilder||a.w.WebKitBlobBuilder||a.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(a.w.URL||a.w.webkitURL).createObjectURL(n),r=a.c("a");if("download"in r){r.style.visibility="hidden",r.href=s,r.download=i,a.d.body.appendChild(r);var d=a.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),r.dispatchEvent(d),a.d.body.removeChild(r)}else location.href=s}}},json:{json2string:function(e){return JSON.stringify(e)},string2json:function(e){return JSON.parse(e)},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:r.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substring(2)).substring(2,18)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},d={container:"",editable:!1,theme:null,mode:"full",support_html:!0,view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:45,addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class l{constructor(e,t,i,o,s,a,r,d){e?"number"==typeof t?(void 0===d&&(d=!0),this.id=e,this.index=t,this.topic=i,this.data=o||{},this.isroot=s,this.parent=a,this.direction=r,this.expanded=!!d,this.children=[],this._data={}):n.error("invalid node index"):n.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?"Up":"Down")?this.view.zoomIn():this.view.zoomOut())}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;r encodeURIComponent(k) + '=' + encodeURIComponent(param[k])).join('&');\n console.log(p);\n var xhr = new XMLHttpRequest();\n if (!xhr) { return; }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status == 0) {\n if (typeof callback === 'function') {\n var data = util.json.string2json(xhr.responseText);\n if (data != null) {\n callback(data);\n } else {\n callback(xhr.responseText);\n }\n }\n } else {\n if (typeof fail_callback === 'function') {\n fail_callback(xhr);\n } else {\n logger.error('xhr request failed.', xhr);\n }\n }\n }\n }\n method = method || 'GET';\n xhr.open(method, url, true);\n xhr.setRequestHeader('If-Modified-Since', '0');\n if (method == 'POST') {\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');\n xhr.send(p);\n } else {\n xhr.send();\n }\n },\n get: function (url, callback) {\n return util.ajax.request(url, {}, 'GET', callback);\n },\n post: function (url, param, callback) {\n return util.ajax.request(url, param, 'POST', callback);\n }\n },\n\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 = $.w.BlobBuilder || $.w.MozBlobBuilder || $.w.WebKitBlobBuilder || $.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 bloburl = URL.createObjectURL(blob);\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\n }\n }\n }\n },\n\n json: {\n json2string: function (json) {\n if (!!JSON) {\n try {\n var json_str = JSON.stringify(json);\n return json_str;\n } catch (e) {\n logger.warn(e);\n logger.warn('can not convert to string');\n return null;\n }\n }\n },\n string2json: function (json_str) {\n if (!!JSON) {\n try {\n var json = JSON.parse(json_str);\n return json;\n } catch (e) {\n logger.warn(e);\n logger.warn('can not parse to json');\n return null;\n }\n }\n },\n merge: function (b, a) {\n for (var o in a) {\n if (o in b) {\n if (typeof b[o] === 'object' &&\n Object.prototype.toString.call(b[o]).toLowerCase() == '[object object]' &&\n !b[o].length) {\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 (new Date().getTime().toString(16) + Math.random().toString(16).substr(2)).substr(2, 16);\n }\n },\n\n text: {\n is_empty: function (s) {\n if (!s) { return true; }\n return s.replace(/\\s*/, '').length == 0;\n }\n }\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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\n view: {\n engine: 'canvas',\n hmargin: 100,\n vmargin: 50,\n line_width: 2,\n line_color: '#555',\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 },\n layout: {\n hspace: 30,\n vspace: 20,\n pspace: 13\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 },\n mapping: {\n addchild: 45, // Insert\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};\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-2022 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) { logger.error('invalid node id'); return; }\n if (typeof iIndex != 'number') { logger.error('invalid node index'); return; }\n if (typeof bExpanded === 'undefined') { bExpanded = true; }\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 alwary the last\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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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\n","/**\n * @license BSD\n * @copyright 2014-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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(nodeid, node_index, topic, data, false, parent_node, parent_node.direction, expanded);\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._reindex(parent_node);\n } else {\n logger.error('fail, the nodeid \\'' + node.id + '\\' has been already exist.');\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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) { return null; }\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, nodeid, 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, nodeid, 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) { return null; }\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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = (!!beforeid) ? this.get_node(beforeid) : null;\n if (node_before != null && node_before.parent != null && node_before.parent.id == node.parent.id) {\n node.index = node_before.index - 0.5;\n this._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn('the nodeid \\'' + node.id + '\\' has been already exist.');\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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\n","/**\n * @license BSD\n * @copyright 2014-2022 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\";\n\nexport const format = {\n node_tree: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_tree simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_tree\",\n \"data\": { \"id\": \"root\", \"topic\": \"jsMind 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._buildnode(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 (k == 'id' || k == 'topic' || k == 'children' || k == 'direction' || k == 'expanded') {\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(node_parent, node_json.id, node_json.topic, data, d, node_json.expanded);\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 _buildnode: function (node) {\n var df = format.node_tree;\n if (!(node instanceof Node)) { return; }\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._buildnode(children[i]));\n }\n }\n return o;\n }\n },\n\n node_array: {\n example: {\n \"meta\": {\n \"name\": 'jsMind node_array simple',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"node_array\",\n \"data\": [\n { \"id\": \"root\", \"topic\": \"jsMind Example\", \"isroot\": true }\n ]\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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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(parent_node, node_json.id, node_json.topic, data, d, node_json.expanded);\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 (k == 'id' || k == 'topic' || k == 'parentid' || k == 'isroot' || k == 'direction' || k == 'expanded') {\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)) { return; }\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\": {\n \"name\": 'jsMind freemind example',\n \"author\": __author__,\n \"version\": __version__\n },\n \"format\": \"freemind\",\n \"data\": \"\"\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 { // 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 // 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 = ('expanded' in node_data) ? (node_data.expanded == 'true') : true;\n delete node_data.expanded;\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(parent_node, node_id, node_topic, node_data, node_direction, node_expanded);\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n }\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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++) { if (children[i].direction === Direction.left) { r--; } else { r++; } }\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 layout_data.outer_height = node_outer_height;\n layout_data.offset_y = base_y - node_outer_height / 2;\n layout_data.offset_x = this.opts.hspace * layout_data.direction + 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\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 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 = 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 nodeid in nodes) {\n node = nodes[nodeid];\n pout = this.get_node_point_out(node);\n if (pout.x > this.bounds.e) { this.bounds.e = pout.x; }\n if (pout.x < this.bounds.w) { this.bounds.w = pout.x; }\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, { evt: 'expand_node', data: [], node: node.id });\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, { evt: 'collapse_node', data: [], node: node.id });\n }\n expand_all() {\n var nodes = this.jm.mind.nodes;\n var c = 0;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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) { return; }\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(root_layout_data.right_nodes);\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n } else {\n if (node._data.layout.direction == Direction.right) {\n root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes);\n } else {\n root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes);\n }\n }\n this.bounds.s = Math.max(root_layout_data.outer_height_left, root_layout_data.outer_height_right);\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\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from \"./jsmind.dom.js\";\n\nclass graph_svg {\n constructor(view) {\n this.view = view;\n this.opts = view.opts;\n this.e_svg = graph_svg.c('svg');\n this.e_svg.setAttribute('class', 'jsmind');\n this.size = { w: 0, h: 0 };\n this.lines = [];\n }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = graph_svg.c('path');\n line.setAttribute('stroke', 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._bezier_to(line, 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 var img = new Image();\n img.onload = function () {\n dest_canvas_ctx.drawImage(img, 0, 0);\n !!callback && callback();\n };\n img.src = 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg));\n }\n _bezier_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M' + x1 + ' ' + y1 + ' C ' + (x1 + (x2 - x1) * 2 / 3) + ' ' + y1 + ', ' + x1 + ' ' + y2 + ', ' + x2 + ' ' + y2);\n }\n _line_to(path, x1, y1, x2, y2) {\n path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2);\n }\n}\n\n\nclass graph_canvas {\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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y);\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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 const graph = { svg: graph_svg, canvas: graph_canvas };\n","/**\n * @license BSD\n * @copyright 2014-2022 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 { 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 }\n init() {\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.e_panel = $.c('div');\n this.e_nodes = $.c('jmnodes');\n this.e_editor = $.c('input');\n\n this.graph = this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this);\n\n this.e_panel.className = 'jsmind-inner';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\n\n var v = this;\n $.on(this.e_editor, 'keydown', function (e) {\n var evt = e || event;\n if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); }\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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) { client_w = min_width; }\n if (client_h < min_height) { client_h = min_height; }\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\n }\n select_node(node) {\n if (!!this.selected_node) {\n this.selected_node._data.view.element.className =\n this.selected_node._data.view.element.className.replace(/\\s*selected\\b/i, '');\n this.reset_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_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 = (element.clientWidth - parseInt(ncs.getPropertyValue('padding-left')) - parseInt(ncs.getPropertyValue('padding-right'))) + '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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if ((zoom < this.minZoom) || (zoom > this.maxZoom)) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n };\n this.show(true);\n return true;\n\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = (_offset.x + p.x) + 'px';\n node_element.style.top = (_offset.y + p.y) + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = (_offset.x + p_expander.x) + 'px';\n expander.style.top = (_offset.y + p_expander.y) + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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(img, 2, 2, node_element.clientWidth, node_element.clientHeight);\n var scaledImageData = c.toDataURL();\n node_element.style.backgroundImage = 'url(' + scaledImageData + ')';\n }\n };\n img.src = backgroundImage;\n\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 = 'rotate(' + node_data['background-rotation'] + 'deg)';\n }\n }\n }\n clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) { continue; }\n if (('visible' in node._data.layout) && !node._data.layout.visible) { continue; }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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\n\n","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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) { e.preventDefault(); } //prevent tab to change focus in browser\n if (this.jm.view.is_editing()) { return; }\n var evt = e || event;\n if (!this.opts.enable) { return true; }\n var kc = evt.keyCode + (evt.metaKey << 13) + (evt.ctrlKey << 12) + (evt.altKey << 11) + (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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 }\n else if (selected_node.direction === d) {\n var children = selected_node.children;\n var childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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\n","/**\n * @license BSD\n * @copyright 2014-2022 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('plugin ' + plugin + ' is not a supported plugin')\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } 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\n\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\n this.init();\n }\n\n init() {\n if (!!this.initialized) { return; }\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n // call enable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // call disable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n get_editable() {\n return this.options.editable;\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, \"mousewheel\", this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(event) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n if (!this.options.default_event_handle[\"enable_mousewheel_handle\"] || !window.event.ctrlKey) {\n return;\n }\n // Avoid default page scrolling behavior.\n event.preventDefault();\n\n var dir = event.deltaY > 0 ? \"Up\" : \"Down\";\n if (dir == \"Up\") {\n this.view.zoomIn();\n } else {\n this.view.zoomOut();\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) { return; }\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) { return; }\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) { return; }\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, { evt: 'add_node', data: [the_parent_node.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(the_node_before, nodeid, topic, data, direction);\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, { evt: 'insert_node_before', data: [the_node_before.id, nodeid, topic, data], node: nodeid });\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, { evt: 'insert_node_after', data: [the_node_after.id, nodeid, topic, data], node: nodeid });\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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, { evt: 'remove_node', data: [nodeid], node: parentid });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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, { evt: 'update_node', data: [nodeid, topic], node: nodeid });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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, { evt: 'move_node', data: [nodeid, beforeid, parentid, direction], node: nodeid });\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 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) { return null; }\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) { return null; }\n var n = null;\n if (node.parent.isroot) {\n var c = node.parent.children;\n var getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!node.data['background-image']) {\n logger.error('fail, only can change rotation angle of node with background image');\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jm;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","request","url","param","method","callback","fail_callback","Object","keys","map","k","encodeURIComponent","join","xhr","XMLHttpRequest","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","a","o","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substr","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","push","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","ActiveXObject","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","graph_svg","e_svg","setAttribute","size","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","graph","svg","canvas","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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"],"mappings":"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"} \ No newline at end of file +{"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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nexport const __version__ = '0.4.9';\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\n// an noop function define\nvar _noop = function () {};\nexport let logger =\n typeof console === 'undefined'\n ? {\n log: _noop,\n debug: _noop,\n error: _noop,\n warn: _noop,\n info: _noop,\n }\n : console;\n\nexport const Direction = { left: -1, center: 0, right: 1 };\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 };\n","/**\n * @license BSD\n * @copyright 2014-2022 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-2022 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\nexport const util = {\n ajax: {\n request: function (url, param, method, callback, fail_callback) {\n var p = Object.keys(param)\n .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(param[k]))\n .join('&');\n var xhr = new XMLHttpRequest();\n if (!xhr) {\n return;\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status == 0) {\n if (typeof callback === 'function') {\n var data = util.json.string2json(xhr.responseText);\n if (data != null) {\n callback(data);\n } else {\n callback(xhr.responseText);\n }\n }\n } else {\n if (typeof fail_callback === 'function') {\n fail_callback(xhr);\n } else {\n logger.error('xhr request failed.', xhr);\n }\n }\n }\n };\n method = method || 'GET';\n xhr.open(method, url, true);\n xhr.setRequestHeader('If-Modified-Since', '0');\n if (method == 'POST') {\n xhr.setRequestHeader(\n 'Content-Type',\n 'application/x-www-form-urlencoded;charset=utf-8'\n );\n xhr.send(p);\n } else {\n xhr.send();\n }\n },\n get: function (url, callback) {\n return util.ajax.request(url, {}, 'GET', callback);\n },\n post: function (url, param, callback) {\n return util.ajax.request(url, param, 'POST', callback);\n },\n },\n\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 bloburl = URL.createObjectURL(blob);\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\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-2022 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\n view: {\n engine: 'canvas',\n hmargin: 100,\n vmargin: 50,\n line_width: 2,\n line_color: '#555',\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 },\n layout: {\n hspace: 30,\n vspace: 20,\n pspace: 13,\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, // Insert\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};\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-2022 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 alwary the last\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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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 nodeid,\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._reindex(parent_node);\n } else {\n logger.error(\"fail, the nodeid '\" + node.id + \"' has been already exist.\");\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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, nodeid, 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, nodeid, 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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = !!beforeid ? this.get_node(beforeid) : 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._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn(\"the nodeid '\" + node.id + \"' has been already exist.\");\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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-2022 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';\n\nexport const format = {\n node_tree: {\n example: {\n meta: {\n name: 'jsMind node_tree simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_tree',\n data: { id: 'root', topic: 'jsMind 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._buildnode(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 _buildnode: 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._buildnode(children[i]));\n }\n }\n return o;\n },\n },\n\n node_array: {\n example: {\n meta: {\n name: 'jsMind node_array simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_array',\n data: [{ id: 'root', topic: 'jsMind 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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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: {\n name: 'jsMind freemind example',\n author: __author__,\n version: __version__,\n },\n format: 'freemind',\n data: '',\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 // 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 = 'expanded' in node_data ? node_data.expanded == 'true' : true;\n delete node_data.expanded;\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n },\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 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 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\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 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 nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from './jsmind.dom.js';\n\nclass graph_svg {\n constructor(view) {\n this.view = view;\n this.opts = view.opts;\n this.e_svg = graph_svg.c('svg');\n this.e_svg.setAttribute('class', 'jsmind');\n this.size = { w: 0, h: 0 };\n this.lines = [];\n }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = graph_svg.c('path');\n line.setAttribute('stroke', 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._bezier_to(\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 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 graph_canvas {\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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(\n ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y\n );\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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 const graph = { svg: graph_svg, canvas: graph_canvas };\n","/**\n * @license BSD\n * @copyright 2014-2022 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 { 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 }\n init() {\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.e_panel = $.c('div');\n this.e_nodes = $.c('jmnodes');\n this.e_editor = $.c('input');\n\n this.graph =\n this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this);\n\n this.e_panel.className = 'jsmind-inner';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\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 }\n if (!!node) {\n this.selected_node = node;\n node._data.view.element.className += ' selected';\n this.clear_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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if (zoom < this.minZoom || zoom > this.maxZoom) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n }\n this.show(true);\n return true;\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = _offset.x + p.x + 'px';\n node_element.style.top = _offset.y + p.y + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = _offset.x + p_expander.x + 'px';\n expander.style.top = _offset.y + p_expander.y + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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 clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) {\n continue;\n }\n if ('visible' in node._data.layout && !node._data.layout.visible) {\n continue;\n }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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-2022 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('plugin ' + plugin + ' is not a supported plugin');\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } 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\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable,\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n // call enable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // call disable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n get_editable() {\n return this.options.editable;\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, 'mousewheel', this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(event) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n if (\n !this.options.default_event_handle['enable_mousewheel_handle'] ||\n !window.event.ctrlKey\n ) {\n return;\n }\n // Avoid default page scrolling behavior.\n event.preventDefault();\n\n var dir = event.deltaY > 0 ? 'Up' : 'Down';\n if (dir == 'Up') {\n this.view.zoomIn();\n } else {\n this.view.zoomOut();\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, nodeid, topic, data],\n node: nodeid,\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(\n the_node_before,\n nodeid,\n topic,\n data,\n direction\n );\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, nodeid, topic, data],\n node: nodeid,\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, nodeid, topic, data],\n node: nodeid,\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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: [nodeid],\n node: parentid,\n });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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: [nodeid, topic],\n node: nodeid,\n });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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: [nodeid, beforeid, parentid, direction],\n node: nodeid,\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 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 getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jm;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","request","url","param","method","callback","fail_callback","Object","keys","map","k","encodeURIComponent","join","xhr","XMLHttpRequest","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","a","o","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substring","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","push","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","ActiveXObject","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","graph_svg","e_svg","setAttribute","size","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","graph","svg","canvas","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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"],"mappings":"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"} \ No newline at end of file diff --git a/es6/jsmind.screenshot.js.map b/es6/jsmind.screenshot.js.map index 6f4f2b57..fcf0d6ab 100644 --- a/es6/jsmind.screenshot.js.map +++ b/es6/jsmind.screenshot.js.map @@ -1 +1 @@ -{"version":3,"file":"jsmind.screenshot.js","sources":["../src/plugins/jsmind.screenshot.js"],"sourcesContent":["/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n * \n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\n\nif (!jsMind) { throw new Error('jsMind is not defined'); }\n\nconst $ = jsMind.$;\n\nvar css = function (cStyle, property_name) {\n return cStyle.getPropertyValue(property_name);\n};\nvar is_visible = function (cStyle) {\n var visibility = css(cStyle, 'visibility');\n var display = css(cStyle, 'display');\n return (visibility !== 'hidden' && display !== 'none');\n};\nvar jcanvas = {};\njcanvas.rect = function (ctx, x, y, w, h, r) {\n if (w < 2 * r) r = w / 2;\n if (h < 2 * r) r = h / 2;\n ctx.moveTo(x + r, y);\n ctx.arcTo(x + w, y, x + w, y + h, r);\n ctx.arcTo(x + w, y + h, x, y + h, r);\n ctx.arcTo(x, y + h, x, y, r);\n ctx.arcTo(x, y, x + w, y, r);\n};\n\njcanvas.text_multiline = function (ctx, text, x, y, w, h, lineheight) {\n var line = '';\n var text_len = text.length;\n var chars = text.split('');\n var test_line = null;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n for (var i = 0; i < text_len; i++) {\n test_line = line + chars[i];\n if (ctx.measureText(test_line).width > w && i > 0) {\n ctx.fillText(line, x, y);\n line = chars[i];\n y += lineheight;\n } else {\n line = test_line;\n }\n }\n ctx.fillText(line, x, y);\n};\n\njcanvas.text_ellipsis = function (ctx, text, x, y, w, h) {\n var center_y = y + h / 2;\n var text = jcanvas.fittingString(ctx, text, w);\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, x, center_y, w);\n};\n\njcanvas.fittingString = function (ctx, text, max_width) {\n var width = ctx.measureText(text).width;\n var ellipsis = '…';\n var ellipsis_width = ctx.measureText(ellipsis).width;\n if (width <= max_width || width <= ellipsis_width) {\n return text;\n } else {\n var len = text.length;\n while (width >= max_width - ellipsis_width && len-- > 0) {\n text = text.substring(0, len);\n width = ctx.measureText(text).width;\n }\n return text + ellipsis;\n }\n};\n\njcanvas.image = function (ctx, url, x, y, w, h, r, rotation, callback) {\n var img = new Image();\n img.onload = function () {\n ctx.save();\n ctx.translate(x, y);\n ctx.save();\n ctx.beginPath();\n jcanvas.rect(ctx, 0, 0, w, h, r);\n ctx.closePath();\n ctx.clip();\n ctx.translate(w / 2, h / 2);\n ctx.rotate(rotation * Math.PI / 180);\n ctx.drawImage(img, -w / 2, -h / 2);\n ctx.restore();\n ctx.restore();\n !!callback && callback();\n }\n img.src = url;\n};\n\nclass screenshot {\n constructor(jm) {\n this.jm = jm;\n this.canvas_elem = null;\n this.canvas_ctx = null;\n this._inited = false;\n }\n init() {\n if (this._inited) { return; }\n console.log('init');\n var c = $.c('canvas');\n var ctx = c.getContext('2d');\n\n this.canvas_elem = c;\n this.canvas_ctx = ctx;\n this.jm.view.e_panel.appendChild(c);\n this._inited = true;\n this.resize();\n }\n shoot(callback) {\n this.init();\n this._draw(function () {\n !!callback && callback();\n this.clean();\n }.bind(this));\n this._watermark();\n }\n shootDownload() {\n this.shoot(function () {\n this._download();\n }.bind(this));\n }\n shootAsDataURL(callback) {\n this.shoot(function () {\n !!callback && callback(this.canvas_elem.toDataURL());\n }.bind(this));\n }\n resize() {\n if (this._inited) {\n this.canvas_elem.width = this.jm.view.size.w;\n this.canvas_elem.height = this.jm.view.size.h;\n }\n }\n clean() {\n var c = this.canvas_elem;\n this.canvas_ctx.clearRect(0, 0, c.width, c.height);\n }\n _draw(callback) {\n var ctx = this.canvas_ctx;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n this._draw_lines(function () {\n this._draw_nodes(callback);\n }.bind(this));\n }\n _watermark() {\n var c = this.canvas_elem;\n var ctx = this.canvas_ctx;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'bottom';\n ctx.fillStyle = '#000';\n ctx.font = '11px Verdana,Arial,Helvetica,sans-serif';\n ctx.fillText('hizzgdev.github.io/jsmind', c.width - 5.5, c.height - 2.5);\n ctx.textAlign = 'left';\n ctx.fillText($.w.location, 5.5, c.height - 2.5);\n }\n _draw_lines(callback) {\n this.jm.view.graph.copy_to(this.canvas_ctx, callback);\n }\n _draw_nodes(callback) {\n var nodes = this.jm.mind.nodes;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n this._draw_node(node);\n }\n\n function check_nodes_ready() {\n console.log('check_node_ready' + new Date());\n var allOk = true;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n allOk = allOk & node.ready;\n }\n\n if (!allOk) {\n $.w.setTimeout(check_nodes_ready, 200);\n } else {\n $.w.setTimeout(callback, 200);\n }\n }\n check_nodes_ready();\n }\n _draw_node(node) {\n var ctx = this.canvas_ctx;\n var view_data = node._data.view;\n var node_element = view_data.element;\n var ncs = getComputedStyle(node_element);\n if (!is_visible(ncs)) {\n node.ready = true;\n return;\n }\n\n var bgcolor = css(ncs, 'background-color');\n var round_radius = parseInt(css(ncs, 'border-top-left-radius'));\n var color = css(ncs, 'color');\n var padding_left = parseInt(css(ncs, 'padding-left'));\n var padding_right = parseInt(css(ncs, 'padding-right'));\n var padding_top = parseInt(css(ncs, 'padding-top'));\n var padding_bottom = parseInt(css(ncs, 'padding-bottom'));\n var text_overflow = css(ncs, 'text-overflow');\n var font = css(ncs, 'font-style') + ' ' +\n css(ncs, 'font-variant') + ' ' +\n css(ncs, 'font-weight') + ' ' +\n css(ncs, 'font-size') + '/' + css(ncs, 'line-height') + ' ' +\n css(ncs, 'font-family');\n\n var rb = {\n x: view_data.abs_x,\n y: view_data.abs_y,\n w: view_data.width + 1,\n h: view_data.height + 1\n };\n var tb = {\n x: rb.x + padding_left,\n y: rb.y + padding_top,\n w: rb.w - padding_left - padding_right,\n h: rb.h - padding_top - padding_bottom\n };\n\n ctx.font = font;\n ctx.fillStyle = bgcolor;\n ctx.beginPath();\n jcanvas.rect(ctx, rb.x, rb.y, rb.w, rb.h, round_radius);\n ctx.closePath();\n ctx.fill();\n\n ctx.fillStyle = color;\n if ('background-image' in node.data) {\n var backgroundUrl = css(ncs, 'background-image').slice(5, -2);\n node.ready = false;\n var rotation = 0;\n if ('background-rotation' in node.data) {\n rotation = node.data['background-rotation'];\n }\n jcanvas.image(ctx, backgroundUrl, rb.x, rb.y, rb.w, rb.h, round_radius, rotation,\n function () {\n node.ready = true;\n });\n }\n if (!!node.topic) {\n if (text_overflow === 'ellipsis') {\n jcanvas.text_ellipsis(ctx, node.topic, tb.x, tb.y, tb.w, tb.h);\n } else {\n var line_height = parseInt(css(ncs, 'line-height'));\n jcanvas.text_multiline(ctx, node.topic, tb.x, tb.y, tb.w, tb.h, line_height);\n }\n }\n if (!!view_data.expander) {\n this._draw_expander(view_data.expander);\n }\n if (!('background-image' in node.data)) {\n node.ready = true;\n }\n }\n _draw_expander(expander) {\n var ctx = this.canvas_ctx;\n var ncs = getComputedStyle(expander);\n if (!is_visible(ncs)) { return; }\n\n var style_left = css(ncs, 'left');\n var style_top = css(ncs, 'top');\n var font = css(ncs, 'font');\n var left = parseInt(style_left);\n var top = parseInt(style_top);\n var is_plus = expander.innerHTML === '+';\n\n ctx.lineWidth = 1;\n\n ctx.beginPath();\n ctx.arc(left + 7, top + 7, 5, 0, Math.PI * 2, true);\n ctx.moveTo(left + 10, top + 7);\n ctx.lineTo(left + 4, top + 7);\n if (is_plus) {\n ctx.moveTo(left + 7, top + 4);\n ctx.lineTo(left + 7, top + 10);\n }\n ctx.closePath();\n ctx.stroke();\n }\n _download() {\n var c = this.canvas_elem;\n var name = this.jm.mind.name + '.png';\n\n if (navigator.msSaveBlob && (!!c.msToBlob)) {\n var blob = c.msToBlob();\n navigator.msSaveBlob(blob, name);\n } else {\n var bloburl = this.canvas_elem.toDataURL();\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\n }\n }\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\n\nvar screenshot_plugin = new jsMind.plugin('screenshot', function (jm) {\n var jss = new screenshot(jm);\n jm.screenshot = jss;\n jm.shoot = function () {\n jss.shoot();\n };\n jm.add_event_listener(function (type, data) {\n jss.jm_event_handle.call(jss, type, data);\n });\n});\n\njsMind.register_plugin(screenshot_plugin);\n"],"names":["jsMind","Error","$","css","cStyle","property_name","getPropertyValue","is_visible","visibility","display","jcanvas","ctx","x","y","w","h","r","moveTo","arcTo","text","lineheight","line","text_len","length","chars","split","test_line","textAlign","textBaseline","i","measureText","width","fillText","center_y","fittingString","max_width","ellipsis_width","len","substring","url","rotation","callback","img","Image","onload","save","translate","beginPath","rect","closePath","clip","rotate","Math","PI","drawImage","restore","src","screenshot","constructor","jm","this","canvas_elem","canvas_ctx","_inited","init","console","log","c","getContext","view","e_panel","appendChild","resize","shoot","_draw","clean","bind","_watermark","shootDownload","_download","shootAsDataURL","toDataURL","size","height","clearRect","_draw_lines","_draw_nodes","fillStyle","font","location","graph","copy_to","node","nodes","mind","nodeid","_draw_node","check_nodes_ready","Date","allOk","ready","setTimeout","view_data","_data","node_element","element","ncs","getComputedStyle","bgcolor","round_radius","parseInt","color","padding_left","padding_right","padding_top","padding_bottom","text_overflow","rb","abs_x","abs_y","tb","fill","data","backgroundUrl","slice","image","topic","text_ellipsis","line_height","text_multiline","expander","_draw_expander","style_left","style_top","left","top","is_plus","innerHTML","lineWidth","arc","lineTo","stroke","name","navigator","msSaveBlob","msToBlob","blob","bloburl","anchor","style","href","download","d","body","evt","createEvent","initEvent","dispatchEvent","removeChild","jm_event_handle","type","event_type","screenshot_plugin","plugin","jss","add_event_listener","call","register_plugin"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"jsmind.screenshot.js","sources":["../src/plugins/jsmind.screenshot.js"],"sourcesContent":["/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nif (!jsMind) {\n throw new Error('jsMind is not defined');\n}\n\nconst $ = jsMind.$;\n\nvar css = function (cStyle, property_name) {\n return cStyle.getPropertyValue(property_name);\n};\nvar is_visible = function (cStyle) {\n var visibility = css(cStyle, 'visibility');\n var display = css(cStyle, 'display');\n return visibility !== 'hidden' && display !== 'none';\n};\nvar jcanvas = {};\njcanvas.rect = function (ctx, x, y, w, h, r) {\n if (w < 2 * r) r = w / 2;\n if (h < 2 * r) r = h / 2;\n ctx.moveTo(x + r, y);\n ctx.arcTo(x + w, y, x + w, y + h, r);\n ctx.arcTo(x + w, y + h, x, y + h, r);\n ctx.arcTo(x, y + h, x, y, r);\n ctx.arcTo(x, y, x + w, y, r);\n};\n\njcanvas.text_multiline = function (ctx, text, x, y, w, h, lineheight) {\n var line = '';\n var text_len = text.length;\n var chars = text.split('');\n var test_line = null;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n for (var i = 0; i < text_len; i++) {\n test_line = line + chars[i];\n if (ctx.measureText(test_line).width > w && i > 0) {\n ctx.fillText(line, x, y);\n line = chars[i];\n y += lineheight;\n } else {\n line = test_line;\n }\n }\n ctx.fillText(line, x, y);\n};\n\njcanvas.text_ellipsis = function (ctx, text, x, y, w, h) {\n var center_y = y + h / 2;\n var text = jcanvas.fittingString(ctx, text, w);\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, x, center_y, w);\n};\n\njcanvas.fittingString = function (ctx, text, max_width) {\n var width = ctx.measureText(text).width;\n var ellipsis = '…';\n var ellipsis_width = ctx.measureText(ellipsis).width;\n if (width <= max_width || width <= ellipsis_width) {\n return text;\n } else {\n var len = text.length;\n while (width >= max_width - ellipsis_width && len-- > 0) {\n text = text.substring(0, len);\n width = ctx.measureText(text).width;\n }\n return text + ellipsis;\n }\n};\n\njcanvas.image = function (ctx, url, x, y, w, h, r, rotation, callback) {\n var img = new Image();\n img.onload = function () {\n ctx.save();\n ctx.translate(x, y);\n ctx.save();\n ctx.beginPath();\n jcanvas.rect(ctx, 0, 0, w, h, r);\n ctx.closePath();\n ctx.clip();\n ctx.translate(w / 2, h / 2);\n ctx.rotate((rotation * Math.PI) / 180);\n ctx.drawImage(img, -w / 2, -h / 2);\n ctx.restore();\n ctx.restore();\n !!callback && callback();\n };\n img.src = url;\n};\n\nclass screenshot {\n constructor(jm) {\n this.jm = jm;\n this.canvas_elem = null;\n this.canvas_ctx = null;\n this._inited = false;\n }\n init() {\n if (this._inited) {\n return;\n }\n console.log('init');\n var c = $.c('canvas');\n var ctx = c.getContext('2d');\n\n this.canvas_elem = c;\n this.canvas_ctx = ctx;\n this.jm.view.e_panel.appendChild(c);\n this._inited = true;\n this.resize();\n }\n shoot(callback) {\n this.init();\n this._draw(\n function () {\n !!callback && callback();\n this.clean();\n }.bind(this)\n );\n this._watermark();\n }\n shootDownload() {\n this.shoot(\n function () {\n this._download();\n }.bind(this)\n );\n }\n shootAsDataURL(callback) {\n this.shoot(\n function () {\n !!callback && callback(this.canvas_elem.toDataURL());\n }.bind(this)\n );\n }\n resize() {\n if (this._inited) {\n this.canvas_elem.width = this.jm.view.size.w;\n this.canvas_elem.height = this.jm.view.size.h;\n }\n }\n clean() {\n var c = this.canvas_elem;\n this.canvas_ctx.clearRect(0, 0, c.width, c.height);\n }\n _draw(callback) {\n var ctx = this.canvas_ctx;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n this._draw_lines(\n function () {\n this._draw_nodes(callback);\n }.bind(this)\n );\n }\n _watermark() {\n var c = this.canvas_elem;\n var ctx = this.canvas_ctx;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'bottom';\n ctx.fillStyle = '#000';\n ctx.font = '11px Verdana,Arial,Helvetica,sans-serif';\n ctx.fillText('hizzgdev.github.io/jsmind', c.width - 5.5, c.height - 2.5);\n ctx.textAlign = 'left';\n ctx.fillText($.w.location, 5.5, c.height - 2.5);\n }\n _draw_lines(callback) {\n this.jm.view.graph.copy_to(this.canvas_ctx, callback);\n }\n _draw_nodes(callback) {\n var nodes = this.jm.mind.nodes;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n this._draw_node(node);\n }\n\n function check_nodes_ready() {\n console.log('check_node_ready' + new Date());\n var allOk = true;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n allOk = allOk & node.ready;\n }\n\n if (!allOk) {\n $.w.setTimeout(check_nodes_ready, 200);\n } else {\n $.w.setTimeout(callback, 200);\n }\n }\n check_nodes_ready();\n }\n _draw_node(node) {\n var ctx = this.canvas_ctx;\n var view_data = node._data.view;\n var node_element = view_data.element;\n var ncs = getComputedStyle(node_element);\n if (!is_visible(ncs)) {\n node.ready = true;\n return;\n }\n\n var bgcolor = css(ncs, 'background-color');\n var round_radius = parseInt(css(ncs, 'border-top-left-radius'));\n var color = css(ncs, 'color');\n var padding_left = parseInt(css(ncs, 'padding-left'));\n var padding_right = parseInt(css(ncs, 'padding-right'));\n var padding_top = parseInt(css(ncs, 'padding-top'));\n var padding_bottom = parseInt(css(ncs, 'padding-bottom'));\n var text_overflow = css(ncs, 'text-overflow');\n var font =\n css(ncs, 'font-style') +\n ' ' +\n css(ncs, 'font-variant') +\n ' ' +\n css(ncs, 'font-weight') +\n ' ' +\n css(ncs, 'font-size') +\n '/' +\n css(ncs, 'line-height') +\n ' ' +\n css(ncs, 'font-family');\n\n var rb = {\n x: view_data.abs_x,\n y: view_data.abs_y,\n w: view_data.width + 1,\n h: view_data.height + 1,\n };\n var tb = {\n x: rb.x + padding_left,\n y: rb.y + padding_top,\n w: rb.w - padding_left - padding_right,\n h: rb.h - padding_top - padding_bottom,\n };\n\n ctx.font = font;\n ctx.fillStyle = bgcolor;\n ctx.beginPath();\n jcanvas.rect(ctx, rb.x, rb.y, rb.w, rb.h, round_radius);\n ctx.closePath();\n ctx.fill();\n\n ctx.fillStyle = color;\n if ('background-image' in node.data) {\n var backgroundUrl = css(ncs, 'background-image').slice(5, -2);\n node.ready = false;\n var rotation = 0;\n if ('background-rotation' in node.data) {\n rotation = node.data['background-rotation'];\n }\n jcanvas.image(\n ctx,\n backgroundUrl,\n rb.x,\n rb.y,\n rb.w,\n rb.h,\n round_radius,\n rotation,\n function () {\n node.ready = true;\n }\n );\n }\n if (!!node.topic) {\n if (text_overflow === 'ellipsis') {\n jcanvas.text_ellipsis(ctx, node.topic, tb.x, tb.y, tb.w, tb.h);\n } else {\n var line_height = parseInt(css(ncs, 'line-height'));\n jcanvas.text_multiline(ctx, node.topic, tb.x, tb.y, tb.w, tb.h, line_height);\n }\n }\n if (!!view_data.expander) {\n this._draw_expander(view_data.expander);\n }\n if (!('background-image' in node.data)) {\n node.ready = true;\n }\n }\n _draw_expander(expander) {\n var ctx = this.canvas_ctx;\n var ncs = getComputedStyle(expander);\n if (!is_visible(ncs)) {\n return;\n }\n\n var style_left = css(ncs, 'left');\n var style_top = css(ncs, 'top');\n var font = css(ncs, 'font');\n var left = parseInt(style_left);\n var top = parseInt(style_top);\n var is_plus = expander.innerHTML === '+';\n\n ctx.lineWidth = 1;\n\n ctx.beginPath();\n ctx.arc(left + 7, top + 7, 5, 0, Math.PI * 2, true);\n ctx.moveTo(left + 10, top + 7);\n ctx.lineTo(left + 4, top + 7);\n if (is_plus) {\n ctx.moveTo(left + 7, top + 4);\n ctx.lineTo(left + 7, top + 10);\n }\n ctx.closePath();\n ctx.stroke();\n }\n _download() {\n var c = this.canvas_elem;\n var name = this.jm.mind.name + '.png';\n\n if (navigator.msSaveBlob && !!c.msToBlob) {\n var blob = c.msToBlob();\n navigator.msSaveBlob(blob, name);\n } else {\n var bloburl = this.canvas_elem.toDataURL();\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\n }\n }\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\nvar screenshot_plugin = new jsMind.plugin('screenshot', function (jm) {\n var jss = new screenshot(jm);\n jm.screenshot = jss;\n jm.shoot = function () {\n jss.shoot();\n };\n jm.add_event_listener(function (type, data) {\n jss.jm_event_handle.call(jss, type, data);\n });\n});\n\njsMind.register_plugin(screenshot_plugin);\n"],"names":["jsMind","Error","$","css","cStyle","property_name","getPropertyValue","is_visible","visibility","display","jcanvas","ctx","x","y","w","h","r","moveTo","arcTo","text","lineheight","line","text_len","length","chars","split","test_line","textAlign","textBaseline","i","measureText","width","fillText","center_y","fittingString","max_width","ellipsis_width","len","substring","url","rotation","callback","img","Image","onload","save","translate","beginPath","rect","closePath","clip","rotate","Math","PI","drawImage","restore","src","screenshot","constructor","jm","this","canvas_elem","canvas_ctx","_inited","init","console","log","c","getContext","view","e_panel","appendChild","resize","shoot","_draw","clean","bind","_watermark","shootDownload","_download","shootAsDataURL","toDataURL","size","height","clearRect","_draw_lines","_draw_nodes","fillStyle","font","location","graph","copy_to","node","nodes","mind","nodeid","_draw_node","check_nodes_ready","Date","allOk","ready","setTimeout","view_data","_data","node_element","element","ncs","getComputedStyle","bgcolor","round_radius","parseInt","color","padding_left","padding_right","padding_top","padding_bottom","text_overflow","rb","abs_x","abs_y","tb","fill","data","backgroundUrl","slice","image","topic","text_ellipsis","line_height","text_multiline","expander","_draw_expander","style_left","style_top","left","top","is_plus","innerHTML","lineWidth","arc","lineTo","stroke","name","navigator","msSaveBlob","msToBlob","blob","bloburl","anchor","style","href","download","d","body","evt","createEvent","initEvent","dispatchEvent","removeChild","jm_event_handle","type","event_type","screenshot_plugin","plugin","jss","add_event_listener","call","register_plugin"],"mappings":"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"} \ No newline at end of file diff --git a/example/1_basic.html b/example/1_basic.html index bdc43313..7dda9732 100644 --- a/example/1_basic.html +++ b/example/1_basic.html @@ -1,62 +1,72 @@ - + - - - - jsMind - - - - -
    - - - + + - + load_jsmind(); + + diff --git a/example/2_features.html b/example/2_features.html index c7e194c0..7d63e7b2 100644 --- a/example/2_features.html +++ b/example/2_features.html @@ -1,528 +1,650 @@ - + - - - - jsMind - - - - -
    -
    -
    1. Open
    -
      -
    1. -
    2. -
    3. -
    4. -
    5. -
    - -
    2. Select & Toggle
    -
      -
    1. -
    2. -
    3. -
    -
    3. Edit
    -
      -
    1. -
    2. -
    3. -
    4. -
    5. -
    6. -
    7. -
    8. -
    9. -
    -
    4. Style
    -
      -
    1. -
    2. -
    3. -
    4. -
    -
    5. Theme
    -
      -
    1. - -
    2. -
    -
    6. Adjusting
    -
      -
    1. -
    2. -
    3. expand/collapse
    4. -
        -
      1. -
      2. -
      3. -
      4. -
      5. -
      6. -
      7. -
      -
    5. zoom(ctrl+mousewheel)
    6. - - -
    - -
    7. Multi Format
    -
      -
    1. node_tree(default)
    2. -
        -
      1. -
      2. -
      3. -
      4. -
      -
    3. node_array
    4. -
        -
      1. -
      2. -
      3. -
      4. -
      -
    5. freemind(.mm)
    6. -
        -
      1. -
      2. -
      3. -
      4. -
      -
    -
    -
    -
    - -
    - -
    - - - - + + + - + } + + function prompt_info(msg) { + alert(msg); + } + + open_empty(); + + diff --git a/example/2_features_es6.html b/example/2_features_es6.html index 8a739487..930aeb27 100644 --- a/example/2_features_es6.html +++ b/example/2_features_es6.html @@ -1,528 +1,650 @@ - + - - - - jsMind - - - - -
    -
    -
    1. Open
    -
      -
    1. -
    2. -
    3. -
    4. -
    5. -
    - -
    2. Select & Toggle
    -
      -
    1. -
    2. -
    3. -
    -
    3. Edit
    -
      -
    1. -
    2. -
    3. -
    4. -
    5. -
    6. -
    7. -
    8. -
    9. -
    -
    4. Style
    -
      -
    1. -
    2. -
    3. -
    4. -
    -
    5. Theme
    -
      -
    1. - -
    2. -
    -
    6. Adjusting
    -
      -
    1. -
    2. -
    3. expand/collapse
    4. -
        -
      1. -
      2. -
      3. -
      4. -
      5. -
      6. -
      7. -
      -
    5. zoom(ctrl+mousewheel)
    6. - - -
    - -
    7. Multi Format
    -
      -
    1. node_tree(default)
    2. -
        -
      1. -
      2. -
      3. -
      4. -
      -
    3. node_array
    4. -
        -
      1. -
      2. -
      3. -
      4. -
      -
    5. freemind(.mm)
    6. -
        -
      1. -
      2. -
      3. -
      4. -
      -
    -
    -
    -
    - -
    - -
    - - - - + + + - + } + + function prompt_info(msg) { + alert(msg); + } + + open_empty(); + + diff --git a/example/3_mathjax.html b/example/3_mathjax.html index f1b6c88b..f325f8fb 100644 --- a/example/3_mathjax.html +++ b/example/3_mathjax.html @@ -1,104 +1,104 @@ - + - - - - jsMind - - - - - - - -
    - - - - - + + + + - + load_jsmind(); + + diff --git a/example/data_example.json b/example/data_example.json index ab75b950..75491e8d 100644 --- a/example/data_example.json +++ b/example/data_example.json @@ -1,48 +1,95 @@ { - "meta":{ - "name":"jsMind remote", - "author":"hizzgdev@163.com", - "version":"0.2" + "meta": { + "name": "jsMind remote", + "author": "hizzgdev@163.com", + "version": "0.2" }, - "format":"node_tree", - "data":{"id":"root","topic":"jsMind","children":[ - {"id":"easy","topic":"Easy","direction":"left","expanded":false,"children":[ - {"id":"easy1","topic":"Easy to show"}, - {"id":"easy2","topic":"Easy to edit"}, - {"id":"easy3","topic":"Easy to store"}, - {"id":"easy4","topic":"Easy to embed","children":[ - {"id":"easy41","topic":"Easy to show"}, - {"id":"easy42","topic":"Easy to edit"}, - {"id":"easy43","topic":"Easy to store"}, - {"id":"open44","topic":"BSD License","children":[ - {"id":"open441","topic":"on GitHub"}, - {"id":"open442","topic":"BSD License"} - ]}, - {"id":"easy45","topic":"Easy to embed"} - ]} - ]}, - {"id":"open","topic":"Open Source","direction":"right","children":[ - {"id":"open1","topic":"on GitHub"}, - {"id":"open2","topic":"BSD License","children":[ - {"id":"open21","topic":"on GitHub"}, - {"id":"open22","topic":"BSD License","children":[ - {"id":"open221","topic":"on GitHub"}, - {"id":"open222","topic":"BSD License"} - ]} - ]} - ]}, - {"id":"powerful","topic":"Powerful","direction":"right","expanded":false,"children":[ - {"id":"powerful1","topic":"Base on Javascript"}, - {"id":"powerful2","topic":"Base on HTML5"}, - {"id":"powerful3","topic":"Depends on you","expanded":false,"children":[ - {"id":"powerful31","topic":"Base on Javascript"}, - {"id":"powerful32","topic":"Base on HTML5"}, - {"id":"powerful33","topic":"Depends on you"} - ]} - ]}, - {"id":"other","topic":"test node","direction":"left","children":[ - {"id":"other1","topic":"I'm from ajax"}, - {"id":"other2","topic":"I can do everything"} - ]} - ]} + "format": "node_tree", + "data": { + "id": "root", + "topic": "jsMind", + "children": [ + { + "id": "easy", + "topic": "Easy", + "direction": "left", + "expanded": false, + "children": [ + { "id": "easy1", "topic": "Easy to show" }, + { "id": "easy2", "topic": "Easy to edit" }, + { "id": "easy3", "topic": "Easy to store" }, + { + "id": "easy4", + "topic": "Easy to embed", + "children": [ + { "id": "easy41", "topic": "Easy to show" }, + { "id": "easy42", "topic": "Easy to edit" }, + { "id": "easy43", "topic": "Easy to store" }, + { + "id": "open44", + "topic": "BSD License", + "children": [ + { "id": "open441", "topic": "on GitHub" }, + { "id": "open442", "topic": "BSD License" } + ] + }, + { "id": "easy45", "topic": "Easy to embed" } + ] + } + ] + }, + { + "id": "open", + "topic": "Open Source", + "direction": "right", + "children": [ + { "id": "open1", "topic": "on GitHub" }, + { + "id": "open2", + "topic": "BSD License", + "children": [ + { "id": "open21", "topic": "on GitHub" }, + { + "id": "open22", + "topic": "BSD License", + "children": [ + { "id": "open221", "topic": "on GitHub" }, + { "id": "open222", "topic": "BSD License" } + ] + } + ] + } + ] + }, + { + "id": "powerful", + "topic": "Powerful", + "direction": "right", + "expanded": false, + "children": [ + { "id": "powerful1", "topic": "Base on Javascript" }, + { "id": "powerful2", "topic": "Base on HTML5" }, + { + "id": "powerful3", + "topic": "Depends on you", + "expanded": false, + "children": [ + { "id": "powerful31", "topic": "Base on Javascript" }, + { "id": "powerful32", "topic": "Base on HTML5" }, + { "id": "powerful33", "topic": "Depends on you" } + ] + } + ] + }, + { + "id": "other", + "topic": "test node", + "direction": "left", + "children": [ + { "id": "other1", "topic": "I'm from ajax" }, + { "id": "other2", "topic": "I can do everything" } + ] + } + ] + } } diff --git a/example/demo.html b/example/demo.html index ef1c82a4..e09c195a 100644 --- a/example/demo.html +++ b/example/demo.html @@ -1,102 +1,102 @@ - + - - - - jsMind - - - - - - - -
    - - - - + + + - + load_jsmind(); + + diff --git a/features/jsmind.shell.js b/features/jsmind.shell.js index 2da81ce6..1be6cdfd 100644 --- a/features/jsmind.shell.js +++ b/features/jsmind.shell.js @@ -1,7 +1,7 @@ /* * Released under BSD License * Copyright (c) 2014-2021 hizzgdev@163.com - * + * * Project Home: * https://github.com/hizzgdev/jsmind/ */ @@ -11,11 +11,15 @@ var $d = $w.document; var __name__ = 'jsMind'; var jsMind = $w[__name__]; - if (!jsMind) { return; } - if (typeof (jsMind.shell) != 'undefined') { return; } + if (!jsMind) { + return; + } + if (typeof jsMind.shell != 'undefined') { + return; + } var options = { - play_delay: 1000 + play_delay: 1000, }; jsMind.shell = function (jm) { @@ -35,7 +39,11 @@ if (!this.playing) { var command = { action: action, data: obj.data, node: obj.node }; var prev_command = this.commands[this.step - 1]; - if (command.action === 'update_node' && prev_command.action === 'add_node' && prev_command.data[2] === 'New Node') { + if ( + command.action === 'update_node' && + prev_command.action === 'add_node' && + prev_command.data[2] === 'New Node' + ) { prev_command.data[2] = command.data[1]; this.commands[this.step - 1] = prev_command; } else { @@ -100,7 +108,7 @@ delete data.evt; this.record(action, data); } - } + }, }; var shell_plugin = new jsMind.plugin('shell', function (jm) { diff --git a/package-lock.json b/package-lock.json index f864ddc0..638d91b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "devDependencies": { "jest": "^28.1.0", "jest-environment-jsdom": "^28.1.0", + "prettier": "2.6.2", "rollup": "^2.75.5", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-terser": "^7.0.2" @@ -3378,6 +3379,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-format": { "version": "28.1.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz", @@ -6819,6 +6835,12 @@ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true }, + "prettier": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "dev": true + }, "pretty-format": { "version": "28.1.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz", diff --git a/package.json b/package.json index babc67cb..0e0b560e 100644 --- a/package.json +++ b/package.json @@ -1,48 +1,51 @@ { - "name": "jsmind", - "version": "0.4.8", - "description": "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.", - "main": "js/jsmind.js", - "directories": { - "doc": "docs", - "example": "example" - }, - "scripts": { - "build": "rollup -c", - "test": "jest", - "test6": "JM_LANG=ES6 jest" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/hizzgdev/jsmind.git" - }, - "author": { - "name": "hizzgdev@163.com" - }, - "license": "BSD-3-Clause", - "bugs": { - "url": "https://github.com/hizzgdev/jsmind/issues" - }, - "homepage": "https://github.com/hizzgdev/jsmind#readme", - "keywords": [ - "jsmind", - "mindmap" - ], - "maintainers": [ - { - "name": "hizzgdev", - "email": "hizzgdev@163.com" + "name": "jsmind", + "version": "0.4.8", + "description": "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.", + "main": "js/jsmind.js", + "directories": { + "doc": "docs", + "example": "example" + }, + "scripts": { + "build": "rollup -c", + "test": "jest", + "test6": "JM_LANG=ES6 jest", + "format": "prettier --write .", + "format-check": "prettier --check ." + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hizzgdev/jsmind.git" + }, + "author": { + "name": "hizzgdev@163.com" + }, + "license": "BSD-3-Clause", + "bugs": { + "url": "https://github.com/hizzgdev/jsmind/issues" + }, + "homepage": "https://github.com/hizzgdev/jsmind#readme", + "keywords": [ + "jsmind", + "mindmap" + ], + "maintainers": [ + { + "name": "hizzgdev", + "email": "hizzgdev@163.com" + } + ], + "devDependencies": { + "jest": "^28.1.0", + "jest-environment-jsdom": "^28.1.0", + "prettier": "2.6.2", + "rollup": "^2.75.5", + "rollup-plugin-cleanup": "^3.2.1", + "rollup-plugin-terser": "^7.0.2" + }, + "jest": { + "verbose": true, + "testEnvironment": "jsdom" } - ], - "devDependencies": { - "jest": "^28.1.0", - "jest-environment-jsdom": "^28.1.0", - "rollup": "^2.75.5", - "rollup-plugin-cleanup": "^3.2.1", - "rollup-plugin-terser": "^7.0.2" - }, - "jest": { - "verbose": true, - "testEnvironment": "jsdom" - } } diff --git a/rollup.config.js b/rollup.config.js index d7dfd3a5..2f6b5b0f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,60 +1,63 @@ import cleanup from 'rollup-plugin-cleanup'; import { terser } from 'rollup-plugin-terser'; -export default [{ - input: 'src/jsmind.js', - output: { - name: 'jsMind', - file: 'es6/jsmind.js', - format: 'umd', - banner: "/**\n* @license BSD-3-Clause\n* @copyright 2014-2022 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/", - sourcemap: true, +export default [ + { + input: 'src/jsmind.js', + output: { + name: 'jsMind', + file: 'es6/jsmind.js', + format: 'umd', + banner: '/**\n* @license BSD-3-Clause\n* @copyright 2014-2022 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/', + sourcemap: true, + }, + plugins: [ + cleanup({ + comments: 'none', + }), + terser({ + output: { + comments: 'all', + }, + }), + ], }, - plugins: [ - cleanup({ - comments: "none" - }), - terser({ - output: { - comments: "all", - }, - }) - ], -}, { - input: 'src/plugins/jsmind.draggable.js', - output: { - file: 'es6/jsmind.draggable.js', - format: 'iife', - banner: "/**\n* @license BSD-3-Clause\n* @copyright 2014-2022 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/", - sourcemap: true, + { + input: 'src/plugins/jsmind.draggable.js', + output: { + file: 'es6/jsmind.draggable.js', + format: 'iife', + banner: '/**\n* @license BSD-3-Clause\n* @copyright 2014-2022 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/', + sourcemap: true, + }, + plugins: [ + cleanup({ + comments: 'none', + }), + terser({ + output: { + comments: 'all', + }, + }), + ], }, - plugins: [ - cleanup({ - comments: "none" - }), - terser({ - output: { - comments: "all", - }, - }) - ], -}, { - input: 'src/plugins/jsmind.screenshot.js', - output: { - file: 'es6/jsmind.screenshot.js', - format: 'iife', - banner: "/**\n* @license BSD-3-Clause\n* @copyright 2014-2022 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/", - sourcemap: true, + { + input: 'src/plugins/jsmind.screenshot.js', + output: { + file: 'es6/jsmind.screenshot.js', + format: 'iife', + banner: '/**\n* @license BSD-3-Clause\n* @copyright 2014-2022 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/', + sourcemap: true, + }, + plugins: [ + cleanup({ + comments: 'none', + }), + terser({ + output: { + comments: 'all', + }, + }), + ], }, - plugins: [ - cleanup({ - comments: "none" - }), - terser({ - output: { - comments: "all", - }, - }) - ], -} -] +]; diff --git a/src/jsmind.common.js b/src/jsmind.common.js index d71f2b27..5e703ded 100644 --- a/src/jsmind.common.js +++ b/src/jsmind.common.js @@ -9,14 +9,25 @@ export const __version__ = '0.4.9'; export const __author__ = 'hizzgdev@163.com'; -if (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (p) { return this.slice(0, p.length) === p; }; } +if (typeof String.prototype.startsWith != 'function') { + String.prototype.startsWith = function (p) { + return this.slice(0, p.length) === p; + }; +} // an noop function define -var _noop = function () { }; -export let logger = (typeof console === 'undefined') ? { - log: _noop, debug: _noop, error: _noop, warn: _noop, info: _noop -} : console; +var _noop = function () {}; +export let logger = + typeof console === 'undefined' + ? { + log: _noop, + debug: _noop, + error: _noop, + warn: _noop, + info: _noop, + } + : console; export const Direction = { left: -1, center: 0, right: 1 }; export const EventType = { show: 1, resize: 2, edit: 3, select: 4 }; -export const Key = { meta: 1 << 13, ctrl: 1 << 12, alt: 1 << 11, shift: 1 << 10 }; \ No newline at end of file +export const Key = { meta: 1 << 13, ctrl: 1 << 12, alt: 1 << 11, shift: 1 << 10 }; diff --git a/src/jsmind.data_provider.js b/src/jsmind.data_provider.js index 469a08dc..58ea5924 100644 --- a/src/jsmind.data_provider.js +++ b/src/jsmind.data_provider.js @@ -6,8 +6,8 @@ * https://github.com/hizzgdev/jsmind/ */ -import { logger } from "./jsmind.common.js"; -import { format } from "./jsmind.format.js"; +import { logger } from './jsmind.common.js'; +import { format } from './jsmind.format.js'; export class DataProvider { constructor(jm) { @@ -58,5 +58,3 @@ export class DataProvider { return data; } } - - diff --git a/src/jsmind.dom.js b/src/jsmind.dom.js index d4a052b1..6a62c849 100644 --- a/src/jsmind.dom.js +++ b/src/jsmind.dom.js @@ -10,9 +10,19 @@ class Dom { constructor(w) { this.w = w; this.d = w.document; - this.g = function (id) { return this.d.getElementById(id); }; - this.c = function (tag) { return this.d.createElement(tag); }; - this.t = function (n, t) { if (n.hasChildNodes()) { n.firstChild.nodeValue = t; } else { n.appendChild(this.d.createTextNode(t)); } }; + this.g = function (id) { + return this.d.getElementById(id); + }; + this.c = function (tag) { + return this.d.createElement(tag); + }; + this.t = function (n, t) { + if (n.hasChildNodes()) { + n.firstChild.nodeValue = t; + } else { + n.appendChild(this.d.createTextNode(t)); + } + }; this.h = function (n, t) { if (t instanceof HTMLElement) { @@ -23,7 +33,15 @@ class Dom { } }; // detect isElement - this.i = function (el) { return !!el && (typeof el === 'object') && (el.nodeType === 1) && (typeof el.style === 'object') && (typeof el.ownerDocument === 'object'); }; + this.i = function (el) { + return ( + !!el && + typeof el === 'object' && + el.nodeType === 1 && + typeof el.style === 'object' && + typeof el.ownerDocument === 'object' + ); + }; //target,eventType,handler this.on = function (t, e, h) { diff --git a/src/jsmind.format.js b/src/jsmind.format.js index 9574ecf2..17513b42 100644 --- a/src/jsmind.format.js +++ b/src/jsmind.format.js @@ -6,20 +6,20 @@ * https://github.com/hizzgdev/jsmind/ */ -import { __author__, __version__ , logger, Direction} from "./jsmind.common.js"; -import { Mind } from "./jsmind.mind.js"; -import { Node } from "./jsmind.node.js"; +import { __author__, __version__, logger, Direction } from './jsmind.common.js'; +import { Mind } from './jsmind.mind.js'; +import { Node } from './jsmind.node.js'; export const format = { node_tree: { example: { - "meta": { - "name": 'jsMind node_tree simple', - "author": __author__, - "version": __version__ + meta: { + name: 'jsMind node_tree simple', + author: __author__, + version: __version__, }, - "format": "node_tree", - "data": { "id": "root", "topic": "jsMind Example" } + format: 'node_tree', + data: { id: 'root', topic: 'jsMind Example' }, }, get_mind: function (source) { var df = format.node_tree; @@ -36,7 +36,7 @@ export const format = { json.meta = { name: mind.name, author: mind.author, - version: mind.version + version: mind.version, }; json.format = 'node_tree'; json.data = df._buildnode(mind.root); @@ -58,7 +58,13 @@ export const format = { _extract_data: function (node_json) { var data = {}; for (var k in node_json) { - if (k == 'id' || k == 'topic' || k == 'children' || k == 'direction' || k == 'expanded') { + if ( + k == 'id' || + k == 'topic' || + k == 'children' || + k == 'direction' || + k == 'expanded' + ) { continue; } data[k] = node_json[k]; @@ -73,7 +79,14 @@ export const format = { if (node_parent.isroot) { d = node_json.direction == 'left' ? Direction.left : Direction.right; } - var node = mind.add_node(node_parent, node_json.id, node_json.topic, data, d, node_json.expanded); + var node = mind.add_node( + node_parent, + node_json.id, + node_json.topic, + data, + d, + node_json.expanded + ); if (!!node_json['children']) { var children = node_json.children; for (var i = 0; i < children.length; i++) { @@ -84,11 +97,13 @@ export const format = { _buildnode: function (node) { var df = format.node_tree; - if (!(node instanceof Node)) { return; } + if (!(node instanceof Node)) { + return; + } var o = { id: node.id, topic: node.topic, - expanded: node.expanded + expanded: node.expanded, }; if (!!node.parent && node.parent.isroot) { o.direction = node.direction == Direction.left ? 'left' : 'right'; @@ -107,20 +122,18 @@ export const format = { } } return o; - } + }, }, node_array: { example: { - "meta": { - "name": 'jsMind node_array simple', - "author": __author__, - "version": __version__ + meta: { + name: 'jsMind node_array simple', + author: __author__, + version: __version__, }, - "format": "node_array", - "data": [ - { "id": "root", "topic": "jsMind Example", "isroot": true } - ] + format: 'node_array', + data: [{ id: 'root', topic: 'jsMind Example', isroot: true }], }, get_mind: function (source) { @@ -139,7 +152,7 @@ export const format = { json.meta = { name: mind.name, author: mind.author, - version: mind.version + version: mind.version, }; json.format = 'node_array'; json.data = []; @@ -190,7 +203,14 @@ export const format = { if (!!node_direction) { d = node_direction == 'left' ? Direction.left : Direction.right; } - var node = mind.add_node(parent_node, node_json.id, node_json.topic, data, d, node_json.expanded); + var node = mind.add_node( + parent_node, + node_json.id, + node_json.topic, + data, + d, + node_json.expanded + ); node_array.splice(i, 1); extract_count++; var sub_extract_count = df._extract_subnode(mind, node, node_array); @@ -207,7 +227,14 @@ export const format = { _extract_data: function (node_json) { var data = {}; for (var k in node_json) { - if (k == 'id' || k == 'topic' || k == 'parentid' || k == 'isroot' || k == 'direction' || k == 'expanded') { + if ( + k == 'id' || + k == 'topic' || + k == 'parentid' || + k == 'isroot' || + k == 'direction' || + k == 'expanded' + ) { continue; } data[k] = node_json[k]; @@ -222,11 +249,13 @@ export const format = { _array_node: function (node, node_array) { var df = format.node_array; - if (!(node instanceof Node)) { return; } + if (!(node instanceof Node)) { + return; + } var o = { id: node.id, topic: node.topic, - expanded: node.expanded + expanded: node.expanded, }; if (!!node.parent) { o.parentid = node.parent.id; @@ -235,7 +264,7 @@ export const format = { o.isroot = true; } if (!!node.parent && node.parent.isroot) { - o.direction = node.direction == Direction.left ? 'left' : 'right'; + o.direction = node.direction == Direction.left ? 'left' : 'right'; } if (node.data != null) { var node_data = node.data; @@ -253,13 +282,13 @@ export const format = { freemind: { example: { - "meta": { - "name": 'jsMind freemind example', - "author": __author__, - "version": __version__ + meta: { + name: 'jsMind freemind example', + author: __author__, + version: __version__, }, - "format": "freemind", - "data": "" + format: 'freemind', + data: '', }, get_mind: function (source) { var df = format.freemind; @@ -280,11 +309,11 @@ export const format = { json.meta = { name: mind.name, author: mind.author, - version: mind.version + version: mind.version, }; json.format = 'freemind'; var xmllines = []; - xmllines.push(''); + xmllines.push(''); df._buildmap(mind.root, xmllines); xmllines.push(''); json.data = xmllines.join(' '); @@ -296,7 +325,8 @@ export const format = { if (window.DOMParser) { var parser = new DOMParser(); xml_doc = parser.parseFromString(xml, 'text/xml'); - } else { // Internet Explorer + } else { + // Internet Explorer xml_doc = new ActiveXObject('Microsoft.XMLDOM'); xml_doc.async = false; xml_doc.loadXML(xml); @@ -347,7 +377,7 @@ export const format = { } } var node_data = df._load_attributes(xml_node); - var node_expanded = ('expanded' in node_data) ? (node_data.expanded == 'true') : true; + var node_expanded = 'expanded' in node_data ? node_data.expanded == 'true' : true; delete node_data.expanded; var node_position = xml_node.getAttribute('POSITION'); @@ -357,7 +387,14 @@ export const format = { } var node = null; if (!!parent_node) { - node = mind.add_node(parent_node, node_id, node_topic, node_data, node_direction, node_expanded); + node = mind.add_node( + parent_node, + node_id, + node_topic, + node_data, + node_direction, + node_expanded + ); } else { node = mind.set_root(node_id, node_topic, node_data); } @@ -391,20 +428,20 @@ export const format = { pos = node.direction === Direction.left ? 'left' : 'right'; } xmllines.push(''); + xmllines.push('TEXT="' + node.topic + '">'); // store expanded status as an attribute - xmllines.push(''); + xmllines.push(''); // for attributes var node_data = node.data; if (node_data != null) { for (var k in node_data) { - xmllines.push(''); + xmllines.push(''); } } @@ -416,5 +453,5 @@ export const format = { xmllines.push(''); }, - } + }, }; diff --git a/src/jsmind.graph.js b/src/jsmind.graph.js index 764a3346..e746928d 100644 --- a/src/jsmind.graph.js +++ b/src/jsmind.graph.js @@ -6,7 +6,7 @@ * https://github.com/hizzgdev/jsmind/ */ -import { $ } from "./jsmind.dom.js"; +import { $ } from './jsmind.dom.js'; class graph_svg { constructor(view) { @@ -43,7 +43,13 @@ class graph_svg { line.setAttribute('fill', 'transparent'); this.lines.push(line); this.e_svg.appendChild(line); - this._bezier_to(line, pin.x + offset.x, pin.y + offset.y, pout.x + offset.x, pout.y + offset.y); + this._bezier_to( + line, + pin.x + offset.x, + pin.y + offset.y, + pout.x + offset.x, + pout.y + offset.y + ); } copy_to(dest_canvas_ctx, callback) { var img = new Image(); @@ -51,17 +57,35 @@ class graph_svg { dest_canvas_ctx.drawImage(img, 0, 0); !!callback && callback(); }; - img.src = 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg)); + img.src = + 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg)); } _bezier_to(path, x1, y1, x2, y2) { - path.setAttribute('d', 'M' + x1 + ' ' + y1 + ' C ' + (x1 + (x2 - x1) * 2 / 3) + ' ' + y1 + ', ' + x1 + ' ' + y2 + ', ' + x2 + ' ' + y2); + path.setAttribute( + 'd', + 'M' + + x1 + + ' ' + + y1 + + ' C ' + + (x1 + ((x2 - x1) * 2) / 3) + + ' ' + + y1 + + ', ' + + x1 + + ' ' + + y2 + + ', ' + + x2 + + ' ' + + y2 + ); } _line_to(path, x1, y1, x2, y2) { path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2); } } - class graph_canvas { constructor(view) { this.opts = view.opts; @@ -88,11 +112,13 @@ class graph_canvas { ctx.lineWidth = this.opts.line_width; ctx.lineCap = 'round'; - this._bezier_to(ctx, + this._bezier_to( + ctx, pin.x + offset.x, pin.y + offset.y, pout.x + offset.x, - pout.y + offset.y); + pout.y + offset.y + ); } copy_to(dest_canvas_ctx, callback) { dest_canvas_ctx.drawImage(this.e_canvas, 0, 0); @@ -101,7 +127,7 @@ class graph_canvas { _bezier_to(ctx, x1, y1, x2, y2) { ctx.beginPath(); ctx.moveTo(x1, y1); - ctx.bezierCurveTo(x1 + (x2 - x1) * 2 / 3, y1, x1, y2, x2, y2); + ctx.bezierCurveTo(x1 + ((x2 - x1) * 2) / 3, y1, x1, y2, x2, y2); ctx.stroke(); } _line_to(ctx, x1, y1, x2, y2) { diff --git a/src/jsmind.js b/src/jsmind.js index 3d22a69c..b307d1d3 100644 --- a/src/jsmind.js +++ b/src/jsmind.js @@ -6,19 +6,18 @@ * https://github.com/hizzgdev/jsmind/ */ -import { __version__, logger, EventType, Direction } from "./jsmind.common.js"; -import { merge_option } from "./jsmind.option.js"; -import { Mind } from "./jsmind.mind.js"; -import { Node } from "./jsmind.node.js"; -import { DataProvider } from "./jsmind.data_provider.js"; -import { LayoutProvider } from "./jsmind.layout_provider.js"; -import { ViewProvider } from "./jsmind.view_provider.js"; -import { ShortcutProvider } from "./jsmind.shortcut_provider.js"; -import { Plugin, register as _register_plugin, apply as apply_plugins } from "./jsmind.plugin.js"; -import { format } from "./jsmind.format.js"; -import { $ } from "./jsmind.dom.js"; -import { util as _util } from "./jsmind.util.js" - +import { __version__, logger, EventType, Direction } from './jsmind.common.js'; +import { merge_option } from './jsmind.option.js'; +import { Mind } from './jsmind.mind.js'; +import { Node } from './jsmind.node.js'; +import { DataProvider } from './jsmind.data_provider.js'; +import { LayoutProvider } from './jsmind.layout_provider.js'; +import { ViewProvider } from './jsmind.view_provider.js'; +import { ShortcutProvider } from './jsmind.shortcut_provider.js'; +import { Plugin, register as _register_plugin, apply as apply_plugins } from './jsmind.plugin.js'; +import { format } from './jsmind.format.js'; +import { $ } from './jsmind.dom.js'; +import { util as _util } from './jsmind.util.js'; class jm { static mind = Mind; @@ -26,9 +25,9 @@ class jm { static direction = Direction; static event_type = EventType; static $ = $; - static plugin = Plugin - static register_plugin = _register_plugin - static util = _util + static plugin = Plugin; + static register_plugin = _register_plugin; + static util = _util; constructor(options) { jm.current = this; @@ -41,13 +40,15 @@ class jm { } init() { - if (!!this.initialized) { return; } + if (!!this.initialized) { + return; + } this.initialized = true; var opts_layout = { mode: this.options.mode, hspace: this.options.layout.hspace, vspace: this.options.layout.vspace, - pspace: this.options.layout.pspace + pspace: this.options.layout.pspace, }; var opts_view = { container: this.options.container, @@ -58,7 +59,7 @@ class jm { line_width: this.options.view.line_width, line_color: this.options.view.line_color, draggable: this.options.view.draggable, - hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable + hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable, }; // create instance of function provider this.data = new DataProvider(this); @@ -96,7 +97,7 @@ class jm { } set_theme(theme) { var theme_old = this.options.theme; - this.options.theme = (!!theme) ? theme : null; + this.options.theme = !!theme ? theme : null; if (theme_old != this.options.theme) { this.view.reset_theme(); this.view.reset_custom_style(); @@ -106,7 +107,7 @@ class jm { this.view.add_event(this, 'mousedown', this.mousedown_handle); this.view.add_event(this, 'click', this.click_handle); this.view.add_event(this, 'dblclick', this.dblclick_handle); - this.view.add_event(this, "mousewheel", this.mousewheel_handle); + this.view.add_event(this, 'mousewheel', this.mousewheel_handle); } mousedown_handle(e) { if (!this.options.default_event_handle['enable_mousedown_handle']) { @@ -150,14 +151,17 @@ class jm { // Use [Ctrl] + Mousewheel, to zoom in/out. mousewheel_handle(event) { // Test if mousewheel option is enabled and Ctrl key is pressed. - if (!this.options.default_event_handle["enable_mousewheel_handle"] || !window.event.ctrlKey) { + if ( + !this.options.default_event_handle['enable_mousewheel_handle'] || + !window.event.ctrlKey + ) { return; } // Avoid default page scrolling behavior. event.preventDefault(); - var dir = event.deltaY > 0 ? "Up" : "Down"; - if (dir == "Up") { + var dir = event.deltaY > 0 ? 'Up' : 'Down'; + if (dir == 'Up') { this.view.zoomIn(); } else { this.view.zoomOut(); @@ -193,7 +197,9 @@ class jm { return this.toggle_node(the_node); } } - if (node.isroot) { return; } + if (node.isroot) { + return; + } this.view.save_location(node); this.layout.toggle_node(node); this.view.relayout(); @@ -209,7 +215,9 @@ class jm { return this.expand_node(the_node); } } - if (node.isroot) { return; } + if (node.isroot) { + return; + } this.view.save_location(node); this.layout.expand_node(node); this.view.relayout(); @@ -225,7 +233,9 @@ class jm { return this.collapse_node(the_node); } } - if (node.isroot) { return; } + if (node.isroot) { + return; + } this.view.save_location(node); this.layout.collapse_node(node); this.view.relayout(); @@ -278,7 +288,7 @@ class jm { return { name: this.mind.name, author: this.mind.author, - version: this.mind.version + version: this.mind.version, }; } get_data(data_format) { @@ -305,7 +315,11 @@ class jm { this.view.show(false); this.view.reset_node_custom_style(node); this.expand_node(the_parent_node); - this.invoke_event_handle(EventType.edit, { evt: 'add_node', data: [the_parent_node.id, nodeid, topic, data], node: nodeid }); + this.invoke_event_handle(EventType.edit, { + evt: 'add_node', + data: [the_parent_node.id, nodeid, topic, data], + node: nodeid, + }); } return node; } else { @@ -317,12 +331,22 @@ class jm { if (this.get_editable()) { var the_node_before = this.get_node(node_before); var direction = this.layout.calculate_next_child_direction(the_node_before.parent); - var node = this.mind.insert_node_before(the_node_before, nodeid, topic, data, direction); + var node = this.mind.insert_node_before( + the_node_before, + nodeid, + topic, + data, + direction + ); if (!!node) { this.view.add_node(node); this.layout.layout(); this.view.show(false); - this.invoke_event_handle(EventType.edit, { evt: 'insert_node_before', data: [the_node_before.id, nodeid, topic, data], node: nodeid }); + this.invoke_event_handle(EventType.edit, { + evt: 'insert_node_before', + data: [the_node_before.id, nodeid, topic, data], + node: nodeid, + }); } return node; } else { @@ -339,7 +363,11 @@ class jm { this.view.add_node(node); this.layout.layout(); this.view.show(false); - this.invoke_event_handle(EventType.edit, { evt: 'insert_node_after', data: [the_node_after.id, nodeid, topic, data], node: nodeid }); + this.invoke_event_handle(EventType.edit, { + evt: 'insert_node_after', + data: [the_node_after.id, nodeid, topic, data], + node: nodeid, + }); } return node; } else { @@ -371,7 +399,11 @@ class jm { this.layout.layout(); this.view.show(false); this.view.restore_location(parent_node); - this.invoke_event_handle(EventType.edit, { evt: 'remove_node', data: [nodeid], node: parentid }); + this.invoke_event_handle(EventType.edit, { + evt: 'remove_node', + data: [nodeid], + node: parentid, + }); return true; } else { logger.error('fail, this mind map is not editable'); @@ -395,7 +427,11 @@ class jm { this.view.update_node(node); this.layout.layout(); this.view.show(false); - this.invoke_event_handle(EventType.edit, { evt: 'update_node', data: [nodeid, topic], node: nodeid }); + this.invoke_event_handle(EventType.edit, { + evt: 'update_node', + data: [nodeid, topic], + node: nodeid, + }); } } else { logger.error('fail, this mind map is not editable'); @@ -410,7 +446,11 @@ class jm { this.view.update_node(updated_node); this.layout.layout(); this.view.show(false); - this.invoke_event_handle(EventType.edit, { evt: 'move_node', data: [nodeid, beforeid, parentid, direction], node: nodeid }); + this.invoke_event_handle(EventType.edit, { + evt: 'move_node', + data: [nodeid, beforeid, parentid, direction], + node: nodeid, + }); } } else { logger.error('fail, this mind map is not editable'); @@ -460,7 +500,9 @@ class jm { return this.find_node_before(the_node); } } - if (node.isroot) { return null; } + if (node.isroot) { + return null; + } var n = null; if (node.parent.isroot) { var c = node.parent.children; @@ -490,7 +532,9 @@ class jm { return this.find_node_after(the_node); } } - if (node.isroot) { return null; } + if (node.isroot) { + return null; + } var n = null; if (node.parent.isroot) { var c = node.parent.children; @@ -584,7 +628,9 @@ class jm { var node = this.mind.get_node(nodeid); if (!!node) { if (!node.data['background-image']) { - logger.error('fail, only can change rotation angle of node with background image'); + logger.error( + 'fail, only can change rotation angle of node with background image' + ); return null; } node.data['background-rotation'] = rotation; diff --git a/src/jsmind.layout_provider.js b/src/jsmind.layout_provider.js index b0613bd2..3acd59cf 100644 --- a/src/jsmind.layout_provider.js +++ b/src/jsmind.layout_provider.js @@ -5,13 +5,13 @@ * Project Home: * https://github.com/hizzgdev/jsmind/ */ -import { logger, Direction, EventType } from "./jsmind.common.js"; +import { logger, Direction, EventType } from './jsmind.common.js'; export class LayoutProvider { constructor(jm, options) { this.opts = options; this.jm = jm; - this.isside = (this.opts.mode == 'side'); + this.isside = this.opts.mode == 'side'; this.bounds = null; this.cache_valid = false; @@ -30,8 +30,14 @@ export class LayoutProvider { var children = node.children || []; var children_len = children.length; var r = 0; - for (var i = 0; i < children_len; i++) { if (children[i].direction === Direction.left) { r--; } else { r++; } } - return (children_len > 1 && r > 0) ? Direction.left : Direction.right; + for (var i = 0; i < children_len; i++) { + if (children[i].direction === Direction.left) { + r--; + } else { + r++; + } + } + return children_len > 1 && r > 0 ? Direction.left : Direction.right; } layout() { logger.debug('layout.layout'); @@ -144,7 +150,9 @@ export class LayoutProvider { layout_data.outer_height = node_outer_height; layout_data.offset_y = base_y - node_outer_height / 2; - layout_data.offset_x = this.opts.hspace * layout_data.direction + pd.view.width * (pd.layout.direction + layout_data.direction) / 2; + layout_data.offset_x = + this.opts.hspace * layout_data.direction + + (pd.view.width * (pd.layout.direction + layout_data.direction)) / 2; if (!node.parent.isroot) { layout_data.offset_x += this.opts.pspace * layout_data.direction; } @@ -205,7 +213,7 @@ export class LayoutProvider { get_node_offset(node) { var layout_data = node._data.layout; var offset_cache = null; - if (('_offset_' in layout_data) && this.cache_valid) { + if ('_offset_' in layout_data && this.cache_valid) { offset_cache = layout_data._offset_; } else { offset_cache = { x: -1, y: -1 }; @@ -228,7 +236,7 @@ export class LayoutProvider { var view_data = node._data.view; var offset_p = this.get_node_offset(node); var p = {}; - p.x = offset_p.x + view_data.width * (node._data.layout.direction - 1) / 2; + p.x = offset_p.x + (view_data.width * (node._data.layout.direction - 1)) / 2; p.y = offset_p.y - view_data.height / 2; return p; } @@ -239,7 +247,7 @@ export class LayoutProvider { get_node_point_out(node) { var layout_data = node._data.layout; var pout_cache = null; - if (('_pout_' in layout_data) && this.cache_valid) { + if ('_pout_' in layout_data && this.cache_valid) { pout_cache = layout_data._pout_; } else { pout_cache = { x: -1, y: -1 }; @@ -252,7 +260,8 @@ export class LayoutProvider { } else { var view_data = node._data.view; var offset_p = this.get_node_offset(node); - pout_cache.x = offset_p.x + (view_data.width + this.opts.pspace) * node._data.layout.direction; + pout_cache.x = + offset_p.x + (view_data.width + this.opts.pspace) * node._data.layout.direction; pout_cache.y = offset_p.y; } } @@ -276,12 +285,16 @@ export class LayoutProvider { for (var nodeid in nodes) { node = nodes[nodeid]; pout = this.get_node_point_out(node); - if (pout.x > this.bounds.e) { this.bounds.e = pout.x; } - if (pout.x < this.bounds.w) { this.bounds.w = pout.x; } + if (pout.x > this.bounds.e) { + this.bounds.e = pout.x; + } + if (pout.x < this.bounds.w) { + this.bounds.w = pout.x; + } } return { w: this.bounds.e - this.bounds.w, - h: this.bounds.s - this.bounds.n + h: this.bounds.s - this.bounds.n, }; } toggle_node(node) { @@ -298,13 +311,21 @@ export class LayoutProvider { node.expanded = true; this.part_layout(node); this.set_visible(node.children, true); - this.jm.invoke_event_handle(EventType.show, { evt: 'expand_node', data: [], node: node.id }); + this.jm.invoke_event_handle(EventType.show, { + evt: 'expand_node', + data: [], + node: node.id, + }); } collapse_node(node) { node.expanded = false; this.part_layout(node); this.set_visible(node.children, false); - this.jm.invoke_event_handle(EventType.show, { evt: 'collapse_node', data: [], node: node.id }); + this.jm.invoke_event_handle(EventType.show, { + evt: 'collapse_node', + data: [], + node: node.id, + }); } expand_all() { var nodes = this.jm.mind.nodes; @@ -341,7 +362,9 @@ export class LayoutProvider { } } expand_to_depth(target_depth, curr_nodes, curr_depth) { - if (target_depth < 1) { return; } + if (target_depth < 1) { + return; + } var nodes = curr_nodes || this.jm.mind.root.children; var depth = curr_depth || 1; var i = nodes.length; @@ -366,16 +389,27 @@ export class LayoutProvider { if (!!root) { var root_layout_data = root._data.layout; if (node.isroot) { - root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes); - root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes); + root_layout_data.outer_height_right = this._layout_offset_subnodes_height( + root_layout_data.right_nodes + ); + root_layout_data.outer_height_left = this._layout_offset_subnodes_height( + root_layout_data.left_nodes + ); } else { if (node._data.layout.direction == Direction.right) { - root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes); + root_layout_data.outer_height_right = this._layout_offset_subnodes_height( + root_layout_data.right_nodes + ); } else { - root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes); + root_layout_data.outer_height_left = this._layout_offset_subnodes_height( + root_layout_data.left_nodes + ); } } - this.bounds.s = Math.max(root_layout_data.outer_height_left, root_layout_data.outer_height_right); + this.bounds.s = Math.max( + root_layout_data.outer_height_left, + root_layout_data.outer_height_right + ); this.cache_valid = false; } else { logger.warn('can not found root node'); @@ -403,12 +437,10 @@ export class LayoutProvider { } is_visible(node) { var layout_data = node._data.layout; - if (('visible' in layout_data) && !layout_data.visible) { + if ('visible' in layout_data && !layout_data.visible) { return false; } else { return true; } } } - - diff --git a/src/jsmind.mind.js b/src/jsmind.mind.js index c956c4d5..835afa92 100644 --- a/src/jsmind.mind.js +++ b/src/jsmind.mind.js @@ -6,8 +6,8 @@ * https://github.com/hizzgdev/jsmind/ */ -import { Node } from "./jsmind.node.js"; -import { logger, Direction } from "./jsmind.common.js"; +import { Node } from './jsmind.node.js'; +import { logger, Direction } from './jsmind.common.js'; export class Mind { constructor() { @@ -42,7 +42,16 @@ export class Mind { return null; } var node_index = idx || -1; - var node = new Node(nodeid, node_index, topic, data, false, parent_node, parent_node.direction, expanded); + var node = new Node( + nodeid, + node_index, + topic, + data, + false, + parent_node, + parent_node.direction, + expanded + ); if (parent_node.isroot) { node.direction = direction || Direction.right; } @@ -50,7 +59,7 @@ export class Mind { parent_node.children.push(node); this._reindex(parent_node); } else { - logger.error('fail, the nodeid \'' + node.id + '\' has been already exist.'); + logger.error("fail, the nodeid '" + node.id + "' has been already exist."); node = null; } return node; @@ -73,7 +82,9 @@ export class Mind { return this.get_node_before(the_node); } } - if (node.isroot) { return null; } + if (node.isroot) { + return null; + } var idx = node.index - 2; if (idx >= 0) { return node.parent.children[idx]; @@ -99,7 +110,9 @@ export class Mind { return this.get_node_after(the_node); } } - if (node.isroot) { return null; } + if (node.isroot) { + return null; + } var idx = node.index; var brothers = node.parent.children; if (brothers.length > idx) { @@ -138,8 +151,12 @@ export class Mind { node.index = 0; this._reindex(node.parent); } else { - var node_before = (!!beforeid) ? this.get_node(beforeid) : null; - if (node_before != null && node_before.parent != null && node_before.parent.id == node.parent.id) { + var node_before = !!beforeid ? this.get_node(beforeid) : null; + if ( + node_before != null && + node_before.parent != null && + node_before.parent.id == node.parent.id + ) { node.index = node_before.index - 0.5; this._reindex(node.parent); } @@ -224,7 +241,7 @@ export class Mind { } _put_node(node) { if (node.id in this.nodes) { - logger.warn('the nodeid \'' + node.id + '\' has been already exist.'); + logger.warn("the nodeid '" + node.id + "' has been already exist."); return false; } else { this.nodes[node.id] = node; @@ -240,5 +257,3 @@ export class Mind { } } } - - diff --git a/src/jsmind.node.js b/src/jsmind.node.js index 93415c99..f42abf33 100644 --- a/src/jsmind.node.js +++ b/src/jsmind.node.js @@ -6,12 +6,20 @@ * https://github.com/hizzgdev/jsmind/ */ -import { logger } from "./jsmind.common.js"; +import { logger } from './jsmind.common.js'; export class Node { constructor(sId, iIndex, sTopic, oData, bIsRoot, oParent, eDirection, bExpanded) { - if (!sId) { logger.error('invalid node id'); return; } - if (typeof iIndex != 'number') { logger.error('invalid node index'); return; } - if (typeof bExpanded === 'undefined') { bExpanded = true; } + if (!sId) { + logger.error('invalid node id'); + return; + } + if (typeof iIndex != 'number') { + logger.error('invalid node index'); + return; + } + if (typeof bExpanded === 'undefined') { + bExpanded = true; + } this.id = sId; this.index = iIndex; this.topic = sTopic; @@ -28,15 +36,15 @@ export class Node { var vd = this._data.view; return { x: vd.abs_x, - y: vd.abs_y + y: vd.abs_y, }; } get_size() { var vd = this._data.view; return { w: vd.width, - h: vd.height - } + h: vd.height, + }; } static compare(node1, node2) { @@ -80,5 +88,3 @@ export class Node { return !!n && n instanceof Node; } } - - diff --git a/src/jsmind.option.js b/src/jsmind.option.js index 4605fb5a..1efa8c46 100644 --- a/src/jsmind.option.js +++ b/src/jsmind.option.js @@ -6,13 +6,13 @@ * https://github.com/hizzgdev/jsmind/ */ -import { util } from "./jsmind.util.js"; +import { util } from './jsmind.util.js'; const default_options = { - container: '', // id of the container + container: '', // id of the container editable: false, // you can change it in your options theme: null, - mode: 'full', // full or side + mode: 'full', // full or side support_html: true, view: { @@ -22,44 +22,43 @@ const default_options = { line_width: 2, line_color: '#555', draggable: false, // drag the mind map with your mouse, when it's larger that the container - hide_scrollbars_when_draggable: false // hide container scrollbars, when mind map is larger than container and draggable option is true. + hide_scrollbars_when_draggable: false, // hide container scrollbars, when mind map is larger than container and draggable option is true. }, layout: { hspace: 30, vspace: 20, - pspace: 13 + pspace: 13, }, default_event_handle: { enable_mousedown_handle: true, enable_click_handle: true, enable_dblclick_handle: true, - enable_mousewheel_handle: true + enable_mousewheel_handle: true, }, shortcut: { enable: true, - handles: { - }, + handles: {}, mapping: { addchild: 45, // Insert addbrother: 13, // Enter - editnode: 113,// F2 + editnode: 113, // F2 delnode: 46, // Delete toggle: 32, // Space left: 37, // Left up: 38, // Up right: 39, // Right down: 40, // Down - } + }, }, }; -export function merge_option (options) { +export function merge_option(options) { var opts = {}; util.json.merge(opts, default_options); util.json.merge(opts, options); if (!opts.container) { - throw new Error('the options.container should not be null or empty.') + throw new Error('the options.container should not be null or empty.'); } return opts; } diff --git a/src/jsmind.plugin.js b/src/jsmind.plugin.js index ed153806..1fdd8817 100644 --- a/src/jsmind.plugin.js +++ b/src/jsmind.plugin.js @@ -6,15 +6,15 @@ * https://github.com/hizzgdev/jsmind/ */ -import { $ } from "./jsmind.dom.js"; +import { $ } from './jsmind.dom.js'; const plugin_data = { - plugins: [] -} + plugins: [], +}; export function register(plugin) { if (!plugin instanceof Plugin) { - throw new Error('plugin ' + plugin + ' is not a supported plugin') + throw new Error('plugin ' + plugin + ' is not a supported plugin'); } plugin_data.plugins.push(plugin); } diff --git a/src/jsmind.shortcut_provider.js b/src/jsmind.shortcut_provider.js index b5a066b7..44848514 100644 --- a/src/jsmind.shortcut_provider.js +++ b/src/jsmind.shortcut_provider.js @@ -6,9 +6,9 @@ * https://github.com/hizzgdev/jsmind/ */ -import { $ } from "./jsmind.dom.js"; -import { util } from "./jsmind.util.js"; -import { Direction } from "./jsmind.common.js"; +import { $ } from './jsmind.dom.js'; +import { util } from './jsmind.util.js'; +import { Direction } from './jsmind.common.js'; export class ShortcutProvider { constructor(jm, options) { @@ -33,7 +33,7 @@ export class ShortcutProvider { this.handles['right'] = this.handle_right; for (var handle in this.mapping) { - if (!!this.mapping[handle] && (handle in this.handles)) { + if (!!this.mapping[handle] && handle in this.handles) { this._mapping[this.mapping[handle]] = this.handles[handle]; } } @@ -51,11 +51,22 @@ export class ShortcutProvider { this.opts.enable = false; } handler(e) { - if (e.which == 9) { e.preventDefault(); } //prevent tab to change focus in browser - if (this.jm.view.is_editing()) { return; } + if (e.which == 9) { + e.preventDefault(); + } //prevent tab to change focus in browser + if (this.jm.view.is_editing()) { + return; + } var evt = e || event; - if (!this.opts.enable) { return true; } - var kc = evt.keyCode + (evt.metaKey << 13) + (evt.ctrlKey << 12) + (evt.altKey << 11) + (evt.shiftKey << 10); + if (!this.opts.enable) { + return true; + } + var kc = + evt.keyCode + + (evt.metaKey << 13) + + (evt.ctrlKey << 12) + + (evt.altKey << 11) + + (evt.shiftKey << 10); if (kc in this._mapping) { this._mapping[kc].call(this, this.jm, e); } @@ -160,8 +171,7 @@ export class ShortcutProvider { } } node = c[children[Math.floor((children.length - 1) / 2)]]; - } - else if (selected_node.direction === d) { + } else if (selected_node.direction === d) { var children = selected_node.children; var childrencount = children.length; if (childrencount > 0) { @@ -178,5 +188,3 @@ export class ShortcutProvider { } } } - - diff --git a/src/jsmind.util.js b/src/jsmind.util.js index 1bf8eff6..91e6a971 100644 --- a/src/jsmind.util.js +++ b/src/jsmind.util.js @@ -6,15 +6,19 @@ * https://github.com/hizzgdev/jsmind/ */ -import { $ } from "./jsmind.dom.js"; -import { logger } from "./jsmind.common.js"; +import { $ } from './jsmind.dom.js'; +import { logger } from './jsmind.common.js'; export const util = { ajax: { request: function (url, param, method, callback, fail_callback) { - var p = Object.keys(param).map(k => encodeURIComponent(k) + '=' + encodeURIComponent(param[k])).join('&'); + var p = Object.keys(param) + .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(param[k])) + .join('&'); var xhr = new XMLHttpRequest(); - if (!xhr) { return; } + if (!xhr) { + return; + } xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status == 0) { @@ -34,12 +38,15 @@ export const util = { } } } - } + }; method = method || 'GET'; xhr.open(method, url, true); xhr.setRequestHeader('If-Modified-Since', '0'); if (method == 'POST') { - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8'); + xhr.setRequestHeader( + 'Content-Type', + 'application/x-www-form-urlencoded;charset=utf-8' + ); xhr.send(p); } else { xhr.send(); @@ -50,7 +57,7 @@ export const util = { }, post: function (url, param, callback) { return util.ajax.request(url, param, 'POST', callback); - } + }, }, file: { @@ -69,7 +76,11 @@ export const util = { if (typeof $.w.Blob === 'function') { blob = new Blob([file_data], { type: type }); } else { - var BlobBuilder = $.w.BlobBuilder || $.w.MozBlobBuilder || $.w.WebKitBlobBuilder || $.w.MSBlobBuilder; + var BlobBuilder = + $.w.BlobBuilder || + $.w.MozBlobBuilder || + $.w.WebKitBlobBuilder || + $.w.MSBlobBuilder; var bb = new BlobBuilder(); bb.append(file_data); blob = bb.getBlob(type); @@ -93,7 +104,7 @@ export const util = { location.href = bloburl; } } - } + }, }, json: { @@ -106,9 +117,11 @@ export const util = { merge: function (b, a) { for (var o in a) { if (o in b) { - if (typeof b[o] === 'object' && + if ( + typeof b[o] === 'object' && Object.prototype.toString.call(b[o]).toLowerCase() == '[object object]' && - !b[o].length) { + !b[o].length + ) { util.json.merge(b[o], a[o]); } else { b[o] = a[o]; @@ -118,19 +131,23 @@ export const util = { } } return b; - } + }, }, uuid: { newid: function () { - return (new Date().getTime().toString(16) + Math.random().toString(16).substring(2)).substring(2, 18); - } + return ( + new Date().getTime().toString(16) + Math.random().toString(16).substring(2) + ).substring(2, 18); + }, }, text: { is_empty: function (s) { - if (!s) { return true; } + if (!s) { + return true; + } return s.replace(/\s*/, '').length == 0; - } - } + }, + }, }; diff --git a/src/jsmind.view_provider.js b/src/jsmind.view_provider.js index 93ca0b38..480d816f 100644 --- a/src/jsmind.view_provider.js +++ b/src/jsmind.view_provider.js @@ -5,10 +5,10 @@ * Project Home: * https://github.com/hizzgdev/jsmind/ */ -import { logger, EventType } from "./jsmind.common.js"; -import { $ } from "./jsmind.dom.js"; -import { graph } from "./jsmind.graph.js"; -import { util } from "./jsmind.util.js"; +import { logger, EventType } from './jsmind.common.js'; +import { $ } from './jsmind.dom.js'; +import { graph } from './jsmind.graph.js'; +import { util } from './jsmind.util.js'; export class ViewProvider { constructor(jm, options) { @@ -39,7 +39,8 @@ export class ViewProvider { this.e_nodes = $.c('jmnodes'); this.e_editor = $.c('input'); - this.graph = this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this); + this.graph = + this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this); this.e_panel.className = 'jsmind-inner'; this.e_panel.tabIndex = 1; @@ -57,7 +58,10 @@ export class ViewProvider { var v = this; $.on(this.e_editor, 'keydown', function (e) { var evt = e || event; - if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); } + if (evt.keyCode == 13) { + v.edit_node_end(); + evt.stopPropagation(); + } }); $.on(this.e_editor, 'blur', function (e) { v.edit_node_end(); @@ -88,7 +92,7 @@ export class ViewProvider { } } is_expander(element) { - return (element.tagName.toLowerCase() == 'jmexpander'); + return element.tagName.toLowerCase() == 'jmexpander'; } reset() { logger.debug('view.reset'); @@ -121,8 +125,12 @@ export class ViewProvider { var min_height = min_size.h + this.opts.vmargin * 2; var client_w = this.e_panel.clientWidth; var client_h = this.e_panel.clientHeight; - if (client_w < min_width) { client_w = min_width; } - if (client_h < min_height) { client_h = min_height; } + if (client_w < min_width) { + client_w = min_width; + } + if (client_h < min_height) { + client_h = min_height; + } this.size.w = client_w; this.size.h = client_h; } @@ -217,9 +225,8 @@ export class ViewProvider { } select_node(node) { if (!!this.selected_node) { - this.selected_node._data.view.element.className = - this.selected_node._data.view.element.className.replace(/\s*selected\b/i, ''); - this.reset_node_custom_style(this.selected_node); + var element = this.selected_node._data.view.element; + element.className = element.className.replace(/\s*selected\b/i, ''); } if (!!node) { this.selected_node = node; @@ -234,7 +241,7 @@ export class ViewProvider { return this.editing_node; } is_editing() { - return (!!this.editing_node); + return !!this.editing_node; } edit_node_begin(node) { if (!node.topic) { @@ -250,7 +257,11 @@ export class ViewProvider { var topic = node.topic; var ncs = getComputedStyle(element); this.e_editor.value = topic; - this.e_editor.style.width = (element.clientWidth - parseInt(ncs.getPropertyValue('padding-left')) - parseInt(ncs.getPropertyValue('padding-right'))) + 'px'; + this.e_editor.style.width = + element.clientWidth - + parseInt(ncs.getPropertyValue('padding-left')) - + parseInt(ncs.getPropertyValue('padding-right')) + + 'px'; element.innerHTML = ''; element.appendChild(this.e_editor); element.style.zIndex = 5; @@ -308,16 +319,15 @@ export class ViewProvider { return this.setZoom(this.actualZoom - this.zoomStep); } setZoom(zoom) { - if ((zoom < this.minZoom) || (zoom > this.maxZoom)) { + if (zoom < this.minZoom || zoom > this.maxZoom) { return false; } this.actualZoom = zoom; for (var i = 0; i < this.e_panel.children.length; i++) { this.e_panel.children[i].style.transform = 'scale(' + zoom + ')'; - }; + } this.show(true); return true; - } _center_root() { // center root node @@ -393,15 +403,15 @@ export class ViewProvider { p = this.layout.get_node_point(node); view_data.abs_x = _offset.x + p.x; view_data.abs_y = _offset.y + p.y; - node_element.style.left = (_offset.x + p.x) + 'px'; - node_element.style.top = (_offset.y + p.y) + 'px'; + node_element.style.left = _offset.x + p.x + 'px'; + node_element.style.top = _offset.y + p.y + 'px'; node_element.style.display = ''; node_element.style.visibility = 'visible'; if (!node.isroot && node.children.length > 0) { expander_text = node.expanded ? '-' : '+'; p_expander = this.layout.get_expander_point(node); - expander.style.left = (_offset.x + p_expander.x) + 'px'; - expander.style.top = (_offset.y + p_expander.y) + 'px'; + expander.style.left = _offset.x + p_expander.x + 'px'; + expander.style.top = _offset.y + p_expander.y + 'px'; expander.style.display = ''; expander.style.visibility = 'visible'; $.t(expander, expander_text); @@ -450,27 +460,33 @@ export class ViewProvider { var img = this; if (c.getContext) { var ctx = c.getContext('2d'); - ctx.drawImage(img, 2, 2, node_element.clientWidth, node_element.clientHeight); + ctx.drawImage( + img, + 2, + 2, + node_element.clientWidth, + node_element.clientHeight + ); var scaledImageData = c.toDataURL(); node_element.style.backgroundImage = 'url(' + scaledImageData + ')'; } }; img.src = backgroundImage; - } else { node_element.style.backgroundImage = 'url(' + backgroundImage + ')'; } node_element.style.backgroundSize = '99%'; if ('background-rotation' in node_data) { - node_element.style.transform = 'rotate(' + node_data['background-rotation'] + 'deg)'; + node_element.style.transform = + 'rotate(' + node_data['background-rotation'] + 'deg)'; } } } clear_node_custom_style(node) { var node_element = node._data.view.element; - node_element.style.backgroundColor = ""; - node_element.style.color = ""; + node_element.style.backgroundColor = ''; + node_element.style.color = ''; } clear_lines() { this.graph.clear(); @@ -484,8 +500,12 @@ export class ViewProvider { var _offset = this.get_view_offset(); for (var nodeid in nodes) { node = nodes[nodeid]; - if (!!node.isroot) { continue; } - if (('visible' in node._data.layout) && !node._data.layout.visible) { continue; } + if (!!node.isroot) { + continue; + } + if ('visible' in node._data.layout && !node._data.layout.visible) { + continue; + } pin = this.layout.get_node_point_in(node); pout = this.layout.get_node_point_out(node.parent); this.graph.draw_line(pout, pin, _offset); @@ -503,7 +523,7 @@ export class ViewProvider { this.e_panel.style = 'overflow: hidden'; } // Move the whole mind map with mouse moves, while button is down. - $.on(this.container, 'mousedown', (eventDown) => { + $.on(this.container, 'mousedown', eventDown => { dragging = true; // Record current mouse position. x = eventDown.clientX; @@ -514,7 +534,7 @@ export class ViewProvider { dragging = false; }); // Follow current mouse position and move mind map accordingly. - $.on(this.container, 'mousemove', (eventMove) => { + $.on(this.container, 'mousemove', eventMove => { if (dragging) { this.e_panel.scrollBy(x - eventMove.clientX, y - eventMove.clientY); // Record new current position. @@ -525,5 +545,3 @@ export class ViewProvider { } } } - - diff --git a/src/plugins/jsmind.draggable.js b/src/plugins/jsmind.draggable.js index 70761dd6..aa0216a6 100644 --- a/src/plugins/jsmind.draggable.js +++ b/src/plugins/jsmind.draggable.js @@ -1,26 +1,31 @@ /** * @license BSD * @copyright 2014-2022 hizzgdev@163.com - * + * * Project Home: * https://github.com/hizzgdev/jsmind/ */ -if (!jsMind) { throw new Error('jsMind is not defined'); } +if (!jsMind) { + throw new Error('jsMind is not defined'); +} const jm = jsMind; const $ = jm.$; -const clear_selection = 'getSelection' in $.w ? function () { - $.w.getSelection().removeAllRanges(); -} : function () { - $.d.selection.empty(); -}; +const clear_selection = + 'getSelection' in $.w + ? function () { + $.w.getSelection().removeAllRanges(); + } + : function () { + $.d.selection.empty(); + }; const options = { line_width: 5, lookup_delay: 500, - lookup_interval: 80 + lookup_interval: 80, }; class draggable { @@ -80,7 +85,6 @@ class draggable { s.transform = el.style.transform; this.shadow_w = this.shadow.clientWidth; this.shadow_h = this.shadow.clientHeight; - } show_shadow() { if (!this.moved) { @@ -121,8 +125,7 @@ class draggable { var ns, nl; - var direct = (sx + sw / 2) >= root_x ? - jsMind.direction.right : jsMind.direction.left; + var direct = sx + sw / 2 >= root_x ? jsMind.direction.right : jsMind.direction.left; var nodes = this.jm.mind.nodes; var node = null; var layout = this.jm.layout; @@ -144,12 +147,16 @@ class draggable { ns = node.get_size(); nl = node.get_location(); if (direct == jsMind.direction.right) { - if (sx - nl.x - ns.w <= 0) { continue; } + if (sx - nl.x - ns.w <= 0) { + continue; + } distance = Math.abs(sx - nl.x - ns.w) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2); np = { x: nl.x + ns.w - options.line_width, y: nl.y + ns.h / 2 }; sp = { x: sx + options.line_width, y: sy + sh / 2 }; } else { - if (nl.x - sx - sw <= 0) { continue; } + if (nl.x - sx - sw <= 0) { + continue; + } distance = Math.abs(sx + sw - nl.x) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2); np = { x: nl.x + options.line_width, y: nl.y + ns.h / 2 }; sp = { x: sx + sw - options.line_width, y: sy + sh / 2 }; @@ -168,7 +175,7 @@ class draggable { node: closest_node, direction: direct, sp: shadow_p, - np: closest_p + np: closest_p, }; } return result_node; @@ -210,21 +217,29 @@ class draggable { }); } dragstart(e) { - if (!this.jm.get_editable()) { return; } - if (this.capture) { return; } + if (!this.jm.get_editable()) { + return; + } + if (this.capture) { + return; + } this.active_node = null; var jview = this.jm.view; var el = e.target || event.srcElement; - if (el.tagName.toLowerCase() != 'jmnode') { return; } + if (el.tagName.toLowerCase() != 'jmnode') { + return; + } var nodeid = jview.get_binded_nodeid(el); if (!!nodeid) { var node = this.jm.get_node(nodeid); if (!node.isroot) { this.reset_shadow(el); this.active_node = node; - this.offset_x = (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft; - this.offset_y = (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop; + this.offset_x = + (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft; + this.offset_y = + (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop; this.client_hw = Math.floor(el.clientWidth / 2); this.client_hh = Math.floor(el.clientHeight / 2); if (this.hlookup_delay != 0) { @@ -245,7 +260,9 @@ class draggable { } } drag(e) { - if (!this.jm.get_editable()) { return; } + if (!this.jm.get_editable()) { + return; + } if (this.capture) { e.preventDefault(); this.show_shadow(); @@ -260,7 +277,9 @@ class draggable { } } dragend(e) { - if (!this.jm.get_editable()) { return; } + if (!this.jm.get_editable()) { + return; + } if (this.capture) { if (this.hlookup_delay != 0) { $.w.clearTimeout(this.hlookup_delay); @@ -304,7 +323,9 @@ class draggable { } } } - if (!!node_before) { beforeid = node_before.id; } + if (!!node_before) { + beforeid = node_before.id; + } this.jm.move_node(src_node.id, beforeid, target_node.id, target_direct); } this.active_node = null; @@ -318,7 +339,6 @@ class draggable { } } - var draggable_plugin = new jm.plugin('draggable', function (jm) { var jd = new draggable(jm); jd.init(); diff --git a/src/plugins/jsmind.screenshot.js b/src/plugins/jsmind.screenshot.js index 55516f26..99d0e007 100644 --- a/src/plugins/jsmind.screenshot.js +++ b/src/plugins/jsmind.screenshot.js @@ -1,13 +1,14 @@ /** * @license BSD * @copyright 2014-2022 hizzgdev@163.com - * + * * Project Home: * https://github.com/hizzgdev/jsmind/ */ - -if (!jsMind) { throw new Error('jsMind is not defined'); } +if (!jsMind) { + throw new Error('jsMind is not defined'); +} const $ = jsMind.$; @@ -17,7 +18,7 @@ var css = function (cStyle, property_name) { var is_visible = function (cStyle) { var visibility = css(cStyle, 'visibility'); var display = css(cStyle, 'display'); - return (visibility !== 'hidden' && display !== 'none'); + return visibility !== 'hidden' && display !== 'none'; }; var jcanvas = {}; jcanvas.rect = function (ctx, x, y, w, h, r) { @@ -85,12 +86,12 @@ jcanvas.image = function (ctx, url, x, y, w, h, r, rotation, callback) { ctx.closePath(); ctx.clip(); ctx.translate(w / 2, h / 2); - ctx.rotate(rotation * Math.PI / 180); + ctx.rotate((rotation * Math.PI) / 180); ctx.drawImage(img, -w / 2, -h / 2); ctx.restore(); ctx.restore(); !!callback && callback(); - } + }; img.src = url; }; @@ -102,7 +103,9 @@ class screenshot { this._inited = false; } init() { - if (this._inited) { return; } + if (this._inited) { + return; + } console.log('init'); var c = $.c('canvas'); var ctx = c.getContext('2d'); @@ -115,21 +118,27 @@ class screenshot { } shoot(callback) { this.init(); - this._draw(function () { - !!callback && callback(); - this.clean(); - }.bind(this)); + this._draw( + function () { + !!callback && callback(); + this.clean(); + }.bind(this) + ); this._watermark(); } shootDownload() { - this.shoot(function () { - this._download(); - }.bind(this)); + this.shoot( + function () { + this._download(); + }.bind(this) + ); } shootAsDataURL(callback) { - this.shoot(function () { - !!callback && callback(this.canvas_elem.toDataURL()); - }.bind(this)); + this.shoot( + function () { + !!callback && callback(this.canvas_elem.toDataURL()); + }.bind(this) + ); } resize() { if (this._inited) { @@ -145,9 +154,11 @@ class screenshot { var ctx = this.canvas_ctx; ctx.textAlign = 'left'; ctx.textBaseline = 'top'; - this._draw_lines(function () { - this._draw_nodes(callback); - }.bind(this)); + this._draw_lines( + function () { + this._draw_nodes(callback); + }.bind(this) + ); } _watermark() { var c = this.canvas_elem; @@ -205,23 +216,30 @@ class screenshot { var padding_top = parseInt(css(ncs, 'padding-top')); var padding_bottom = parseInt(css(ncs, 'padding-bottom')); var text_overflow = css(ncs, 'text-overflow'); - var font = css(ncs, 'font-style') + ' ' + - css(ncs, 'font-variant') + ' ' + - css(ncs, 'font-weight') + ' ' + - css(ncs, 'font-size') + '/' + css(ncs, 'line-height') + ' ' + + var font = + css(ncs, 'font-style') + + ' ' + + css(ncs, 'font-variant') + + ' ' + + css(ncs, 'font-weight') + + ' ' + + css(ncs, 'font-size') + + '/' + + css(ncs, 'line-height') + + ' ' + css(ncs, 'font-family'); var rb = { x: view_data.abs_x, y: view_data.abs_y, w: view_data.width + 1, - h: view_data.height + 1 + h: view_data.height + 1, }; var tb = { x: rb.x + padding_left, y: rb.y + padding_top, w: rb.w - padding_left - padding_right, - h: rb.h - padding_top - padding_bottom + h: rb.h - padding_top - padding_bottom, }; ctx.font = font; @@ -239,10 +257,19 @@ class screenshot { if ('background-rotation' in node.data) { rotation = node.data['background-rotation']; } - jcanvas.image(ctx, backgroundUrl, rb.x, rb.y, rb.w, rb.h, round_radius, rotation, + jcanvas.image( + ctx, + backgroundUrl, + rb.x, + rb.y, + rb.w, + rb.h, + round_radius, + rotation, function () { node.ready = true; - }); + } + ); } if (!!node.topic) { if (text_overflow === 'ellipsis') { @@ -262,7 +289,9 @@ class screenshot { _draw_expander(expander) { var ctx = this.canvas_ctx; var ncs = getComputedStyle(expander); - if (!is_visible(ncs)) { return; } + if (!is_visible(ncs)) { + return; + } var style_left = css(ncs, 'left'); var style_top = css(ncs, 'top'); @@ -288,7 +317,7 @@ class screenshot { var c = this.canvas_elem; var name = this.jm.mind.name + '.png'; - if (navigator.msSaveBlob && (!!c.msToBlob)) { + if (navigator.msSaveBlob && !!c.msToBlob) { var blob = c.msToBlob(); navigator.msSaveBlob(blob, name); } else { @@ -315,7 +344,6 @@ class screenshot { } } - var screenshot_plugin = new jsMind.plugin('screenshot', function (jm) { var jss = new screenshot(jm); jm.screenshot = jss; diff --git a/style/jsmind.css b/style/jsmind.css index 4cdec39e..78cfcdeb 100644 --- a/style/jsmind.css +++ b/style/jsmind.css @@ -7,154 +7,392 @@ */ /* important section */ -.jsmind-inner{position:relative;overflow:auto;width:100%;height:100%;outline:none;}/*box-shadow:0 0 2px #000;*/ -.jsmind-inner{ - moz-user-select:-moz-none; - -moz-user-select:none; - -o-user-select:none; - -khtml-user-select:none; - -webkit-user-select:none; - -ms-user-select:none; - user-select:none; +.jsmind-inner { + position: relative; + overflow: auto; + width: 100%; + height: 100%; + outline: none; +} /*box-shadow:0 0 2px #000;*/ +.jsmind-inner { + moz-user-select: -moz-none; + -moz-user-select: none; + -o-user-select: none; + -khtml-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } /* z-index:1 */ -svg.jsmind{position:absolute;z-index:1;} -canvas.jsmind{position:absolute;z-index:1;} +svg.jsmind { + position: absolute; + z-index: 1; +} +canvas.jsmind { + position: absolute; + z-index: 1; +} /* z-index:2 */ -jmnodes{position:absolute;z-index:2;background-color:rgba(0,0,0,0);}/*background color is necessary*/ -jmnode{position:absolute;cursor:default;max-width:400px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} -jmexpander{position:absolute;width:11px;height:11px;display:block;overflow:hidden;line-height:12px;font-size:12px;text-align:center;border-radius:6px;border-width:1px;border-style:solid;cursor:pointer;} +jmnodes { + position: absolute; + z-index: 2; + background-color: rgba(0, 0, 0, 0); +} /*background color is necessary*/ +jmnode { + position: absolute; + cursor: default; + max-width: 400px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +jmexpander { + position: absolute; + width: 11px; + height: 11px; + display: block; + overflow: hidden; + line-height: 12px; + font-size: 12px; + text-align: center; + border-radius: 6px; + border-width: 1px; + border-style: solid; + cursor: pointer; +} /* default theme */ -jmnode{padding:10px;background-color:#fff;color:#333;border-radius:5px;box-shadow:1px 1px 1px #666;font:16px/1.125 Verdana,Arial,Helvetica,sans-serif;} -jmnode:hover{box-shadow:2px 2px 8px #000;background-color:#ebebeb;color:#333;} -jmnode.selected{background-color:#11f;color:#fff;box-shadow:2px 2px 8px #000;} -jmnode.root{font-size:24px;} -jmexpander{border-color:gray;} -jmexpander:hover{border-color:#000;} +jmnode { + padding: 10px; + background-color: #fff; + color: #333; + border-radius: 5px; + box-shadow: 1px 1px 1px #666; + font: 16px/1.125 Verdana, Arial, Helvetica, sans-serif; +} +jmnode:hover { + box-shadow: 2px 2px 8px #000; + background-color: #ebebeb; + color: #333; +} +jmnode.selected { + background-color: #11f; + color: #fff; + box-shadow: 2px 2px 8px #000; +} +jmnode.root { + font-size: 24px; +} +jmexpander { + border-color: gray; +} +jmexpander:hover { + border-color: #000; +} @media screen and (max-device-width: 1024px) { - jmnode{padding:5px;border-radius:3px;font-size:14px;} - jmnode.root{font-size:21px;} + jmnode { + padding: 5px; + border-radius: 3px; + font-size: 14px; + } + jmnode.root { + font-size: 21px; + } } /* primary theme */ -jmnodes.theme-primary jmnode{background-color:#428bca;color:#fff;border-color:#357ebd;} -jmnodes.theme-primary jmnode:hover{background-color:#3276b1;border-color:#285e8e;} -jmnodes.theme-primary jmnode.selected{background-color:#f1c40f;color:#fff;} -jmnodes.theme-primary jmnode.root{} -jmnodes.theme-primary jmexpander{} -jmnodes.theme-primary jmexpander:hover{} +jmnodes.theme-primary jmnode { + background-color: #428bca; + color: #fff; + border-color: #357ebd; +} +jmnodes.theme-primary jmnode:hover { + background-color: #3276b1; + border-color: #285e8e; +} +jmnodes.theme-primary jmnode.selected { + background-color: #f1c40f; + color: #fff; +} +jmnodes.theme-primary jmnode.root { +} +jmnodes.theme-primary jmexpander { +} +jmnodes.theme-primary jmexpander:hover { +} /* warning theme */ -jmnodes.theme-warning jmnode{background-color:#f0ad4e;border-color:#eea236;color:#fff;} -jmnodes.theme-warning jmnode:hover{background-color:#ed9c28;border-color:#d58512;} -jmnodes.theme-warning jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-warning jmnode.root{} -jmnodes.theme-warning jmexpander{} -jmnodes.theme-warning jmexpander:hover{} +jmnodes.theme-warning jmnode { + background-color: #f0ad4e; + border-color: #eea236; + color: #fff; +} +jmnodes.theme-warning jmnode:hover { + background-color: #ed9c28; + border-color: #d58512; +} +jmnodes.theme-warning jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-warning jmnode.root { +} +jmnodes.theme-warning jmexpander { +} +jmnodes.theme-warning jmexpander:hover { +} /* danger theme */ -jmnodes.theme-danger jmnode{background-color:#d9534f;border-color:#d43f3a;color:#fff;} -jmnodes.theme-danger jmnode:hover{background-color:#d2322d;border-color:#ac2925;} -jmnodes.theme-danger jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-danger jmnode.root{} -jmnodes.theme-danger jmexpander{} -jmnodes.theme-danger jmexpander:hover{} +jmnodes.theme-danger jmnode { + background-color: #d9534f; + border-color: #d43f3a; + color: #fff; +} +jmnodes.theme-danger jmnode:hover { + background-color: #d2322d; + border-color: #ac2925; +} +jmnodes.theme-danger jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-danger jmnode.root { +} +jmnodes.theme-danger jmexpander { +} +jmnodes.theme-danger jmexpander:hover { +} /* success theme */ -jmnodes.theme-success jmnode{background-color:#5cb85c;border-color:#4cae4c;color:#fff;} -jmnodes.theme-success jmnode:hover{background-color:#47a447;border-color:#398439;} -jmnodes.theme-success jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-success jmnode.root{} -jmnodes.theme-success jmexpander{} -jmnodes.theme-success jmexpander:hover{} +jmnodes.theme-success jmnode { + background-color: #5cb85c; + border-color: #4cae4c; + color: #fff; +} +jmnodes.theme-success jmnode:hover { + background-color: #47a447; + border-color: #398439; +} +jmnodes.theme-success jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-success jmnode.root { +} +jmnodes.theme-success jmexpander { +} +jmnodes.theme-success jmexpander:hover { +} /* info theme */ -jmnodes.theme-info jmnode{background-color:#5dc0de;border-color:#46b8da;;color:#fff;} -jmnodes.theme-info jmnode:hover{background-color:#39b3d7;border-color:#269abc;} -jmnodes.theme-info jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-info jmnode.root{} -jmnodes.theme-info jmexpander{} -jmnodes.theme-info jmexpander:hover{} +jmnodes.theme-info jmnode { + background-color: #5dc0de; + border-color: #46b8da; + color: #fff; +} +jmnodes.theme-info jmnode:hover { + background-color: #39b3d7; + border-color: #269abc; +} +jmnodes.theme-info jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-info jmnode.root { +} +jmnodes.theme-info jmexpander { +} +jmnodes.theme-info jmexpander:hover { +} /* greensea theme */ -jmnodes.theme-greensea jmnode{background-color:#1abc9c;color:#fff;} -jmnodes.theme-greensea jmnode:hover{background-color:#16a085;} -jmnodes.theme-greensea jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-greensea jmnode.root{} -jmnodes.theme-greensea jmexpander{} -jmnodes.theme-greensea jmexpander:hover{} +jmnodes.theme-greensea jmnode { + background-color: #1abc9c; + color: #fff; +} +jmnodes.theme-greensea jmnode:hover { + background-color: #16a085; +} +jmnodes.theme-greensea jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-greensea jmnode.root { +} +jmnodes.theme-greensea jmexpander { +} +jmnodes.theme-greensea jmexpander:hover { +} /* nephrite theme */ -jmnodes.theme-nephrite jmnode{background-color:#2ecc71;color:#fff;} -jmnodes.theme-nephrite jmnode:hover{background-color:#27ae60;} -jmnodes.theme-nephrite jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-nephrite jmnode.root{} -jmnodes.theme-nephrite jmexpander{} -jmnodes.theme-nephrite jmexpander:hover{} +jmnodes.theme-nephrite jmnode { + background-color: #2ecc71; + color: #fff; +} +jmnodes.theme-nephrite jmnode:hover { + background-color: #27ae60; +} +jmnodes.theme-nephrite jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-nephrite jmnode.root { +} +jmnodes.theme-nephrite jmexpander { +} +jmnodes.theme-nephrite jmexpander:hover { +} /* belizehole theme */ -jmnodes.theme-belizehole jmnode{background-color:#3498db;color:#fff;} -jmnodes.theme-belizehole jmnode:hover{background-color:#2980b9;} -jmnodes.theme-belizehole jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-belizehole jmnode.root{} -jmnodes.theme-belizehole jmexpander{} -jmnodes.theme-belizehole jmexpander:hover{} +jmnodes.theme-belizehole jmnode { + background-color: #3498db; + color: #fff; +} +jmnodes.theme-belizehole jmnode:hover { + background-color: #2980b9; +} +jmnodes.theme-belizehole jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-belizehole jmnode.root { +} +jmnodes.theme-belizehole jmexpander { +} +jmnodes.theme-belizehole jmexpander:hover { +} /* wisteria theme */ -jmnodes.theme-wisteria jmnode{background-color:#9b59b6;color:#fff;} -jmnodes.theme-wisteria jmnode:hover{background-color:#8e44ad;} -jmnodes.theme-wisteria jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-wisteria jmnode.root{} -jmnodes.theme-wisteria jmexpander{} -jmnodes.theme-wisteria jmexpander:hover{} +jmnodes.theme-wisteria jmnode { + background-color: #9b59b6; + color: #fff; +} +jmnodes.theme-wisteria jmnode:hover { + background-color: #8e44ad; +} +jmnodes.theme-wisteria jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-wisteria jmnode.root { +} +jmnodes.theme-wisteria jmexpander { +} +jmnodes.theme-wisteria jmexpander:hover { +} /* asphalt theme */ -jmnodes.theme-asphalt jmnode{background-color:#34495e;color:#fff;} -jmnodes.theme-asphalt jmnode:hover{background-color:#2c3e50;} -jmnodes.theme-asphalt jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-asphalt jmnode.root{} -jmnodes.theme-asphalt jmexpander{} -jmnodes.theme-asphalt jmexpander:hover{} +jmnodes.theme-asphalt jmnode { + background-color: #34495e; + color: #fff; +} +jmnodes.theme-asphalt jmnode:hover { + background-color: #2c3e50; +} +jmnodes.theme-asphalt jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-asphalt jmnode.root { +} +jmnodes.theme-asphalt jmexpander { +} +jmnodes.theme-asphalt jmexpander:hover { +} /* orange theme */ -jmnodes.theme-orange jmnode{background-color:#f1c40f;color:#fff;} -jmnodes.theme-orange jmnode:hover{background-color:#f39c12;} -jmnodes.theme-orange jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-orange jmnode.root{} -jmnodes.theme-orange jmexpander{} -jmnodes.theme-orange jmexpander:hover{} +jmnodes.theme-orange jmnode { + background-color: #f1c40f; + color: #fff; +} +jmnodes.theme-orange jmnode:hover { + background-color: #f39c12; +} +jmnodes.theme-orange jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-orange jmnode.root { +} +jmnodes.theme-orange jmexpander { +} +jmnodes.theme-orange jmexpander:hover { +} /* pumpkin theme */ -jmnodes.theme-pumpkin jmnode{background-color:#e67e22;color:#fff;} -jmnodes.theme-pumpkin jmnode:hover{background-color:#d35400;} -jmnodes.theme-pumpkin jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-pumpkin jmnode.root{} -jmnodes.theme-pumpkin jmexpander{} -jmnodes.theme-pumpkin jmexpander:hover{} +jmnodes.theme-pumpkin jmnode { + background-color: #e67e22; + color: #fff; +} +jmnodes.theme-pumpkin jmnode:hover { + background-color: #d35400; +} +jmnodes.theme-pumpkin jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-pumpkin jmnode.root { +} +jmnodes.theme-pumpkin jmexpander { +} +jmnodes.theme-pumpkin jmexpander:hover { +} /* pomegranate theme */ -jmnodes.theme-pomegranate jmnode{background-color:#e74c3c;color:#fff;} -jmnodes.theme-pomegranate jmnode:hover{background-color:#c0392b;} -jmnodes.theme-pomegranate jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-pomegranate jmnode.root{} -jmnodes.theme-pomegranate jmexpander{} -jmnodes.theme-pomegranate jmexpander:hover{} +jmnodes.theme-pomegranate jmnode { + background-color: #e74c3c; + color: #fff; +} +jmnodes.theme-pomegranate jmnode:hover { + background-color: #c0392b; +} +jmnodes.theme-pomegranate jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-pomegranate jmnode.root { +} +jmnodes.theme-pomegranate jmexpander { +} +jmnodes.theme-pomegranate jmexpander:hover { +} /* clouds theme */ -jmnodes.theme-clouds jmnode{background-color:#ecf0f1;color:#333;} -jmnodes.theme-clouds jmnode:hover{background-color:#bdc3c7;} -jmnodes.theme-clouds jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-clouds jmnode.root{} -jmnodes.theme-clouds jmexpander{} -jmnodes.theme-clouds jmexpander:hover{} +jmnodes.theme-clouds jmnode { + background-color: #ecf0f1; + color: #333; +} +jmnodes.theme-clouds jmnode:hover { + background-color: #bdc3c7; +} +jmnodes.theme-clouds jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-clouds jmnode.root { +} +jmnodes.theme-clouds jmexpander { +} +jmnodes.theme-clouds jmexpander:hover { +} /* asbestos theme */ -jmnodes.theme-asbestos jmnode{background-color:#95a5a6;color:#fff;} -jmnodes.theme-asbestos jmnode:hover{background-color:#7f8c8d;} -jmnodes.theme-asbestos jmnode.selected{background-color:#11f;color:#fff;} -jmnodes.theme-asbestos jmnode.root{} -jmnodes.theme-asbestos jmexpander{} -jmnodes.theme-asbestos jmexpander:hover{} +jmnodes.theme-asbestos jmnode { + background-color: #95a5a6; + color: #fff; +} +jmnodes.theme-asbestos jmnode:hover { + background-color: #7f8c8d; +} +jmnodes.theme-asbestos jmnode.selected { + background-color: #11f; + color: #fff; +} +jmnodes.theme-asbestos jmnode.root { +} +jmnodes.theme-asbestos jmexpander { +} +jmnodes.theme-asbestos jmexpander:hover { +} diff --git a/tests/jsmind.mind.test.js b/tests/jsmind.mind.test.js index 330257c9..764c154a 100644 --- a/tests/jsmind.mind.test.js +++ b/tests/jsmind.mind.test.js @@ -1,4 +1,4 @@ -const jm = require('./jsmind.versions') +const jm = require('./jsmind.versions'); beforeEach(() => { jest.restoreAllMocks(); @@ -12,71 +12,71 @@ test('initial', () => { version: null, root: null, selected: null, - nodes: {} - }) + nodes: {}, + }); }); test('get node', () => { const mind = new jm.mind(); const fake_node = new jm.node('1', 1); - mind.nodes = { '1': fake_node } - expect(mind.get_node('1')).toBe(fake_node) + mind.nodes = { 1: fake_node }; + expect(mind.get_node('1')).toBe(fake_node); - jest.spyOn(console, "warn").mockImplementation(() => { }); - expect(mind.get_node('2')).toBe(null) + jest.spyOn(console, 'warn').mockImplementation(() => {}); + expect(mind.get_node('2')).toBe(null); }); test('set root', () => { const mind = new jm.mind(); - mind.set_root('1', 'root', { 'addition': 'test' }); - const root_node = new jm.node('1', 0, 'root', { 'addition': 'test' }, true); + mind.set_root('1', 'root', { addition: 'test' }); + const root_node = new jm.node('1', 0, 'root', { addition: 'test' }, true); expect(mind).toEqual({ name: null, author: null, version: null, root: root_node, selected: null, - nodes: { '1': root_node } + nodes: { 1: root_node }, }); - jest.spyOn(console, "warn").mockImplementation(() => { }); - expect(mind.get_node('2')).toBe(null) + jest.spyOn(console, 'warn').mockImplementation(() => {}); + expect(mind.get_node('2')).toBe(null); }); test('add node', () => { const mind = new jm.mind(); const root = mind.set_root('1', 'root'); - const node2 = mind.add_node(root, '2', 'node2', { 'addition': 'test 2' }) - const node3 = mind.add_node(root, '3', 'node3', { 'addition': 'test 3' }, jm.direction.left) - const node4 = mind.add_node(root, '4', 'node4') + const node2 = mind.add_node(root, '2', 'node2', { addition: 'test 2' }); + const node3 = mind.add_node(root, '3', 'node3', { addition: 'test 3' }, jm.direction.left); + const node4 = mind.add_node(root, '4', 'node4'); - expect(mind.get_node('1')).toBe(root) - expect(mind.get_node('2')).toBe(node2) - expect(mind.get_node('3')).toBe(node3) - expect(mind.get_node('4')).toBe(node4) + expect(mind.get_node('1')).toBe(root); + expect(mind.get_node('2')).toBe(node2); + expect(mind.get_node('3')).toBe(node3); + expect(mind.get_node('4')).toBe(node4); expect(node2).toEqual({ id: '2', index: 1, topic: 'node2', - data: { 'addition': 'test 2' }, + data: { addition: 'test 2' }, isroot: false, parent: root, direction: jm.direction.right, expanded: true, children: [], - _data: {} + _data: {}, }); expect(node3).toEqual({ id: '3', index: 2, topic: 'node3', - data: { 'addition': 'test 3' }, + data: { addition: 'test 3' }, isroot: false, parent: root, direction: jm.direction.left, expanded: true, children: [], - _data: {} + _data: {}, }); expect(node4).toEqual({ id: '4', @@ -88,15 +88,15 @@ test('add node', () => { direction: jm.direction.right, expanded: true, children: [], - _data: {} + _data: {}, }); - expect(node2.index).toBe(1) - expect(node3.index).toBe(2) - expect(node4.index).toBe(3) + expect(node2.index).toBe(1); + expect(node3.index).toBe(2); + expect(node4.index).toBe(3); - jest.spyOn(console, "error").mockImplementation(() => { }); - jest.spyOn(console, "warn").mockImplementation(() => { }); - expect(mind.add_node('100')).toBe(null) + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + expect(mind.add_node('100')).toBe(null); }); test('insert node before/after', () => { @@ -111,7 +111,7 @@ test('insert node before/after', () => { expect(node_a.index).toBe(1); expect(node1.index).toBe(2); expect(node_b.index).toBe(3); -}) +}); test('get node before/after', () => { const mind = new jm.mind(); @@ -125,7 +125,7 @@ test('get node before/after', () => { expect(mind.get_node_after(node1)).toBe(node2); expect(mind.get_node_after(node2)).toBe(node3); expect(mind.get_node_after(node3)).toBe(null); -}) +}); test('move node', () => { const mind = new jm.mind(); @@ -157,11 +157,10 @@ test('move node', () => { expect(node1.children[0]).toBe(node2); expect(node1.children[1]).toBe(node3); - jest.spyOn(console, "error").mockImplementation(() => { }); + jest.spyOn(console, 'error').mockImplementation(() => {}); mind.move_node(node1, '_first_', node2.id); expect(node1.parent).toBe(root); expect(node2.children.length).toBe(0); - }); test('remove node', () => { @@ -170,16 +169,16 @@ test('remove node', () => { const node1 = mind.add_node(root, '1', 'node1', null); const node2 = mind.add_node(node1, '2', 'node2', null); const node3 = mind.add_node(node2, '3', 'node3', null); - mind.selected = node3 + mind.selected = node3; - jest.spyOn(console, "error").mockImplementation(() => { }); + jest.spyOn(console, 'error').mockImplementation(() => {}); mind.remove_node(root); - expect(mind.get_node('0')).toBe(root) + expect(mind.get_node('0')).toBe(root); mind.remove_node(node1); - expect(root.children.length).toBe(0) - jest.spyOn(console, "warn").mockImplementation(() => { }); - expect(mind.get_node('1')).toBe(null) - expect(mind.get_node('2')).toBe(null) - expect(mind.get_node('3')).toBe(null) - expect(mind.selected).toBe(null) -}); \ No newline at end of file + expect(root.children.length).toBe(0); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + expect(mind.get_node('1')).toBe(null); + expect(mind.get_node('2')).toBe(null); + expect(mind.get_node('3')).toBe(null); + expect(mind.selected).toBe(null); +}); diff --git a/tests/jsmind.node.test.js b/tests/jsmind.node.test.js index d029fe40..302bceb4 100644 --- a/tests/jsmind.node.test.js +++ b/tests/jsmind.node.test.js @@ -1,11 +1,11 @@ -const jm = require('./jsmind.versions') +const jm = require('./jsmind.versions'); beforeEach(() => { jest.restoreAllMocks(); }); test('initial', () => { - const node = new jm.node('1', 1, 'topic', null, false, null, jm.direction.right) + const node = new jm.node('1', 1, 'topic', null, false, null, jm.direction.right); const expected_node = { id: '1', index: 1, @@ -16,11 +16,11 @@ test('initial', () => { direction: jm.direction.right, expanded: true, children: [], - _data: {} - } - expect(node).toEqual(expected_node) + _data: {}, + }; + expect(node).toEqual(expected_node); - jest.spyOn(console, "error").mockImplementation(() => { }); + jest.spyOn(console, 'error').mockImplementation(() => {}); expect(new jm.node()).toEqual({}); expect(new jm.node('1', '2')).toEqual({}); @@ -30,16 +30,16 @@ test('initial', () => { test('compare node', () => { function fake_node(sId, iIndex) { - return new jm.node(sId, iIndex) + return new jm.node(sId, iIndex); } - expect(jm.node.compare(fake_node('a', 1), fake_node('b', 2))).toBeLessThan(0) - expect(jm.node.compare(fake_node('a', 2), fake_node('b', 1))).toBeGreaterThan(0) - expect(jm.node.compare(fake_node('a', 2), fake_node('b', 2))).toBe(0) - expect(jm.node.compare(fake_node('a', -1), fake_node('b', 2))).toBeGreaterThan(0) - expect(jm.node.compare(fake_node('a', 1), fake_node('b', -1))).toBeLessThan(0) - expect(jm.node.compare(fake_node('a', -1), fake_node('b', -1))).toBe(0) - expect(jm.node.compare(fake_node('a', -5), fake_node('b', -6))).toBe(0) + expect(jm.node.compare(fake_node('a', 1), fake_node('b', 2))).toBeLessThan(0); + expect(jm.node.compare(fake_node('a', 2), fake_node('b', 1))).toBeGreaterThan(0); + expect(jm.node.compare(fake_node('a', 2), fake_node('b', 2))).toBe(0); + expect(jm.node.compare(fake_node('a', -1), fake_node('b', 2))).toBeGreaterThan(0); + expect(jm.node.compare(fake_node('a', 1), fake_node('b', -1))).toBeLessThan(0); + expect(jm.node.compare(fake_node('a', -1), fake_node('b', -1))).toBe(0); + expect(jm.node.compare(fake_node('a', -5), fake_node('b', -6))).toBe(0); }); test('inherited node', () => { @@ -59,19 +59,22 @@ test('inherited node', () => { }); test('get location and size', () => { - const fakeNode = new jm.node('1', 1) + const fakeNode = new jm.node('1', 1); fakeNode._data.view = { - abs_x: 1, abs_y: 2, width: 3, height: 4 - } - expect(fakeNode.get_location()).toEqual({ x: 1, y: 2 }) - expect(fakeNode.get_size()).toEqual({ w: 3, h: 4 }) + abs_x: 1, + abs_y: 2, + width: 3, + height: 4, + }; + expect(fakeNode.get_location()).toEqual({ x: 1, y: 2 }); + expect(fakeNode.get_size()).toEqual({ w: 3, h: 4 }); }); -test('check if it is a node', ()=>{ - const fakeNode = new jm.node('1', 1) - expect(jm.node.is_node({})).toBeFalsy() - expect(jm.node.is_node(null)).toBeFalsy() - expect(jm.node.is_node()).toBeFalsy() - expect(jm.node.is_node('node')).toBeFalsy() - expect(jm.node.is_node(fakeNode)).toBeTruthy() +test('check if it is a node', () => { + const fakeNode = new jm.node('1', 1); + expect(jm.node.is_node({})).toBeFalsy(); + expect(jm.node.is_node(null)).toBeFalsy(); + expect(jm.node.is_node()).toBeFalsy(); + expect(jm.node.is_node('node')).toBeFalsy(); + expect(jm.node.is_node(fakeNode)).toBeTruthy(); }); diff --git a/tests/jsmind.util.test.js b/tests/jsmind.util.test.js index c151d464..93fcdacb 100644 --- a/tests/jsmind.util.test.js +++ b/tests/jsmind.util.test.js @@ -1,4 +1,4 @@ -const jm = require('./jsmind.versions') +const jm = require('./jsmind.versions'); test('json serialization', () => { const jsonObject = { name: 'jsMind' }; @@ -11,14 +11,14 @@ test('json serialization', () => { test('json merge', () => { const o1 = { name: 'jsMind', license: 'BSD' }; const o2 = { name: 'jsMind ES6', lang: 'ES6' }; - const o3 = jm.util.json.merge({}, o1) - const o4 = jm.util.json.merge(o3, o2) - const o5 = jm.util.json.merge({}, o4) + const o3 = jm.util.json.merge({}, o1); + const o4 = jm.util.json.merge(o3, o2); + const o5 = jm.util.json.merge({}, o4); - expect(o3).toBe(o4) - expect(o4).toEqual({ name: 'jsMind ES6', lang: 'ES6', license: 'BSD' }) - expect(o5).toEqual(o4) - expect(jm.util.json.merge(o5, {})).toEqual(o4) + expect(o3).toBe(o4); + expect(o4).toEqual({ name: 'jsMind ES6', lang: 'ES6', license: 'BSD' }); + expect(o5).toEqual(o4); + expect(jm.util.json.merge(o5, {})).toEqual(o4); }); test('uuid newid', () => { @@ -35,4 +35,4 @@ test('string is empty', () => { expect(jm.util.text.is_empty('\n\t\r ')).toBeTruthy(); expect(jm.util.text.is_empty(' hello ')).toBeFalsy(); expect(jm.util.text.is_empty('hello world')).toBeFalsy(); -}); \ No newline at end of file +}); diff --git a/tests/jsmind.versions.js b/tests/jsmind.versions.js index c4d6f839..f5facbb5 100644 --- a/tests/jsmind.versions.js +++ b/tests/jsmind.versions.js @@ -1,7 +1,7 @@ if (process.env.JM_LANG === 'ES6') { - console.log('run test on ES6 version') + console.log('run test on ES6 version'); module.exports = require('../es6/jsmind'); } else { - console.log('run test on ES5 version') + console.log('run test on ES5 version'); module.exports = require('../js/jsmind'); -} \ No newline at end of file +} From 81466bf54721254079aa6c47ef4b81cf2422f523 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Fri, 10 Jun 2022 20:35:01 +0800 Subject: [PATCH 041/274] Create pull_request_template.md --- .github/pull_request_template.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..8f8afd3e --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,18 @@ + + + + + + + + From d9236b5ddc75058725eb5d0972281dbb7d5ebae9 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Fri, 10 Jun 2022 21:30:29 +0800 Subject: [PATCH 042/274] reorganize config files (#346) --- .prettierignore => .config/prettierignore | 2 +- .prettierrc.json => .config/prettierrc.json | 0 rollup.config.js => .config/rollup.config.js | 0 .github/pull_request_template.md | 21 ++++++++++++-------- .gitignore | 2 +- .npmignore | 1 + package.json | 6 +++--- 7 files changed, 19 insertions(+), 13 deletions(-) rename .prettierignore => .config/prettierignore (90%) rename .prettierrc.json => .config/prettierrc.json (100%) rename rollup.config.js => .config/rollup.config.js (100%) diff --git a/.prettierignore b/.config/prettierignore similarity index 90% rename from .prettierignore rename to .config/prettierignore index fd2673a1..87cb2fa7 100644 --- a/.prettierignore +++ b/.config/prettierignore @@ -1,3 +1,4 @@ +.config .github .vscode docs @@ -5,6 +6,5 @@ es6 js node_modules screenshots -.* LICENSE package-lock.json diff --git a/.prettierrc.json b/.config/prettierrc.json similarity index 100% rename from .prettierrc.json rename to .config/prettierrc.json diff --git a/rollup.config.js b/.config/rollup.config.js similarity index 100% rename from rollup.config.js rename to .config/rollup.config.js diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 8f8afd3e..39c797d4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,18 +1,23 @@ +- 提交 pull-request 之前,请确保其已经通过了你的测试,如果尚未完工,请先创建 Draft pull request。 +- Before submitting the pull-request, make sure it has passed your tests, otherwise, please create the Draft pull request first. +- 提交 pull-request 前,请在你的电脑上执行 `npm run format` 对代码进行格式化。 +- Please run `npm run format` on your laptop to format the code before submitting the pull-request. +Draft pull request + - 中文版文档: + https://docs.github.com/cn/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests + - Doc in English: + https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests +--> diff --git a/.gitignore b/.gitignore index c8fcd164..09d78ccc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -node_modules/ .vscode +node_modules/ diff --git a/.npmignore b/.npmignore index a81c2c2e..5fb1fa22 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,4 @@ +.config .github .vscode example diff --git a/package.json b/package.json index 0e0b560e..dbb6555c 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,11 @@ "example": "example" }, "scripts": { - "build": "rollup -c", + "build": "rollup -c .config/rollup.config.js", "test": "jest", "test6": "JM_LANG=ES6 jest", - "format": "prettier --write .", - "format-check": "prettier --check ." + "format": "prettier --config .config/prettierrc.json --ignore-path .config/prettierignore --write .", + "format-check": "prettier --config .config/prettierrc.json --ignore-path .config/prettierignore --check ." }, "repository": { "type": "git", From 54a47e99be17bc08e6853a515ec18e57738e8a1b Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sat, 11 Jun 2022 02:14:10 +0800 Subject: [PATCH 043/274] refactor graph classes (#347) --- es6/jsmind.js | 2 +- es6/jsmind.js.map | 2 +- example/2_features_es6.html | 1 + src/jsmind.graph.js | 14 ++++++++------ src/jsmind.view_provider.js | 8 +++----- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/es6/jsmind.js b/es6/jsmind.js index 130829af..0369c991 100644 --- a/es6/jsmind.js +++ b/es6/jsmind.js @@ -5,5 +5,5 @@ * Project Home: * https://github.com/hizzgdev/jsmind/ */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).jsMind=t()}(this,(function(){"use strict";const e="0.4.9",t="hizzgdev@163.com";"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e){return this.slice(0,e.length)===e});var i=function(){};let n="undefined"==typeof console?{log:i,debug:i,error:i,warn:i,info:i}:console;const o={left:-1,center:0,right:1},s={show:1,resize:2,edit:3,select:4};const a=new class{constructor(e){this.w=e,this.d=e.document,this.g=function(e){return this.d.getElementById(e)},this.c=function(e){return this.d.createElement(e)},this.t=function(e,t){e.hasChildNodes()?e.firstChild.nodeValue=t:e.appendChild(this.d.createTextNode(t))},this.h=function(e,t){t instanceof HTMLElement?(e.innerHTML="",e.appendChild(t)):e.innerHTML=t},this.i=function(e){return!!e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument},this.on=function(e,t,i){e.addEventListener?e.addEventListener(t,i,!1):e.attachEvent("on"+t,i)}}}(window),r={ajax:{request:function(e,t,i,o,s){var a=Object.keys(t).map((e=>encodeURIComponent(e)+"="+encodeURIComponent(t[e]))).join("&"),d=new XMLHttpRequest;d&&(d.onreadystatechange=function(){if(4==d.readyState)if(200==d.status||0==d.status){if("function"==typeof o){var e=r.json.string2json(d.responseText);o(null!=e?e:d.responseText)}}else"function"==typeof s?s(d):n.error("xhr request failed.",d)},i=i||"GET",d.open(i,e,!0),d.setRequestHeader("If-Modified-Since","0"),"POST"==i?(d.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),d.send(a)):d.send())},get:function(e,t){return r.ajax.request(e,{},"GET",t)},post:function(e,t,i){return r.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof a.w.Blob)n=new Blob([e],{type:t});else{var o=new(a.w.BlobBuilder||a.w.MozBlobBuilder||a.w.WebKitBlobBuilder||a.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(a.w.URL||a.w.webkitURL).createObjectURL(n),r=a.c("a");if("download"in r){r.style.visibility="hidden",r.href=s,r.download=i,a.d.body.appendChild(r);var d=a.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),r.dispatchEvent(d),a.d.body.removeChild(r)}else location.href=s}}},json:{json2string:function(e){return JSON.stringify(e)},string2json:function(e){return JSON.parse(e)},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:r.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substring(2)).substring(2,18)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},d={container:"",editable:!1,theme:null,mode:"full",support_html:!0,view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:45,addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class l{constructor(e,t,i,o,s,a,r,d){e?"number"==typeof t?(void 0===d&&(d=!0),this.id=e,this.index=t,this.topic=i,this.data=o||{},this.isroot=s,this.parent=a,this.direction=r,this.expanded=!!d,this.children=[],this._data={}):n.error("invalid node index"):n.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?"Up":"Down")?this.view.zoomIn():this.view.zoomOut())}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;rencodeURIComponent(e)+"="+encodeURIComponent(t[e]))).join("&"),d=new XMLHttpRequest;d&&(d.onreadystatechange=function(){if(4==d.readyState)if(200==d.status||0==d.status){if("function"==typeof o){var e=r.json.string2json(d.responseText);o(null!=e?e:d.responseText)}}else"function"==typeof s?s(d):n.error("xhr request failed.",d)},i=i||"GET",d.open(i,e,!0),d.setRequestHeader("If-Modified-Since","0"),"POST"==i?(d.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),d.send(a)):d.send())},get:function(e,t){return r.ajax.request(e,{},"GET",t)},post:function(e,t,i){return r.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof a.w.Blob)n=new Blob([e],{type:t});else{var o=new(a.w.BlobBuilder||a.w.MozBlobBuilder||a.w.WebKitBlobBuilder||a.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(a.w.URL||a.w.webkitURL).createObjectURL(n),r=a.c("a");if("download"in r){r.style.visibility="hidden",r.href=s,r.download=i,a.d.body.appendChild(r);var d=a.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),r.dispatchEvent(d),a.d.body.removeChild(r)}else location.href=s}}},json:{json2string:function(e){return JSON.stringify(e)},string2json:function(e){return JSON.parse(e)},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:r.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substring(2)).substring(2,18)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},d={container:"",editable:!1,theme:null,mode:"full",support_html:!0,view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:45,addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class l{constructor(e,t,i,o,s,a,r,d){e?"number"==typeof t?(void 0===d&&(d=!0),this.id=e,this.index=t,this.topic=i,this.data=o||{},this.isroot=s,this.parent=a,this.direction=r,this.expanded=!!d,this.children=[],this._data={}):n.error("invalid node index"):n.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?"Up":"Down")?this.view.zoomIn():this.view.zoomOut())}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;r encodeURIComponent(k) + '=' + encodeURIComponent(param[k]))\n .join('&');\n var xhr = new XMLHttpRequest();\n if (!xhr) {\n return;\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status == 0) {\n if (typeof callback === 'function') {\n var data = util.json.string2json(xhr.responseText);\n if (data != null) {\n callback(data);\n } else {\n callback(xhr.responseText);\n }\n }\n } else {\n if (typeof fail_callback === 'function') {\n fail_callback(xhr);\n } else {\n logger.error('xhr request failed.', xhr);\n }\n }\n }\n };\n method = method || 'GET';\n xhr.open(method, url, true);\n xhr.setRequestHeader('If-Modified-Since', '0');\n if (method == 'POST') {\n xhr.setRequestHeader(\n 'Content-Type',\n 'application/x-www-form-urlencoded;charset=utf-8'\n );\n xhr.send(p);\n } else {\n xhr.send();\n }\n },\n get: function (url, callback) {\n return util.ajax.request(url, {}, 'GET', callback);\n },\n post: function (url, param, callback) {\n return util.ajax.request(url, param, 'POST', callback);\n },\n },\n\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 bloburl = URL.createObjectURL(blob);\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\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-2022 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\n view: {\n engine: 'canvas',\n hmargin: 100,\n vmargin: 50,\n line_width: 2,\n line_color: '#555',\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 },\n layout: {\n hspace: 30,\n vspace: 20,\n pspace: 13,\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, // Insert\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};\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-2022 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 alwary the last\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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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 nodeid,\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._reindex(parent_node);\n } else {\n logger.error(\"fail, the nodeid '\" + node.id + \"' has been already exist.\");\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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, nodeid, 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, nodeid, 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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = !!beforeid ? this.get_node(beforeid) : 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._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn(\"the nodeid '\" + node.id + \"' has been already exist.\");\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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-2022 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';\n\nexport const format = {\n node_tree: {\n example: {\n meta: {\n name: 'jsMind node_tree simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_tree',\n data: { id: 'root', topic: 'jsMind 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._buildnode(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 _buildnode: 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._buildnode(children[i]));\n }\n }\n return o;\n },\n },\n\n node_array: {\n example: {\n meta: {\n name: 'jsMind node_array simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_array',\n data: [{ id: 'root', topic: 'jsMind 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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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: {\n name: 'jsMind freemind example',\n author: __author__,\n version: __version__,\n },\n format: 'freemind',\n data: '',\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 // 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 = 'expanded' in node_data ? node_data.expanded == 'true' : true;\n delete node_data.expanded;\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n },\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 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 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\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 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 nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from './jsmind.dom.js';\n\nclass graph_svg {\n constructor(view) {\n this.view = view;\n this.opts = view.opts;\n this.e_svg = graph_svg.c('svg');\n this.e_svg.setAttribute('class', 'jsmind');\n this.size = { w: 0, h: 0 };\n this.lines = [];\n }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = graph_svg.c('path');\n line.setAttribute('stroke', 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._bezier_to(\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 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 graph_canvas {\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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(\n ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y\n );\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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 const graph = { svg: graph_svg, canvas: graph_canvas };\n","/**\n * @license BSD\n * @copyright 2014-2022 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 { 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 }\n init() {\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.e_panel = $.c('div');\n this.e_nodes = $.c('jmnodes');\n this.e_editor = $.c('input');\n\n this.graph =\n this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this);\n\n this.e_panel.className = 'jsmind-inner';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\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 }\n if (!!node) {\n this.selected_node = node;\n node._data.view.element.className += ' selected';\n this.clear_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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if (zoom < this.minZoom || zoom > this.maxZoom) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n }\n this.show(true);\n return true;\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = _offset.x + p.x + 'px';\n node_element.style.top = _offset.y + p.y + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = _offset.x + p_expander.x + 'px';\n expander.style.top = _offset.y + p_expander.y + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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 clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) {\n continue;\n }\n if ('visible' in node._data.layout && !node._data.layout.visible) {\n continue;\n }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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-2022 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('plugin ' + plugin + ' is not a supported plugin');\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } 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\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable,\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n // call enable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // call disable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n get_editable() {\n return this.options.editable;\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, 'mousewheel', this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(event) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n if (\n !this.options.default_event_handle['enable_mousewheel_handle'] ||\n !window.event.ctrlKey\n ) {\n return;\n }\n // Avoid default page scrolling behavior.\n event.preventDefault();\n\n var dir = event.deltaY > 0 ? 'Up' : 'Down';\n if (dir == 'Up') {\n this.view.zoomIn();\n } else {\n this.view.zoomOut();\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, nodeid, topic, data],\n node: nodeid,\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(\n the_node_before,\n nodeid,\n topic,\n data,\n direction\n );\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, nodeid, topic, data],\n node: nodeid,\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, nodeid, topic, data],\n node: nodeid,\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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: [nodeid],\n node: parentid,\n });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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: [nodeid, topic],\n node: nodeid,\n });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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: [nodeid, beforeid, parentid, direction],\n node: nodeid,\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 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 getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jm;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","request","url","param","method","callback","fail_callback","Object","keys","map","k","encodeURIComponent","join","xhr","XMLHttpRequest","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","a","o","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substring","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","push","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","ActiveXObject","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","graph_svg","e_svg","setAttribute","size","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","graph","svg","canvas","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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"],"mappings":"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"} \ No newline at end of file +{"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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nexport const __version__ = '0.4.9';\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\n// an noop function define\nvar _noop = function () {};\nexport let logger =\n typeof console === 'undefined'\n ? {\n log: _noop,\n debug: _noop,\n error: _noop,\n warn: _noop,\n info: _noop,\n }\n : console;\n\nexport const Direction = { left: -1, center: 0, right: 1 };\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 };\n","/**\n * @license BSD\n * @copyright 2014-2022 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-2022 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\nexport const util = {\n ajax: {\n request: function (url, param, method, callback, fail_callback) {\n var p = Object.keys(param)\n .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(param[k]))\n .join('&');\n var xhr = new XMLHttpRequest();\n if (!xhr) {\n return;\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status == 0) {\n if (typeof callback === 'function') {\n var data = util.json.string2json(xhr.responseText);\n if (data != null) {\n callback(data);\n } else {\n callback(xhr.responseText);\n }\n }\n } else {\n if (typeof fail_callback === 'function') {\n fail_callback(xhr);\n } else {\n logger.error('xhr request failed.', xhr);\n }\n }\n }\n };\n method = method || 'GET';\n xhr.open(method, url, true);\n xhr.setRequestHeader('If-Modified-Since', '0');\n if (method == 'POST') {\n xhr.setRequestHeader(\n 'Content-Type',\n 'application/x-www-form-urlencoded;charset=utf-8'\n );\n xhr.send(p);\n } else {\n xhr.send();\n }\n },\n get: function (url, callback) {\n return util.ajax.request(url, {}, 'GET', callback);\n },\n post: function (url, param, callback) {\n return util.ajax.request(url, param, 'POST', callback);\n },\n },\n\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 bloburl = URL.createObjectURL(blob);\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\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-2022 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\n view: {\n engine: 'canvas',\n hmargin: 100,\n vmargin: 50,\n line_width: 2,\n line_color: '#555',\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 },\n layout: {\n hspace: 30,\n vspace: 20,\n pspace: 13,\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, // Insert\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};\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-2022 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 alwary the last\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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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 nodeid,\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._reindex(parent_node);\n } else {\n logger.error(\"fail, the nodeid '\" + node.id + \"' has been already exist.\");\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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, nodeid, 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, nodeid, 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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = !!beforeid ? this.get_node(beforeid) : 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._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn(\"the nodeid '\" + node.id + \"' has been already exist.\");\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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-2022 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';\n\nexport const format = {\n node_tree: {\n example: {\n meta: {\n name: 'jsMind node_tree simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_tree',\n data: { id: 'root', topic: 'jsMind 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._buildnode(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 _buildnode: 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._buildnode(children[i]));\n }\n }\n return o;\n },\n },\n\n node_array: {\n example: {\n meta: {\n name: 'jsMind node_array simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_array',\n data: [{ id: 'root', topic: 'jsMind 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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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: {\n name: 'jsMind freemind example',\n author: __author__,\n version: __version__,\n },\n format: 'freemind',\n data: '',\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 // 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 = 'expanded' in node_data ? node_data.expanded == 'true' : true;\n delete node_data.expanded;\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n },\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 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 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\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 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 nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from './jsmind.dom.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 }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = SvgGraph.c('path');\n line.setAttribute('stroke', 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._bezier_to(\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 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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(\n ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y\n );\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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-2022 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 }\n init() {\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';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\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 }\n if (!!node) {\n this.selected_node = node;\n node._data.view.element.className += ' selected';\n this.clear_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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if (zoom < this.minZoom || zoom > this.maxZoom) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n }\n this.show(true);\n return true;\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = _offset.x + p.x + 'px';\n node_element.style.top = _offset.y + p.y + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = _offset.x + p_expander.x + 'px';\n expander.style.top = _offset.y + p_expander.y + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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 clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) {\n continue;\n }\n if ('visible' in node._data.layout && !node._data.layout.visible) {\n continue;\n }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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-2022 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('plugin ' + plugin + ' is not a supported plugin');\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } 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\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable,\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n // call enable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // call disable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n get_editable() {\n return this.options.editable;\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, 'mousewheel', this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(event) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n if (\n !this.options.default_event_handle['enable_mousewheel_handle'] ||\n !window.event.ctrlKey\n ) {\n return;\n }\n // Avoid default page scrolling behavior.\n event.preventDefault();\n\n var dir = event.deltaY > 0 ? 'Up' : 'Down';\n if (dir == 'Up') {\n this.view.zoomIn();\n } else {\n this.view.zoomOut();\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, nodeid, topic, data],\n node: nodeid,\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(\n the_node_before,\n nodeid,\n topic,\n data,\n direction\n );\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, nodeid, topic, data],\n node: nodeid,\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, nodeid, topic, data],\n node: nodeid,\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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: [nodeid],\n node: parentid,\n });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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: [nodeid, topic],\n node: nodeid,\n });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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: [nodeid, beforeid, parentid, direction],\n node: nodeid,\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 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 getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jm;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","request","url","param","method","callback","fail_callback","Object","keys","map","k","encodeURIComponent","join","xhr","XMLHttpRequest","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","a","o","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substring","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","push","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","ActiveXObject","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","CanvasGraph","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","graph","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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"],"mappings":"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"} \ No newline at end of file diff --git a/example/2_features_es6.html b/example/2_features_es6.html index 930aeb27..d4df238d 100644 --- a/example/2_features_es6.html +++ b/example/2_features_es6.html @@ -197,6 +197,7 @@ theme: 'greensea', editable: true, view: { + engine: 'svg', draggable: true, }, }; diff --git a/src/jsmind.graph.js b/src/jsmind.graph.js index e746928d..2b3d4dae 100644 --- a/src/jsmind.graph.js +++ b/src/jsmind.graph.js @@ -8,11 +8,11 @@ import { $ } from './jsmind.dom.js'; -class graph_svg { +class SvgGraph { constructor(view) { this.view = view; this.opts = view.opts; - this.e_svg = graph_svg.c('svg'); + this.e_svg = SvgGraph.c('svg'); this.e_svg.setAttribute('class', 'jsmind'); this.size = { w: 0, h: 0 }; this.lines = []; @@ -37,7 +37,7 @@ class graph_svg { this.lines.length = 0; } draw_line(pout, pin, offset) { - var line = graph_svg.c('path'); + var line = SvgGraph.c('path'); line.setAttribute('stroke', this.opts.line_color); line.setAttribute('stroke-width', this.opts.line_width); line.setAttribute('fill', 'transparent'); @@ -63,7 +63,7 @@ class graph_svg { _bezier_to(path, x1, y1, x2, y2) { path.setAttribute( 'd', - 'M' + + 'M ' + x1 + ' ' + y1 + @@ -86,7 +86,7 @@ class graph_svg { } } -class graph_canvas { +class CanvasGraph { constructor(view) { this.opts = view.opts; this.e_canvas = $.c('canvas'); @@ -138,4 +138,6 @@ class graph_canvas { } } -export const graph = { svg: graph_svg, canvas: graph_canvas }; +export function init_graph(view, engine) { + return engine.toLowerCase() === 'svg' ? new SvgGraph(view) : new CanvasGraph(view); +} diff --git a/src/jsmind.view_provider.js b/src/jsmind.view_provider.js index 480d816f..a0d3634c 100644 --- a/src/jsmind.view_provider.js +++ b/src/jsmind.view_provider.js @@ -7,7 +7,7 @@ */ import { logger, EventType } from './jsmind.common.js'; import { $ } from './jsmind.dom.js'; -import { graph } from './jsmind.graph.js'; +import { init_graph } from './jsmind.graph.js'; import { util } from './jsmind.util.js'; export class ViewProvider { @@ -35,13 +35,11 @@ export class ViewProvider { logger.error('the options.view.container was not be found in dom'); return; } + this.graph = init_graph(this, this.opts.engine); + this.e_panel = $.c('div'); this.e_nodes = $.c('jmnodes'); this.e_editor = $.c('input'); - - this.graph = - this.opts.engine.toLowerCase() === 'svg' ? new graph.svg(this) : new graph.canvas(this); - this.e_panel.className = 'jsmind-inner'; this.e_panel.tabIndex = 1; this.e_panel.appendChild(this.graph.element()); From bb0f640ca5fb5687738e44d7811a26eaa0d7e999 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sun, 12 Jun 2022 01:25:34 +0800 Subject: [PATCH 044/274] enable es6 module for jest, reorganize unit test files (#348) --- .github/workflows/node.js.yml | 32 +--- package.json | 5 +- src/package.json | 3 + tests/jsmind.versions.js | 7 - tests/{ => legacy}/jsmind.mind.test.js | 0 tests/{ => legacy}/jsmind.node.test.js | 0 tests/{ => legacy}/jsmind.util.test.js | 0 tests/legacy/jsmind.versions.js | 1 + tests/unit/jsmind.common.test.js | 28 ++++ tests/unit/jsmind.data_provider.test.js | 73 +++++++++ tests/unit/jsmind.mind.test.js | 187 ++++++++++++++++++++++++ tests/unit/package.json | 3 + 12 files changed, 303 insertions(+), 36 deletions(-) create mode 100644 src/package.json delete mode 100644 tests/jsmind.versions.js rename tests/{ => legacy}/jsmind.mind.test.js (100%) rename tests/{ => legacy}/jsmind.node.test.js (100%) rename tests/{ => legacy}/jsmind.util.test.js (100%) create mode 100644 tests/legacy/jsmind.versions.js create mode 100644 tests/unit/jsmind.common.test.js create mode 100644 tests/unit/jsmind.data_provider.test.js create mode 100644 tests/unit/jsmind.mind.test.js create mode 100644 tests/unit/package.json diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 2205f446..d6a3dc3a 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -10,42 +10,20 @@ on: branches: [ master ] jobs: - static_check: + npm-run: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x] + command: [format-check, test-es6, test-legacy] steps: - uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: ${{ matrix.node-version }} + node-version: 18.x cache: 'npm' - run: npm ci - - run: npm run format-check - - test: - - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [18.x] - jm-lang: [ES5, ES6] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - - steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - cache: 'npm' - - run: npm ci - - run: npm run build --if-present - - run: npm test - env: - JM_LANG: ${{ matrix.jm-lang }} + # - run: npm run build --if-present + - run: npm run ${{ matrix.command }} diff --git a/package.json b/package.json index dbb6555c..e02e63d7 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,9 @@ }, "scripts": { "build": "rollup -c .config/rollup.config.js", - "test": "jest", - "test6": "JM_LANG=ES6 jest", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", + "test-legacy": "jest tests/legacy", + "test-es6": "NODE_OPTIONS=--experimental-vm-modules jest tests/unit", "format": "prettier --config .config/prettierrc.json --ignore-path .config/prettierignore --write .", "format-check": "prettier --config .config/prettierrc.json --ignore-path .config/prettierignore --check ." }, diff --git a/src/package.json b/src/package.json new file mode 100644 index 00000000..47200257 --- /dev/null +++ b/src/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/tests/jsmind.versions.js b/tests/jsmind.versions.js deleted file mode 100644 index f5facbb5..00000000 --- a/tests/jsmind.versions.js +++ /dev/null @@ -1,7 +0,0 @@ -if (process.env.JM_LANG === 'ES6') { - console.log('run test on ES6 version'); - module.exports = require('../es6/jsmind'); -} else { - console.log('run test on ES5 version'); - module.exports = require('../js/jsmind'); -} diff --git a/tests/jsmind.mind.test.js b/tests/legacy/jsmind.mind.test.js similarity index 100% rename from tests/jsmind.mind.test.js rename to tests/legacy/jsmind.mind.test.js diff --git a/tests/jsmind.node.test.js b/tests/legacy/jsmind.node.test.js similarity index 100% rename from tests/jsmind.node.test.js rename to tests/legacy/jsmind.node.test.js diff --git a/tests/jsmind.util.test.js b/tests/legacy/jsmind.util.test.js similarity index 100% rename from tests/jsmind.util.test.js rename to tests/legacy/jsmind.util.test.js diff --git a/tests/legacy/jsmind.versions.js b/tests/legacy/jsmind.versions.js new file mode 100644 index 00000000..bf29ba43 --- /dev/null +++ b/tests/legacy/jsmind.versions.js @@ -0,0 +1 @@ +module.exports = require('../../js/jsmind'); diff --git a/tests/unit/jsmind.common.test.js b/tests/unit/jsmind.common.test.js new file mode 100644 index 00000000..f2754723 --- /dev/null +++ b/tests/unit/jsmind.common.test.js @@ -0,0 +1,28 @@ +import { + __author__, + __version__, + logger, + Direction, + EventType, + Key, +} from '../../src/jsmind.common.js'; + +test('test exported elements', () => { + expect(logger.debug).toBeDefined(); + expect(logger.info).toBeDefined(); + expect(logger.log).toBeDefined(); + expect(logger.warn).toBeDefined(); + expect(logger.error).toBeDefined(); + expect(Direction.left).toBe(-1); + expect(Direction.center).toBe(0); + expect(Direction.right).toBe(1); + expect(EventType.show).toBe(1); + expect(EventType.resize).toBe(2); + expect(EventType.edit).toBe(3); + expect(EventType.select).toBe(4); + expect(Direction.center).toBe(0); + expect(Key.meta).toBe(1 << 13); + expect(Key.ctrl).toBe(1 << 12); + expect(Key.alt).toBe(1 << 11); + expect(Key.shift).toBe(1 << 10); +}); diff --git a/tests/unit/jsmind.data_provider.test.js b/tests/unit/jsmind.data_provider.test.js new file mode 100644 index 00000000..f438172d --- /dev/null +++ b/tests/unit/jsmind.data_provider.test.js @@ -0,0 +1,73 @@ +import { describe, expect, test, beforeAll, jest } from '@jest/globals'; +import { DataProvider } from '../../src/jsmind.data_provider.js'; +import { format } from '../../src/jsmind.format.js'; +import { logger } from '../../src/jsmind.common.js'; + +const mockFormat = { get_mind: jest.fn(), get_data: jest.fn() }; +const mockMind = { mock: true }; +const data_provider = new DataProvider({ mind: mockMind }); + +beforeAll(() => { + format.node_array.get_mind = jest.fn(); + format.node_array.get_data = jest.fn(); + format.node_tree.get_mind = jest.fn(); + format.node_tree.get_data = jest.fn(); + format.freemind.get_mind = jest.fn(); + format.freemind.get_data = jest.fn(); + logger.error = jest.fn(); +}); + +test('init', () => { + expect(data_provider.init).toBeDefined(); +}); + +test('reset', () => { + expect(data_provider.reset).toBeDefined(); +}); + +describe('load', () => { + test('load node_tree', () => { + const mockData = { format: 'node_tree' }; + data_provider.load(mockData); + expect(format.node_tree.get_mind).toBeCalledWith(mockData); + }); + test('load node_array', () => { + const mockData = { format: 'node_array' }; + data_provider.load(mockData); + expect(format.node_array.get_mind).toBeCalledWith(mockData); + }); + test('load freemind', () => { + const mockData = { format: 'freemind' }; + data_provider.load(mockData); + expect(format.freemind.get_mind).toBeCalledWith(mockData); + }); + test('load non-format', () => { + const mockData = { data: 'some data' }; + data_provider.load(mockData); + expect(format.node_tree.get_mind).toBeCalledWith(mockData); + }); + test('load non-object', () => { + const mockData = ''; + data_provider.load(mockData); + expect(format.freemind.get_mind).toBeCalledWith(mockData); + }); +}); + +describe('get_data', () => { + test('get_data node_tree', () => { + data_provider.get_data('node_tree'); + expect(format.node_tree.get_data).toBeCalledWith(mockMind); + }); + test('get_data node_array', () => { + data_provider.get_data('node_array'); + expect(format.node_array.get_data).toBeCalledWith(mockMind); + }); + test('get_data freemind', () => { + data_provider.get_data('freemind'); + expect(format.freemind.get_data).toBeCalledWith(mockMind); + }); + test('get_data unknown data', () => { + data_provider.get_data('unknown'); + expect(logger.error).toBeCalled(); + }); +}); diff --git a/tests/unit/jsmind.mind.test.js b/tests/unit/jsmind.mind.test.js new file mode 100644 index 00000000..e13d026e --- /dev/null +++ b/tests/unit/jsmind.mind.test.js @@ -0,0 +1,187 @@ +import { expect, test, jest } from '@jest/globals'; +import { Mind } from '../../src/jsmind.mind.js'; +import { Node } from '../../src/jsmind.node.js'; +import { Direction } from '../../src/jsmind.common.js'; + +beforeEach(() => { + jest.restoreAllMocks(); +}); + +test('initial', () => { + const mind = new Mind(); + expect(mind).toEqual({ + name: null, + author: null, + version: null, + root: null, + selected: null, + nodes: {}, + }); +}); + +test('get node', () => { + const mind = new Mind(); + const fake_node = new Node('1', 1); + mind.nodes = { 1: fake_node }; + expect(mind.get_node('1')).toBe(fake_node); + + jest.spyOn(console, 'warn').mockImplementation(() => {}); + expect(mind.get_node('2')).toBe(null); +}); + +test('set root', () => { + const mind = new Mind(); + mind.set_root('1', 'root', { addition: 'test' }); + const root_node = new Node('1', 0, 'root', { addition: 'test' }, true); + expect(mind).toEqual({ + name: null, + author: null, + version: null, + root: root_node, + selected: null, + nodes: { 1: root_node }, + }); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + expect(mind.get_node('2')).toBe(null); +}); + +test('add node', () => { + const mind = new Mind(); + const root = mind.set_root('1', 'root'); + const node2 = mind.add_node(root, '2', 'node2', { addition: 'test 2' }); + const node3 = mind.add_node(root, '3', 'node3', { addition: 'test 3' }, Direction.left); + const node4 = mind.add_node(root, '4', 'node4'); + + expect(mind.get_node('1')).toBe(root); + expect(mind.get_node('2')).toBe(node2); + expect(mind.get_node('3')).toBe(node3); + expect(mind.get_node('4')).toBe(node4); + + expect(node2).toEqual({ + id: '2', + index: 1, + topic: 'node2', + data: { addition: 'test 2' }, + isroot: false, + parent: root, + direction: Direction.right, + expanded: true, + children: [], + _data: {}, + }); + expect(node3).toEqual({ + id: '3', + index: 2, + topic: 'node3', + data: { addition: 'test 3' }, + isroot: false, + parent: root, + direction: Direction.left, + expanded: true, + children: [], + _data: {}, + }); + expect(node4).toEqual({ + id: '4', + index: 3, + topic: 'node4', + data: {}, + isroot: false, + parent: root, + direction: Direction.right, + expanded: true, + children: [], + _data: {}, + }); + expect(node2.index).toBe(1); + expect(node3.index).toBe(2); + expect(node4.index).toBe(3); + + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + expect(mind.add_node('100')).toBe(null); +}); + +test('insert node before/after', () => { + const mind = new Mind(); + const root = mind.set_root('0', 'root'); + const node1 = mind.add_node(root, '1', 'node1'); + expect(node1.index).toBe(1); + const node_a = mind.insert_node_before(node1, '2', 'node2'); + expect(node_a.index).toBe(1); + expect(node1.index).toBe(2); + const node_b = mind.insert_node_after(node1, '3', 'node3'); + expect(node_a.index).toBe(1); + expect(node1.index).toBe(2); + expect(node_b.index).toBe(3); +}); + +test('get node before/after', () => { + const mind = new Mind(); + const root = mind.set_root('0', 'root'); + const node1 = mind.add_node(root, '1', 'node1'); + const node2 = mind.add_node(root, '2', 'node2'); + const node3 = mind.add_node(root, '3', 'node3'); + expect(mind.get_node_before(node1)).toBe(null); + expect(mind.get_node_before(node2)).toBe(node1); + expect(mind.get_node_before(node3)).toBe(node2); + expect(mind.get_node_after(node1)).toBe(node2); + expect(mind.get_node_after(node2)).toBe(node3); + expect(mind.get_node_after(node3)).toBe(null); +}); + +test('move node', () => { + const mind = new Mind(); + const root = mind.set_root('0', 'root'); + const node1 = mind.add_node(root, '1', 'node1', null); + const node2 = mind.add_node(root, '2', 'node2', null); + const node3 = mind.add_node(root, '3', 'node3', null); + + mind.move_node(node3, node2.id); + expect(mind.get_node_after(node1)).toBe(node3); + expect(mind.get_node_after(node3)).toBe(node2); + + mind.move_node(node3, '_first_'); + expect(mind.get_node_after(node3)).toBe(node1); + expect(mind.get_node_before(node3)).toBe(null); + + mind.move_node(node3, '_last_'); + expect(mind.get_node_before(node3)).toBe(node2); + expect(mind.get_node_after(node3)).toBe(null); + + mind.move_node(node3, '_last_', node1.id); + expect(node3.parent).toBe(node1); + expect(root.children.length).toBe(2); + expect(node1.children[0]).toBe(node3); + + mind.move_node(node2, '_first_', node1.id); + expect(node2.parent).toBe(node1); + expect(root.children.length).toBe(1); + expect(node1.children[0]).toBe(node2); + expect(node1.children[1]).toBe(node3); + + jest.spyOn(console, 'error').mockImplementation(() => {}); + mind.move_node(node1, '_first_', node2.id); + expect(node1.parent).toBe(root); + expect(node2.children.length).toBe(0); +}); + +test('remove node', () => { + const mind = new Mind(); + const root = mind.set_root('0', 'root'); + const node1 = mind.add_node(root, '1', 'node1', null); + const node2 = mind.add_node(node1, '2', 'node2', null); + const node3 = mind.add_node(node2, '3', 'node3', null); + mind.selected = node3; + + jest.spyOn(console, 'error').mockImplementation(() => {}); + mind.remove_node(root); + expect(mind.get_node('0')).toBe(root); + mind.remove_node(node1); + expect(root.children.length).toBe(0); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + expect(mind.get_node('1')).toBe(null); + expect(mind.get_node('2')).toBe(null); + expect(mind.get_node('3')).toBe(null); + expect(mind.selected).toBe(null); +}); diff --git a/tests/unit/package.json b/tests/unit/package.json new file mode 100644 index 00000000..47200257 --- /dev/null +++ b/tests/unit/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} From cfb7d6743763f39d80d6f3a0b3d9eca3bf73a31e Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Mon, 13 Jun 2022 00:49:54 +0800 Subject: [PATCH 045/274] add test for jsmind.dom & jsmind.format (#349) --- tests/unit/jsmind.dom.test.js | 13 +++++ tests/unit/jsmind.format.test.js | 83 ++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 tests/unit/jsmind.dom.test.js create mode 100644 tests/unit/jsmind.format.test.js diff --git a/tests/unit/jsmind.dom.test.js b/tests/unit/jsmind.dom.test.js new file mode 100644 index 00000000..38c74b76 --- /dev/null +++ b/tests/unit/jsmind.dom.test.js @@ -0,0 +1,13 @@ +import { expect, test } from '@jest/globals'; +import { $ } from '../../src/jsmind.dom.js'; + +test('members', () => { + expect($.w).toBeDefined(); + expect($.d).toBeDefined(); + expect($.g).toBeDefined(); + expect($.c).toBeDefined(); + expect($.t).toBeDefined(); + expect($.h).toBeDefined(); + expect($.i).toBeDefined(); + expect($.on).toBeDefined(); +}); diff --git a/tests/unit/jsmind.format.test.js b/tests/unit/jsmind.format.test.js new file mode 100644 index 00000000..5cd01180 --- /dev/null +++ b/tests/unit/jsmind.format.test.js @@ -0,0 +1,83 @@ +import { describe, expect, test } from '@jest/globals'; +import { format } from '../../src/jsmind.format.js'; +import { Direction } from '../../src/jsmind.common.js'; + +test('node tree', () => { + const mind = format.node_tree.get_mind(fakeMindMaps.node_tree); + checkMindData(mind); + const data = format.node_tree.get_data(mind); + expect(data).toMatchObject(fakeMindMaps.node_tree); +}); + +test('node array', () => { + const mind = format.node_array.get_mind(fakeMindMaps.node_array); + checkMindData(mind); + const data = format.node_array.get_data(mind); + expect(data).toMatchObject(fakeMindMaps.node_array); +}); + +test('freemind', () => { + const mind = format.freemind.get_mind(fakeMindMaps.freemind); + checkMindData(mind); + const data = format.freemind.get_data(mind); + expect(data).toMatchObject(fakeMindMaps.freemind); +}); + +function checkMindData(mind) { + expect(mind.name).toBe(fakeMindName); + expect(mind.author).toBe(fakeMindAuthor); + expect(mind.version).toBe(fakeVersion); + + const rootNode = mind.root; + expect(rootNode.id).toBe('root'); + expect(rootNode.topic).toBe('jsMind'); + expect(rootNode.children.length).toBe(1); + + const node1 = rootNode.children[0]; + expect(node1.id).toBe('easy'); + expect(node1.topic).toBe('Easy'); + expect(node1.direction).toBe(Direction.left); + expect(node1.children.length).toBe(1); + + const node2 = node1.children[0]; + expect(node2.id).toBe('easy1'); + expect(node2.topic).toBe('Easy to show'); + expect(node2.data.ext).toBe('addition data'); + expect(node2.children.length).toBe(0); +} + +const fakeMindName = 'test jsmind'; +const fakeMindAuthor = 'hizzgdev'; +const fakeVersion = 'version'; +const fakeMindMaps = { + node_tree: { + meta: { name: fakeMindName, author: fakeMindAuthor, version: fakeVersion }, + format: 'node_tree', + data: { + id: 'root', + topic: 'jsMind', + children: [ + { + id: 'easy', + topic: 'Easy', + direction: 'left', + children: [{ id: 'easy1', topic: 'Easy to show', ext: 'addition data' }], + }, + ], + }, + }, + node_array: { + meta: { name: fakeMindName, author: fakeMindAuthor, version: fakeVersion }, + format: 'node_array', + data: [ + { id: 'root', topic: 'jsMind', isroot: true }, + { id: 'easy', topic: 'Easy', parentid: 'root', direction: 'left' }, + { id: 'easy1', topic: 'Easy to show', parentid: 'easy', ext: 'addition data' }, + ], + }, + freemind: { + meta: { name: 'test jsmind', author: 'hizzgdev', version: 'version' }, + format: 'freemind', + data: ' ', + }, +}; From e8acdd512f8a024527390cafbbcaa3ec1ee04916 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Mon, 27 Jun 2022 01:09:04 +0800 Subject: [PATCH 046/274] add unit test for graph module (#353) --- tests/unit/jsmind.data_provider.test.js | 1 - tests/unit/jsmind.format.test.js | 2 +- tests/unit/jsmind.graph.test.js | 144 ++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 tests/unit/jsmind.graph.test.js diff --git a/tests/unit/jsmind.data_provider.test.js b/tests/unit/jsmind.data_provider.test.js index f438172d..6df057bc 100644 --- a/tests/unit/jsmind.data_provider.test.js +++ b/tests/unit/jsmind.data_provider.test.js @@ -3,7 +3,6 @@ import { DataProvider } from '../../src/jsmind.data_provider.js'; import { format } from '../../src/jsmind.format.js'; import { logger } from '../../src/jsmind.common.js'; -const mockFormat = { get_mind: jest.fn(), get_data: jest.fn() }; const mockMind = { mock: true }; const data_provider = new DataProvider({ mind: mockMind }); diff --git a/tests/unit/jsmind.format.test.js b/tests/unit/jsmind.format.test.js index 5cd01180..fc6a914b 100644 --- a/tests/unit/jsmind.format.test.js +++ b/tests/unit/jsmind.format.test.js @@ -1,4 +1,4 @@ -import { describe, expect, test } from '@jest/globals'; +import { expect, test } from '@jest/globals'; import { format } from '../../src/jsmind.format.js'; import { Direction } from '../../src/jsmind.common.js'; diff --git a/tests/unit/jsmind.graph.test.js b/tests/unit/jsmind.graph.test.js new file mode 100644 index 00000000..a3144a71 --- /dev/null +++ b/tests/unit/jsmind.graph.test.js @@ -0,0 +1,144 @@ +import { expect, jest, test } from '@jest/globals'; + +import { $ } from '../../src/jsmind.dom.js'; +import { init_graph } from '../../src/jsmind.graph.js'; + +const view = { + opts: { + line_color: 'color', + line_width: 1, + }, +}; + +describe('graph over canvas', () => { + const canvas_ctx = { + beginPath: jest.fn(), + moveTo: jest.fn(), + bezierCurveTo: jest.fn(), + stroke: jest.fn(), + clearRect: jest.fn(), + }; + + const mockCanvas = { + getContext: () => canvas_ctx, + }; + $.c = () => mockCanvas; + const graph = init_graph(view, 'canvas'); + + test('graph.element', () => { + expect(graph.element()).toEqual(mockCanvas); + }); + + test('graph.set_size', () => { + graph.set_size(10, 10); + expect(graph.size).toEqual({ w: 10, h: 10 }); + expect(mockCanvas.width).toBe(10); + expect(mockCanvas.height).toBe(10); + graph.set_size(0, 0); + expect(graph.size).toEqual({ w: 0, h: 0 }); + expect(mockCanvas.width).toBe(0); + expect(mockCanvas.height).toBe(0); + }); + + test('graph.clear', () => { + graph.clear(); + expect(canvas_ctx.clearRect).toBeCalledWith(0, 0, 0, 0); + }); + + test('graph.draw_line', () => { + graph.draw_line({ x: 1, y: 1 }, { x: 2, y: 2 }, { x: 3, y: 3 }); + expect(canvas_ctx.strokeStyle).toBe(view.opts.line_color); + expect(canvas_ctx.lineWidth).toBe(view.opts.line_width); + expect(canvas_ctx.lineCap).toBe('round'); + + expect(canvas_ctx.beginPath).toBeCalled(); + expect(canvas_ctx.moveTo).toBeCalledWith(5, 5); + expect(canvas_ctx.bezierCurveTo).toBeCalledWith(5 - 2 / 3, 5, 5, 4, 4, 4); + expect(canvas_ctx.stroke).toBeCalled(); + }); + + test('graph.copy_to', () => { + const mockDest = { drawImage: jest.fn() }; + const callback = jest.fn(); + graph.copy_to(mockDest, callback); + expect(mockDest.drawImage).toBeCalledWith(mockCanvas, 0, 0); + expect(callback).toBeCalled(); + }); +}); + +describe('graph over svg', () => { + const mockSVG = { + setAttribute: (key, value) => { + mockSVG[key] = value; + }, + removeChild: jest.fn(), + appendChild: jest.fn(), + }; + + const mockSetAttribute = jest.fn(); + $.d.createElementNS = (ns, tag) => { + if (tag === 'svg') { + return mockSVG; + } + return { + setAttribute: mockSetAttribute, + }; + }; + const graph = init_graph(view, 'svg'); + + test('graph.element', () => { + expect(graph.element()).toEqual(mockSVG); + }); + + test('graph.set_size', () => { + graph.set_size(10, 10); + expect(graph.size).toEqual({ w: 10, h: 10 }); + expect(mockSVG.width).toBe(10); + expect(mockSVG.height).toBe(10); + graph.set_size(0, 0); + expect(graph.size).toEqual({ w: 0, h: 0 }); + expect(mockSVG.width).toBe(0); + expect(mockSVG.height).toBe(0); + }); + + test('graph.clear', () => { + graph.draw_line({ x: 1, y: 1 }, { x: 2, y: 2 }, { x: 3, y: 3 }); + graph.clear(); + expect(mockSVG.removeChild).toBeCalled(); + expect(graph.lines.length).toBe(0); + }); + + test('graph.draw_line', () => { + graph.draw_line({ x: 1, y: 1 }, { x: 2, y: 2 }, { x: 3, y: 3 }); + expect(mockSetAttribute).toHaveBeenNthCalledWith(1, 'stroke', view.opts.line_color); + expect(mockSetAttribute).toHaveBeenNthCalledWith(2, 'stroke-width', view.opts.line_width); + expect(mockSetAttribute).toHaveBeenNthCalledWith(3, 'fill', 'transparent'); + const path = 'M 5 5 C ' + (5 - 2 / 3) + ' 5, 5 4, 4 4'; + expect(mockSetAttribute).toHaveBeenNthCalledWith(4, 'd', path); + }); + + test('graph.copy_to', () => { + const originXMLSerializer = global.XMLSerializer; + const originImage = global.Image; + + global.XMLSerializer = class { + serializeToString = () => 'fake data'; + }; + const mockImage = {}; + global.Image = class { + constructor() { + return mockImage; + } + }; + const mockDest = { drawImage: jest.fn() }; + const callback = jest.fn(); + graph.copy_to(mockDest, callback); + mockImage.onload(); + + expect(mockDest.drawImage).toBeCalledWith(mockImage, 0, 0); + expect(callback).toBeCalled(); + + global.XMLSerializer = originXMLSerializer; + global.Image = originImage; + }); +}); From fe3eb0de89bb9b3c03b50d6c70d1db36818643d8 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Tue, 28 Jun 2022 00:11:14 +0800 Subject: [PATCH 047/274] add unit test for node module (#354) --- tests/unit/jsmind.node.test.js | 81 ++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 tests/unit/jsmind.node.test.js diff --git a/tests/unit/jsmind.node.test.js b/tests/unit/jsmind.node.test.js new file mode 100644 index 00000000..b5b1f4fc --- /dev/null +++ b/tests/unit/jsmind.node.test.js @@ -0,0 +1,81 @@ +import { expect, test, jest } from '@jest/globals'; +import { Node } from '../../src/jsmind.node.js'; + +beforeEach(() => { + jest.restoreAllMocks(); +}); + +test('initial', () => { + const node = new Node('1', 1, 'topic', null, false, null, 1); + const expected_node = { + id: '1', + index: 1, + topic: 'topic', + data: {}, + isroot: false, + parent: null, + direction: 1, + expanded: true, + children: [], + _data: {}, + }; + expect(node).toEqual(expected_node); + + jest.spyOn(console, 'error').mockImplementation(() => {}); + + expect(new Node()).toEqual({}); + expect(new Node('1', '2')).toEqual({}); + expect(new Node('1', 'a')).toEqual({}); + expect(new Node('1', null)).toEqual({}); +}); + +test('compare node', () => { + function fake_node(sId, iIndex) { + return new Node(sId, iIndex); + } + + expect(Node.compare(fake_node('a', 1), fake_node('b', 2))).toBeLessThan(0); + expect(Node.compare(fake_node('a', 2), fake_node('b', 1))).toBeGreaterThan(0); + expect(Node.compare(fake_node('a', 2), fake_node('b', 2))).toBe(0); + expect(Node.compare(fake_node('a', -1), fake_node('b', 2))).toBeGreaterThan(0); + expect(Node.compare(fake_node('a', 1), fake_node('b', -1))).toBeLessThan(0); + expect(Node.compare(fake_node('a', -1), fake_node('b', -1))).toBe(0); + expect(Node.compare(fake_node('a', -5), fake_node('b', -6))).toBe(0); +}); + +test('inherited node', () => { + const rootNode = new Node('1', 1, 'root', null, true, null); + const node11 = new Node('1-1', 1, 'sub node 1', null, false, rootNode); + const node12 = new Node('1-2', 2, 'sub node 2', null, false, rootNode); + const node111 = new Node('1-1-1', 1, 'sub sub node 1', null, false, node11); + expect(Node.inherited(rootNode, node11)).toBe(true); + expect(Node.inherited(rootNode, node12)).toBe(true); + expect(Node.inherited(rootNode, node111)).toBe(true); + expect(Node.inherited(node11, node111)).toBe(true); + expect(Node.inherited(rootNode, rootNode)).toBe(true); + expect(Node.inherited(node11, node11)).toBe(true); + expect(Node.inherited(node11, rootNode)).toBe(false); + expect(Node.inherited(node11, node12)).toBe(false); + expect(Node.inherited(node12, node111)).toBe(false); +}); + +test('get location and size', () => { + const fakeNode = new Node('1', 1); + fakeNode._data.view = { + abs_x: 1, + abs_y: 2, + width: 3, + height: 4, + }; + expect(fakeNode.get_location()).toEqual({ x: 1, y: 2 }); + expect(fakeNode.get_size()).toEqual({ w: 3, h: 4 }); +}); + +test('check if it is a node', () => { + const fakeNode = new Node('1', 1); + expect(Node.is_node({})).toBeFalsy(); + expect(Node.is_node(null)).toBeFalsy(); + expect(Node.is_node()).toBeFalsy(); + expect(Node.is_node('node')).toBeFalsy(); + expect(Node.is_node(fakeNode)).toBeTruthy(); +}); From abcae2c7fb124eb84c6e5299cadf26f29978e270 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Thu, 30 Jun 2022 14:06:32 +0800 Subject: [PATCH 048/274] add unit test for jsmind (#355) * add unit test for jsmind * update dist file * format --- es6/jsmind.js | 2 +- es6/jsmind.js.map | 2 +- src/jsmind.js | 21 +- tests/unit/jsmind.test.js | 543 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 553 insertions(+), 15 deletions(-) create mode 100644 tests/unit/jsmind.test.js diff --git a/es6/jsmind.js b/es6/jsmind.js index 0369c991..a13c1be9 100644 --- a/es6/jsmind.js +++ b/es6/jsmind.js @@ -5,5 +5,5 @@ * Project Home: * https://github.com/hizzgdev/jsmind/ */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).jsMind=t()}(this,(function(){"use strict";const e="0.4.9",t="hizzgdev@163.com";"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e){return this.slice(0,e.length)===e});var i=function(){};let n="undefined"==typeof console?{log:i,debug:i,error:i,warn:i,info:i}:console;const o={left:-1,center:0,right:1},s={show:1,resize:2,edit:3,select:4};const a=new class{constructor(e){this.w=e,this.d=e.document,this.g=function(e){return this.d.getElementById(e)},this.c=function(e){return this.d.createElement(e)},this.t=function(e,t){e.hasChildNodes()?e.firstChild.nodeValue=t:e.appendChild(this.d.createTextNode(t))},this.h=function(e,t){t instanceof HTMLElement?(e.innerHTML="",e.appendChild(t)):e.innerHTML=t},this.i=function(e){return!!e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument},this.on=function(e,t,i){e.addEventListener?e.addEventListener(t,i,!1):e.attachEvent("on"+t,i)}}}(window),r={ajax:{request:function(e,t,i,o,s){var a=Object.keys(t).map((e=>encodeURIComponent(e)+"="+encodeURIComponent(t[e]))).join("&"),d=new XMLHttpRequest;d&&(d.onreadystatechange=function(){if(4==d.readyState)if(200==d.status||0==d.status){if("function"==typeof o){var e=r.json.string2json(d.responseText);o(null!=e?e:d.responseText)}}else"function"==typeof s?s(d):n.error("xhr request failed.",d)},i=i||"GET",d.open(i,e,!0),d.setRequestHeader("If-Modified-Since","0"),"POST"==i?(d.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),d.send(a)):d.send())},get:function(e,t){return r.ajax.request(e,{},"GET",t)},post:function(e,t,i){return r.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof a.w.Blob)n=new Blob([e],{type:t});else{var o=new(a.w.BlobBuilder||a.w.MozBlobBuilder||a.w.WebKitBlobBuilder||a.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(a.w.URL||a.w.webkitURL).createObjectURL(n),r=a.c("a");if("download"in r){r.style.visibility="hidden",r.href=s,r.download=i,a.d.body.appendChild(r);var d=a.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),r.dispatchEvent(d),a.d.body.removeChild(r)}else location.href=s}}},json:{json2string:function(e){return JSON.stringify(e)},string2json:function(e){return JSON.parse(e)},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:r.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substring(2)).substring(2,18)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},d={container:"",editable:!1,theme:null,mode:"full",support_html:!0,view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:45,addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class l{constructor(e,t,i,o,s,a,r,d){e?"number"==typeof t?(void 0===d&&(d=!0),this.id=e,this.index=t,this.topic=i,this.data=o||{},this.isroot=s,this.parent=a,this.direction=r,this.expanded=!!d,this.children=[],this._data={}):n.error("invalid node index"):n.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?"Up":"Down")?this.view.zoomIn():this.view.zoomOut())}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;rencodeURIComponent(e)+"="+encodeURIComponent(t[e]))).join("&"),d=new XMLHttpRequest;d&&(d.onreadystatechange=function(){if(4==d.readyState)if(200==d.status||0==d.status){if("function"==typeof o){var e=r.json.string2json(d.responseText);o(null!=e?e:d.responseText)}}else"function"==typeof s?s(d):n.error("xhr request failed.",d)},i=i||"GET",d.open(i,e,!0),d.setRequestHeader("If-Modified-Since","0"),"POST"==i?(d.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),d.send(a)):d.send())},get:function(e,t){return r.ajax.request(e,{},"GET",t)},post:function(e,t,i){return r.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof a.w.Blob)n=new Blob([e],{type:t});else{var o=new(a.w.BlobBuilder||a.w.MozBlobBuilder||a.w.WebKitBlobBuilder||a.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(a.w.URL||a.w.webkitURL).createObjectURL(n),r=a.c("a");if("download"in r){r.style.visibility="hidden",r.href=s,r.download=i,a.d.body.appendChild(r);var d=a.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),r.dispatchEvent(d),a.d.body.removeChild(r)}else location.href=s}}},json:{json2string:function(e){return JSON.stringify(e)},string2json:function(e){return JSON.parse(e)},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:r.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substring(2)).substring(2,18)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},d={container:"",editable:!1,theme:null,mode:"full",support_html:!0,view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:45,addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class l{constructor(e,t,i,o,s,a,r,d){e?"number"==typeof t?(void 0===d&&(d=!0),this.id=e,this.index=t,this.topic=i,this.data=o||{},this.isroot=s,this.parent=a,this.direction=r,this.expanded=!!d,this.children=[],this._data={}):n.error("invalid node index"):n.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof l}}class h{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(n.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new l(e,0,t,i,!0),this._put_node(this.root),this.root):(n.error("root node is already exist"),null)}add_node(e,t,i,s,a,r,d){if(!l.is_node(e))return n.error("the parent_node "+e+" is not a node."),null;var h=new l(t,d||-1,i,s,!1,e,e.direction,r);return e.isroot&&(h.direction=a||o.right),this._put_node(h)?(e.children.push(h),this._reindex(e)):(n.error("fail, the nodeid '"+h.id+"' has been already exist."),h=null),h}insert_node_before(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_before "+e+" is not a node."),null;var a=e.index-.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,o,s){if(!l.is_node(e))return n.error("the node_after "+e+" is not a node."),null;var a=e.index+.5;return this.add_node(e.parent,t,i,o,s,!0,a)}get_node_after(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(n.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,o){return l.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,o)):(n.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._reindex(e.parent);else if("_first_"==t)e.index=0,this._reindex(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._reindex(e.parent))}return e}_move_node(e,t,i,s){if(e&&i){var a=this.get_node(i);if(l.inherited(e,a))return n.error("can not move a node to its children"),null;if(e.parent.id!=i){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=a,a.children.push(e)}e.parent.isroot?e.direction=s==o.left?s:o.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!l.is_node(e))return n.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return n.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var o=e.parent.children,s=o.length;s--;)if(o[s].id==e.id){o.splice(s,1);break}for(var a in delete this.nodes[e.id],e)delete e[a];return e=null,!0}_put_node(e){return e.id in this.nodes?(n.warn("the nodeid '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_reindex(e){if(e instanceof l){e.children.sort(l.compare);for(var t=0;t0){i.children=[];for(var r=0;r0&&(s=i.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){_.node_array._array_node(e.root,t)},_array_node:function(e,t){var i=_.node_array;if(e instanceof l){var n={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(n.parentid=e.parent.id),e.isroot&&(n.isroot=!0),e.parent&&e.parent.isroot&&(n.direction=e.direction==o.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)n[a]=s[a]}t.push(n);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=_.freemind,i=new h;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=_.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._buildmap(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}}};class u{constructor(e){this.jm=e}init(){n.debug("data.init")}reset(){n.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=_.node_array.get_mind(e):"node_tree"==t?i=_.node_tree.get_mind(e):"freemind"==t?i=_.freemind.get_mind(e):n.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=_.node_array.get_data(this.jm.mind):"node_tree"==e?t=_.node_tree.get_data(this.jm.mind):"freemind"==e?t=_.freemind.get_data(this.jm.mind):n.error("unsupported "+e+" format"),t}}class c{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){n.debug("layout.init")}reset(){n.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return o.right;for(var t=e.children||[],i=t.length,n=0,s=0;s1&&n>0?o.left:o.right}layout(){n.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var i=e.children,n=i.length;if(t.direction=o.center,t.side_index=0,this.isside)for(var s=n;s--;)this._layout_direction_side(i[s],o.right,s);else{s=n;for(var a=null;s--;)(a=i[s]).direction==o.left?this._layout_direction_side(a,o.left,s):this._layout_direction_side(a,o.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var i=e.children,n=i.length,s=[],a=[],r=null;n--;)(r=i[n])._data.layout.direction==o.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),i={};return e._data.layout.direction==o.right?i.x=t.x-this.opts.pspace:i.x=t.x,i.y=t.y-Math.ceil(this.opts.pspace/2),i}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h-t)/2)}show(e){n.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,r="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(r=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",a.t(n,r)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=a.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}clear_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=this.get_view_offset();for(var s in e)(t=e[s]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),this.graph.draw_line(n,i,o))}enable_draggable_canvas(){if(this.opts.draggable){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),a.on(this.container,"mousedown",(n=>{i=!0,e=n.clientX,t=n.clientY})),a.on(this.container,"mouseup",(()=>{i=!1})),a.on(this.container,"mousemove",(n=>{i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class g{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in a.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)this.mapping[e]&&e in this.handles&&(this._mapping[this.mapping[e]]=this.handles[e]);"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=r.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,o.left)}handle_right(e,t){this._handle_direction(e,t,o.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const m={plugins:[]};function y(e){if(!e instanceof b)throw new Error("plugin "+e+" is not a supported plugin");m.plugins.push(e)}function w(e){a.w.setTimeout((function(){!function(e){for(var t=m.plugins.length,i=null,n=0;n0?this.view.zoomIn():this.view.zoomOut()}}begin_edit(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.begin_edit(t):(n.error("the node[id="+e+"] can not be found."),!1)}this.get_editable()?this.view.edit_node_begin(e):n.error("fail, this mind map is not editable.")}end_edit(){this.view.edit_node_end()}toggle_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.toggle_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.toggle_node(e),this.view.relayout(),this.view.restore_location(e))}expand_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.expand_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.expand_node(e),this.view.relayout(),this.view.restore_location(e))}collapse_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.collapse_node(t):void n.error("the node[id="+e+"] can not be found.")}e.isroot||(this.view.save_location(e),this.layout.collapse_node(e),this.view.relayout(),this.view.restore_location(e))}expand_all(){this.layout.expand_all(),this.view.relayout()}collapse_all(){this.layout.collapse_all(),this.view.relayout()}expand_to_depth(e){this.layout.expand_to_depth(e),this.view.relayout()}_reset(){this.view.reset(),this.layout.reset(),this.data.reset()}_show(e){var t=e||_.node_array.example;this.mind=this.data.load(t),this.mind?(n.debug("data.load ok"),this.view.load(),n.debug("view.load ok"),this.layout.layout(),n.debug("layout.layout ok"),this.view.show(!0),n.debug("view.show ok"),this.invoke_event_handle(s.show,{data:[e]})):n.error("data.load error")}show(e){this._reset(),this._show(e)}get_meta(){return{name:this.mind.name,author:this.mind.author,version:this.mind.version}}get_data(e){var t=e||"node_tree";return this.data.get_data(t)}get_root(){return this.mind.root}get_node(e){return l.is_node(e)?e:this.mind.get_node(e)}add_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a),d=this.mind.add_node(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.view.reset_node_custom_style(d),this.expand_node(a),this.invoke_event_handle(s.edit,{evt:"add_node",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_before(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_before(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_before",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}insert_node_after(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.layout.calculate_next_child_direction(a.parent),d=this.mind.insert_node_after(a,t,i,o,r);return d&&(this.view.add_node(d),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"insert_node_after",data:[a.id,t,i,o],node:t})),d}return n.error("fail, this mind map is not editable"),null}remove_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.remove_node(t):(n.error("the node[id="+e+"] can not be found."),!1)}if(this.get_editable()){if(e.isroot)return n.error("fail, can not remove root node"),!1;var i=e.id,o=e.parent.id,a=this.get_node(o);return this.view.save_location(a),this.view.remove_node(e),this.mind.remove_node(e),this.layout.layout(),this.view.show(!1),this.view.restore_location(a),this.invoke_event_handle(s.edit,{evt:"remove_node",data:[i],node:o}),!0}return n.error("fail, this mind map is not editable"),!1}update_node(e,t){if(this.get_editable())if(r.text.is_empty(t))n.warn("fail, topic can not be empty");else{var i=this.get_node(e);if(i){if(i.topic===t)return n.info("nothing changed"),void this.view.update_node(i);i.topic=t,this.view.update_node(i),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"update_node",data:[e,t],node:e})}}else n.error("fail, this mind map is not editable")}move_node(e,t,i,o){if(this.get_editable()){var a=this.get_node(e),r=this.mind.move_node(a,t,i,o);r&&(this.view.update_node(r),this.layout.layout(),this.view.show(!1),this.invoke_event_handle(s.edit,{evt:"move_node",data:[e,t,i,o],node:e}))}else n.error("fail, this mind map is not editable")}select_node(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.select_node(t):void n.error("the node[id="+e+"] can not be found.")}this.layout.is_visible(e)&&(this.mind.selected=e,this.view.select_node(e),this.invoke_event_handle(s.select,{evt:"select_node",data:[],node:e.id}))}get_selected_node(){return this.mind?this.mind.selected:null}select_clear(){this.mind&&(this.mind.selected=null,this.view.select_clear())}is_node_visible(e){return this.layout.is_visible(e)}find_node_before(e){if(!l.is_node(e)){var t=this.get_node(e);return t?this.find_node_before(t):void n.error("the node[id="+e+"] can not be found.")}if(e.isroot)return null;var i=null;if(e.parent.isroot)for(var o=e.parent.children,s=null,a=null,r=0;r encodeURIComponent(k) + '=' + encodeURIComponent(param[k]))\n .join('&');\n var xhr = new XMLHttpRequest();\n if (!xhr) {\n return;\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status == 0) {\n if (typeof callback === 'function') {\n var data = util.json.string2json(xhr.responseText);\n if (data != null) {\n callback(data);\n } else {\n callback(xhr.responseText);\n }\n }\n } else {\n if (typeof fail_callback === 'function') {\n fail_callback(xhr);\n } else {\n logger.error('xhr request failed.', xhr);\n }\n }\n }\n };\n method = method || 'GET';\n xhr.open(method, url, true);\n xhr.setRequestHeader('If-Modified-Since', '0');\n if (method == 'POST') {\n xhr.setRequestHeader(\n 'Content-Type',\n 'application/x-www-form-urlencoded;charset=utf-8'\n );\n xhr.send(p);\n } else {\n xhr.send();\n }\n },\n get: function (url, callback) {\n return util.ajax.request(url, {}, 'GET', callback);\n },\n post: function (url, param, callback) {\n return util.ajax.request(url, param, 'POST', callback);\n },\n },\n\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 bloburl = URL.createObjectURL(blob);\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\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-2022 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\n view: {\n engine: 'canvas',\n hmargin: 100,\n vmargin: 50,\n line_width: 2,\n line_color: '#555',\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 },\n layout: {\n hspace: 30,\n vspace: 20,\n pspace: 13,\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, // Insert\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};\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-2022 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 alwary the last\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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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 nodeid,\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._reindex(parent_node);\n } else {\n logger.error(\"fail, the nodeid '\" + node.id + \"' has been already exist.\");\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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, nodeid, 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, nodeid, 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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = !!beforeid ? this.get_node(beforeid) : 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._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn(\"the nodeid '\" + node.id + \"' has been already exist.\");\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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-2022 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';\n\nexport const format = {\n node_tree: {\n example: {\n meta: {\n name: 'jsMind node_tree simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_tree',\n data: { id: 'root', topic: 'jsMind 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._buildnode(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 _buildnode: 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._buildnode(children[i]));\n }\n }\n return o;\n },\n },\n\n node_array: {\n example: {\n meta: {\n name: 'jsMind node_array simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_array',\n data: [{ id: 'root', topic: 'jsMind 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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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: {\n name: 'jsMind freemind example',\n author: __author__,\n version: __version__,\n },\n format: 'freemind',\n data: '',\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 // 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 = 'expanded' in node_data ? node_data.expanded == 'true' : true;\n delete node_data.expanded;\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n },\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 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 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\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 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 nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from './jsmind.dom.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 }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = SvgGraph.c('path');\n line.setAttribute('stroke', 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._bezier_to(\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 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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(\n ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y\n );\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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-2022 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 }\n init() {\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';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\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 }\n if (!!node) {\n this.selected_node = node;\n node._data.view.element.className += ' selected';\n this.clear_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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if (zoom < this.minZoom || zoom > this.maxZoom) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n }\n this.show(true);\n return true;\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = _offset.x + p.x + 'px';\n node_element.style.top = _offset.y + p.y + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = _offset.x + p_expander.x + 'px';\n expander.style.top = _offset.y + p_expander.y + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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 clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) {\n continue;\n }\n if ('visible' in node._data.layout && !node._data.layout.visible) {\n continue;\n }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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-2022 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('plugin ' + plugin + ' is not a supported plugin');\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } 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\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable,\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = false;\n }\n // call enable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n enable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = true;\n }\n // call disable_event_handle('dblclick')\n // options are 'mousedown', 'click', 'dblclick'\n disable_event_handle(event_handle) {\n this.options.default_event_handle['enable_' + event_handle + '_handle'] = false;\n }\n get_editable() {\n return this.options.editable;\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, 'mousewheel', this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\n }\n }\n }\n // Use [Ctrl] + Mousewheel, to zoom in/out.\n mousewheel_handle(event) {\n // Test if mousewheel option is enabled and Ctrl key is pressed.\n if (\n !this.options.default_event_handle['enable_mousewheel_handle'] ||\n !window.event.ctrlKey\n ) {\n return;\n }\n // Avoid default page scrolling behavior.\n event.preventDefault();\n\n var dir = event.deltaY > 0 ? 'Up' : 'Down';\n if (dir == 'Up') {\n this.view.zoomIn();\n } else {\n this.view.zoomOut();\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, nodeid, topic, data],\n node: nodeid,\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(\n the_node_before,\n nodeid,\n topic,\n data,\n direction\n );\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, nodeid, topic, data],\n node: nodeid,\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, nodeid, topic, data],\n node: nodeid,\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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: [nodeid],\n node: parentid,\n });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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: [nodeid, topic],\n node: nodeid,\n });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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: [nodeid, beforeid, parentid, direction],\n node: nodeid,\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 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 getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jm;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","request","url","param","method","callback","fail_callback","Object","keys","map","k","encodeURIComponent","join","xhr","XMLHttpRequest","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","a","o","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substring","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","push","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","ActiveXObject","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","CanvasGraph","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","graph","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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"],"mappings":"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"} \ No newline at end of file +{"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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nexport const __version__ = '0.4.9';\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\n// an noop function define\nvar _noop = function () {};\nexport let logger =\n typeof console === 'undefined'\n ? {\n log: _noop,\n debug: _noop,\n error: _noop,\n warn: _noop,\n info: _noop,\n }\n : console;\n\nexport const Direction = { left: -1, center: 0, right: 1 };\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 };\n","/**\n * @license BSD\n * @copyright 2014-2022 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-2022 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\nexport const util = {\n ajax: {\n request: function (url, param, method, callback, fail_callback) {\n var p = Object.keys(param)\n .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(param[k]))\n .join('&');\n var xhr = new XMLHttpRequest();\n if (!xhr) {\n return;\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status == 0) {\n if (typeof callback === 'function') {\n var data = util.json.string2json(xhr.responseText);\n if (data != null) {\n callback(data);\n } else {\n callback(xhr.responseText);\n }\n }\n } else {\n if (typeof fail_callback === 'function') {\n fail_callback(xhr);\n } else {\n logger.error('xhr request failed.', xhr);\n }\n }\n }\n };\n method = method || 'GET';\n xhr.open(method, url, true);\n xhr.setRequestHeader('If-Modified-Since', '0');\n if (method == 'POST') {\n xhr.setRequestHeader(\n 'Content-Type',\n 'application/x-www-form-urlencoded;charset=utf-8'\n );\n xhr.send(p);\n } else {\n xhr.send();\n }\n },\n get: function (url, callback) {\n return util.ajax.request(url, {}, 'GET', callback);\n },\n post: function (url, param, callback) {\n return util.ajax.request(url, param, 'POST', callback);\n },\n },\n\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 bloburl = URL.createObjectURL(blob);\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\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-2022 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\n view: {\n engine: 'canvas',\n hmargin: 100,\n vmargin: 50,\n line_width: 2,\n line_color: '#555',\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 },\n layout: {\n hspace: 30,\n vspace: 20,\n pspace: 13,\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, // Insert\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};\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-2022 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 alwary the last\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(pnode, node) {\n if (!!pnode && !!node) {\n if (pnode.id === node.id) {\n return true;\n }\n if (pnode.isroot) {\n return true;\n }\n var pid = pnode.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-2022 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(nodeid) {\n if (nodeid in this.nodes) {\n return this.nodes[nodeid];\n } else {\n logger.warn('the node[id=' + nodeid + '] can not be found');\n return null;\n }\n }\n set_root(nodeid, topic, data) {\n if (this.root == null) {\n this.root = new Node(nodeid, 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, nodeid, 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 nodeid,\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._reindex(parent_node);\n } else {\n logger.error(\"fail, the nodeid '\" + node.id + \"' has been already exist.\");\n node = null;\n }\n return node;\n }\n insert_node_before(node_before, nodeid, 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, nodeid, 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, nodeid, 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, nodeid, 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, beforeid) {\n if (!!node && !!beforeid) {\n if (beforeid == '_last_') {\n node.index = -1;\n this._reindex(node.parent);\n } else if (beforeid == '_first_') {\n node.index = 0;\n this._reindex(node.parent);\n } else {\n var node_before = !!beforeid ? this.get_node(beforeid) : 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._reindex(node.parent);\n }\n }\n }\n return node;\n }\n _move_node(node, beforeid, parentid, direction) {\n if (!!node && !!parentid) {\n var parent_node = this.get_node(parentid);\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 != parentid) {\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 node.parent = parent_node;\n parent_node.children.push(node);\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, beforeid);\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 // 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 //delete node;\n return true;\n }\n _put_node(node) {\n if (node.id in this.nodes) {\n logger.warn(\"the nodeid '\" + node.id + \"' has been already exist.\");\n return false;\n } else {\n this.nodes[node.id] = node;\n return true;\n }\n }\n _reindex(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-2022 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';\n\nexport const format = {\n node_tree: {\n example: {\n meta: {\n name: 'jsMind node_tree simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_tree',\n data: { id: 'root', topic: 'jsMind 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._buildnode(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 _buildnode: 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._buildnode(children[i]));\n }\n }\n return o;\n },\n },\n\n node_array: {\n example: {\n meta: {\n name: 'jsMind node_array simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_array',\n data: [{ id: 'root', topic: 'jsMind 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 narray = node_array.slice(0);\n // reverse array for improving looping performance\n narray.reverse();\n var root_node = df._extract_root(mind, narray);\n if (!!root_node) {\n df._extract_subnode(mind, root_node, narray);\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: {\n name: 'jsMind freemind example',\n author: __author__,\n version: __version__,\n },\n format: 'freemind',\n data: '',\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 xmllines = [];\n xmllines.push('');\n df._buildmap(mind.root, xmllines);\n xmllines.push('');\n json.data = xmllines.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 // 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 = 'expanded' in node_data ? node_data.expanded == 'true' : true;\n delete node_data.expanded;\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 _buildmap: function (node, xmllines) {\n var df = format.freemind;\n var pos = null;\n if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xmllines.push('');\n\n // store expanded status as an attribute\n xmllines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xmllines.push('');\n }\n }\n\n // for children\n var children = node.children;\n for (var i = 0; i < children.length; i++) {\n df._buildmap(children[i], xmllines);\n }\n\n xmllines.push('');\n },\n },\n};\n","/**\n * @license BSD\n * @copyright 2014-2022 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 {\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 {\n logger.error('unsupported ' + data_format + ' format');\n }\n return data;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 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 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\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 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 nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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 nodeid in nodes) {\n node = nodes[nodeid];\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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from './jsmind.dom.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 }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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) {\n var line = SvgGraph.c('path');\n line.setAttribute('stroke', 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._bezier_to(\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 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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\n }\n clear() {\n this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h);\n }\n draw_line(pout, pin, offset) {\n var ctx = this.canvas_ctx;\n ctx.strokeStyle = this.opts.line_color;\n ctx.lineWidth = this.opts.line_width;\n ctx.lineCap = 'round';\n\n this._bezier_to(\n ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y\n );\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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-2022 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 }\n init() {\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';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\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 this.enable_draggable_canvas();\n }\n add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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.init_nodes();\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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\n }\n view_data.width = element.clientWidth;\n view_data.height = element.clientHeight;\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 }\n if (!!node) {\n this.selected_node = node;\n node._data.view.element.className += ' selected';\n this.clear_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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if (zoom < this.minZoom || zoom > this.maxZoom) {\n return false;\n }\n this.actualZoom = zoom;\n for (var i = 0; i < this.e_panel.children.length; i++) {\n this.e_panel.children[i].style.transform = 'scale(' + zoom + ')';\n }\n this.show(true);\n return true;\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = _offset.x + p.x + 'px';\n node_element.style.top = _offset.y + p.y + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = _offset.x + p_expander.x + 'px';\n expander.style.top = _offset.y + p_expander.y + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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 clear_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 _offset = this.get_view_offset();\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n if (!!node.isroot) {\n continue;\n }\n if ('visible' in node._data.layout && !node._data.layout.visible) {\n continue;\n }\n pin = this.layout.get_node_point_in(node);\n pout = this.layout.get_node_point_out(node.parent);\n this.graph.draw_line(pout, pin, _offset);\n }\n }\n // Drag the whole mind map with your mouse, when it's larger that the container\n enable_draggable_canvas() {\n // If draggable option is true.\n if (this.opts.draggable) {\n // Dragging disabled by default.\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 dragging = true;\n // Record current mouse position.\n x = eventDown.clientX;\n y = eventDown.clientY;\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 (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","/**\n * @license BSD\n * @copyright 2014-2022 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 this._mapping[this.mapping[handle]] = this.handles[handle];\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 nodeid = this._newid();\n var node = _jm.add_node(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 nodeid = this._newid();\n var node = _jm.insert_node_after(selected_node, nodeid, 'New Node');\n if (!!node) {\n _jm.select_node(nodeid);\n _jm.begin_edit(nodeid);\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 childrencount = children.length;\n if (childrencount > 0) {\n node = children[Math.floor((childrencount - 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-2022 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('plugin ' + plugin + ' is not a supported plugin');\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { __version__, logger, EventType, Direction } 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\nclass jm {\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 jm.current = this;\n this.version = __version__;\n this.initialized = false;\n this.mind = null;\n this.event_handles = [];\n this.options = merge_option(options);\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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable,\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);\n }\n enable_edit() {\n this.options.editable = true;\n }\n disable_edit() {\n this.options.editable = 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 get_editable() {\n return this.options.editable;\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, 'mousewheel', this.mousewheel_handle);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n if (element.tagName.toLowerCase() == 'jmnode') {\n this.select_node(nodeid);\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 isexpander = this.view.is_expander(element);\n if (isexpander) {\n var nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.toggle_node(nodeid);\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 nodeid = this.view.get_binded_nodeid(element);\n if (!!nodeid) {\n this.begin_edit(nodeid);\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 if (!this.options.default_event_handle['enable_mousewheel_handle'] || !e.ctrlKey) {\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.zoomIn(); // wheel up\n } else {\n this.view.zoomOut();\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, nodeid, topic, data, direction);\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, nodeid, topic, data],\n node: nodeid,\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(\n the_node_before,\n nodeid,\n topic,\n data,\n direction\n );\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, nodeid, topic, data],\n node: nodeid,\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, nodeid, topic, data) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, nodeid, topic, data, direction);\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, nodeid, topic, data],\n node: nodeid,\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 nodeid = node.id;\n var parentid = node.parent.id;\n var parent_node = this.get_node(parentid);\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: [nodeid],\n node: parentid,\n });\n return true;\n } else {\n logger.error('fail, this mind map is not editable');\n return false;\n }\n }\n update_node(nodeid, 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(nodeid);\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: [nodeid, topic],\n node: nodeid,\n });\n }\n } else {\n logger.error('fail, this mind map is not editable');\n return;\n }\n }\n move_node(nodeid, beforeid, parentid, direction) {\n if (this.get_editable()) {\n var node = this.get_node(nodeid);\n var updated_node = this.mind.move_node(node, beforeid, parentid, 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: [nodeid, beforeid, parentid, direction],\n node: nodeid,\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 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 getthis = 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 (getthis) {\n n = ni;\n break;\n }\n if (node.id === ni.id) {\n getthis = true;\n }\n }\n }\n } else {\n n = this.mind.get_node_after(node);\n }\n return n;\n }\n set_node_color(nodeid, bgcolor, fgcolor) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\n if (!!node) {\n if (!!bgcolor) {\n node.data['background-color'] = bgcolor;\n }\n if (!!fgcolor) {\n node.data['foreground-color'] = fgcolor;\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(nodeid, size, weight, style) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, image, width, height, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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(nodeid, rotation) {\n if (this.get_editable()) {\n var node = this.mind.get_node(nodeid);\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 // quick way\n static show(options, mind) {\n var _jm = new jm(options);\n _jm.show(mind);\n return _jm;\n }\n}\n\nexport default jm;\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","_noop","logger","console","log","debug","error","warn","info","Direction","left","center","right","EventType","show","resize","edit","select","$","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","ajax","request","url","param","method","callback","fail_callback","Object","keys","map","k","encodeURIComponent","join","xhr","XMLHttpRequest","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","bloburl","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json2string","JSON","stringify","json_str","parse","merge","b","a","o","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substring","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","pnode","node","pid","Mind","author","version","root","selected","nodes","get_node","nodeid","set_root","_put_node","add_node","parent_node","idx","is_node","push","_reindex","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","beforeid","parentid","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_buildnode","node_root","_extract_data","_extract_subnode","node_json","node_parent","node_data","node_array","_array","narray","reverse","root_node","_extract_root","root_json","extract_count","node_direction","sub_extract_count","_array_node","freemind","xml","xml_doc","_parse_xml","xml_root","_find_root","_load_node","xmllines","_buildmap","DOMParser","parseFromString","ActiveXObject","async","loadXML","childNodes","tagName","ns","xml_node","node_id","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","lines","createElementNS","element","set_size","clear","draw_line","pin","offset","line","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","CanvasGraph","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","graph","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","enable_draggable_canvas","add_event","obj","event_name","event_handle","get_binded_nodeid","parentElement","is_expander","clear_lines","clear_nodes","reset_theme","theme_name","reset_custom_style","reset_node_custom_style","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","d_e","expander","_reset_node_custom_style","update_node","select_node","clear_node_custom_style","select_clear","get_editing_node","is_editing","edit_node_begin","ncs","getComputedStyle","value","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","transform","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","color","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","childrencount","plugin_data","plugins","register","plugin","Plugin","Error","apply","setTimeout","l","fn_init","_apply","_register_plugin","_util","current","initialized","event_handles","merge_option","opts_layout","opts_view","_event_bind","apply_plugins","enable_edit","disable_edit","enable_event_handle","disable_event_handle","get_editable","set_theme","theme_old","mousedown_handle","click_handle","dblclick_handle","mousewheel_handle","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","prev","ni","getthis","set_node_color","bgcolor","fgcolor","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"],"mappings":"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"} \ No newline at end of file diff --git a/src/jsmind.js b/src/jsmind.js index b307d1d3..43dc4bde 100644 --- a/src/jsmind.js +++ b/src/jsmind.js @@ -82,13 +82,11 @@ class jm { disable_edit() { this.options.editable = false; } - // call enable_event_handle('dblclick') - // options are 'mousedown', 'click', 'dblclick' + // options are 'mousedown', 'click', 'dblclick', 'mousewheel' enable_event_handle(event_handle) { this.options.default_event_handle['enable_' + event_handle + '_handle'] = true; } - // call disable_event_handle('dblclick') - // options are 'mousedown', 'click', 'dblclick' + // options are 'mousedown', 'click', 'dblclick', 'mousewheel' disable_event_handle(event_handle) { this.options.default_event_handle['enable_' + event_handle + '_handle'] = false; } @@ -149,20 +147,17 @@ class jm { } } // Use [Ctrl] + Mousewheel, to zoom in/out. - mousewheel_handle(event) { + mousewheel_handle(e) { // Test if mousewheel option is enabled and Ctrl key is pressed. - if ( - !this.options.default_event_handle['enable_mousewheel_handle'] || - !window.event.ctrlKey - ) { + if (!this.options.default_event_handle['enable_mousewheel_handle'] || !e.ctrlKey) { return; } + var evt = e || event; // Avoid default page scrolling behavior. - event.preventDefault(); + evt.preventDefault(); - var dir = event.deltaY > 0 ? 'Up' : 'Down'; - if (dir == 'Up') { - this.view.zoomIn(); + if (evt.deltaY > 0) { + this.view.zoomIn(); // wheel up } else { this.view.zoomOut(); } diff --git a/tests/unit/jsmind.test.js b/tests/unit/jsmind.test.js new file mode 100644 index 00000000..acf5d261 --- /dev/null +++ b/tests/unit/jsmind.test.js @@ -0,0 +1,543 @@ +import { describe, expect, test, jest, beforeAll } from '@jest/globals'; +import { __version__, logger, EventType } from '../../src/jsmind.common.js'; +import { $ } from '../../src/jsmind.dom.js'; +import jm from '../../src/jsmind.js'; + +beforeAll(() => { + $.c = jest.fn(); + $.g = jest.fn(); + $.on = jest.fn(); + logger.error = jest.fn(); + logger.warn = jest.fn(); + logger.debug = jest.fn(); +}); + +const mockElement = { + getContext: jest.fn(), + addEventListener: jest.fn(), + appendChild: jest.fn(), +}; + +test('class alias', () => { + expect(jm.mind).not.toBeUndefined(); + expect(jm.node).not.toBeUndefined(); + expect(jm.direction).not.toBeUndefined(); + expect(jm.event_type).not.toBeUndefined(); + expect(jm.$).not.toBeUndefined(); + expect(jm.plugin).not.toBeUndefined(); + expect(jm.register_plugin).not.toBeUndefined(); + expect(jm.util).not.toBeUndefined(); +}); + +test('constructor and init', () => { + $.g.mockReturnValue(mockElement); + $.c.mockReturnValue(mockElement); + const jsmind = new jm({ container: 'container' }); + expect(jm.current).toBe(jsmind); + expect(jsmind.version).toBe(__version__); + expect(jsmind.initialized).toBeTruthy(); +}); + +test('editable', () => { + const jsmind = new jm({ container: 'container', editable: false }); + expect(jsmind.get_editable()).toBeFalsy(); + jsmind.enable_edit(); + expect(jsmind.get_editable()).toBeTruthy(); + jsmind.disable_edit(); + expect(jsmind.get_editable()).toBeFalsy(); + + const jsmind2 = new jm({ container: 'container', editable: true }); + expect(jsmind2.get_editable()).toBeTruthy(); + jsmind2.disable_edit(); + expect(jsmind2.get_editable()).toBeFalsy(); +}); + +test('begin and end edit', () => { + const jsmind = create_fake_mind(); + const node = jsmind.get_node('node1'); + + jsmind.view.edit_node_begin = jest.fn(); + jsmind.view.edit_node_end = jest.fn(); + jsmind.enable_edit(); + + jsmind.begin_edit(node); + jsmind.end_edit(); + expect(jsmind.view.edit_node_begin).toBeCalledTimes(1); + expect(jsmind.view.edit_node_end).toBeCalledTimes(1); + + jsmind.begin_edit('node1'); + jsmind.end_edit(); + expect(jsmind.view.edit_node_begin).toBeCalledTimes(2); + expect(jsmind.view.edit_node_end).toBeCalledTimes(2); + + jsmind.begin_edit('node2'); + jsmind.end_edit(); + expect(jsmind.view.edit_node_begin).toBeCalledTimes(2); + expect(jsmind.view.edit_node_end).toBeCalledTimes(3); + + jsmind.disable_edit(); + jsmind.begin_edit(node); + jsmind.end_edit(); + expect(jsmind.view.edit_node_begin).toBeCalledTimes(2); + expect(jsmind.view.edit_node_end).toBeCalledTimes(4); +}); + +test('theme', () => { + const jsmind = new jm({ container: 'container', theme: 'a' }); + jsmind.view.reset_theme = jest.fn(); + jsmind.view.reset_custom_style = jest.fn(); + jsmind.set_theme('b'); + expect(jsmind.view.reset_theme).toBeCalledTimes(1); + expect(jsmind.view.reset_custom_style).toBeCalledTimes(1); + jsmind.set_theme('b'); + expect(jsmind.view.reset_theme).toBeCalledTimes(1); + expect(jsmind.view.reset_custom_style).toBeCalledTimes(1); + jsmind.set_theme(); + expect(jsmind.view.reset_theme).toBeCalledTimes(2); + expect(jsmind.view.reset_custom_style).toBeCalledTimes(2); +}); + +describe('expand & collapse', () => { + test('test over node', () => { + const jsmind = create_fake_mind(); + const node = jsmind.get_node('node1'); + + jsmind.view.save_location = jest.fn(); + jsmind.view.relayout = jest.fn(); + jsmind.view.restore_location = jest.fn(); + jsmind.layout.toggle_node = jest.fn(); + jsmind.layout.expand_node = jest.fn(); + jsmind.layout.collapse_node = jest.fn(); + jsmind.layout.expand_all = jest.fn(); + jsmind.layout.collapse_all = jest.fn(); + jsmind.layout.expand_to_depth = jest.fn(); + + jsmind.toggle_node(node); + expect(jsmind.view.save_location).toBeCalledTimes(1); + expect(jsmind.view.relayout).toBeCalledTimes(1); + expect(jsmind.view.restore_location).toBeCalledTimes(1); + expect(jsmind.layout.toggle_node).toBeCalledTimes(1); + + jsmind.expand_node(node); + expect(jsmind.view.save_location).toBeCalledTimes(2); + expect(jsmind.view.relayout).toBeCalledTimes(2); + expect(jsmind.view.restore_location).toBeCalledTimes(2); + expect(jsmind.layout.expand_node).toBeCalledTimes(1); + + jsmind.collapse_node(node); + expect(jsmind.view.save_location).toBeCalledTimes(3); + expect(jsmind.view.relayout).toBeCalledTimes(3); + expect(jsmind.view.restore_location).toBeCalledTimes(3); + expect(jsmind.layout.collapse_node).toBeCalledTimes(1); + + jsmind.expand_all(); + expect(jsmind.view.relayout).toBeCalledTimes(4); + expect(jsmind.layout.expand_all).toBeCalledTimes(1); + + jsmind.collapse_all(); + expect(jsmind.view.relayout).toBeCalledTimes(5); + expect(jsmind.layout.collapse_all).toBeCalledTimes(1); + + jsmind.expand_to_depth(1); + expect(jsmind.view.relayout).toBeCalledTimes(6); + expect(jsmind.layout.expand_to_depth).toBeCalledTimes(1); + }); + + test('test over node id', () => { + const jsmind = create_fake_mind(); + + jsmind.view.save_location = jest.fn(); + jsmind.view.relayout = jest.fn(); + jsmind.view.restore_location = jest.fn(); + jsmind.layout.toggle_node = jest.fn(); + jsmind.layout.expand_node = jest.fn(); + jsmind.layout.collapse_node = jest.fn(); + jsmind.layout.expand_all = jest.fn(); + jsmind.layout.collapse_all = jest.fn(); + jsmind.layout.expand_to_depth = jest.fn(); + + jsmind.toggle_node('node1'); + expect(jsmind.view.save_location).toBeCalledTimes(1); + expect(jsmind.view.relayout).toBeCalledTimes(1); + expect(jsmind.view.restore_location).toBeCalledTimes(1); + expect(jsmind.layout.toggle_node).toBeCalledTimes(1); + + jsmind.expand_node('node1'); + expect(jsmind.view.save_location).toBeCalledTimes(2); + expect(jsmind.view.relayout).toBeCalledTimes(2); + expect(jsmind.view.restore_location).toBeCalledTimes(2); + expect(jsmind.layout.expand_node).toBeCalledTimes(1); + + jsmind.collapse_node('node1'); + expect(jsmind.view.save_location).toBeCalledTimes(3); + expect(jsmind.view.relayout).toBeCalledTimes(3); + expect(jsmind.view.restore_location).toBeCalledTimes(3); + expect(jsmind.layout.collapse_node).toBeCalledTimes(1); + + jsmind.expand_all(); + expect(jsmind.view.relayout).toBeCalledTimes(4); + expect(jsmind.layout.expand_all).toBeCalledTimes(1); + + jsmind.collapse_all(); + expect(jsmind.view.relayout).toBeCalledTimes(5); + expect(jsmind.layout.collapse_all).toBeCalledTimes(1); + + jsmind.expand_to_depth(1); + expect(jsmind.view.relayout).toBeCalledTimes(6); + expect(jsmind.layout.expand_to_depth).toBeCalledTimes(1); + }); +}); + +describe('event handler', () => { + const mockEvent = { target: { tagName: 'jmnode' } }; + + test('mousedown', () => { + const jsmind = create_fake_mind(); + + jsmind.select_node = jest.fn(); + jsmind.select_clear = jest.fn(); + jsmind.view = { get_binded_nodeid: jest.fn() }; + jsmind.view.get_binded_nodeid.mockReturnValue('node1'); + + jsmind.enable_event_handle('mousedown'); + jsmind.mousedown_handle({ target: { tagName: 'jmnode' } }); + expect(jsmind.select_node).toBeCalledWith('node1'); + expect(jsmind.select_clear).toBeCalledTimes(0); + + jsmind.mousedown_handle({ target: { tagName: 'DIV' } }); + expect(jsmind.select_node).toBeCalledTimes(1); + expect(jsmind.select_clear).toBeCalledTimes(0); + + jsmind.view.get_binded_nodeid.mockReturnValue(null); + jsmind.mousedown_handle({ target: { tagName: 'jmnode' } }); + expect(jsmind.select_node).toBeCalledTimes(1); + expect(jsmind.select_clear).toBeCalledTimes(1); + + jsmind.disable_event_handle('mousedown'); + jsmind.mousedown_handle({ target: { tagName: 'jmnode' } }); + expect(jsmind.select_node).toBeCalledTimes(1); + expect(jsmind.select_clear).toBeCalledTimes(1); + }); + + test('click', () => { + const jsmind = create_fake_mind(); + jsmind.view = { is_expander: jest.fn(), get_binded_nodeid: jest.fn() }; + jsmind.toggle_node = jest.fn(); + + jsmind.enable_event_handle('click'); + jsmind.view.is_expander.mockReturnValue(true); + jsmind.view.get_binded_nodeid.mockReturnValue('node1'); + jsmind.click_handle({ target: {} }); + expect(jsmind.toggle_node).toBeCalledWith('node1'); + + jsmind.view.is_expander.mockReturnValue(false); + jsmind.click_handle({ target: {} }); + expect(jsmind.toggle_node).toBeCalledTimes(1); + + jsmind.disable_event_handle('click'); + jsmind.view.is_expander.mockReturnValue(true); + jsmind.click_handle({ target: {} }); + expect(jsmind.toggle_node).toBeCalledTimes(1); + }); + + test('dblclick', () => { + const jsmind = create_fake_mind(); + jsmind.get_editable = jest.fn(); + jsmind.begin_edit = jest.fn(); + jsmind.view = { get_binded_nodeid: jest.fn() }; + + jsmind.enable_event_handle('dblclick'); + jsmind.get_editable.mockReturnValue(true); + jsmind.view.get_binded_nodeid.mockReturnValue('node1'); + jsmind.dblclick_handle({ target: {} }); + expect(jsmind.begin_edit).toBeCalledWith('node1'); + + jsmind.view.get_binded_nodeid.mockReturnValue(null); + jsmind.dblclick_handle({ target: {} }); + expect(jsmind.begin_edit).toBeCalledTimes(1); + + jsmind.get_editable.mockReturnValue(false); + jsmind.view.get_binded_nodeid.mockReturnValue('node1'); + jsmind.dblclick_handle({ target: {} }); + expect(jsmind.begin_edit).toBeCalledTimes(1); + + jsmind.disable_event_handle('dblclick'); + jsmind.dblclick_handle({ target: {} }); + expect(jsmind.begin_edit).toBeCalledTimes(1); + }); + + test('mousewheel', () => { + const evt = { preventDefault: jest.fn(), ctrlKey: true }; + const jsmind = create_fake_mind(); + jsmind.view = { zoomIn: jest.fn(), zoomOut: jest.fn() }; + + jsmind.enable_event_handle('mousewheel'); + evt.deltaY = 1; + jsmind.mousewheel_handle(evt); + expect(jsmind.view.zoomIn).toBeCalledTimes(1); + expect(jsmind.view.zoomOut).toBeCalledTimes(0); + + evt.deltaY = -1; + jsmind.mousewheel_handle(evt); + expect(jsmind.view.zoomIn).toBeCalledTimes(1); + expect(jsmind.view.zoomOut).toBeCalledTimes(1); + + evt.ctrlKey = false; + jsmind.mousewheel_handle(evt); + expect(jsmind.view.zoomIn).toBeCalledTimes(1); + expect(jsmind.view.zoomOut).toBeCalledTimes(1); + + evt.ctrlKey = true; + jsmind.disable_event_handle('mousewheel'); + jsmind.mousewheel_handle(evt); + expect(jsmind.view.zoomIn).toBeCalledTimes(1); + expect(jsmind.view.zoomOut).toBeCalledTimes(1); + }); +}); + +test('show mind', () => { + const jsmind = create_fake_mind(); + jsmind.data = { load: jest.fn(), reset: jest.fn() }; + jsmind.view = { load: jest.fn(), show: jest.fn(), reset: jest.fn() }; + jsmind.layout = { layout: jest.fn(), reset: jest.fn() }; + jsmind.data.load.mockReturnValue({}); + jsmind.invoke_event_handle = jest.fn(); + + jsmind.show({ data: 'origin data' }); + expect(jsmind.invoke_event_handle).toBeCalledWith(EventType.show, { + data: [{ data: 'origin data' }], + }); +}); + +test('visible check', () => { + const jsmind = create_fake_mind(); + jsmind.layout = { is_visible: jest.fn() }; + jsmind.layout.is_visible.mockReturnValue(true); + expect(jsmind.is_node_visible({})).toBe(true); + expect(jsmind.layout.is_visible).toBeCalledWith({}); +}); + +test('resize', () => { + const jsmind = create_fake_mind(); + jsmind.view = { resize: jest.fn() }; + jsmind.resize(); + expect(jsmind.view.resize).toBeCalled(); +}); + +describe('get data', () => { + test('get metadata', () => { + const jsmind = create_fake_mind(); + jsmind.mind.name = 'jsMind'; + jsmind.mind.author = 'hizzgdev@163.com'; + jsmind.mind.version = 'version'; + expect(jsmind.get_meta()).toEqual({ + name: 'jsMind', + author: 'hizzgdev@163.com', + version: 'version', + }); + }); + + test('get data', () => { + const jsmind = create_fake_mind(); + jsmind.data = { get_data: jest.fn() }; + jsmind.get_data(); + expect(jsmind.data.get_data).toBeCalledWith('node_tree'); + + jsmind.get_data('node_array'); + expect(jsmind.data.get_data).toBeCalledWith('node_array'); + + jsmind.get_data('freemind'); + expect(jsmind.data.get_data).toBeCalledWith('freemind'); + }); + + test('get root', () => { + const jsmind = new jm({ container: 'container' }); + const mind = new jm.mind(); + const root_node = mind.set_root('root', 'root'); + jsmind.mind = mind; + expect(jsmind.get_root()).toBe(root_node); + }); + + test('get node', () => { + const jsmind = new jm({ container: 'container' }); + const mind = new jm.mind(); + const root_node = mind.set_root('root', 'root'); + const node = mind.add_node(root_node, 'node1', 'node1'); + jsmind.mind = mind; + expect(jsmind.get_node('node1')).toBe(node); + }); +}); + +describe('data mutation', () => { + function mock_jsmind(jsmind) { + jsmind.enable_edit(); + jsmind.layout = { + calculate_next_child_direction: jest.fn(), + layout: jest.fn(), + expand_node: jest.fn(), + }; + jsmind.view = { + add_node: jest.fn(), + show: jest.fn(), + reset_node_custom_style: jest.fn(), + save_location: jest.fn(), + expand_node: jest.fn(), + relayout: jest.fn(), + restore_location: jest.fn(), + remove_node: jest.fn(), + update_node: jest.fn(), + }; + return jsmind; + } + + test('add node', () => { + const jsmind = mock_jsmind(create_fake_mind()); + + jsmind.add_node('node1', 'node2', 'node2'); + const node1 = jsmind.get_node('node1'); + expect(jsmind.layout.calculate_next_child_direction).toBeCalledWith(node1); + expect(jsmind.view.add_node).toBeCalled(); + const node2 = jsmind.get_node('node2'); + expect(node2.parent).toBe(node1); + expect(node2.topic).toBe('node2'); + }); + + test('insert node before', () => { + const jsmind = mock_jsmind(create_fake_mind()); + + jsmind.insert_node_before('node1', 'node2', 'node2'); + const root = jsmind.get_root(); + const node1 = jsmind.get_node('node1'); + const node2 = jsmind.get_node('node2'); + expect(node2.parent).toBe(root); + expect(root.children[0]).toBe(node2); + expect(root.children[1]).toBe(node1); + }); + + test('insert node after', () => { + const jsmind = mock_jsmind(create_fake_mind()); + jsmind.insert_node_after('node1', 'node2', 'node2'); + const root = jsmind.get_root(); + const node1 = jsmind.get_node('node1'); + const node2 = jsmind.get_node('node2'); + expect(node2.parent).toBe(root); + expect(root.children[0]).toBe(node1); + expect(root.children[1]).toBe(node2); + }); + + test('remove node', () => { + const jsmind = mock_jsmind(create_fake_mind()); + jsmind.remove_node('node1'); + expect(jsmind.get_node('node1')).toBeNull(); + }); + + test('update node', () => { + const jsmind = mock_jsmind(create_fake_mind()); + jsmind.update_node('node1', 'node1 new topic'); + expect(jsmind.get_node('node1').topic).toBe('node1 new topic'); + }); + + test('move node', () => { + const jsmind = mock_jsmind(create_fake_mind()); + jsmind.insert_node_after('node1', 'node2', 'node2'); + jsmind.move_node('node2', 'node1', 'root'); + const root = jsmind.get_root(); + const node1 = jsmind.get_node('node1'); + const node2 = jsmind.get_node('node2'); + expect(node2.parent).toBe(root); + expect(root.children[0]).toBe(node2); + expect(root.children[1]).toBe(node1); + }); + + test('find node', () => { + const jsmind = mock_jsmind(create_fake_mind()); + jsmind.insert_node_after('node1', 'node2', 'node2'); + const node1 = jsmind.get_node('node1'); + const node2 = jsmind.get_node('node2'); + expect(jsmind.find_node_before('node1')).toBeNull(); + expect(jsmind.find_node_before('node2')).toBe(node1); + expect(jsmind.find_node_after('node2')).toBeNull(); + expect(jsmind.find_node_after('node1')).toBe(node2); + }); +}); + +test('select node', () => { + const jsmind = create_fake_mind(); + jsmind.layout = { is_visible: jest.fn() }; + jsmind.view = { select_node: jest.fn(), select_clear: jest.fn() }; + jsmind.layout.is_visible.mockReturnValue(true); + jsmind.select_node('node1'); + const node1 = jsmind.get_node('node1'); + expect(jsmind.get_selected_node()).toBe(node1); + jsmind.select_clear(); + expect(jsmind.get_selected_node()).toBeNull; +}); + +describe('style', () => { + function mock_jsmind(jsmind) { + jsmind.enable_edit(); + jsmind.layout = { + layout: jest.fn(), + }; + jsmind.view = { + reset_node_custom_style: jest.fn(), + update_node: jest.fn(), + show: jest.fn(), + }; + return jsmind; + } + test('node color', () => { + const jsmind = mock_jsmind(create_fake_mind()); + const node = jsmind.get_node('node1'); + jsmind.set_node_color('node1', 'bgcolor', 'fgcolor'); + expect(node.data['background-color']).toBe('bgcolor'); + expect(node.data['foreground-color']).toBe('fgcolor'); + }); + test('node font style', () => { + const jsmind = mock_jsmind(create_fake_mind()); + const node = jsmind.get_node('node1'); + jsmind.set_node_font_style('node1', 'size', 'weight', 'style'); + expect(node.data['font-size']).toBe('size'); + expect(node.data['font-weight']).toBe('weight'); + expect(node.data['font-style']).toBe('style'); + }); + test('background image', () => { + const jsmind = mock_jsmind(create_fake_mind()); + const node = jsmind.get_node('node1'); + jsmind.set_node_background_image('node1', 'image', 'width', 'height', 'rotation'); + expect(node.data['background-image']).toBe('image'); + expect(node.data['width']).toBe('width'); + expect(node.data['height']).toBe('height'); + expect(node.data['background-rotation']).toBe('rotation'); + + jsmind.set_node_background_rotation('node1', 'new rotation'); + expect(node.data['background-rotation']).toBe('new rotation'); + }); +}); + +test('event listener', () => { + const jsmind = create_fake_mind(); + const callback1 = jest.fn(); + const callback2 = jest.fn(); + const callback3 = jest.fn(); + $.w.setTimeout = (fn, timeout) => fn(); + + jsmind.add_event_listener(callback1); + jsmind.clear_event_listener(); + jsmind.add_event_listener(callback2); + jsmind.add_event_listener(callback3); + + jsmind.invoke_event_handle('a', 'b'); + expect(callback1).toBeCalledTimes(0); + expect(callback2).toBeCalledWith('a', 'b'); + expect(callback3).toBeCalledWith('a', 'b'); +}); + +function create_fake_mind() { + const jsmind = new jm({ container: 'container' }); + const mind = new jm.mind(); + const root_node = mind.set_root('root', 'root'); + mind.add_node(root_node, 'node1', 'node1'); + jsmind.mind = mind; + return jsmind; +} From c01a05cff8a4fc1cbc45adbb73705a92aa0295e4 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Thu, 30 Jun 2022 18:21:56 +0800 Subject: [PATCH 049/274] refactor some variable (#356) * refactor some variable * update pull request template --- .github/pull_request_template.md | 2 +- es6/jsmind.js | 2 +- es6/jsmind.js.map | 2 +- src/jsmind.format.js | 42 ++++++------- src/jsmind.js | 104 +++++++++++++++---------------- src/jsmind.layout_provider.js | 12 ++-- src/jsmind.mind.js | 58 ++++++++--------- src/jsmind.node.js | 12 ++-- src/jsmind.shortcut_provider.js | 22 +++---- src/jsmind.util.js | 6 +- 10 files changed, 131 insertions(+), 131 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 39c797d4..3a2a685e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,7 +8,7 @@ Please describe the proposal of your pull-request. why, how and what. diff --git a/docs/en/1.usage.md b/docs/en/1.usage.md index d4ca6229..46a32b08 100644 --- a/docs/en/1.usage.md +++ b/docs/en/1.usage.md @@ -16,10 +16,10 @@ At first, 2 files (jsmind.css and jsmind.js) are required. ``` -add script jsmind.draggable.js for enabling drag-and-drop feature. +add script jsmind.draggable-node.js for enabling draggable node feature. ```html - + ``` The second, a div element should be in your HTML as container diff --git a/docs/zh/1.usage.md b/docs/zh/1.usage.md index 40e503a7..b56c6eb7 100644 --- a/docs/zh/1.usage.md +++ b/docs/zh/1.usage.md @@ -16,10 +16,10 @@ ``` -如果希望能够通过鼠标拖拽的方式移动节点,需要额外引用 jsmind.draggable.js 文件 +如果希望能够通过鼠标拖拽的方式移动节点,需要额外引用 jsmind.draggable-node.js 文件 ```html - + ``` 其次,要为 jsMind 准备一个容器,jsMind 将在这个容器里显示思维导图。可自行定义容器的id、大小及样式。 diff --git a/es6/jsmind.draggable.js b/es6/jsmind.draggable-node.js similarity index 99% rename from es6/jsmind.draggable.js rename to es6/jsmind.draggable-node.js index 22dcbc55..9168bb52 100644 --- a/es6/jsmind.draggable.js +++ b/es6/jsmind.draggable-node.js @@ -6,4 +6,4 @@ * https://github.com/hizzgdev/jsmind/ */ !function(){"use strict";if(!jsMind)throw new Error("jsMind is not defined");const t=jsMind,e=t.$,i="getSelection"in e.w?function(){e.w.getSelection().removeAllRanges()}:function(){e.d.selection.empty()},s=5,o=500,n=80;class h{constructor(t){this.jm=t,this.e_canvas=null,this.canvas_ctx=null,this.shadow=null,this.shadow_w=0,this.shadow_h=0,this.active_node=null,this.target_node=null,this.target_direct=null,this.client_w=0,this.client_h=0,this.offset_x=0,this.offset_y=0,this.hlookup_delay=0,this.hlookup_timer=0,this.capture=!1,this.moved=!1}init(){this._create_canvas(),this._create_shadow(),this._event_bind()}resize(){this.jm.view.e_nodes.appendChild(this.shadow),this.e_canvas.width=this.jm.view.size.w,this.e_canvas.height=this.jm.view.size.h}_create_canvas(){var t=e.c("canvas");this.jm.view.e_panel.appendChild(t);var i=t.getContext("2d");this.e_canvas=t,this.canvas_ctx=i}_create_shadow(){var t=e.c("jmnode");t.style.visibility="hidden",t.style.zIndex="3",t.style.cursor="move",t.style.opacity="0.7",this.shadow=t}reset_shadow(t){var e=this.shadow.style;this.shadow.innerHTML=t.innerHTML,e.left=t.style.left,e.top=t.style.top,e.width=t.style.width,e.height=t.style.height,e.backgroundImage=t.style.backgroundImage,e.backgroundSize=t.style.backgroundSize,e.transform=t.style.transform,this.shadow_w=this.shadow.clientWidth,this.shadow_h=this.shadow.clientHeight}show_shadow(){this.moved||(this.shadow.style.visibility="visible")}hide_shadow(){this.shadow.style.visibility="hidden"}_magnet_shadow(t){t&&(this.canvas_ctx.lineWidth=s,this.canvas_ctx.strokeStyle="rgba(0,0,0,0.3)",this.canvas_ctx.lineCap="round",this._clear_lines(),this._canvas_lineto(t.sp.x,t.sp.y,t.np.x,t.np.y))}_clear_lines(){this.canvas_ctx.clearRect(0,0,this.jm.view.size.w,this.jm.view.size.h)}_canvas_lineto(t,e,i,s){this.canvas_ctx.beginPath(),this.canvas_ctx.moveTo(t,e),this.canvas_ctx.lineTo(i,s),this.canvas_ctx.stroke()}_lookup_close_node(){var t,e,i=this.jm.get_root(),o=i.get_location(),n=i.get_size(),h=o.x+n.w/2,a=this.shadow_w,l=this.shadow_h,d=this.shadow.offsetLeft,c=this.shadow.offsetTop,r=d+a/2>=h?jsMind.direction.right:jsMind.direction.left,_=this.jm.mind.nodes,v=null,u=this.jm.layout,w=Number.MAX_VALUE,f=0,m=null,g=null,p=null;for(var y in _){var j,x;if((v=_[y]).isroot||v.direction==r){if(v.id==this.active_node.id)continue;if(!u.is_visible(v))continue;if(t=v.get_size(),e=v.get_location(),r==jsMind.direction.right){if(d-e.x-t.w<=0)continue;f=Math.abs(d-e.x-t.w)+Math.abs(c+l/2-e.y-t.h/2),j={x:e.x+t.w-s,y:e.y+t.h/2},x={x:d+s,y:c+l/2}}else{if(e.x-d-a<=0)continue;f=Math.abs(d+a-e.x)+Math.abs(c+l/2-e.y-t.h/2),j={x:e.x+s,y:e.y+t.h/2},x={x:d+a-s,y:c+l/2}}f0&&c= root_x ? jsMind.direction.right : jsMind.direction.left;\n var nodes = this.jm.mind.nodes;\n var node = null;\n var layout = this.jm.layout;\n var min_distance = Number.MAX_VALUE;\n var distance = 0;\n var closest_node = null;\n var closest_p = null;\n var shadow_p = null;\n for (var nodeid in nodes) {\n var np, sp;\n node = nodes[nodeid];\n if (node.isroot || node.direction == direct) {\n if (node.id == this.active_node.id) {\n continue;\n }\n if (!layout.is_visible(node)) {\n continue;\n }\n ns = node.get_size();\n nl = node.get_location();\n if (direct == jsMind.direction.right) {\n if (sx - nl.x - ns.w <= 0) {\n continue;\n }\n distance = Math.abs(sx - nl.x - ns.w) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + ns.w - options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + options.line_width, y: sy + sh / 2 };\n } else {\n if (nl.x - sx - sw <= 0) {\n continue;\n }\n distance = Math.abs(sx + sw - nl.x) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + sw - options.line_width, y: sy + sh / 2 };\n }\n if (distance < min_distance) {\n closest_node = node;\n closest_p = np;\n shadow_p = sp;\n min_distance = distance;\n }\n }\n }\n var result_node = null;\n if (!!closest_node) {\n result_node = {\n node: closest_node,\n direction: direct,\n sp: shadow_p,\n np: closest_p,\n };\n }\n return result_node;\n }\n lookup_close_node() {\n var node_data = this._lookup_close_node();\n if (!!node_data) {\n this._magnet_shadow(node_data);\n this.target_node = node_data.node;\n this.target_direct = node_data.direction;\n }\n }\n _event_bind() {\n var jd = this;\n var container = this.jm.view.container;\n $.on(container, 'mousedown', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'mousemove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'mouseup', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n $.on(container, 'touchstart', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'touchmove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'touchend', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n }\n dragstart(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n return;\n }\n this.active_node = null;\n\n var jview = this.jm.view;\n var el = e.target || event.srcElement;\n if (el.tagName.toLowerCase() != 'jmnode') {\n return;\n }\n var nodeid = jview.get_binded_nodeid(el);\n if (!!nodeid) {\n var node = this.jm.get_node(nodeid);\n if (!node.isroot) {\n this.reset_shadow(el);\n this.active_node = node;\n this.offset_x =\n (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft;\n this.offset_y =\n (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop;\n this.client_hw = Math.floor(el.clientWidth / 2);\n this.client_hh = Math.floor(el.clientHeight / 2);\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n }\n var jd = this;\n this.hlookup_delay = $.w.setTimeout(function () {\n jd.hlookup_delay = 0;\n jd.hlookup_timer = $.w.setInterval(function () {\n jd.lookup_close_node.call(jd);\n }, options.lookup_interval);\n }, options.lookup_delay);\n this.capture = true;\n }\n }\n }\n drag(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n e.preventDefault();\n this.show_shadow();\n this.moved = true;\n clear_selection();\n var jview = this.jm.view;\n var px = (e.clientX || e.touches[0].clientX) / jview.actualZoom - this.offset_x;\n var py = (e.clientY || e.touches[0].clientY) / jview.actualZoom - this.offset_y;\n this.shadow.style.left = px + 'px';\n this.shadow.style.top = py + 'px';\n clear_selection();\n }\n }\n dragend(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n this.hlookup_delay = 0;\n this._clear_lines();\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n this.hlookup_timer = 0;\n this._clear_lines();\n }\n if (this.moved) {\n var src_node = this.active_node;\n var target_node = this.target_node;\n var target_direct = this.target_direct;\n this.move_node(src_node, target_node, target_direct);\n }\n this.hide_shadow();\n }\n this.moved = false;\n this.capture = false;\n }\n move_node(src_node, target_node, target_direct) {\n var shadow_h = this.shadow.offsetTop;\n if (!!target_node && !!src_node && !jsMind.node.inherited(src_node, target_node)) {\n // lookup before_node\n var sibling_nodes = target_node.children;\n var sc = sibling_nodes.length;\n var node = null;\n var delta_y = Number.MAX_VALUE;\n var node_before = null;\n var beforeid = '_last_';\n while (sc--) {\n node = sibling_nodes[sc];\n if (node.direction == target_direct && node.id != src_node.id) {\n var dy = node.get_location().y - shadow_h;\n if (dy > 0 && dy < delta_y) {\n delta_y = dy;\n node_before = node;\n beforeid = '_first_';\n }\n }\n }\n if (!!node_before) {\n beforeid = node_before.id;\n }\n this.jm.move_node(src_node.id, beforeid, target_node.id, target_direct);\n }\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\nvar draggable_plugin = new jm.plugin('draggable', function (jm) {\n var jd = new draggable(jm);\n jd.init();\n jm.add_event_listener(function (type, data) {\n jd.jm_event_handle.call(jd, type, data);\n });\n});\n\njsMind.register_plugin(draggable_plugin);\n"],"names":["jsMind","Error","jm","$","clear_selection","w","getSelection","removeAllRanges","d","selection","empty","options","draggable","constructor","this","e_canvas","canvas_ctx","shadow","shadow_w","shadow_h","active_node","target_node","target_direct","client_w","client_h","offset_x","offset_y","hlookup_delay","hlookup_timer","capture","moved","init","_create_canvas","_create_shadow","_event_bind","resize","view","e_nodes","appendChild","width","size","height","h","c","e_panel","ctx","getContext","s","style","visibility","zIndex","cursor","opacity","reset_shadow","el","innerHTML","left","top","backgroundImage","backgroundSize","transform","clientWidth","clientHeight","show_shadow","hide_shadow","_magnet_shadow","node","lineWidth","strokeStyle","lineCap","_clear_lines","_canvas_lineto","sp","x","y","np","clearRect","x1","y1","x2","y2","beginPath","moveTo","lineTo","stroke","_lookup_close_node","ns","nl","root","get_root","root_location","get_location","root_size","get_size","root_x","sw","sh","sx","offsetLeft","sy","offsetTop","direct","direction","right","nodes","mind","layout","min_distance","Number","MAX_VALUE","distance","closest_node","closest_p","shadow_p","nodeid","isroot","id","is_visible","Math","abs","result_node","lookup_close_node","node_data","jd","container","on","e","evt","event","dragstart","call","drag","dragend","get_editable","jview","target","srcElement","tagName","toLowerCase","get_binded_nodeid","get_node","clientX","touches","actualZoom","clientY","client_hw","floor","client_hh","clearTimeout","clearInterval","setTimeout","setInterval","preventDefault","px","py","src_node","move_node","inherited","sibling_nodes","children","sc","length","delta_y","node_before","beforeid","dy","jm_event_handle","type","data","event_type","draggable_plugin","plugin","add_event_listener","register_plugin"],"mappings":"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"} \ No newline at end of file diff --git a/es6/jsmind.draggable.js.map b/es6/jsmind.draggable.js.map deleted file mode 100644 index 907c3f0f..00000000 --- a/es6/jsmind.draggable.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"jsmind.draggable.js","sources":["../src/plugins/jsmind.draggable.js"],"sourcesContent":["/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nif (!jsMind) {\n throw new Error('jsMind is not defined');\n}\n\nconst jm = jsMind;\nconst $ = jm.$;\n\nconst clear_selection =\n 'getSelection' in $.w\n ? function () {\n $.w.getSelection().removeAllRanges();\n }\n : function () {\n $.d.selection.empty();\n };\n\nconst options = {\n line_width: 5,\n lookup_delay: 500,\n lookup_interval: 80,\n};\n\nclass draggable {\n constructor(jm) {\n this.jm = jm;\n this.e_canvas = null;\n this.canvas_ctx = null;\n this.shadow = null;\n this.shadow_w = 0;\n this.shadow_h = 0;\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n this.client_w = 0;\n this.client_h = 0;\n this.offset_x = 0;\n this.offset_y = 0;\n this.hlookup_delay = 0;\n this.hlookup_timer = 0;\n this.capture = false;\n this.moved = false;\n }\n init() {\n this._create_canvas();\n this._create_shadow();\n this._event_bind();\n }\n resize() {\n this.jm.view.e_nodes.appendChild(this.shadow);\n this.e_canvas.width = this.jm.view.size.w;\n this.e_canvas.height = this.jm.view.size.h;\n }\n _create_canvas() {\n var c = $.c('canvas');\n this.jm.view.e_panel.appendChild(c);\n var ctx = c.getContext('2d');\n this.e_canvas = c;\n this.canvas_ctx = ctx;\n }\n _create_shadow() {\n var s = $.c('jmnode');\n s.style.visibility = 'hidden';\n s.style.zIndex = '3';\n s.style.cursor = 'move';\n s.style.opacity = '0.7';\n this.shadow = s;\n }\n reset_shadow(el) {\n var s = this.shadow.style;\n this.shadow.innerHTML = el.innerHTML;\n s.left = el.style.left;\n s.top = el.style.top;\n s.width = el.style.width;\n s.height = el.style.height;\n s.backgroundImage = el.style.backgroundImage;\n s.backgroundSize = el.style.backgroundSize;\n s.transform = el.style.transform;\n this.shadow_w = this.shadow.clientWidth;\n this.shadow_h = this.shadow.clientHeight;\n }\n show_shadow() {\n if (!this.moved) {\n this.shadow.style.visibility = 'visible';\n }\n }\n hide_shadow() {\n this.shadow.style.visibility = 'hidden';\n }\n _magnet_shadow(node) {\n if (!!node) {\n this.canvas_ctx.lineWidth = options.line_width;\n this.canvas_ctx.strokeStyle = 'rgba(0,0,0,0.3)';\n this.canvas_ctx.lineCap = 'round';\n this._clear_lines();\n this._canvas_lineto(node.sp.x, node.sp.y, node.np.x, node.np.y);\n }\n }\n _clear_lines() {\n this.canvas_ctx.clearRect(0, 0, this.jm.view.size.w, this.jm.view.size.h);\n }\n _canvas_lineto(x1, y1, x2, y2) {\n this.canvas_ctx.beginPath();\n this.canvas_ctx.moveTo(x1, y1);\n this.canvas_ctx.lineTo(x2, y2);\n this.canvas_ctx.stroke();\n }\n _lookup_close_node() {\n var root = this.jm.get_root();\n var root_location = root.get_location();\n var root_size = root.get_size();\n var root_x = root_location.x + root_size.w / 2;\n\n var sw = this.shadow_w;\n var sh = this.shadow_h;\n var sx = this.shadow.offsetLeft;\n var sy = this.shadow.offsetTop;\n\n var ns, nl;\n\n var direct = sx + sw / 2 >= root_x ? jsMind.direction.right : jsMind.direction.left;\n var nodes = this.jm.mind.nodes;\n var node = null;\n var layout = this.jm.layout;\n var min_distance = Number.MAX_VALUE;\n var distance = 0;\n var closest_node = null;\n var closest_p = null;\n var shadow_p = null;\n for (var nodeid in nodes) {\n var np, sp;\n node = nodes[nodeid];\n if (node.isroot || node.direction == direct) {\n if (node.id == this.active_node.id) {\n continue;\n }\n if (!layout.is_visible(node)) {\n continue;\n }\n ns = node.get_size();\n nl = node.get_location();\n if (direct == jsMind.direction.right) {\n if (sx - nl.x - ns.w <= 0) {\n continue;\n }\n distance = Math.abs(sx - nl.x - ns.w) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + ns.w - options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + options.line_width, y: sy + sh / 2 };\n } else {\n if (nl.x - sx - sw <= 0) {\n continue;\n }\n distance = Math.abs(sx + sw - nl.x) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + sw - options.line_width, y: sy + sh / 2 };\n }\n if (distance < min_distance) {\n closest_node = node;\n closest_p = np;\n shadow_p = sp;\n min_distance = distance;\n }\n }\n }\n var result_node = null;\n if (!!closest_node) {\n result_node = {\n node: closest_node,\n direction: direct,\n sp: shadow_p,\n np: closest_p,\n };\n }\n return result_node;\n }\n lookup_close_node() {\n var node_data = this._lookup_close_node();\n if (!!node_data) {\n this._magnet_shadow(node_data);\n this.target_node = node_data.node;\n this.target_direct = node_data.direction;\n }\n }\n _event_bind() {\n var jd = this;\n var container = this.jm.view.container;\n $.on(container, 'mousedown', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'mousemove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'mouseup', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n $.on(container, 'touchstart', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'touchmove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'touchend', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n }\n dragstart(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n return;\n }\n this.active_node = null;\n\n var jview = this.jm.view;\n var el = e.target || event.srcElement;\n if (el.tagName.toLowerCase() != 'jmnode') {\n return;\n }\n var nodeid = jview.get_binded_nodeid(el);\n if (!!nodeid) {\n var node = this.jm.get_node(nodeid);\n if (!node.isroot) {\n this.reset_shadow(el);\n this.active_node = node;\n this.offset_x =\n (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft;\n this.offset_y =\n (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop;\n this.client_hw = Math.floor(el.clientWidth / 2);\n this.client_hh = Math.floor(el.clientHeight / 2);\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n }\n var jd = this;\n this.hlookup_delay = $.w.setTimeout(function () {\n jd.hlookup_delay = 0;\n jd.hlookup_timer = $.w.setInterval(function () {\n jd.lookup_close_node.call(jd);\n }, options.lookup_interval);\n }, options.lookup_delay);\n this.capture = true;\n }\n }\n }\n drag(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n e.preventDefault();\n this.show_shadow();\n this.moved = true;\n clear_selection();\n var jview = this.jm.view;\n var px = (e.clientX || e.touches[0].clientX) / jview.actualZoom - this.offset_x;\n var py = (e.clientY || e.touches[0].clientY) / jview.actualZoom - this.offset_y;\n this.shadow.style.left = px + 'px';\n this.shadow.style.top = py + 'px';\n clear_selection();\n }\n }\n dragend(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n this.hlookup_delay = 0;\n this._clear_lines();\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n this.hlookup_timer = 0;\n this._clear_lines();\n }\n if (this.moved) {\n var src_node = this.active_node;\n var target_node = this.target_node;\n var target_direct = this.target_direct;\n this.move_node(src_node, target_node, target_direct);\n }\n this.hide_shadow();\n }\n this.moved = false;\n this.capture = false;\n }\n move_node(src_node, target_node, target_direct) {\n var shadow_h = this.shadow.offsetTop;\n if (!!target_node && !!src_node && !jsMind.node.inherited(src_node, target_node)) {\n // lookup before_node\n var sibling_nodes = target_node.children;\n var sc = sibling_nodes.length;\n var node = null;\n var delta_y = Number.MAX_VALUE;\n var node_before = null;\n var beforeid = '_last_';\n while (sc--) {\n node = sibling_nodes[sc];\n if (node.direction == target_direct && node.id != src_node.id) {\n var dy = node.get_location().y - shadow_h;\n if (dy > 0 && dy < delta_y) {\n delta_y = dy;\n node_before = node;\n beforeid = '_first_';\n }\n }\n }\n if (!!node_before) {\n beforeid = node_before.id;\n }\n this.jm.move_node(src_node.id, beforeid, target_node.id, target_direct);\n }\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\nvar draggable_plugin = new jm.plugin('draggable', function (jm) {\n var jd = new draggable(jm);\n jd.init();\n jm.add_event_listener(function (type, data) {\n jd.jm_event_handle.call(jd, type, data);\n });\n});\n\njsMind.register_plugin(draggable_plugin);\n"],"names":["jsMind","Error","jm","$","clear_selection","w","getSelection","removeAllRanges","d","selection","empty","options","draggable","constructor","this","e_canvas","canvas_ctx","shadow","shadow_w","shadow_h","active_node","target_node","target_direct","client_w","client_h","offset_x","offset_y","hlookup_delay","hlookup_timer","capture","moved","init","_create_canvas","_create_shadow","_event_bind","resize","view","e_nodes","appendChild","width","size","height","h","c","e_panel","ctx","getContext","s","style","visibility","zIndex","cursor","opacity","reset_shadow","el","innerHTML","left","top","backgroundImage","backgroundSize","transform","clientWidth","clientHeight","show_shadow","hide_shadow","_magnet_shadow","node","lineWidth","strokeStyle","lineCap","_clear_lines","_canvas_lineto","sp","x","y","np","clearRect","x1","y1","x2","y2","beginPath","moveTo","lineTo","stroke","_lookup_close_node","ns","nl","root","get_root","root_location","get_location","root_size","get_size","root_x","sw","sh","sx","offsetLeft","sy","offsetTop","direct","direction","right","nodes","mind","layout","min_distance","Number","MAX_VALUE","distance","closest_node","closest_p","shadow_p","nodeid","isroot","id","is_visible","Math","abs","result_node","lookup_close_node","node_data","jd","container","on","e","evt","event","dragstart","call","drag","dragend","get_editable","jview","target","srcElement","tagName","toLowerCase","get_binded_nodeid","get_node","clientX","touches","actualZoom","clientY","client_hw","floor","client_hh","clearTimeout","clearInterval","setTimeout","setInterval","preventDefault","px","py","src_node","move_node","inherited","sibling_nodes","children","sc","length","delta_y","node_before","beforeid","dy","jm_event_handle","type","data","event_type","draggable_plugin","plugin","add_event_listener","register_plugin"],"mappings":"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"} \ No newline at end of file diff --git a/example/1_basic.html b/example/1_basic.html index 7dda9732..0d295d81 100644 --- a/example/1_basic.html +++ b/example/1_basic.html @@ -18,7 +18,7 @@
    - + - + - + - + - + + + @@ -43,7 +50,8 @@ jsMind is mind map library built by javascript, it base on html5 canvas and svg. - Project Home : - on Github: - - on npm : + - on NPM: + - on CDN: - Apps : - - @@ -68,8 +76,8 @@ jsMind is mind map library built by javascript, it base on html5 canvas and svg. - Will be launched in 2023 H1 - NPM Pilot Version: `0.5.1` - Code Location - - 源码位于 `/src`, 可运行于浏览器的 js 文件位于 `/es6` - - The source code is located in `/src`, and the js files that can run in browsers are located in `/es6` + - 源码位于 `/src`, 可运行于浏览器的 js 文件将生成于 `/es6` + - The source code is located in `/src`, and the js files that can run in browsers will be generated into `/es6` - Demo: ## Maintainer diff --git a/es6/jsmind.draggable-node.js b/es6/jsmind.draggable-node.js deleted file mode 100644 index 01dcf33b..00000000 --- a/es6/jsmind.draggable-node.js +++ /dev/null @@ -1,9 +0,0 @@ -/** -* @license BSD-3-Clause -* @copyright 2014-2022 hizzgdev@163.com -* -* Project Home: -* https://github.com/hizzgdev/jsmind/ -*/ -!function(){"use strict";if(!jsMind)throw new Error("jsMind is not defined");const t=jsMind,e=t.$,i="getSelection"in e.w?function(){e.w.getSelection().removeAllRanges()}:function(){e.d.selection.empty()},s=5,a=500,o=80;class h{constructor(t){this.jm=t,this.e_canvas=null,this.canvas_ctx=null,this.shadow=null,this.shadow_w=0,this.shadow_h=0,this.active_node=null,this.target_node=null,this.target_direct=null,this.client_w=0,this.client_h=0,this.offset_x=0,this.offset_y=0,this.hlookup_delay=0,this.hlookup_timer=0,this.capture=!1,this.moved=!1,this.canvas_draggable=this.jm.get_view_draggable()}init(){this._create_canvas(),this._create_shadow(),this._event_bind()}resize(){this.jm.view.e_nodes.appendChild(this.shadow),this.e_canvas.width=this.jm.view.size.w,this.e_canvas.height=this.jm.view.size.h}_create_canvas(){var t=e.c("canvas");this.jm.view.e_panel.appendChild(t);var i=t.getContext("2d");this.e_canvas=t,this.canvas_ctx=i}_create_shadow(){var t=e.c("jmnode");t.style.visibility="hidden",t.style.zIndex="3",t.style.cursor="move",t.style.opacity="0.7",this.shadow=t}reset_shadow(t){var e=this.shadow.style;this.shadow.innerHTML=t.innerHTML,e.left=t.style.left,e.top=t.style.top,e.width=t.style.width,e.height=t.style.height,e.backgroundImage=t.style.backgroundImage,e.backgroundSize=t.style.backgroundSize,e.transform=t.style.transform,this.shadow_w=this.shadow.clientWidth,this.shadow_h=this.shadow.clientHeight}show_shadow(){this.moved||(this.shadow.style.visibility="visible")}hide_shadow(){this.shadow.style.visibility="hidden"}_magnet_shadow(t){t&&(this.canvas_ctx.lineWidth=s,this.canvas_ctx.strokeStyle="rgba(0,0,0,0.3)",this.canvas_ctx.lineCap="round",this._clear_lines(),this._canvas_lineto(t.sp.x,t.sp.y,t.np.x,t.np.y))}_clear_lines(){this.canvas_ctx.clearRect(0,0,this.jm.view.size.w,this.jm.view.size.h)}_canvas_lineto(t,e,i,s){this.canvas_ctx.beginPath(),this.canvas_ctx.moveTo(t,e),this.canvas_ctx.lineTo(i,s),this.canvas_ctx.stroke()}_lookup_close_node(){var t,e,i=this.jm.get_root(),a=i.get_location(),o=i.get_size(),h=a.x+o.w/2,n=this.shadow_w,l=this.shadow_h,d=this.shadow.offsetLeft,r=this.shadow.offsetTop,_=d+n/2>=h?jsMind.direction.right:jsMind.direction.left,c=this.jm.mind.nodes,v=null,u=this.jm.layout,w=Number.MAX_VALUE,g=0,m=null,f=null,p=null;for(var y in c){var j,b;if((v=c[y]).isroot||v.direction==_){if(v.id==this.active_node.id)continue;if(!u.is_visible(v))continue;if(t=v.get_size(),e=v.get_location(),_==jsMind.direction.right){if(d-e.x-t.w<=0)continue;g=Math.abs(d-e.x-t.w)+Math.abs(r+l/2-e.y-t.h/2),j={x:e.x+t.w-s,y:e.y+t.h/2},b={x:d+s,y:r+l/2}}else{if(e.x-d-n<=0)continue;g=Math.abs(d+n-e.x)+Math.abs(r+l/2-e.y-t.h/2),j={x:e.x+s,y:e.y+t.h/2},b={x:d+n-s,y:r+l/2}}g0&&r= root_x ? jsMind.direction.right : jsMind.direction.left;\n var nodes = this.jm.mind.nodes;\n var node = null;\n var layout = this.jm.layout;\n var min_distance = Number.MAX_VALUE;\n var distance = 0;\n var closest_node = null;\n var closest_p = null;\n var shadow_p = null;\n for (var nodeid in nodes) {\n var np, sp;\n node = nodes[nodeid];\n if (node.isroot || node.direction == direct) {\n if (node.id == this.active_node.id) {\n continue;\n }\n if (!layout.is_visible(node)) {\n continue;\n }\n ns = node.get_size();\n nl = node.get_location();\n if (direct == jsMind.direction.right) {\n if (sx - nl.x - ns.w <= 0) {\n continue;\n }\n distance = Math.abs(sx - nl.x - ns.w) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + ns.w - options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + options.line_width, y: sy + sh / 2 };\n } else {\n if (nl.x - sx - sw <= 0) {\n continue;\n }\n distance = Math.abs(sx + sw - nl.x) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2);\n np = { x: nl.x + options.line_width, y: nl.y + ns.h / 2 };\n sp = { x: sx + sw - options.line_width, y: sy + sh / 2 };\n }\n if (distance < min_distance) {\n closest_node = node;\n closest_p = np;\n shadow_p = sp;\n min_distance = distance;\n }\n }\n }\n var result_node = null;\n if (!!closest_node) {\n result_node = {\n node: closest_node,\n direction: direct,\n sp: shadow_p,\n np: closest_p,\n };\n }\n return result_node;\n }\n lookup_close_node() {\n var node_data = this._lookup_close_node();\n if (!!node_data) {\n this._magnet_shadow(node_data);\n this.target_node = node_data.node;\n this.target_direct = node_data.direction;\n }\n }\n _event_bind() {\n var jd = this;\n var container = this.jm.view.container;\n $.on(container, 'mousedown', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'mousemove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'mouseup', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n $.on(container, 'touchstart', function (e) {\n var evt = e || event;\n jd.dragstart.call(jd, evt);\n });\n $.on(container, 'touchmove', function (e) {\n var evt = e || event;\n jd.drag.call(jd, evt);\n });\n $.on(container, 'touchend', function (e) {\n var evt = e || event;\n jd.dragend.call(jd, evt);\n });\n }\n dragstart(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n return;\n }\n this.active_node = null;\n this.view_draggable = this.jm.get_view_draggable();\n\n var jview = this.jm.view;\n var el = e.target || event.srcElement;\n if (el.tagName.toLowerCase() != 'jmnode') {\n return;\n }\n if (this.view_draggable) {\n this.jm.disable_view_draggable();\n }\n var nodeid = jview.get_binded_nodeid(el);\n if (!!nodeid) {\n var node = this.jm.get_node(nodeid);\n if (!node.isroot) {\n this.reset_shadow(el);\n this.active_node = node;\n this.offset_x =\n (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft;\n this.offset_y =\n (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop;\n this.client_hw = Math.floor(el.clientWidth / 2);\n this.client_hh = Math.floor(el.clientHeight / 2);\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n }\n var jd = this;\n this.hlookup_delay = $.w.setTimeout(function () {\n jd.hlookup_delay = 0;\n jd.hlookup_timer = $.w.setInterval(function () {\n jd.lookup_close_node.call(jd);\n }, options.lookup_interval);\n }, options.lookup_delay);\n this.capture = true;\n }\n }\n }\n drag(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.capture) {\n e.preventDefault();\n this.show_shadow();\n this.moved = true;\n clear_selection();\n var jview = this.jm.view;\n var px = (e.clientX || e.touches[0].clientX) / jview.actualZoom - this.offset_x;\n var py = (e.clientY || e.touches[0].clientY) / jview.actualZoom - this.offset_y;\n this.shadow.style.left = px + 'px';\n this.shadow.style.top = py + 'px';\n clear_selection();\n }\n }\n dragend(e) {\n if (!this.jm.get_editable()) {\n return;\n }\n if (this.view_draggable) {\n this.jm.enable_view_draggable();\n }\n if (this.capture) {\n if (this.hlookup_delay != 0) {\n $.w.clearTimeout(this.hlookup_delay);\n this.hlookup_delay = 0;\n this._clear_lines();\n }\n if (this.hlookup_timer != 0) {\n $.w.clearInterval(this.hlookup_timer);\n this.hlookup_timer = 0;\n this._clear_lines();\n }\n if (this.moved) {\n var src_node = this.active_node;\n var target_node = this.target_node;\n var target_direct = this.target_direct;\n this.move_node(src_node, target_node, target_direct);\n }\n this.hide_shadow();\n }\n this.moved = false;\n this.capture = false;\n }\n move_node(src_node, target_node, target_direct) {\n var shadow_h = this.shadow.offsetTop;\n if (!!target_node && !!src_node && !jsMind.node.inherited(src_node, target_node)) {\n // lookup before_node\n var sibling_nodes = target_node.children;\n var sc = sibling_nodes.length;\n var node = null;\n var delta_y = Number.MAX_VALUE;\n var node_before = null;\n var beforeid = '_last_';\n while (sc--) {\n node = sibling_nodes[sc];\n if (node.direction == target_direct && node.id != src_node.id) {\n var dy = node.get_location().y - shadow_h;\n if (dy > 0 && dy < delta_y) {\n delta_y = dy;\n node_before = node;\n beforeid = '_first_';\n }\n }\n }\n if (!!node_before) {\n beforeid = node_before.id;\n }\n this.jm.move_node(src_node.id, beforeid, target_node.id, target_direct);\n }\n this.active_node = null;\n this.target_node = null;\n this.target_direct = null;\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\nvar draggable_plugin = new jm.plugin('draggable_node', function (jm) {\n var jd = new DraggableNode(jm);\n jd.init();\n jm.add_event_listener(function (type, data) {\n jd.jm_event_handle.call(jd, type, data);\n });\n});\n\njsMind.register_plugin(draggable_plugin);\n"],"names":["jsMind","Error","jm","$","clear_selection","w","getSelection","removeAllRanges","d","selection","empty","options","DraggableNode","constructor","this","e_canvas","canvas_ctx","shadow","shadow_w","shadow_h","active_node","target_node","target_direct","client_w","client_h","offset_x","offset_y","hlookup_delay","hlookup_timer","capture","moved","canvas_draggable","get_view_draggable","init","_create_canvas","_create_shadow","_event_bind","resize","view","e_nodes","appendChild","width","size","height","h","c","e_panel","ctx","getContext","s","style","visibility","zIndex","cursor","opacity","reset_shadow","el","innerHTML","left","top","backgroundImage","backgroundSize","transform","clientWidth","clientHeight","show_shadow","hide_shadow","_magnet_shadow","node","lineWidth","strokeStyle","lineCap","_clear_lines","_canvas_lineto","sp","x","y","np","clearRect","x1","y1","x2","y2","beginPath","moveTo","lineTo","stroke","_lookup_close_node","ns","nl","root","get_root","root_location","get_location","root_size","get_size","root_x","sw","sh","sx","offsetLeft","sy","offsetTop","direct","direction","right","nodes","mind","layout","min_distance","Number","MAX_VALUE","distance","closest_node","closest_p","shadow_p","nodeid","isroot","id","is_visible","Math","abs","result_node","lookup_close_node","node_data","jd","container","on","e","evt","event","dragstart","call","drag","dragend","get_editable","view_draggable","jview","target","srcElement","tagName","toLowerCase","disable_view_draggable","get_binded_nodeid","get_node","clientX","touches","actualZoom","clientY","client_hw","floor","client_hh","clearTimeout","clearInterval","setTimeout","setInterval","preventDefault","px","py","enable_view_draggable","src_node","move_node","inherited","sibling_nodes","children","sc","length","delta_y","node_before","beforeid","dy","jm_event_handle","type","data","event_type","draggable_plugin","plugin","add_event_listener","register_plugin"],"mappings":"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"} \ No newline at end of file diff --git a/es6/jsmind.js b/es6/jsmind.js deleted file mode 100644 index dc3a15c1..00000000 --- a/es6/jsmind.js +++ /dev/null @@ -1,9 +0,0 @@ -/** -* @license BSD-3-Clause -* @copyright 2014-2022 hizzgdev@163.com -* -* Project Home: -* https://github.com/hizzgdev/jsmind/ -*/ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).jsMind=t()}(this,(function(){"use strict";const e="0.5.0",t="hizzgdev@163.com";"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e){return this.slice(0,e.length)===e});const i={left:-1,center:0,right:1},n={show:1,resize:2,edit:3,select:4},o={debug:1,info:2,warn:3,error:4,disable:9};var s=function(){};let a="undefined"==typeof console?{level:s,log:s,debug:s,info:s,warn:s,error:s}:{level:function(e){a.debug=e>o.debug?s:console.debug;a.info=e>o.info?s:console.info;a.warn=e>o.warn?s:console.warn;a.error=e>o.error?s:console.error},log:console.log,debug:console.debug,info:console.info,warn:console.warn,error:console.error};const r=new class{constructor(e){this.w=e,this.d=e.document,this.g=function(e){return this.d.getElementById(e)},this.c=function(e){return this.d.createElement(e)},this.t=function(e,t){e.hasChildNodes()?e.firstChild.nodeValue=t:e.appendChild(this.d.createTextNode(t))},this.h=function(e,t){t instanceof HTMLElement?(e.innerHTML="",e.appendChild(t)):e.innerHTML=t},this.i=function(e){return!!e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument},this.on=function(e,t,i){e.addEventListener?e.addEventListener(t,i,!1):e.attachEvent("on"+t,i)}}}(window),d={ajax:{request:function(e,t,i,n,o){var s=Object.keys(t).map((e=>encodeURIComponent(e)+"="+encodeURIComponent(t[e]))).join("&"),r=new XMLHttpRequest;r&&(r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status||0==r.status){if("function"==typeof n){var e=d.json.string2json(r.responseText);n(null!=e?e:r.responseText)}}else"function"==typeof o?o(r):a.error("xhr request failed.",r)},i=i||"GET",r.open(i,e,!0),r.setRequestHeader("If-Modified-Since","0"),"POST"==i?(r.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),r.send(s)):r.send())},get:function(e,t){return d.ajax.request(e,{},"GET",t)},post:function(e,t,i){return d.ajax.request(e,t,"POST",i)}},file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof r.w.Blob)n=new Blob([e],{type:t});else{var o=new(r.w.BlobBuilder||r.w.MozBlobBuilder||r.w.WebKitBlobBuilder||r.w.MSBlobBuilder);o.append(e),n=o.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var s=(r.w.URL||r.w.webkitURL).createObjectURL(n),a=r.c("a");if("download"in a){a.style.visibility="hidden",a.href=s,a.download=i,r.d.body.appendChild(a);var d=r.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),a.dispatchEvent(d),r.d.body.removeChild(a)}else location.href=s}}},json:{json2string:function(e){return JSON.stringify(e)},string2json:function(e){return JSON.parse(e)},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:d.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substring(2)).substring(2,18)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}},l={container:"",editable:!1,theme:null,mode:"full",support_html:!0,log_level:"info",view:{engine:"canvas",hmargin:100,vmargin:50,line_width:2,line_color:"#555",draggable:!1,hide_scrollbars_when_draggable:!1},layout:{hspace:30,vspace:20,pspace:13},default_event_handle:{enable_mousedown_handle:!0,enable_click_handle:!0,enable_dblclick_handle:!0,enable_mousewheel_handle:!0},shortcut:{enable:!0,handles:{},mapping:{addchild:[45,4109],addbrother:13,editnode:113,delnode:46,toggle:32,left:37,up:38,right:39,down:40}}};class h{constructor(e,t,i,n,o,s,r,d){e?"number"==typeof t?(void 0===d&&(d=!0),this.id=e,this.index=t,this.topic=i,this.data=n||{},this.isroot=o,this.parent=s,this.direction=r,this.expanded=!!d,this.children=[],this._data={}):a.error("invalid node index"):a.error("invalid node id")}get_location(){var e=this._data.view;return{x:e.abs_x,y:e.abs_y}}get_size(){var e=this._data.view;return{w:e.width,h:e.height}}static compare(e,t){var i=e.index,n=t.index;return i>=0&&n>=0?i-n:-1==i&&-1==n?0:-1==i?1:-1==n?-1:0}static inherited(e,t){if(e&&t){if(e.id===t.id)return!0;if(e.isroot)return!0;for(var i=e.id,n=t;!n.isroot;)if((n=n.parent).id===i)return!0}return!1}static is_node(e){return!!e&&e instanceof h}}class _{constructor(){this.name=null,this.author=null,this.version=null,this.root=null,this.selected=null,this.nodes={}}get_node(e){return e in this.nodes?this.nodes[e]:(a.warn("the node[id="+e+"] can not be found"),null)}set_root(e,t,i){return null==this.root?(this.root=new h(e,0,t,i,!0),this._put_node(this.root),this.root):(a.error("root node is already exist"),null)}add_node(e,t,n,o,s,r,d){if(!h.is_node(e))return a.error("the parent_node "+e+" is not a node."),null;var l=new h(t,d||-1,n,o,!1,e,e.direction,r);return e.isroot&&(l.direction=s||i.right),this._put_node(l)?(e.children.push(l),this._update_index(e)):(a.error("fail, the node id '"+l.id+"' has been already exist."),l=null),l}insert_node_before(e,t,i,n,o){if(!h.is_node(e))return a.error("the node_before "+e+" is not a node."),null;var s=e.index-.5;return this.add_node(e.parent,t,i,n,o,!0,s)}get_node_before(e){if(!h.is_node(e)){var t=this.get_node(e);return t?this.get_node_before(t):(a.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index-2;return i>=0?e.parent.children[i]:null}insert_node_after(e,t,i,n,o){if(!h.is_node(e))return a.error("the node_after "+e+" is not a node."),null;var s=e.index+.5;return this.add_node(e.parent,t,i,n,o,!0,s)}get_node_after(e){if(!h.is_node(e)){var t=this.get_node(e);return t?this.get_node_after(t):(a.error("the node[id="+e+"] can not be found."),null)}if(e.isroot)return null;var i=e.index;return e.parent.children.length>i?e.parent.children[i]:null}move_node(e,t,i,n){return h.is_node(e)?(i||(i=e.parent.id),this._move_node(e,t,i,n)):(a.error("the parameter node "+e+" is not a node."),null)}_flow_node_direction(e,t){void 0===t?t=e.direction:e.direction=t;for(var i=e.children.length;i--;)this._flow_node_direction(e.children[i],t)}_move_node_internal(e,t){if(e&&t)if("_last_"==t)e.index=-1,this._update_index(e.parent);else if("_first_"==t)e.index=0,this._update_index(e.parent);else{var i=t?this.get_node(t):null;null!=i&&null!=i.parent&&i.parent.id==e.parent.id&&(e.index=i.index-.5,this._update_index(e.parent))}return e}_move_node(e,t,n,o){if(e&&n){var s=this.get_node(n);if(h.inherited(e,s))return a.error("can not move a node to its children"),null;if(e.parent.id!=n){for(var r=e.parent.children,d=r.length;d--;)if(r[d].id==e.id){r.splice(d,1);break}e.parent=s,s.children.push(e)}e.parent.isroot?e.direction=o==i.left?o:i.right:e.direction=e.parent.direction,this._move_node_internal(e,t),this._flow_node_direction(e)}return e}remove_node(e){if(!h.is_node(e))return a.error("the parameter node "+e+" is not a node."),!1;if(e.isroot)return a.error("fail, can not remove root node"),!1;null!=this.selected&&this.selected.id==e.id&&(this.selected=null);for(var t=e.children,i=t.length;i--;)this.remove_node(t[i]);t.length=0;for(var n=e.parent.children,o=n.length;o--;)if(n[o].id==e.id){n.splice(o,1);break}for(var s in delete this.nodes[e.id],e)delete e[s];return e=null,!0}_put_node(e){return e.id in this.nodes?(a.warn("the node_id '"+e.id+"' has been already exist."),!1):(this.nodes[e.id]=e,!0)}_update_index(e){if(e instanceof h){e.children.sort(h.compare);for(var t=0;t0){n.children=[];for(var r=0;r0&&(s=n.length,d+=c)}return d},_extract_data:function(e){var t={};for(var i in e)"id"!=i&&"topic"!=i&&"parentid"!=i&&"isroot"!=i&&"direction"!=i&&"expanded"!=i&&(t[i]=e[i]);return t},_array:function(e,t){u.node_array._array_node(e.root,t)},_array_node:function(e,t){var n=u.node_array;if(e instanceof h){var o={id:e.id,topic:e.topic,expanded:e.expanded};if(e.parent&&(o.parentid=e.parent.id),e.isroot&&(o.isroot=!0),e.parent&&e.parent.isroot&&(o.direction=e.direction==i.left?"left":"right"),null!=e.data){var s=e.data;for(var a in s)o[a]=s[a]}t.push(o);for(var r=e.children.length,d=0;d'},get_mind:function(e){var t=u.freemind,i=new _;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data,o=t._parse_xml(n),s=t._find_root(o);return t._load_node(i,null,s),i},get_data:function(e){var t=u.freemind,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="freemind";var n=[];return n.push(''),t._build_map(e.root,n),n.push(""),i.data=n.join(" "),i},_parse_xml:function(e){var t=null;window.DOMParser?t=(new DOMParser).parseFromString(e,"text/xml"):((t=new ActiveXObject("Microsoft.XMLDOM")).async=!1,t.loadXML(e));return t},_find_root:function(e){for(var t=e.childNodes,i=null,n=null,o=0;o'),t.push('');var s=e.data;if(null!=s)for(var a in s)t.push('');for(var r=e.children,d=0;d")}},text:{example:{meta:{name:"jsMind text example",author:t,version:e},format:"text",data:"Text Example\n node1\n node1-sub\n node1-sub\n node2"},_line_regex:/\s*/,get_mind:function(e){var t=u.text,i=new _;i.name=e.meta.name,i.author=e.meta.author,i.version=e.meta.version;var n=e.data.split(/\n|\r/);return t._fill_nodes(i,n,0,0),i},_fill_nodes:function(e,t){let i=[],n=0;for(;n0)return void log.error("more than 1 root node was found: "+a);if(s>i.length)return void log.error("a suspended node was found: "+a);let r=i.length-s;for(;r--;)i.pop();if(0==s&&0==i.length){let t=e.set_root(d.uuid.newid(),a);i.push(t)}else{let t=e.add_node(i[s-1],d.uuid.newid(),a,{},null);i.push(t)}n++}i.length=0},get_data:function(e){var t=u.text,i={};i.meta={name:e.name,author:e.author,version:e.version},i.format="text";let n=[];return t._build_lines(n,[e.root],0),i.data=n.join("\n"),i},_build_lines:function(e,t,i){let n=new Array(i+1).join(" ");for(let o of t)e.push(n+o.topic),o.children&&u.text._build_lines(e,o.children,i+1)}}};class c{constructor(e){this.jm=e}init(){a.debug("data.init")}reset(){a.debug("data.reset")}load(e){var t=null,i=null;return"node_array"==(t="object"==typeof e?e.format?e.format:"node_tree":"freemind")?i=u.node_array.get_mind(e):"node_tree"==t?i=u.node_tree.get_mind(e):"freemind"==t?i=u.freemind.get_mind(e):"text"==t?i=u.text.get_mind(e):a.warn("unsupported format"),i}get_data(e){var t=null;return"node_array"==e?t=u.node_array.get_data(this.jm.mind):"node_tree"==e?t=u.node_tree.get_data(this.jm.mind):"freemind"==e?t=u.freemind.get_data(this.jm.mind):"text"==e?t=u.text.get_data(this.jm.mind):a.error("unsupported "+e+" format"),t}}class v{constructor(e,t){this.opts=t,this.jm=e,this.isside="side"==this.opts.mode,this.bounds=null,this.cache_valid=!1}init(){a.debug("layout.init")}reset(){a.debug("layout.reset"),this.bounds={n:0,s:0,w:0,e:0}}calculate_next_child_direction(e){if(this.isside)return i.right;for(var t=e.children||[],n=t.length,o=0,s=0;s1&&o>0?i.left:i.right}layout(){a.debug("layout.layout"),this.layout_direction(),this.layout_offset()}layout_direction(){this._layout_direction_root()}_layout_direction_root(){var e=this.jm.mind.root,t=null;"layout"in e._data?t=e._data.layout:(t={},e._data.layout=t);var n=e.children,o=n.length;if(t.direction=i.center,t.side_index=0,this.isside)for(var s=o;s--;)this._layout_direction_side(n[s],i.right,s);else{s=o;for(var a=null;s--;)(a=n[s]).direction==i.left?this._layout_direction_side(a,i.left,s):this._layout_direction_side(a,i.right,s)}}_layout_direction_side(e,t,i){var n=null;"layout"in e._data?n=e._data.layout:(n={},e._data.layout=n);var o=e.children,s=o.length;n.direction=t,n.side_index=i;for(var a=s;a--;)this._layout_direction_side(o[a],t,a)}layout_offset(){var e=this.jm.mind.root,t=e._data.layout;t.offset_x=0,t.offset_y=0,t.outer_height=0;for(var n=e.children,o=n.length,s=[],a=[],r=null;o--;)(r=n[o])._data.layout.direction==i.right?a.unshift(r):s.unshift(r);t.left_nodes=s,t.right_nodes=a,t.outer_height_left=this._layout_offset_subnodes(s),t.outer_height_right=this._layout_offset_subnodes(a),this.bounds.e=e._data.view.width/2,this.bounds.w=0-this.bounds.e,this.bounds.n=0,this.bounds.s=Math.max(t.outer_height_left,t.outer_height_right)}_layout_offset_subnodes(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes(o.children),o.expanded||(s=0,this.set_visible(o.children,!1)),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,a.offset_x=this.opts.hspace*a.direction+d.view.width*(d.layout.direction+a.direction)/2,o.parent.isroot||(a.offset_x+=this.opts.pspace*a.direction),r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}_layout_offset_subnodes_height(e){for(var t=0,i=e.length,n=i,o=null,s=0,a=null,r=0,d=null;n--;)a=(o=e[n])._data.layout,null==d&&(d=o.parent._data),s=this._layout_offset_subnodes_height(o.children),o.expanded||(s=0),s=Math.max(o._data.view.height,s),a.outer_height=s,a.offset_y=r-s/2,r=r-s-this.opts.vspace,t+=s;i>1&&(t+=this.opts.vspace*(i-1)),n=i;for(var l=t/2;n--;)(o=e[n])._data.layout.offset_y+=l;return t}get_node_offset(e){var t=e._data.layout,i=null;if("_offset_"in t&&this.cache_valid?i=t._offset_:(i={x:-1,y:-1},t._offset_=i),-1==i.x||-1==i.y){var n=t.offset_x,o=t.offset_y;if(!e.isroot){var s=this.get_node_offset(e.parent);n+=s.x,o+=s.y}i.x=n,i.y=o}return i}get_node_point(e){var t=e._data.view,i=this.get_node_offset(e),n={};return n.x=i.x+t.width*(e._data.layout.direction-1)/2,n.y=i.y-t.height/2,n}get_node_point_in(e){return this.get_node_offset(e)}get_node_point_out(e){var t=e._data.layout,i=null;if("_pout_"in t&&this.cache_valid?i=t._pout_:(i={x:-1,y:-1},t._pout_=i),-1==i.x||-1==i.y)if(e.isroot)i.x=0,i.y=0;else{var n=e._data.view,o=this.get_node_offset(e);i.x=o.x+(n.width+this.opts.pspace)*e._data.layout.direction,i.y=o.y}return i}get_expander_point(e){var t=this.get_node_point_out(e),n={};return e._data.layout.direction==i.right?n.x=t.x-this.opts.pspace:n.x=t.x,n.y=t.y-Math.ceil(this.opts.pspace/2),n}get_min_size(){var e=this.jm.mind.nodes,t=null,i=null;for(var n in e)t=e[n],(i=this.get_node_point_out(t)).x>this.bounds.e&&(this.bounds.e=i.x),i.x0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}collapse_all(){var e,t=this.jm.mind.nodes,i=0;for(var n in t)(e=t[n]).expanded&&!e.isroot&&(e.expanded=!1,i++);if(i>0){var o=this.jm.mind.root;this.part_layout(o),this.set_visible(o.children,!0)}}expand_to_depth(e,t,i){if(!(e<1))for(var n=t||this.jm.mind.root.children,o=i||1,s=n.length,a=null;s--;)a=n[s],othis.maxZoom)return!1;this.actualZoom=e;for(var t=0;te){var i=this.get_view_offset();this.e_panel.scrollLeft=i.x*this.actualZoom-e/2}this.size.h>t&&(this.e_panel.scrollTop=(this.size.h*this.actualZoom-t)/2)}show(e){a.debug("view.show"),this.expand_size(),this._show(),e&&this._center_root()}relayout(){this.expand_size(),this._show()}save_location(e){var t=e._data.view;t._saved_location={x:parseInt(t.element.style.left)-this.e_panel.scrollLeft,y:parseInt(t.element.style.top)-this.e_panel.scrollTop}}restore_location(e){var t=e._data.view;this.e_panel.scrollLeft=parseInt(t.element.style.left)-t._saved_location.x,this.e_panel.scrollTop=parseInt(t.element.style.top)-t._saved_location.y}clear_nodes(){var e=this.jm.mind;if(null!=e){var t=e.nodes,i=null;for(var n in t)(i=t[n])._data.view.element=null,i._data.view.expander=null;this.e_nodes.innerHTML=""}}show_nodes(){var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=null,a="-",d=null,l=this.get_view_offset();for(var h in e)i=(d=(t=e[h])._data.view).element,n=d.expander,this.layout.is_visible(t)?(this.reset_node_custom_style(t),o=this.layout.get_node_point(t),d.abs_x=l.x+o.x,d.abs_y=l.y+o.y,i.style.left=l.x+o.x+"px",i.style.top=l.y+o.y+"px",i.style.display="",i.style.visibility="visible",!t.isroot&&t.children.length>0&&(a=t.expanded?"-":"+",s=this.layout.get_expander_point(t),n.style.left=l.x+s.x+"px",n.style.top=l.y+s.y+"px",n.style.display="",n.style.visibility="visible",r.t(n,a)),t.isroot||0!=t.children.length||(n.style.display="none",n.style.visibility="hidden")):(i.style.display="none",n.style.display="none")}reset_node_custom_style(e){this._reset_node_custom_style(e._data.view.element,e.data)}_reset_node_custom_style(e,t){if("background-color"in t&&(e.style.backgroundColor=t["background-color"]),"foreground-color"in t&&(e.style.color=t["foreground-color"]),"width"in t&&(e.style.width=t.width+"px"),"height"in t&&(e.style.height=t.height+"px"),"font-size"in t&&(e.style.fontSize=t["font-size"]+"px"),"font-weight"in t&&(e.style.fontWeight=t["font-weight"]),"font-style"in t&&(e.style.fontStyle=t["font-style"]),"background-image"in t){var i=t["background-image"];if(i.startsWith("data")&&t.width&&t.height){var n=new Image;n.onload=function(){var t=r.c("canvas");t.width=e.clientWidth,t.height=e.clientHeight;if(t.getContext){t.getContext("2d").drawImage(this,2,2,e.clientWidth,e.clientHeight);var i=t.toDataURL();e.style.backgroundImage="url("+i+")"}},n.src=i}else e.style.backgroundImage="url("+i+")";e.style.backgroundSize="99%","background-rotation"in t&&(e.style.transform="rotate("+t["background-rotation"]+"deg)")}}restore_selected_node_custom_style(e){var t=e._data.view.element,i=e.data;"background-color"in i&&(t.style.backgroundColor=i["background-color"]),"foreground-color"in i&&(t.style.color=i["foreground-color"])}clear_selected_node_custom_style(e){var t=e._data.view.element;t.style.backgroundColor="",t.style.color=""}clear_lines(){this.graph.clear()}show_lines(){this.clear_lines();var e=this.jm.mind.nodes,t=null,i=null,n=null,o=null,s=this.get_view_offset();for(var a in e)(t=e[a]).isroot||"visible"in t._data.layout&&!t._data.layout.visible||(i=this.layout.get_node_point_in(t),n=this.layout.get_node_point_out(t.parent),o=t.data["leading-line-color"],this.graph.draw_line(n,i,s,o))}setup_canvas_draggable(e){if(this.opts.draggable=e,!this._initialized){let e,t,i=!1;this.opts.hide_scrollbars_when_draggable&&(this.e_panel.style="overflow: hidden"),r.on(this.container,"mousedown",(n=>{this.opts.draggable&&(i=!0,e=n.clientX,t=n.clientY)})),r.on(this.container,"mouseup",(()=>{i=!1})),r.on(this.container,"mousemove",(n=>{this.opts.draggable&&i&&(this.e_panel.scrollBy(e-n.clientX,t-n.clientY),e=n.clientX,t=n.clientY)}))}}}class m{constructor(e,t){this.jm=e,this.opts=t,this.mapping=t.mapping,this.handles=t.handles,this._newid=null,this._mapping={}}init(){for(var e in r.on(this.jm.view.e_panel,"keydown",this.handler.bind(this)),this.handles.addchild=this.handle_addchild,this.handles.addbrother=this.handle_addbrother,this.handles.editnode=this.handle_editnode,this.handles.delnode=this.handle_delnode,this.handles.toggle=this.handle_toggle,this.handles.up=this.handle_up,this.handles.down=this.handle_down,this.handles.left=this.handle_left,this.handles.right=this.handle_right,this.mapping)if(this.mapping[e]&&e in this.handles){let t=this.mapping[e];Array.isArray(t)||(t=[t]);for(let i of t)this._mapping[i]=this.handles[e]}"function"==typeof this.opts.id_generator?this._newid=this.opts.id_generator:this._newid=d.uuid.newid}enable_shortcut(){this.opts.enable=!0}disable_shortcut(){this.opts.enable=!1}handler(e){if(9==e.which&&e.preventDefault(),!this.jm.view.is_editing()){var t=e||event;if(!this.opts.enable)return!0;var i=t.keyCode+(t.metaKey<<13)+(t.ctrlKey<<12)+(t.altKey<<11)+(t.shiftKey<<10);i in this._mapping&&this._mapping[i].call(this,this.jm,e)}}handle_addchild(e,t){var i=e.get_selected_node();if(i){var n=this._newid();e.add_node(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_addbrother(e,t){var i=e.get_selected_node();if(i&&!i.isroot){var n=this._newid();e.insert_node_after(i,n,"New Node")&&(e.select_node(n),e.begin_edit(n))}}handle_editnode(e,t){var i=e.get_selected_node();i&&e.begin_edit(i)}handle_delnode(e,t){var i=e.get_selected_node();i&&!i.isroot&&(e.select_node(i.parent),e.remove_node(i))}handle_toggle(e,t){var i=t||event,n=e.get_selected_node();n&&(e.toggle_node(n.id),i.stopPropagation(),i.preventDefault())}handle_up(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_before(n);if(!o){var s=e.find_node_before(n.parent);s&&s.children.length>0&&(o=s.children[s.children.length-1])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_down(e,t){var i=t||event,n=e.get_selected_node();if(n){var o=e.find_node_after(n);if(!o){var s=e.find_node_after(n.parent);s&&s.children.length>0&&(o=s.children[0])}o&&e.select_node(o),i.stopPropagation(),i.preventDefault()}}handle_left(e,t){this._handle_direction(e,t,i.left)}handle_right(e,t){this._handle_direction(e,t,i.right)}_handle_direction(e,t,i){var n=t||event,o=e.get_selected_node(),s=null;if(o){if(o.isroot){for(var a=o.children,r=[],d=0;d0&&(s=r[Math.floor((l-1)/2)])}else s=o.parent;s&&e.select_node(s),n.stopPropagation(),n.preventDefault()}}}const y={plugins:[]};function b(e){if(!e instanceof x)throw new Error("plugin "+e+" is not a supported plugin");y.plugins.push(e)}function w(e){r.w.setTimeout((function(){!function(e){for(var t=y.plugins.length,i=null,n=0;n 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-2022 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-2022 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\nexport const util = {\n ajax: {\n request: function (url, param, method, callback, fail_callback) {\n var p = Object.keys(param)\n .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(param[k]))\n .join('&');\n var xhr = new XMLHttpRequest();\n if (!xhr) {\n return;\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status == 0) {\n if (typeof callback === 'function') {\n var data = util.json.string2json(xhr.responseText);\n if (data != null) {\n callback(data);\n } else {\n callback(xhr.responseText);\n }\n }\n } else {\n if (typeof fail_callback === 'function') {\n fail_callback(xhr);\n } else {\n logger.error('xhr request failed.', xhr);\n }\n }\n }\n };\n method = method || 'GET';\n xhr.open(method, url, true);\n xhr.setRequestHeader('If-Modified-Since', '0');\n if (method == 'POST') {\n xhr.setRequestHeader(\n 'Content-Type',\n 'application/x-www-form-urlencoded;charset=utf-8'\n );\n xhr.send(p);\n } else {\n xhr.send();\n }\n },\n get: function (url, callback) {\n return util.ajax.request(url, {}, 'GET', callback);\n },\n post: function (url, param, callback) {\n return util.ajax.request(url, param, 'POST', callback);\n },\n },\n\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-2022 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 hmargin: 100,\n vmargin: 50,\n line_width: 2,\n line_color: '#555',\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 },\n layout: {\n hspace: 30,\n vspace: 20,\n pspace: 13,\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};\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-2022 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-2022 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 node.parent = parent_node;\n parent_node.children.push(node);\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 // 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 //delete node;\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-2022 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\nexport const format = {\n node_tree: {\n example: {\n meta: {\n name: 'jsMind node_tree simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_tree',\n data: { id: 'root', topic: 'jsMind 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: {\n name: 'jsMind node_array simple',\n author: __author__,\n version: __version__,\n },\n format: 'node_array',\n data: [{ id: 'root', topic: 'jsMind 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: {\n name: 'jsMind freemind example',\n author: __author__,\n version: __version__,\n },\n format: 'freemind',\n data: '',\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('');\n df._build_map(mind.root, xml_lines);\n xml_lines.push('');\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 // 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 = 'expanded' in node_data ? node_data.expanded == 'true' : true;\n delete node_data.expanded;\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 if (!!node.parent && node.parent.isroot) {\n pos = node.direction === Direction.left ? 'left' : 'right';\n }\n xml_lines.push('');\n\n // store expanded status as an attribute\n xml_lines.push('');\n\n // for attributes\n var node_data = node.data;\n if (node_data != null) {\n for (var k in node_data) {\n xml_lines.push('');\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('');\n },\n },\n text: {\n example: {\n meta: {\n name: 'jsMind text example',\n author: __author__,\n version: __version__,\n },\n format: 'text',\n data: '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-2022 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-2022 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 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\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 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-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { $ } from './jsmind.dom.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 }\n static c(tag) {\n return $.d.createElementNS('http://www.w3.org/2000/svg', tag);\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._bezier_to(\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 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 }\n element() {\n return this.e_canvas;\n }\n set_size(w, h) {\n this.size.w = w;\n this.size.h = h;\n this.e_canvas.width = w;\n this.e_canvas.height = h;\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\n this._bezier_to(\n ctx,\n pin.x + offset.x,\n pin.y + offset.y,\n pout.x + offset.x,\n pout.y + offset.y\n );\n }\n copy_to(dest_canvas_ctx, callback) {\n dest_canvas_ctx.drawImage(this.e_canvas, 0, 0);\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-2022 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._initialized = false;\n }\n init() {\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';\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 this.actualZoom = 1;\n this.zoomStep = 0.1;\n this.minZoom = 0.5;\n this.maxZoom = 2;\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 add_event(obj, event_name, event_handle) {\n $.on(this.e_nodes, 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 == 'jmnodes' || tagName == 'body' || tagName == 'html') {\n return null;\n }\n if (tagName == 'jmnode' || tagName == 'jmexpander') {\n return element.getAttribute('nodeid');\n } else {\n return this.get_binded_nodeid(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 for (var nodeid in nodes) {\n this.init_nodes_size(nodes[nodeid]);\n }\n }\n add_node(node) {\n this.create_node_element(node, this.e_nodes);\n this.init_nodes_size(node);\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 if (this.opts.support_html) {\n $.h(d, node.topic);\n } else {\n $.t(d, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 if (this.opts.support_html) {\n $.h(element, node.topic);\n } else {\n $.t(element, node.topic);\n }\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 zoomIn() {\n return this.setZoom(this.actualZoom + this.zoomStep);\n }\n zoomOut() {\n return this.setZoom(this.actualZoom - this.zoomStep);\n }\n setZoom(zoom) {\n if (zoom < this.minZoom || zoom > this.maxZoom) {\n return false;\n }\n this.actualZoom = 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(true);\n return true;\n }\n _center_root() {\n // center root node\n var outer_w = this.e_panel.clientWidth;\n var outer_h = this.e_panel.clientHeight;\n if (this.size.w > outer_w) {\n var _offset = this.get_view_offset();\n this.e_panel.scrollLeft = _offset.x * this.actualZoom - outer_w / 2;\n }\n if (this.size.h > outer_h) {\n this.e_panel.scrollTop = (this.size.h * this.actualZoom - outer_h) / 2;\n }\n }\n show(keep_center) {\n logger.debug('view.show');\n this.expand_size();\n this._show();\n if (!!keep_center) {\n this._center_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 expander = null;\n var p = null;\n var p_expander = null;\n var expander_text = '-';\n var view_data = null;\n var _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 expander = view_data.expander;\n if (!this.layout.is_visible(node)) {\n node_element.style.display = 'none';\n 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 = _offset.x + p.x;\n view_data.abs_y = _offset.y + p.y;\n node_element.style.left = _offset.x + p.x + 'px';\n node_element.style.top = _offset.y + p.y + 'px';\n node_element.style.display = '';\n node_element.style.visibility = 'visible';\n if (!node.isroot && node.children.length > 0) {\n expander_text = node.expanded ? '-' : '+';\n p_expander = this.layout.get_expander_point(node);\n expander.style.left = _offset.x + p_expander.x + 'px';\n expander.style.top = _offset.y + p_expander.y + 'px';\n expander.style.display = '';\n expander.style.visibility = 'visible';\n $.t(expander, expander_text);\n }\n // hide expander while all children have been removed\n if (!node.isroot && node.children.length == 0) {\n expander.style.display = 'none';\n expander.style.visibility = 'hidden';\n }\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 ('visible' in node._data.layout && !node._data.layout.visible) {\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}\n","/**\n * @license BSD\n * @copyright 2014-2022 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-2022 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('plugin ' + plugin + ' is not a supported plugin');\n }\n plugin_data.plugins.push(plugin);\n}\n\nexport function apply(jm) {\n $.w.setTimeout(function () {\n _apply(jm);\n }, 0);\n}\n\nfunction _apply(jm) {\n var l = plugin_data.plugins.length;\n var fn_init = null;\n for (var i = 0; i < l; i++) {\n fn_init = plugin_data.plugins[i].init;\n if (typeof fn_init === 'function') {\n fn_init(jm);\n }\n }\n}\n\nexport class Plugin {\n constructor(name, init) {\n this.name = name;\n this.init = init;\n }\n}\n","/**\n * @license BSD\n * @copyright 2014-2022 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 };\n var opts_view = {\n container: this.options.container,\n support_html: this.options.support_html,\n engine: this.options.view.engine,\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 draggable: this.options.view.draggable,\n hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable,\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);\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, 'mousewheel', this.mousewheel_handle);\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 (element.tagName.toLowerCase() == 'jmnode') {\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 node_id = this.view.get_binded_nodeid(element);\n if (!!node_id) {\n this.begin_edit(node_id);\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 if (!this.options.default_event_handle['enable_mousewheel_handle'] || !e.ctrlKey) {\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.zoomIn(); // wheel down\n } else {\n this.view.zoomOut();\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) {\n var m = mind || format.node_array.example;\n\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(true);\n logger.debug('view.show ok');\n\n this.invoke_event_handle(EventType.show, { data: [mind] });\n }\n show(mind) {\n this._reset();\n this._show(mind);\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) {\n if (this.get_editable()) {\n var the_parent_node = this.get_node(parent_node);\n var direction = this.layout.calculate_next_child_direction(the_parent_node);\n var node = this.mind.add_node(the_parent_node, node_id, topic, data, direction);\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],\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) {\n if (this.get_editable()) {\n var the_node_before = this.get_node(node_before);\n var direction = this.layout.calculate_next_child_direction(the_node_before.parent);\n var node = this.mind.insert_node_before(\n the_node_before,\n node_id,\n topic,\n data,\n direction\n );\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],\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) {\n if (this.get_editable()) {\n var the_node_after = this.get_node(node_after);\n var direction = this.layout.calculate_next_child_direction(the_node_after.parent);\n var node = this.mind.insert_node_after(the_node_after, node_id, topic, data, direction);\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],\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 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 // quick way\n static show(options, mind) {\n var _jm = new jsMind(options);\n _jm.show(mind);\n return _jm;\n }\n}\n"],"names":["__version__","__author__","String","prototype","startsWith","p","this","slice","length","Direction","left","center","right","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","ajax","request","url","param","method","callback","fail_callback","Object","keys","map","k","encodeURIComponent","join","xhr","XMLHttpRequest","onreadystatechange","readyState","status","data","json","string2json","responseText","open","setRequestHeader","send","get","post","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","json2string","JSON","stringify","json_str","parse","merge","b","a","o","toString","call","toLowerCase","uuid","newid","Date","getTime","Math","random","substring","text","is_empty","s","replace","default_options","container","editable","theme","mode","support_html","view","engine","hmargin","vmargin","line_width","line_color","draggable","hide_scrollbars_when_draggable","layout","hspace","vspace","pspace","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","Node","sId","iIndex","sTopic","oData","bIsRoot","oParent","eDirection","bExpanded","index","topic","isroot","parent","direction","expanded","children","_data","get_location","vd","x","abs_x","y","abs_y","get_size","width","height","static","node1","node2","i1","i2","parent_node","node","pid","Mind","author","version","root","selected","nodes","get_node","node_id","set_root","_put_node","add_node","idx","is_node","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","inherited","sibling","si","splice","remove_node","ci","sort","compare","format","node_tree","example","meta","get_mind","source","df","mind","_parse","get_data","_build_node","node_root","_extract_data","_extract_subnode","node_json","node_parent","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","DOMParser","parseFromString","ActiveXObject","async","loadXML","childNodes","tagName","ns","xml_node","getAttribute","node_topic","topic_children","topic_child","textContent","_load_attributes","node_expanded","node_position","child","attr","attr_data","pos","_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","max","total_height","nodes_count","node_outer_height","base_y","pd","set_visible","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","createElementNS","element","set_size","clear","draw_line","pin","offset","color","_bezier_to","copy_to","dest_canvas_ctx","img","Image","drawImage","src","btoa","XMLSerializer","serializeToString","path","x1","y1","x2","y2","_line_to","CanvasGraph","e_canvas","className","canvas_ctx","getContext","clearRect","ctx","strokeStyle","lineWidth","lineCap","beginPath","moveTo","bezierCurveTo","stroke","lineTo","ViewProvider","e_panel","e_nodes","selected_node","editing_node","graph","_initialized","e_editor","tabIndex","actualZoom","zoomStep","minZoom","maxZoom","v","event","keyCode","edit_node_end","stopPropagation","add_event","obj","event_name","event_handle","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","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","parseInt","getPropertyValue","zIndex","focus","get_view_offset","_show","show_nodes","show_lines","zoomIn","setZoom","zoomOut","zoom","_center_root","outer_w","outer_h","_offset","scrollLeft","scrollTop","keep_center","relayout","save_location","_saved_location","top","restore_location","node_element","p_expander","expander_text","display","backgroundColor","fontSize","fontWeight","fontStyle","backgroundImage","scaledImageData","toDataURL","backgroundSize","transform","enabled","dragging","eventDown","clientX","clientY","eventMove","scrollBy","ShortcutProvider","_newid","_mapping","handle","handler","bind","handle_addchild","handle_addbrother","handle_editnode","handle_delnode","handle_toggle","handle_up","handle_down","handle_left","handle_right","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","Plugin","Error","apply","setTimeout","l","fn_init","_apply","jsMind","_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","target","srcElement","deltaY","end_edit","_reset","m","get_meta","get_root","the_parent_node","the_node_before","the_node_after","updated_node","is_node_visible","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"],"mappings":"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"} \ No newline at end of file diff --git a/es6/jsmind.screenshot.js b/es6/jsmind.screenshot.js deleted file mode 100644 index 98edc59d..00000000 --- a/es6/jsmind.screenshot.js +++ /dev/null @@ -1,9 +0,0 @@ -/** -* @license BSD-3-Clause -* @copyright 2014-2022 hizzgdev@163.com -* -* Project Home: -* https://github.com/hizzgdev/jsmind/ -*/ -!function(){"use strict";if(!jsMind)throw new Error("jsMind is not defined");const t=jsMind.$;var e=function(t,e){return t.getPropertyValue(e)},i=function(t){var i=e(t,"visibility"),n=e(t,"display");return"hidden"!==i&&"none"!==n},n={rect:function(t,e,i,n,a,s){n<2*s&&(s=n/2),a<2*s&&(s=a/2),t.moveTo(e+s,i),t.arcTo(e+n,i,e+n,i+a,s),t.arcTo(e+n,i+a,e,i+a,s),t.arcTo(e,i+a,e,i,s),t.arcTo(e,i,e+n,i,s)},text_multiline:function(t,e,i,n,a,s,o){var r="",l=e.length,d=e.split(""),h=null;t.textAlign="left",t.textBaseline="top";for(var c=0;ca&&c>0?(t.fillText(r,i,n),r=d[c],n+=o):r=h;t.fillText(r,i,n)},text_ellipsis:function(t,e,i,a,s,o){var r=a+o/2;e=n.fittingString(t,e,s);t.textAlign="left",t.textBaseline="middle",t.fillText(e,i,r,s)},fittingString:function(t,e,i){var n=t.measureText(e).width,a=t.measureText("…").width;if(n<=i||n<=a)return e;for(var s=e.length;n>=i-a&&s-- >0;)e=e.substring(0,s),n=t.measureText(e).width;return e+"…"},image:function(t,e,i,a,s,o,r,l,d){var h=new Image;h.onload=function(){t.save(),t.translate(i,a),t.save(),t.beginPath(),n.rect(t,0,0,s,o,r),t.closePath(),t.clip(),t.translate(s/2,o/2),t.rotate(l*Math.PI/180),t.drawImage(h,-s/2,-o/2),t.restore(),t.restore(),d&&d()},h.src=e}};class a{constructor(t){this.jm=t,this.canvas_elem=null,this.canvas_ctx=null,this._inited=!1}init(){if(!this._inited){console.log("init");var e=t.c("canvas"),i=e.getContext("2d");this.canvas_elem=e,this.canvas_ctx=i,this.jm.view.e_panel.appendChild(e),this._inited=!0,this.resize()}}shoot(t){this.init(),this._draw(function(){t&&t(),this.clean()}.bind(this)),this._watermark()}shootDownload(){this.shoot(function(){this._download()}.bind(this))}shootAsDataURL(t){this.shoot(function(){t&&t(this.canvas_elem.toDataURL())}.bind(this))}resize(){this._inited&&(this.canvas_elem.width=this.jm.view.size.w,this.canvas_elem.height=this.jm.view.size.h)}clean(){var t=this.canvas_elem;this.canvas_ctx.clearRect(0,0,t.width,t.height)}_draw(t){var e=this.canvas_ctx;e.textAlign="left",e.textBaseline="top",this._draw_lines(function(){this._draw_nodes(t)}.bind(this))}_watermark(){var e=this.canvas_elem,i=this.canvas_ctx;i.textAlign="right",i.textBaseline="bottom",i.fillStyle="#000",i.font="11px Verdana,Arial,Helvetica,sans-serif",i.fillText("github.com/hizzgdev/jsmind",e.width-5.5,e.height-2.5),i.textAlign="left",i.fillText(t.w.location,5.5,e.height-2.5)}_draw_lines(t){this.jm.view.graph.copy_to(this.canvas_ctx,t)}_draw_nodes(e){var i,n=this.jm.mind.nodes;for(var a in n)i=n[a],this._draw_node(i);!function a(){console.log("check_node_ready"+new Date);var s=!0;for(var o in n)s&=(i=n[o]).ready;s?t.w.setTimeout(e,200):t.w.setTimeout(a,200)}()}_draw_node(t){var a=this.canvas_ctx,s=t._data.view,o=s.element,r=getComputedStyle(o);if(i(r)){var l=e(r,"background-color"),d=parseInt(e(r,"border-top-left-radius")),h=e(r,"color"),c=parseInt(e(r,"padding-left")),v=parseInt(e(r,"padding-right")),f=parseInt(e(r,"padding-top")),_=parseInt(e(r,"padding-bottom")),g=e(r,"text-overflow"),m=e(r,"font-style")+" "+e(r,"font-variant")+" "+e(r,"font-weight")+" "+e(r,"font-size")+"/"+e(r,"line-height")+" "+e(r,"font-family"),u={x:s.abs_x,y:s.abs_y,w:s.width+1,h:s.height+1},w={x:u.x+c,y:u.y+f,w:u.w-c-v,h:u.h-f-_};if(a.font=m,a.fillStyle=l,a.beginPath(),n.rect(a,u.x,u.y,u.w,u.h,d),a.closePath(),a.fill(),a.fillStyle=h,"background-image"in t.data){var p=e(r,"background-image").slice(5,-2);t.ready=!1;var x=0;"background-rotation"in t.data&&(x=t.data["background-rotation"]),n.image(a,p,u.x,u.y,u.w,u.h,d,x,(function(){t.ready=!0}))}if(t.topic)if("ellipsis"===g)n.text_ellipsis(a,t.topic,w.x,w.y,w.w,w.h);else{var y=parseInt(e(r,"line-height"));n.text_multiline(a,t.topic,w.x,w.y,w.w,w.h,y)}s.expander&&this._draw_expander(s.expander),"background-image"in t.data||(t.ready=!0)}else t.ready=!0}_draw_expander(t){var n=this.canvas_ctx,a=getComputedStyle(t);if(i(a)){var s=e(a,"left"),o=e(a,"top");e(a,"font");var r=parseInt(s),l=parseInt(o),d="+"===t.innerHTML;n.lineWidth=1,n.beginPath(),n.arc(r+7,l+7,5,0,2*Math.PI,!0),n.moveTo(r+10,l+7),n.lineTo(r+4,l+7),d&&(n.moveTo(r+7,l+4),n.lineTo(r+7,l+10)),n.closePath(),n.stroke()}}_download(){var e=this.canvas_elem,i=this.jm.mind.name+".png";if(navigator.msSaveBlob&&e.msToBlob){var n=e.msToBlob();navigator.msSaveBlob(n,i)}else{var a=this.canvas_elem.toDataURL(),s=t.c("a");if("download"in s){s.style.visibility="hidden",s.href=a,s.download=i,t.d.body.appendChild(s);var o=t.d.createEvent("MouseEvents");o.initEvent("click",!0,!0),s.dispatchEvent(o),t.d.body.removeChild(s)}else location.href=a}}jm_event_handle(t,e){t===jsMind.event_type.resize&&this.resize()}}var s=new jsMind.plugin("screenshot",(function(t){var e=new a(t);t.screenshot=e,t.shoot=function(){e.shoot()},t.add_event_listener((function(t,i){e.jm_event_handle.call(e,t,i)}))}));jsMind.register_plugin(s)}(); -//# sourceMappingURL=jsmind.screenshot.js.map diff --git a/es6/jsmind.screenshot.js.map b/es6/jsmind.screenshot.js.map deleted file mode 100644 index 9125156c..00000000 --- a/es6/jsmind.screenshot.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"jsmind.screenshot.js","sources":["../src/plugins/jsmind.screenshot.js"],"sourcesContent":["/**\n * @license BSD\n * @copyright 2014-2022 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nif (!jsMind) {\n throw new Error('jsMind is not defined');\n}\n\nconst $ = jsMind.$;\n\nvar css = function (cStyle, property_name) {\n return cStyle.getPropertyValue(property_name);\n};\nvar is_visible = function (cStyle) {\n var visibility = css(cStyle, 'visibility');\n var display = css(cStyle, 'display');\n return visibility !== 'hidden' && display !== 'none';\n};\nvar jcanvas = {};\njcanvas.rect = function (ctx, x, y, w, h, r) {\n if (w < 2 * r) r = w / 2;\n if (h < 2 * r) r = h / 2;\n ctx.moveTo(x + r, y);\n ctx.arcTo(x + w, y, x + w, y + h, r);\n ctx.arcTo(x + w, y + h, x, y + h, r);\n ctx.arcTo(x, y + h, x, y, r);\n ctx.arcTo(x, y, x + w, y, r);\n};\n\njcanvas.text_multiline = function (ctx, text, x, y, w, h, lineheight) {\n var line = '';\n var text_len = text.length;\n var chars = text.split('');\n var test_line = null;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n for (var i = 0; i < text_len; i++) {\n test_line = line + chars[i];\n if (ctx.measureText(test_line).width > w && i > 0) {\n ctx.fillText(line, x, y);\n line = chars[i];\n y += lineheight;\n } else {\n line = test_line;\n }\n }\n ctx.fillText(line, x, y);\n};\n\njcanvas.text_ellipsis = function (ctx, text, x, y, w, h) {\n var center_y = y + h / 2;\n var text = jcanvas.fittingString(ctx, text, w);\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, x, center_y, w);\n};\n\njcanvas.fittingString = function (ctx, text, max_width) {\n var width = ctx.measureText(text).width;\n var ellipsis = '…';\n var ellipsis_width = ctx.measureText(ellipsis).width;\n if (width <= max_width || width <= ellipsis_width) {\n return text;\n } else {\n var len = text.length;\n while (width >= max_width - ellipsis_width && len-- > 0) {\n text = text.substring(0, len);\n width = ctx.measureText(text).width;\n }\n return text + ellipsis;\n }\n};\n\njcanvas.image = function (ctx, url, x, y, w, h, r, rotation, callback) {\n var img = new Image();\n img.onload = function () {\n ctx.save();\n ctx.translate(x, y);\n ctx.save();\n ctx.beginPath();\n jcanvas.rect(ctx, 0, 0, w, h, r);\n ctx.closePath();\n ctx.clip();\n ctx.translate(w / 2, h / 2);\n ctx.rotate((rotation * Math.PI) / 180);\n ctx.drawImage(img, -w / 2, -h / 2);\n ctx.restore();\n ctx.restore();\n !!callback && callback();\n };\n img.src = url;\n};\n\nclass screenshot {\n constructor(jm) {\n this.jm = jm;\n this.canvas_elem = null;\n this.canvas_ctx = null;\n this._inited = false;\n }\n init() {\n if (this._inited) {\n return;\n }\n console.log('init');\n var c = $.c('canvas');\n var ctx = c.getContext('2d');\n\n this.canvas_elem = c;\n this.canvas_ctx = ctx;\n this.jm.view.e_panel.appendChild(c);\n this._inited = true;\n this.resize();\n }\n shoot(callback) {\n this.init();\n this._draw(\n function () {\n !!callback && callback();\n this.clean();\n }.bind(this)\n );\n this._watermark();\n }\n shootDownload() {\n this.shoot(\n function () {\n this._download();\n }.bind(this)\n );\n }\n shootAsDataURL(callback) {\n this.shoot(\n function () {\n !!callback && callback(this.canvas_elem.toDataURL());\n }.bind(this)\n );\n }\n resize() {\n if (this._inited) {\n this.canvas_elem.width = this.jm.view.size.w;\n this.canvas_elem.height = this.jm.view.size.h;\n }\n }\n clean() {\n var c = this.canvas_elem;\n this.canvas_ctx.clearRect(0, 0, c.width, c.height);\n }\n _draw(callback) {\n var ctx = this.canvas_ctx;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n this._draw_lines(\n function () {\n this._draw_nodes(callback);\n }.bind(this)\n );\n }\n _watermark() {\n var c = this.canvas_elem;\n var ctx = this.canvas_ctx;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'bottom';\n ctx.fillStyle = '#000';\n ctx.font = '11px Verdana,Arial,Helvetica,sans-serif';\n ctx.fillText('github.com/hizzgdev/jsmind', c.width - 5.5, c.height - 2.5);\n ctx.textAlign = 'left';\n ctx.fillText($.w.location, 5.5, c.height - 2.5);\n }\n _draw_lines(callback) {\n this.jm.view.graph.copy_to(this.canvas_ctx, callback);\n }\n _draw_nodes(callback) {\n var nodes = this.jm.mind.nodes;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n this._draw_node(node);\n }\n\n function check_nodes_ready() {\n console.log('check_node_ready' + new Date());\n var allOk = true;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n allOk = allOk & node.ready;\n }\n\n if (!allOk) {\n $.w.setTimeout(check_nodes_ready, 200);\n } else {\n $.w.setTimeout(callback, 200);\n }\n }\n check_nodes_ready();\n }\n _draw_node(node) {\n var ctx = this.canvas_ctx;\n var view_data = node._data.view;\n var node_element = view_data.element;\n var ncs = getComputedStyle(node_element);\n if (!is_visible(ncs)) {\n node.ready = true;\n return;\n }\n\n var bgcolor = css(ncs, 'background-color');\n var round_radius = parseInt(css(ncs, 'border-top-left-radius'));\n var color = css(ncs, 'color');\n var padding_left = parseInt(css(ncs, 'padding-left'));\n var padding_right = parseInt(css(ncs, 'padding-right'));\n var padding_top = parseInt(css(ncs, 'padding-top'));\n var padding_bottom = parseInt(css(ncs, 'padding-bottom'));\n var text_overflow = css(ncs, 'text-overflow');\n var font =\n css(ncs, 'font-style') +\n ' ' +\n css(ncs, 'font-variant') +\n ' ' +\n css(ncs, 'font-weight') +\n ' ' +\n css(ncs, 'font-size') +\n '/' +\n css(ncs, 'line-height') +\n ' ' +\n css(ncs, 'font-family');\n\n var rb = {\n x: view_data.abs_x,\n y: view_data.abs_y,\n w: view_data.width + 1,\n h: view_data.height + 1,\n };\n var tb = {\n x: rb.x + padding_left,\n y: rb.y + padding_top,\n w: rb.w - padding_left - padding_right,\n h: rb.h - padding_top - padding_bottom,\n };\n\n ctx.font = font;\n ctx.fillStyle = bgcolor;\n ctx.beginPath();\n jcanvas.rect(ctx, rb.x, rb.y, rb.w, rb.h, round_radius);\n ctx.closePath();\n ctx.fill();\n\n ctx.fillStyle = color;\n if ('background-image' in node.data) {\n var backgroundUrl = css(ncs, 'background-image').slice(5, -2);\n node.ready = false;\n var rotation = 0;\n if ('background-rotation' in node.data) {\n rotation = node.data['background-rotation'];\n }\n jcanvas.image(\n ctx,\n backgroundUrl,\n rb.x,\n rb.y,\n rb.w,\n rb.h,\n round_radius,\n rotation,\n function () {\n node.ready = true;\n }\n );\n }\n if (!!node.topic) {\n if (text_overflow === 'ellipsis') {\n jcanvas.text_ellipsis(ctx, node.topic, tb.x, tb.y, tb.w, tb.h);\n } else {\n var line_height = parseInt(css(ncs, 'line-height'));\n jcanvas.text_multiline(ctx, node.topic, tb.x, tb.y, tb.w, tb.h, line_height);\n }\n }\n if (!!view_data.expander) {\n this._draw_expander(view_data.expander);\n }\n if (!('background-image' in node.data)) {\n node.ready = true;\n }\n }\n _draw_expander(expander) {\n var ctx = this.canvas_ctx;\n var ncs = getComputedStyle(expander);\n if (!is_visible(ncs)) {\n return;\n }\n\n var style_left = css(ncs, 'left');\n var style_top = css(ncs, 'top');\n var font = css(ncs, 'font');\n var left = parseInt(style_left);\n var top = parseInt(style_top);\n var is_plus = expander.innerHTML === '+';\n\n ctx.lineWidth = 1;\n\n ctx.beginPath();\n ctx.arc(left + 7, top + 7, 5, 0, Math.PI * 2, true);\n ctx.moveTo(left + 10, top + 7);\n ctx.lineTo(left + 4, top + 7);\n if (is_plus) {\n ctx.moveTo(left + 7, top + 4);\n ctx.lineTo(left + 7, top + 10);\n }\n ctx.closePath();\n ctx.stroke();\n }\n _download() {\n var c = this.canvas_elem;\n var name = this.jm.mind.name + '.png';\n\n if (navigator.msSaveBlob && !!c.msToBlob) {\n var blob = c.msToBlob();\n navigator.msSaveBlob(blob, name);\n } else {\n var bloburl = this.canvas_elem.toDataURL();\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\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 = bloburl;\n }\n }\n }\n jm_event_handle(type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n}\n\nvar screenshot_plugin = new jsMind.plugin('screenshot', function (jm) {\n var jss = new screenshot(jm);\n jm.screenshot = jss;\n jm.shoot = function () {\n jss.shoot();\n };\n jm.add_event_listener(function (type, data) {\n jss.jm_event_handle.call(jss, type, data);\n });\n});\n\njsMind.register_plugin(screenshot_plugin);\n"],"names":["jsMind","Error","$","css","cStyle","property_name","getPropertyValue","is_visible","visibility","display","jcanvas","ctx","x","y","w","h","r","moveTo","arcTo","text","lineheight","line","text_len","length","chars","split","test_line","textAlign","textBaseline","i","measureText","width","fillText","center_y","fittingString","max_width","ellipsis_width","len","substring","url","rotation","callback","img","Image","onload","save","translate","beginPath","rect","closePath","clip","rotate","Math","PI","drawImage","restore","src","screenshot","constructor","jm","this","canvas_elem","canvas_ctx","_inited","init","console","log","c","getContext","view","e_panel","appendChild","resize","shoot","_draw","clean","bind","_watermark","shootDownload","_download","shootAsDataURL","toDataURL","size","height","clearRect","_draw_lines","_draw_nodes","fillStyle","font","location","graph","copy_to","node","nodes","mind","nodeid","_draw_node","check_nodes_ready","Date","allOk","ready","setTimeout","view_data","_data","node_element","element","ncs","getComputedStyle","bgcolor","round_radius","parseInt","color","padding_left","padding_right","padding_top","padding_bottom","text_overflow","rb","abs_x","abs_y","tb","fill","data","backgroundUrl","slice","image","topic","text_ellipsis","line_height","text_multiline","expander","_draw_expander","style_left","style_top","left","top","is_plus","innerHTML","lineWidth","arc","lineTo","stroke","name","navigator","msSaveBlob","msToBlob","blob","bloburl","anchor","style","href","download","d","body","evt","createEvent","initEvent","dispatchEvent","removeChild","jm_event_handle","type","event_type","screenshot_plugin","plugin","jss","add_event_listener","call","register_plugin"],"mappings":"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"} \ No newline at end of file diff --git a/js/jsmind.js b/js/jsmind.js index 818bbd29..ce184965 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -12,7 +12,7 @@ // __name__ should be a const value, Never try to change it easily. var __name__ = 'jsMind'; // library version - var __version__ = '0.5.0'; + var __version__ = '0.5.2'; // author var __author__ = 'hizzgdev@163.com'; diff --git a/package.json b/package.json index 3b1b8461..73b48cde 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsmind", - "version": "0.5.0", + "version": "0.5.2", "description": "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.", "main": "js/jsmind.js", "directories": { diff --git a/src/jsmind.common.js b/src/jsmind.common.js index 660a087a..df7cfb5b 100644 --- a/src/jsmind.common.js +++ b/src/jsmind.common.js @@ -6,7 +6,7 @@ * https://github.com/hizzgdev/jsmind/ */ -export const __version__ = '0.5.0'; +export const __version__ = '0.5.2'; export const __author__ = 'hizzgdev@163.com'; if (typeof String.prototype.startsWith != 'function') { From 248ab90b440e0395b3630f109b948807e533d1a8 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Mon, 26 Dec 2022 18:03:54 +0800 Subject: [PATCH 091/274] use js url on cdn --- example/1_basic.html | 6 +++--- example/2_features.html | 8 ++++---- example/2_features_es6.html | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/example/1_basic.html b/example/1_basic.html index 0d295d81..0a187d70 100644 --- a/example/1_basic.html +++ b/example/1_basic.html @@ -4,7 +4,7 @@ jsMind - + + + + +
    + + + + + diff --git a/example/2_features.html b/example/2_features.html index 07ef4e61..efa550c2 100644 --- a/example/2_features.html +++ b/example/2_features.html @@ -4,7 +4,11 @@ jsMind - + + + + +
    +
    +
    1. Open
    +
      +
    1. +
    2. +
    3. + +
    4. +
    5. + +
    6. +
    7. +
    +
    2. Select & Toggle
    +
      +
    1. +
    2. + +
    3. +
    4. +
    +
    3. Edit
    +
      +
    1. +
    2. +
    3. +
    4. +
    5. + +
    6. +
    7. +
    8. +
    9. +
    10. +
    +
    4. Style
    +
      +
    1. +
    2. +
    3. +
    4. +
    +
    5. Theme
    +
      +
    1. + +
    2. +
    +
    6. Adjusting
    +
      +
    1. + + +
    2. +
    3. expand/collapse
    4. +
        +
      1. +
      2. +
      3. +
      4. + +
      5. +
      6. + +
      7. +
      8. +
      9. +
      +
    5. zoom(ctrl+mousewheel)
    6. + + +
    + +
    7. Multi Format
    +
      +
    1. node_tree(default)
    2. +
        +
      1. +
      2. +
      3. +
      4. +
      +
    3. node_array
    4. +
        +
      1. + +
      2. +
      3. + +
      4. +
      5. +
      6. +
      +
    5. freemind(.mm)
    6. +
        +
      1. + +
      2. +
      3. + +
      4. +
      5. +
      6. +
      +
    +
    +
    +
    + +
    +
    + + + + + + diff --git a/example/2_features_es6.html b/example/2_features_es6.html index 4eba8002..c5cf815e 100644 --- a/example/2_features_es6.html +++ b/example/2_features_es6.html @@ -4,7 +4,11 @@ jsMind - + - - -
    -
    -
    1. Open
    -
      -
    1. -
    2. -
    3. - -
    4. -
    5. - -
    6. -
    7. -
    -
    2. Select & Toggle
    -
      -
    1. -
    2. - -
    3. -
    4. -
    -
    3. Edit
    -
      -
    1. -
    2. -
    3. -
    4. -
    5. - -
    6. -
    7. -
    8. -
    9. -
    10. -
    -
    4. Style
    -
      -
    1. -
    2. -
    3. -
    4. -
    -
    5. Theme
    -
      -
    1. - -
    2. -
    -
    6. Adjusting
    -
      -
    1. - - -
    2. -
    3. expand/collapse
    4. -
        -
      1. -
      2. -
      3. -
      4. - -
      5. -
      6. - -
      7. -
      8. -
      9. -
      -
    5. zoom(ctrl+mousewheel)
    6. - - -
    - -
    7. Multi Format
    -
      -
    1. node_tree(default)
    2. -
        -
      1. -
      2. -
      3. -
      4. -
      -
    3. node_array
    4. -
        -
      1. - -
      2. -
      3. - -
      4. -
      5. -
      6. -
      -
    5. freemind(.mm)
    6. -
        -
      1. - -
      2. -
      3. - -
      4. -
      5. -
      6. -
      -
    7. text
    8. -
        -
      1. - -
      2. -
      3. - -
      4. -
      5. -
      6. -
      -
    -
    -
    -
    - -
    -
    - - - - - - diff --git a/example/3_mathjax.html b/example/3_mathjax.html deleted file mode 100644 index 4173da3d..00000000 --- a/example/3_mathjax.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - jsMind - - - - - - - -
    - - - - - - - diff --git a/example/demo.html b/example/demo.html index b004f1fb..1157d35a 100644 --- a/example/demo.html +++ b/example/demo.html @@ -20,8 +20,8 @@
    - - + + - - - + + + + diff --git a/example/2_features.js b/example/2_features.js new file mode 100644 index 00000000..b128f476 --- /dev/null +++ b/example/2_features.js @@ -0,0 +1,455 @@ +var _jm = null; +function open_empty() { + var options = { + container: 'jsmind_container', + theme: 'greensea', + editable: true, + view: { + draggable: true, + }, + }; + _jm = new jsMind(options); + _jm.show(); +} + +function open_json() { + var mind = { + meta: { + name: 'jsMind remote', + author: 'hizzgdev@163.com', + version: '0.2', + }, + format: 'node_tree', + data: { + id: 'root', + topic: 'jsMind', + children: [ + { + id: 'easy', + topic: 'Easy', + direction: 'left', + children: [ + { id: 'easy1', topic: 'Easy to show' }, + { id: 'easy2', topic: 'Easy to edit' }, + { id: 'easy3', topic: 'Easy to store' }, + { id: 'easy4', topic: 'Easy to embed' }, + { + 'id': 'other3', + 'background-image': 'ant.png', + 'width': '100', + 'height': '100', + }, + ], + }, + { + id: 'open', + topic: 'Open Source', + direction: 'right', + children: [ + { + 'id': 'open1', + 'topic': 'on GitHub', + 'background-color': '#eee', + 'foreground-color': 'blue', + }, + { id: 'open2', topic: 'BSD License' }, + ], + }, + { + id: 'powerful', + topic: 'Powerful', + direction: 'right', + children: [ + { id: 'powerful1', topic: 'Base on Javascript' }, + { id: 'powerful2', topic: 'Base on HTML5' }, + { id: 'powerful3', topic: 'Depends on you' }, + ], + }, + { + id: 'other', + topic: 'test node', + direction: 'left', + children: [ + { id: 'other1', topic: "I'm from local variable" }, + { id: 'other2', topic: 'I can do everything' }, + ], + }, + ], + }, + }; + _jm.show(mind); +} + +function open_ajax() { + var mind_url = 'data_example.json'; + jsMind.util.ajax.get(mind_url, function (mind) { + _jm.show(mind); + }); +} + +function screen_shot() { + _jm.screenshot.shootDownload(); +} + +function show_data() { + var mind_data = _jm.get_data(); + var mind_string = jsMind.util.json.json2string(mind_data); + prompt_info(mind_string); +} + +function save_file() { + var mind_data = _jm.get_data(); + var mind_name = mind_data.meta.name; + var mind_str = jsMind.util.json.json2string(mind_data); + jsMind.util.file.save(mind_str, 'text/jsmind', mind_name + '.jm'); +} + +function open_file() { + var file_input = document.getElementById('file_input'); + var files = file_input.files; + if (files.length > 0) { + var file_data = files[0]; + jsMind.util.file.read(file_data, function (jsmind_data, jsmind_name) { + var mind = jsMind.util.json.string2json(jsmind_data); + if (!!mind) { + _jm.show(mind); + } else { + prompt_info('can not open this file as mindmap'); + } + }); + } else { + prompt_info('please choose a file first'); + } +} + +function select_node() { + var nodeid = 'other'; + _jm.select_node(nodeid); +} + +function show_selected() { + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + prompt_info(selected_node.topic); + } else { + prompt_info('nothing'); + } +} + +function get_selected_nodeid() { + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + return selected_node.id; + } else { + return null; + } +} + +function add_node() { + var selected_node = _jm.get_selected_node(); // as parent of new node + if (!selected_node) { + prompt_info('please select a node first.'); + return; + } + + var nodeid = jsMind.util.uuid.newid(); + var topic = '* Node_' + nodeid.substr(nodeid.length - 6) + ' *'; + var node = _jm.add_node(selected_node, nodeid, topic); +} + +var imageChooser = document.getElementById('image-chooser'); + +imageChooser.addEventListener( + 'change', + function (event) { + // Read file here. + var reader = new FileReader(); + reader.onloadend = function () { + var selected_node = _jm.get_selected_node(); + var nodeid = jsMind.util.uuid.newid(); + var topic = undefined; + var data = { + 'background-image': reader.result, + 'width': '100', + 'height': '100', + }; + var node = _jm.add_node(selected_node, nodeid, topic, data); + //var node = _jm.add_image_node(selected_node, nodeid, reader.result, 100, 100); + //add_image_node:function(parent_node, nodeid, image, width, height, data, idx, direction, expanded){ + }; + + var file = imageChooser.files[0]; + if (file) { + reader.readAsDataURL(file); + } + }, + false +); + +function add_image_node() { + var selected_node = _jm.get_selected_node(); // as parent of new node + if (!selected_node) { + prompt_info('please select a node first.'); + return; + } + + imageChooser.focus(); + imageChooser.click(); +} + +function modify_node() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + // modify the topic + _jm.update_node(selected_id, '--- modified ---'); +} + +function move_to_first() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + _jm.move_node(selected_id, '_first_'); +} + +function move_to_last() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + _jm.move_node(selected_id, '_last_'); +} + +function move_node() { + // move a node before another + _jm.move_node('other', 'open'); +} + +function remove_node() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + _jm.remove_node(selected_id); +} + +function change_text_font() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + _jm.set_node_font_style(selected_id, 28); +} + +function change_text_color() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + _jm.set_node_color(selected_id, null, '#000'); +} + +function change_background_color() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + _jm.set_node_color(selected_id, '#eee', null); +} + +function change_background_image() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + _jm.set_node_background_image(selected_id, 'ant.png', 100, 100); +} + +function set_theme(theme_name) { + _jm.set_theme(theme_name); +} + +var zoomInButton = document.getElementById('zoom-in-button'); +var zoomOutButton = document.getElementById('zoom-out-button'); + +function zoomIn() { + if (_jm.view.zoom_in()) { + zoomOutButton.disabled = false; + } else { + zoomInButton.disabled = true; + } +} + +function zoomOut() { + if (_jm.view.zoom_out()) { + zoomInButton.disabled = false; + } else { + zoomOutButton.disabled = true; + } +} + +function toggle_editable(btn) { + var editable = _jm.get_editable(); + if (editable) { + _jm.disable_edit(); + btn.innerHTML = 'enable editable'; + } else { + _jm.enable_edit(); + btn.innerHTML = 'disable editable'; + } +} + +// this method change size of container, perpare for adjusting jsmind +function change_container() { + var c = document.getElementById('jsmind_container'); + c.style.width = '800px'; + c.style.height = '500px'; +} + +function resize_jsmind() { + _jm.resize(); +} + +function expand() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + _jm.expand_node(selected_id); +} + +function collapse() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + _jm.collapse_node(selected_id); +} + +function toggle() { + var selected_id = get_selected_nodeid(); + if (!selected_id) { + prompt_info('please select a node first.'); + return; + } + + _jm.toggle_node(selected_id); +} + +function expand_all() { + _jm.expand_all(); +} + +function expand_to_level2() { + _jm.expand_to_depth(2); +} + +function expand_to_level3() { + _jm.expand_to_depth(3); +} + +function collapse_all() { + _jm.collapse_all(); +} + +function get_nodearray_data() { + var mind_data = _jm.get_data('node_array'); + var mind_string = jsMind.util.json.json2string(mind_data); + prompt_info(mind_string); +} + +function save_nodearray_file() { + var mind_data = _jm.get_data('node_array'); + var mind_name = mind_data.meta.name; + var mind_str = jsMind.util.json.json2string(mind_data); + jsMind.util.file.save(mind_str, 'text/jsmind', mind_name + '.jm'); +} + +function open_nodearray() { + var file_input = document.getElementById('file_input_nodearray'); + var files = file_input.files; + if (files.length > 0) { + var file_data = files[0]; + jsMind.util.file.read(file_data, function (jsmind_data, jsmind_name) { + var mind = jsMind.util.json.string2json(jsmind_data); + if (!!mind) { + _jm.show(mind); + } else { + prompt_info('can not open this file as mindmap'); + } + }); + } else { + prompt_info('please choose a file first'); + } +} + +function get_freemind_data() { + var mind_data = _jm.get_data('freemind'); + var mind_string = jsMind.util.json.json2string(mind_data); + alert(mind_string); +} + +function save_freemind_file() { + var mind_data = _jm.get_data('freemind'); + var mind_name = mind_data.meta.name || 'freemind'; + var mind_str = mind_data.data; + jsMind.util.file.save(mind_str, 'text/xml', mind_name + '.mm'); +} + +function open_freemind() { + var file_input = document.getElementById('file_input_freemind'); + var files = file_input.files; + if (files.length > 0) { + var file_data = files[0]; + jsMind.util.file.read(file_data, function (freemind_data, freemind_name) { + if (freemind_data) { + var mind_name = freemind_name; + if (/.*\.mm$/.test(mind_name)) { + mind_name = freemind_name.substring(0, freemind_name.length - 3); + } + var mind = { + meta: { + name: mind_name, + author: 'hizzgdev@163.com', + version: '1.0.1', + }, + format: 'freemind', + data: freemind_data, + }; + _jm.show(mind); + } else { + prompt_info('can not open this file as mindmap'); + } + }); + } else { + prompt_info('please choose a file first'); + } +} + +function prompt_info(msg) { + alert(msg); +} + +open_empty(); diff --git a/example/2_features_cn.html b/example/2_features_cn.html index 71ee3643..cf3f9e1a 100644 --- a/example/2_features_cn.html +++ b/example/2_features_cn.html @@ -206,462 +206,6 @@ type="text/javascript" src="//jsd.onmicrosoft.cn/npm/jsmind/es6/jsmind.screenshot.js" > - + diff --git a/src/jsmind.js b/src/jsmind.js index ccb06d5c..e3f2995f 100644 --- a/src/jsmind.js +++ b/src/jsmind.js @@ -63,6 +63,7 @@ export default class jsMind { draggable: this.options.view.draggable, hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable, node_overflow: this.options.view.node_overflow, + zoom: this.options.view.zoom, }; // create instance of function provider this.data = new DataProvider(this); @@ -77,7 +78,7 @@ export default class jsMind { this._event_bind(); - apply_plugins(this); + apply_plugins(this, this.options); } get_editable() { return this.options.editable; @@ -174,9 +175,9 @@ export default class jsMind { evt.preventDefault(); if (evt.deltaY < 0) { - this.view.zoomIn(evt); // wheel down + this.view.zoom_in(evt); // wheel down } else { - this.view.zoomOut(evt); + this.view.zoom_out(evt); } } begin_edit(node) { diff --git a/src/jsmind.option.js b/src/jsmind.option.js index c171aa6e..e60e47b0 100644 --- a/src/jsmind.option.js +++ b/src/jsmind.option.js @@ -25,6 +25,11 @@ const default_options = { draggable: false, // drag the mind map with your mouse, when it's larger that the container hide_scrollbars_when_draggable: false, // hide container scrollbars, when mind map is larger than container and draggable option is true. node_overflow: 'hidden', // hidden or wrap + zoom: { + min: 0.5, + max: 2.1, + step: 0.1, + }, }, layout: { hspace: 30, diff --git a/src/jsmind.plugin.js b/src/jsmind.plugin.js index f6e1b9b4..54c402f7 100644 --- a/src/jsmind.plugin.js +++ b/src/jsmind.plugin.js @@ -13,32 +13,35 @@ const plugin_data = { }; export function register(plugin) { - if (!plugin instanceof Plugin) { - throw new Error('plugin ' + plugin + ' is not a supported plugin'); + if (!(plugin instanceof Plugin)) { + throw new Error('can not register plugin, it is not an instance of Plugin'); + } + if (plugin_data.plugins.map(p => p.name).includes(plugin.name)) { + throw new Error('can not register plugin ' + plugin.name + ': plugin name already exist'); } plugin_data.plugins.push(plugin); } -export function apply(jm) { +export function apply(jm, options) { $.w.setTimeout(function () { - _apply(jm); + _apply(jm, options); }, 0); } -function _apply(jm) { - var l = plugin_data.plugins.length; - var fn_init = null; - for (var i = 0; i < l; i++) { - fn_init = plugin_data.plugins[i].init; - if (typeof fn_init === 'function') { - fn_init(jm); - } - } +function _apply(jm, options) { + plugin_data.plugins.forEach(p => p.fn_init(jm, options[p.name])); } export class Plugin { - constructor(name, init) { + // fn_init(jm, options) + constructor(name, fn_init) { + if (!name) { + throw new Error('plugin must has a name'); + } + if (!fn_init || typeof fn_init !== 'function') { + throw new Error('plugin must has an init function'); + } this.name = name; - this.init = init; + this.fn_init = fn_init; } } diff --git a/src/jsmind.view_provider.js b/src/jsmind.view_provider.js index 3c4a9d5e..34ed4a61 100644 --- a/src/jsmind.view_provider.js +++ b/src/jsmind.view_provider.js @@ -29,6 +29,7 @@ export class ViewProvider { this._initialized = false; } init() { + logger.debug(this.opts); logger.debug('view.init'); this.container = $.i(this.opts.container) ? this.opts.container : $.g(this.opts.container); @@ -56,9 +57,6 @@ export class ViewProvider { this.e_editor.type = 'text'; this.zoom_current = 1; - this.zoom_step = 0.1; - this.zoom_min = 0.5; - this.zoom_max = 2.1; var v = this; $.on(this.e_editor, 'keydown', function (e) { @@ -340,13 +338,13 @@ export class ViewProvider { this.jm.invoke_event_handle(EventType.resize, { data: [] }); } zoom_in(e) { - return this.set_zoom(this.zoom_current + this.zoom_step, e); + return this.set_zoom(this.zoom_current + this.opts.zoom.step, e); } zoom_out(e) { - return this.set_zoom(this.zoom_current - this.zoom_step, e); + return this.set_zoom(this.zoom_current - this.opts.zoom.step, e); } set_zoom(zoom, e) { - if (zoom < this.zoom_min || zoom > this.zoom_max) { + if (zoom < this.opts.zoom.min || zoom > this.opts.zoom.max) { return false; } let e_panel_rect = this.e_panel.getBoundingClientRect(); diff --git a/src/plugins/jsmind.draggable-node.js b/src/plugins/jsmind.draggable-node.js index 0fb762a8..47d5b9d0 100644 --- a/src/plugins/jsmind.draggable-node.js +++ b/src/plugins/jsmind.draggable-node.js @@ -10,8 +10,7 @@ if (!jsMind) { throw new Error('jsMind is not defined'); } -const jm = jsMind; -const $ = jm.$; +const $ = jsMind.$; const clear_selection = 'getSelection' in $.w @@ -22,7 +21,7 @@ const clear_selection = $.d.selection.empty(); }; -const options = { +const DEFAULT_OPTIONS = { line_width: 5, line_color: 'rgba(0,0,0,0.3)', lookup_delay: 500, @@ -32,8 +31,9 @@ const options = { }; class DraggableNode { - constructor(jm) { + constructor(jm, options) { this.jm = jm; + this.options = jsMind.util.json.merge(options || {}, DEFAULT_OPTIONS); this.e_canvas = null; this.canvas_ctx = null; this.shadow = null; @@ -50,7 +50,7 @@ class DraggableNode { this.hlookup_timer = 0; this.capture = false; this.moved = false; - this.canvas_draggable = this.jm.get_view_draggable(); + this.canvas_draggable = jm.get_view_draggable(); this.view_panel = jm.view.e_panel; this.view_panel_rect = null; } @@ -102,8 +102,8 @@ class DraggableNode { } _magnet_shadow(node) { if (!!node) { - this.canvas_ctx.lineWidth = options.line_width; - this.canvas_ctx.strokeStyle = options.line_color; + this.canvas_ctx.lineWidth = this.options.line_width; + this.canvas_ctx.strokeStyle = this.options.line_color; this.canvas_ctx.lineCap = 'round'; this._clear_lines(); this._canvas_lineto(node.sp.x, node.sp.y, node.np.x, node.np.y); @@ -157,15 +157,15 @@ class DraggableNode { continue; } distance = Math.abs(sx - nl.x - ns.w) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2); - np = { x: nl.x + ns.w - options.line_width, y: nl.y + ns.h / 2 }; - sp = { x: sx + options.line_width, y: sy + sh / 2 }; + np = { x: nl.x + ns.w - this.options.line_width, y: nl.y + ns.h / 2 }; + sp = { x: sx + this.options.line_width, y: sy + sh / 2 }; } else { if (nl.x - sx - sw <= 0) { continue; } distance = Math.abs(sx + sw - nl.x) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2); - np = { x: nl.x + options.line_width, y: nl.y + ns.h / 2 }; - sp = { x: sx + sw - options.line_width, y: sy + sh / 2 }; + np = { x: nl.x + this.options.line_width, y: nl.y + ns.h / 2 }; + sp = { x: sx + sw - this.options.line_width, y: sy + sh / 2 }; } if (distance < min_distance) { closest_node = node; @@ -248,9 +248,9 @@ class DraggableNode { this.view_panel_rect = this.view_panel.getBoundingClientRect(); this.active_node = node; this.offset_x = - (e.clientX || e.touches[0].clientX) / jview.actualZoom - el.offsetLeft; + (e.clientX || e.touches[0].clientX) / jview.zoom_current - el.offsetLeft; this.offset_y = - (e.clientY || e.touches[0].clientY) / jview.actualZoom - el.offsetTop; + (e.clientY || e.touches[0].clientY) / jview.zoom_current - el.offsetTop; this.client_hw = Math.floor(el.clientWidth / 2); this.client_hh = Math.floor(el.clientHeight / 2); if (this.hlookup_delay != 0) { @@ -264,8 +264,8 @@ class DraggableNode { jd.hlookup_delay = 0; jd.hlookup_timer = $.w.setInterval(function () { jd.lookup_close_node.call(jd); - }, options.lookup_interval); - }, options.lookup_delay); + }, jd.options.lookup_interval); + }, this.options.lookup_delay); this.capture = true; } } @@ -280,41 +280,41 @@ class DraggableNode { this.moved = true; clear_selection(); var jview = this.jm.view; - var px = (e.clientX || e.touches[0].clientX) / jview.actualZoom - this.offset_x; - var py = (e.clientY || e.touches[0].clientY) / jview.actualZoom - this.offset_y; + var px = (e.clientX || e.touches[0].clientX) / jview.zoom_current - this.offset_x; + var py = (e.clientY || e.touches[0].clientY) / jview.zoom_current - this.offset_y; // scrolling container axisY if drag nodes exceeding container if ( - e.clientY - this.view_panel_rect.top < options.scrolling_trigger_width && - this.view_panel.scrollTop > options.scrolling_step_length + e.clientY - this.view_panel_rect.top < this.options.scrolling_trigger_width && + this.view_panel.scrollTop > this.options.scrolling_step_length ) { - this.view_panel.scrollBy(0, -options.scrolling_step_length); - this.offset_y += options.scrolling_step_length / jview.actualZoom; + this.view_panel.scrollBy(0, -this.options.scrolling_step_length); + this.offset_y += this.options.scrolling_step_length / jview.zoom_current; } else if ( - this.view_panel_rect.bottom - e.clientY < options.scrolling_trigger_width && + this.view_panel_rect.bottom - e.clientY < this.options.scrolling_trigger_width && this.view_panel.scrollTop < this.view_panel.scrollHeight - this.view_panel_rect.height - - options.scrolling_step_length + this.options.scrolling_step_length ) { - this.view_panel.scrollBy(0, options.scrolling_step_length); - this.offset_y -= options.scrolling_step_length / jview.actualZoom; + this.view_panel.scrollBy(0, this.options.scrolling_step_length); + this.offset_y -= this.options.scrolling_step_length / jview.zoom_current; } // scrolling container axisX if drag nodes exceeding container if ( - e.clientX - this.view_panel_rect.left < options.scrolling_trigger_width && - this.view_panel.scrollLeft > options.scrolling_step_length + e.clientX - this.view_panel_rect.left < this.options.scrolling_trigger_width && + this.view_panel.scrollLeft > this.options.scrolling_step_length ) { - this.view_panel.scrollBy(-options.scrolling_step_length, 0); - this.offset_x += options.scrolling_step_length / jview.actualZoom; + this.view_panel.scrollBy(-this.options.scrolling_step_length, 0); + this.offset_x += this.options.scrolling_step_length / jview.zoom_current; } else if ( - this.view_panel_rect.right - e.clientX < options.scrolling_trigger_width && + this.view_panel_rect.right - e.clientX < this.options.scrolling_trigger_width && this.view_panel.scrollLeft < this.view_panel.scrollWidth - this.view_panel_rect.width - - options.scrolling_step_length + this.options.scrolling_step_length ) { - this.view_panel.scrollBy(options.scrolling_step_length, 0); - this.offset_x -= options.scrolling_step_length / jview.actualZoom; + this.view_panel.scrollBy(this.options.scrolling_step_length, 0); + this.offset_x -= this.options.scrolling_step_length / jview.zoom_current; } this.shadow.style.left = px + 'px'; this.shadow.style.top = py + 'px'; @@ -388,8 +388,8 @@ class DraggableNode { } } -var draggable_plugin = new jm.plugin('draggable_node', function (jm) { - var jd = new DraggableNode(jm); +var draggable_plugin = new jsMind.plugin('draggable_node', function (jm, options) { + var jd = new DraggableNode(jm, options); jd.init(); jm.add_event_listener(function (type, data) { jd.jm_event_handle.call(jd, type, data); diff --git a/tests/unit/jsmind.plugin.test.js b/tests/unit/jsmind.plugin.test.js new file mode 100644 index 00000000..d32c852f --- /dev/null +++ b/tests/unit/jsmind.plugin.test.js @@ -0,0 +1,65 @@ +import { expect, test, jest } from '@jest/globals'; +import { Plugin, register, apply } from '../../src/jsmind.plugin.js'; + +test('register and apply plugins', async () => { + const plugin1_fn_init = jest.fn(); + const plugin2_fn_init = jest.fn(); + + const plugin1 = new Plugin('a', plugin1_fn_init); + const plugin2 = new Plugin('b', plugin2_fn_init); + + register(plugin1); + register(plugin2); + + const mock_jm = { jm: 'mock' }; + const mock_options = { + a: { + a: 'A', + }, + b: { + b: 'B', + }, + }; + apply(mock_jm, mock_options); + + await new Promise(r => setTimeout(r, 10)); + expect(plugin1_fn_init).toBeCalledWith(mock_jm, mock_options.a); + expect(plugin2_fn_init).toBeCalledWith(mock_jm, mock_options.b); +}); + +test('constructor invalid plugins', () => { + expect(() => { + new Plugin(); + }).toThrow(new Error('plugin must has a name')); + expect(() => { + new Plugin(null); + }).toThrow(new Error('plugin must has a name')); + expect(() => { + new Plugin('', {}); + }).toThrow(new Error('plugin must has a name')); + expect(() => { + new Plugin('a'); + }).toThrow(new Error('plugin must has an init function')); + expect(() => { + new Plugin('a', {}); + }).toThrow(new Error('plugin must has an init function')); +}); + +test('register invalid plugins', () => { + expect(() => { + register({}); + }).toThrow(new Error('can not register plugin, it is not an instance of Plugin')); + expect(() => { + register('a'); + }).toThrow(new Error('can not register plugin, it is not an instance of Plugin')); + + const mock_fn_init = jest.fn(); + + const plugin1 = new Plugin('x', mock_fn_init); + const plugin2 = new Plugin('x', mock_fn_init); + + register(plugin1); + expect(() => { + register(plugin2); + }).toThrow(new Error('can not register plugin x: plugin name already exist')); +}); diff --git a/tests/unit/jsmind.test.js b/tests/unit/jsmind.test.js index eac6fb5a..4399caef 100644 --- a/tests/unit/jsmind.test.js +++ b/tests/unit/jsmind.test.js @@ -273,29 +273,29 @@ describe('event handler', () => { test('mousewheel', () => { const evt = { preventDefault: jest.fn(), ctrlKey: true }; const jsmind = create_fake_mind(); - jsmind.view = { zoomIn: jest.fn(), zoomOut: jest.fn() }; + jsmind.view = { zoom_in: jest.fn(), zoom_out: jest.fn() }; jsmind.enable_event_handle('mousewheel'); evt.deltaY = 1; jsmind.mousewheel_handle(evt); - expect(jsmind.view.zoomOut).toBeCalledTimes(1); - expect(jsmind.view.zoomIn).toBeCalledTimes(0); + expect(jsmind.view.zoom_out).toBeCalledTimes(1); + expect(jsmind.view.zoom_in).toBeCalledTimes(0); evt.deltaY = -1; jsmind.mousewheel_handle(evt); - expect(jsmind.view.zoomOut).toBeCalledTimes(1); - expect(jsmind.view.zoomIn).toBeCalledTimes(1); + expect(jsmind.view.zoom_out).toBeCalledTimes(1); + expect(jsmind.view.zoom_in).toBeCalledTimes(1); evt.ctrlKey = false; jsmind.mousewheel_handle(evt); - expect(jsmind.view.zoomIn).toBeCalledTimes(1); - expect(jsmind.view.zoomOut).toBeCalledTimes(1); + expect(jsmind.view.zoom_in).toBeCalledTimes(1); + expect(jsmind.view.zoom_out).toBeCalledTimes(1); evt.ctrlKey = true; jsmind.disable_event_handle('mousewheel'); jsmind.mousewheel_handle(evt); - expect(jsmind.view.zoomIn).toBeCalledTimes(1); - expect(jsmind.view.zoomOut).toBeCalledTimes(1); + expect(jsmind.view.zoom_in).toBeCalledTimes(1); + expect(jsmind.view.zoom_out).toBeCalledTimes(1); }); }); From 176d25714250c0c27e5f16ff6c896ebcce13c117 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Tue, 30 May 2023 20:22:46 +0800 Subject: [PATCH 138/274] optimize zoom method to avoid zoom_out much (#473) --- src/jsmind.js | 2 +- src/jsmind.option.js | 4 ++-- src/jsmind.view_provider.js | 13 +++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/jsmind.js b/src/jsmind.js index e3f2995f..ab580153 100644 --- a/src/jsmind.js +++ b/src/jsmind.js @@ -120,7 +120,7 @@ export default class jsMind { this.view.add_event(this, 'mousedown', this.mousedown_handle); this.view.add_event(this, 'click', this.click_handle); this.view.add_event(this, 'dblclick', this.dblclick_handle); - this.view.add_event(this, 'mousewheel', this.mousewheel_handle, false); + this.view.add_event(this, 'mousewheel', this.mousewheel_handle, true); } mousedown_handle(e) { if (!this.options.default_event_handle['enable_mousedown_handle']) { diff --git a/src/jsmind.option.js b/src/jsmind.option.js index e60e47b0..f61ed59e 100644 --- a/src/jsmind.option.js +++ b/src/jsmind.option.js @@ -18,8 +18,8 @@ const default_options = { view: { engine: 'canvas', - hmargin: 'auto', - vmargin: 'auto', + hmargin: 100, + vmargin: 50, line_width: 2, line_color: '#555', draggable: false, // drag the mind map with your mouse, when it's larger that the container diff --git a/src/jsmind.view_provider.js b/src/jsmind.view_provider.js index 34ed4a61..2462890b 100644 --- a/src/jsmind.view_provider.js +++ b/src/jsmind.view_provider.js @@ -37,12 +37,6 @@ export class ViewProvider { logger.error('the options.view.container was not be found in dom'); return; } - if (isNaN(this.opts.hmargin)) { - this.opts.hmargin = this.container.clientWidth; - } - if (isNaN(this.opts.vmargin)) { - this.opts.vmargin = this.container.clientHeight; - } this.graph = init_graph(this, this.opts.engine); this.e_panel = $.c('div'); @@ -348,6 +342,13 @@ export class ViewProvider { return false; } let e_panel_rect = this.e_panel.getBoundingClientRect(); + if ( + zoom < 1 && + this.size.w * zoom < e_panel_rect.width && + this.size.h * zoom < e_panel_rect.height + ) { + return false; + } let zoom_center = !!e ? { x: e.x - e_panel_rect.x, y: e.y - e_panel_rect.y } : { x: e_panel_rect.width / 2, y: e_panel_rect.height / 2 }; From 9c30ab8a12dcaa0330b1b5e5d5711b44f5ec5981 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Tue, 30 May 2023 20:40:03 +0800 Subject: [PATCH 139/274] relocate options of plugin (#474) --- example/2_features.html | 12 +++++++++--- src/jsmind.js | 2 +- src/jsmind.option.js | 1 + src/plugins/jsmind.draggable-node.js | 6 +++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/example/2_features.html b/example/2_features.html index aed53a9c..6bd4b0d7 100644 --- a/example/2_features.html +++ b/example/2_features.html @@ -190,9 +190,15 @@ - - - + + + diff --git a/src/jsmind.js b/src/jsmind.js index ab580153..dfbe0c9e 100644 --- a/src/jsmind.js +++ b/src/jsmind.js @@ -78,7 +78,7 @@ export default class jsMind { this._event_bind(); - apply_plugins(this, this.options); + apply_plugins(this, this.options.plugin); } get_editable() { return this.options.editable; diff --git a/src/jsmind.option.js b/src/jsmind.option.js index f61ed59e..6b1653bf 100644 --- a/src/jsmind.option.js +++ b/src/jsmind.option.js @@ -58,6 +58,7 @@ const default_options = { down: 40, // Down }, }, + plugin: {}, }; export function merge_option(options) { diff --git a/src/plugins/jsmind.draggable-node.js b/src/plugins/jsmind.draggable-node.js index 47d5b9d0..5e71ed34 100644 --- a/src/plugins/jsmind.draggable-node.js +++ b/src/plugins/jsmind.draggable-node.js @@ -32,8 +32,12 @@ const DEFAULT_OPTIONS = { class DraggableNode { constructor(jm, options) { + var opts = {}; + jsMind.util.json.merge(opts, DEFAULT_OPTIONS); + jsMind.util.json.merge(opts, options); + this.jm = jm; - this.options = jsMind.util.json.merge(options || {}, DEFAULT_OPTIONS); + this.options = opts; this.e_canvas = null; this.canvas_ctx = null; this.shadow = null; From c43145539ff648febe01251264a6fec2447ffdd6 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Tue, 30 May 2023 20:42:45 +0800 Subject: [PATCH 140/274] upgrade version to 0.6.3 (#475) --- package-lock.json | 4 ++-- package.json | 2 +- src/jsmind.common.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c2642e7..8d78417e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jsmind", - "version": "0.6.2", + "version": "0.6.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jsmind", - "version": "0.6.2", + "version": "0.6.3", "license": "BSD-3-Clause", "devDependencies": { "http-server": "^14.1.1", diff --git a/package.json b/package.json index 3f971472..a4353dd6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsmind", - "version": "0.6.2", + "version": "0.6.3", "description": "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.", "main": "es6/jsmind.js", "directories": { diff --git a/src/jsmind.common.js b/src/jsmind.common.js index 5239b482..e02858bb 100644 --- a/src/jsmind.common.js +++ b/src/jsmind.common.js @@ -6,7 +6,7 @@ * https://github.com/hizzgdev/jsmind/ */ -export const __version__ = '0.6.2'; +export const __version__ = '0.6.3'; export const __author__ = 'hizzgdev@163.com'; if (typeof String.prototype.startsWith != 'function') { From 2356dfd7e58f9d5d06b5f1f44cde148f05b3d3e8 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Tue, 30 May 2023 21:13:55 +0800 Subject: [PATCH 141/274] add version to plugins --- src/plugins/jsmind.draggable-node.js | 1 + src/plugins/jsmind.screenshot.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/plugins/jsmind.draggable-node.js b/src/plugins/jsmind.draggable-node.js index 5e71ed34..024662fd 100644 --- a/src/plugins/jsmind.draggable-node.js +++ b/src/plugins/jsmind.draggable-node.js @@ -36,6 +36,7 @@ class DraggableNode { jsMind.util.json.merge(opts, DEFAULT_OPTIONS); jsMind.util.json.merge(opts, options); + this.version = '0.3.0'; this.jm = jm; this.options = opts; this.e_canvas = null; diff --git a/src/plugins/jsmind.screenshot.js b/src/plugins/jsmind.screenshot.js index 3973d589..5e5862c8 100644 --- a/src/plugins/jsmind.screenshot.js +++ b/src/plugins/jsmind.screenshot.js @@ -97,6 +97,7 @@ jcanvas.image = function (ctx, url, x, y, w, h, r, rotation, callback) { class screenshot { constructor(jm) { + this.version = '0.1.0'; this.jm = jm; this.canvas_elem = null; this.canvas_ctx = null; From 2ad351a3a732c71321de9496406582b8161484a8 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Tue, 30 May 2023 23:55:20 +0800 Subject: [PATCH 142/274] update docs --- README.md | 10 ++++++---- docs/en/1.usage.md | 13 ++++++++++--- docs/zh/1.usage.md | 14 +++++++++++--- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 399f03b8..f1a2138c 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,15 @@ The ES6 version of jsMind has been launched. see details from [es6/README.md](es @@ -57,11 +57,13 @@ The ES6 version of jsMind has been launched. see details from [es6/README.md](es ``` +> Read the [usage doc](docs/zh/1.usage.html) to learn more knowledge about CDN and version. + ## Links - Resources: - [NPM - jsmind](https://www.npmjs.com/package/jsmind) - - CDN - [UNPKG](https://unpkg.com/browse/jsmind/), [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind) + - CDN - [UNPKG](https://unpkg.com/browse/jsmind/), [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/), [jsDelivr 的国内镜像](https://jsd.onmicrosoft.cn/npm/jsmind/) - [文档 - Documents](https://hizzgdev.github.io/jsmind/docs) - Apps : - diff --git a/docs/en/1.usage.md b/docs/en/1.usage.md index 6dc0ca59..73cb43e9 100644 --- a/docs/en/1.usage.md +++ b/docs/en/1.usage.md @@ -12,15 +12,22 @@ At first, 2 files (jsmind.css and jsmind.js) are required. Here we link to the resources on the CDN. It is recommended to use the latest version. ```html - + + + - ``` +> CDN: other available CDNs are [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/), and the mirror of jsDelivr 的[jsDelivr](https://jsd.onmicrosoft.cn/npm/jsmind/). the resource urls would look like: +> - https://unpkg.com/jsmind@0.6.3/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.6.3/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.6.3/es6/jsmind.js + +> Version: the version number appear in the url of CDN. It's strongly recommended that you also specify the version number in your project to avoid the risks that caused by version upgrades. Access the [Release page](https://github.com/hizzgdev/jsmind/releases) to get the latest version number of jsMind. Add script jsmind.draggable-node.js for enabling draggable node feature. ```html - + ``` The second, a div element should be in your HTML as container diff --git a/docs/zh/1.usage.md b/docs/zh/1.usage.md index a02ee05b..f478507c 100644 --- a/docs/zh/1.usage.md +++ b/docs/zh/1.usage.md @@ -11,16 +11,24 @@ 首先,需要在页面上引用 jsmind.js 和 jsmind.css 两个文件,这里我们引用的是 CDN 上的资源,请注意使用最新的版本。 + ```html - + - + ``` +> CDN:其它可用的 CDN 还有 [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/),以及 jsDelivr 的[国内镜像](https://jsd.onmicrosoft.cn/npm/jsmind/)。文件路径大概像这样: +> - https://unpkg.com/jsmind@0.6.3/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.6.3/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.6.3/es6/jsmind.js + +> 版本:上面的示例url中都有版本号,强烈建议你在项目里也指明版本号,以避免版本升级给你的项目带来风险。访问 [Release 页面](https://github.com/hizzgdev/jsmind/releases) 可以获取 jsmind 的最新版本号. + 如果希望能够通过鼠标拖拽的方式移动节点,需要额外引用 jsmind.draggable-node.js 文件 ```html - + ``` 其次,要为 jsMind 准备一个容器,jsMind 将在这个容器里显示思维导图。可自行定义容器的id、大小及样式。 From 244c483d2a544277ec1c3e7cba4dae221529134e Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Tue, 30 May 2023 23:59:43 +0800 Subject: [PATCH 143/274] update doc link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f1a2138c..4351517b 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ The ES6 version of jsMind has been launched. see details from [es6/README.md](es ``` -> Read the [usage doc](docs/zh/1.usage.html) to learn more knowledge about CDN and version. +> 查阅[文档](docs/zh/1.usage.md)以获取更多关于 CDN 以及版本的知识。 Read the [doc](docs/en/1.usage.md) to learn more knowledge about CDN and version. ## Links From 3a44018f5eda2bf78f155057b070b5a7d433ad3a Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Wed, 31 May 2023 00:03:13 +0800 Subject: [PATCH 144/274] update doc content --- docs/en/1.usage.md | 2 +- docs/zh/1.usage.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/1.usage.md b/docs/en/1.usage.md index 73cb43e9..9f6af4cd 100644 --- a/docs/en/1.usage.md +++ b/docs/en/1.usage.md @@ -17,7 +17,7 @@ At first, 2 files (jsmind.css and jsmind.js) are required. Here we link to the r ``` -> CDN: other available CDNs are [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/), and the mirror of jsDelivr 的[jsDelivr](https://jsd.onmicrosoft.cn/npm/jsmind/). the resource urls would look like: +> CDN: other available CDNs are [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/), and [the mirror of jsDelivr in China](https://jsd.onmicrosoft.cn/npm/jsmind/). the resource urls would look like: > - https://unpkg.com/jsmind@0.6.3/es6/jsmind.js > - https://cdn.jsdelivr.net/npm/jsmind@0.6.3/es6/jsmind.js > - https://jsd.onmicrosoft.cn/npm/jsmind@0.6.3/es6/jsmind.js diff --git a/docs/zh/1.usage.md b/docs/zh/1.usage.md index f478507c..06430b7e 100644 --- a/docs/zh/1.usage.md +++ b/docs/zh/1.usage.md @@ -23,7 +23,7 @@ > - https://cdn.jsdelivr.net/npm/jsmind@0.6.3/es6/jsmind.js > - https://jsd.onmicrosoft.cn/npm/jsmind@0.6.3/es6/jsmind.js -> 版本:上面的示例url中都有版本号,强烈建议你在项目里也指明版本号,以避免版本升级给你的项目带来风险。访问 [Release 页面](https://github.com/hizzgdev/jsmind/releases) 可以获取 jsmind 的最新版本号. +> 版本:上面的示例url中都有版本号,强烈建议你在项目里也指明版本号,以避免版本升级给你的项目带来风险。访问 [Release 页面](https://github.com/hizzgdev/jsmind/releases) 可以获取 jsmind 的最新版本号。 如果希望能够通过鼠标拖拽的方式移动节点,需要额外引用 jsmind.draggable-node.js 文件 From 6d243fdcb664a942430747d530bb9e05d84497f2 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Fri, 30 Jun 2023 23:55:46 +0800 Subject: [PATCH 145/274] Add readme about es6 version --- es6/README-en.md | 37 +++++++++++++++++++++++++++++++++++++ es6/README.md | 29 ++++++++++++++--------------- 2 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 es6/README-en.md diff --git a/es6/README-en.md b/es6/README-en.md new file mode 100644 index 00000000..27364cd2 --- /dev/null +++ b/es6/README-en.md @@ -0,0 +1,37 @@ +# jsMind ES6 Version + +[[中文](README.md) | English] + +jsMind is now written in ES6 code, the source code is in `/src`, and the dist directory is `/es6`. + + +### Compatibility + +All features in the JS version are fully compatible in the ES6 version. + +### Migration + +If you use `jsMind` via `NPM`, no migration is required, we just changed the `main` file to `es6/jsmind.js` + +If you reference `jsMind` from CDN, the only thing you need to do is change the url from `js/*.js` to `es6/*.js`. + +E.g. + +```html + + + + + +``` + +### Deprecation + +The legacy version `/js` will be kept in repo for several months, and then will be removed in a version with a break change alert. + +### Local build + +You probably notice that there is no `js` files or `es6` files in the directory `/es6`. Yes, we publish the dist file to `NPM` but don't store them in the repo. + +You can download the resources from CDN, or build them locally by running `npm run build` in the root dir of the project. Read [development doc](../docs/en/5.development.md) to get the detail about code building. + diff --git a/es6/README.md b/es6/README.md index c328af74..fb8b402d 100644 --- a/es6/README.md +++ b/es6/README.md @@ -1,35 +1,34 @@ # jsMind ES6 Version -jsMind is now written in ES6 code, the source code is in `/src`, and the dist directory is `/es6`. +[中文 | [English](README-en.md)] +jsMind 现在已经用 ES6 编写了,源代码位于 `/src`,构建目录为 `/es6`。 -### Compatible -All features in the JS version are fully compatible in the ES6 version. +### 兼容性 -### Migration +之前 JS 版本里的所有功能,在 ES6 的版本中都是兼容的。 -If you use `jsMind` via `NPM`, no migration is required, we just changed the `main` file to `es6/jsmind.js` +### 迁移到新版 -If you reference `jsMind` from CDN, the only thing you need to do is change the url from `js/*.js` to `es6/*.js`. +如果你是通过 `NPM` 引用的 `jsMind`,则无须手动迁移,我们只是在 `project.json` 里将 `main` 修改成了 `es6/jsmind.js` 。 -E.g. +如果你是通过 CDN 引用 `jsMind` 的话,你仅仅需要把 url 从 `js/*.js` 改成 `es6/*.js` 。 如: ```html - + - + ``` -### Deprecation +### 老版本下线 -The legacy version `/js` will be kept in repo for serval months, and then will be removed in a version with a break change alert. +在未来的几个月,原先的版本仍将会保留在 `/js` 目录里,然后将会在某个带有不兼容警告的版本里移除。 -### Local build +### 本地构建 -You probably notice that there is no `js` files or `es6` files in the directory `/es6`. Yes, we publish the dist file to `NPM` but don't store them in the repo. - -If you can not refer the resource from CDN, the dist files can be built by running `npm run build` in the root dir of the project. see details for [development](../docs/en/5.development.md) +你可以注意到了,在 `es6` 这个目录里没有任何 `js` 或 `es` 文件。是的,构建的文件仅会被包含在 `NPM` 里,但并不会保留在代码库中。 +你可以从 CDN 上下载这些文件,也可以在你本地构建,只需在项目根目录里运行 `npm run build` 即可。更详细的介绍可参考[贡献代码指南](../docs/en/5.development.md)里的相关内容。 From 2452579d1c1d84d08a19b67050790802a380e9c3 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sat, 1 Jul 2023 00:03:20 +0800 Subject: [PATCH 146/274] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4351517b..b6d1117c 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ jsMind is mind map library built by javascript, it base on html5 canvas and svg. ES6 版本现已发布,详情请查阅 [es6/README.md](es6/README.md) -The ES6 version of jsMind has been launched. see details from [es6/README.md](es6/README.md) +The ES6 version of jsMind has been launched. see details from [es6/README-en.md](es6/README-en.md) ## Get Started From 35da9ed90db7189b7e1fcbc91a533e47f96dfacf Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sat, 1 Jul 2023 17:13:28 +0800 Subject: [PATCH 147/274] [Feature] new option of line style (#480) * add option to config the line style * update docs to intro the line_style option * update docs to indicate the default option * format --- docs/en/2.options.md | 5 +++++ docs/zh/2.options.md | 8 +++++++- src/jsmind.graph.js | 22 +++++++++++++--------- src/jsmind.js | 1 + src/jsmind.option.js | 1 + 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/docs/en/2.options.md b/docs/en/2.options.md index d069d758..678be863 100644 --- a/docs/en/2.options.md +++ b/docs/en/2.options.md @@ -36,6 +36,7 @@ options = { vmargin:50, // Minimum vertical distance of the mindmap from the outer frame of the container line_width:2, // thickness of the mindmap line line_color:'#555', // Thought mindmap line color + line_style:'curved', // line style, straight or curved draggable: false, // Drag the mind map with your mouse, when it's larger that the container hide_scrollbars_when_draggable: false, // Hide container scrollbars, when mind map is larger than container and draggable option is true. node_overflow: 'hidden' // Text overflow style in node @@ -126,6 +127,10 @@ These options are described in more detail below. **view.line_width** : (number) Thickness of the mindmap line (pixels) **view.line_color** : (string) color of the mindmap line (color representation in HTML). [for ES6 version] If `data.leading-line-color` is set on `node`, this option will be overridden. +**view.line_style** : (string) style of the mindmap line. [for ES6 version], the available options are: +> * `curved` [default] +> * `straight` + > These two parameters determine the style of the lines in the mindmap. By default, the lines are 2px in thickness and dark gray in color (#555). **view.draggable** : (bool) Do you want whole mind map draggable inside container? diff --git a/docs/zh/2.options.md b/docs/zh/2.options.md index 6c151745..92222a93 100644 --- a/docs/zh/2.options.md +++ b/docs/zh/2.options.md @@ -36,6 +36,7 @@ options = { vmargin:50, // 思维导图距容器外框的最小垂直距离 line_width:2, // 思维导图线条的粗细 line_color:'#555', // 思维导图线条的颜色 + line_style:'curved',// 思维导图线条的样式,直线(straight)或者曲线(curved) draggable: false, // 当容器不能完全容纳思维导图时,是否允许拖动画布代替鼠标滚动 hide_scrollbars_when_draggable: false, // 当设置 draggable = true 时,是否隐藏滚动条 node_overflow: 'hidden' // 节点文本过长时的样式 @@ -122,7 +123,12 @@ options = { > 这两个参数决定了思维导图与容器的边框能距离多近。把思维导图本身作为一个对象的话,这两个参数就类似该对象的 margin(css) 属性。这两个参数的默认值为 container 的宽和高。 **view.line_width** : (number) 思维导图线条的粗细(像素) -**view.line_color** : (string) 思维导图线条的颜色(html的颜色表示方法)。[在 ES6 版本里] 如果一个 `node` 设置了 `data.leading-line-color`,此选项将会被覆盖. +**view.line_color** : (string) 思维导图线条的颜色(html的颜色表示方法)。[仅在 ES6 版本里支持] 如果一个 `node` 设置了 `data.leading-line-color`,此选项将会被覆盖 + +**view.line_style** : (string) 思维导图线条的样式. [仅在 ES6 版本里支持], 可用的选项有: + +> * `curved` 表示曲线 [默认值] +> * `straight` 表示直线 > 这两个参数决定了思维导图中的线条的样式。默认情况下,线条的粗细是2px,颜色是深灰色(#555)。 diff --git a/src/jsmind.graph.js b/src/jsmind.graph.js index b6387f6e..9a183b96 100644 --- a/src/jsmind.graph.js +++ b/src/jsmind.graph.js @@ -16,6 +16,11 @@ class SvgGraph { this.e_svg.setAttribute('class', 'jsmind'); this.size = { w: 0, h: 0 }; this.lines = []; + this.line_drawing = { + straight: this._line_to, + curved: this._bezier_to, + }; + this.drawing = this.line_drawing[this.opts.line_style] || this.line_drawing.curved; } static c(tag) { return $.d.createElementNS('http://www.w3.org/2000/svg', tag); @@ -43,7 +48,7 @@ class SvgGraph { line.setAttribute('fill', 'transparent'); this.lines.push(line); this.e_svg.appendChild(line); - this._bezier_to( + this.drawing( line, pin.x + offset.x, pin.y + offset.y, @@ -51,6 +56,7 @@ class SvgGraph { pout.y + offset.y ); } + copy_to(dest_canvas_ctx, callback) { var img = new Image(); img.onload = function () { @@ -93,6 +99,11 @@ class CanvasGraph { this.e_canvas.className = 'jsmind'; this.canvas_ctx = this.e_canvas.getContext('2d'); this.size = { w: 0, h: 0 }; + this.line_drawing = { + straight: this._line_to, + curved: this._bezier_to, + }; + this.drawing = this.line_drawing[this.opts.line_style] || this.line_drawing.curved; } element() { return this.e_canvas; @@ -111,14 +122,7 @@ class CanvasGraph { ctx.strokeStyle = color || this.opts.line_color; ctx.lineWidth = this.opts.line_width; ctx.lineCap = 'round'; - - this._bezier_to( - ctx, - pin.x + offset.x, - pin.y + offset.y, - pout.x + offset.x, - pout.y + offset.y - ); + this.drawing(ctx, pin.x + offset.x, pin.y + offset.y, pout.x + offset.x, pout.y + offset.y); } copy_to(dest_canvas_ctx, callback) { dest_canvas_ctx.drawImage(this.e_canvas, 0, 0); diff --git a/src/jsmind.js b/src/jsmind.js index dfbe0c9e..a6a527d0 100644 --- a/src/jsmind.js +++ b/src/jsmind.js @@ -60,6 +60,7 @@ export default class jsMind { vmargin: this.options.view.vmargin, line_width: this.options.view.line_width, line_color: this.options.view.line_color, + line_style: this.options.view.line_style, draggable: this.options.view.draggable, hide_scrollbars_when_draggable: this.options.view.hide_scrollbars_when_draggable, node_overflow: this.options.view.node_overflow, diff --git a/src/jsmind.option.js b/src/jsmind.option.js index 6b1653bf..03b2227c 100644 --- a/src/jsmind.option.js +++ b/src/jsmind.option.js @@ -22,6 +22,7 @@ const default_options = { vmargin: 50, line_width: 2, line_color: '#555', + line_style: 'curved', // straight or curved draggable: false, // drag the mind map with your mouse, when it's larger that the container hide_scrollbars_when_draggable: false, // hide container scrollbars, when mind map is larger than container and draggable option is true. node_overflow: 'hidden', // hidden or wrap From 01fc137e0d8f956f391cc4892c5248a15a1e60fe Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sat, 1 Jul 2023 17:17:13 +0800 Subject: [PATCH 148/274] update version to 0.6.4 (#481) --- README.md | 6 +++--- docs/en/1.usage.md | 12 ++++++------ package-lock.json | 4 ++-- src/jsmind.common.js | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b6d1117c..c40a11d7 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,15 @@ The ES6 version of jsMind has been launched. see details from [es6/README-en.md] diff --git a/docs/en/1.usage.md b/docs/en/1.usage.md index 9f6af4cd..a0d31b10 100644 --- a/docs/en/1.usage.md +++ b/docs/en/1.usage.md @@ -12,22 +12,22 @@ At first, 2 files (jsmind.css and jsmind.js) are required. Here we link to the resources on the CDN. It is recommended to use the latest version. ```html - + - + ``` > CDN: other available CDNs are [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/), and [the mirror of jsDelivr in China](https://jsd.onmicrosoft.cn/npm/jsmind/). the resource urls would look like: -> - https://unpkg.com/jsmind@0.6.3/es6/jsmind.js -> - https://cdn.jsdelivr.net/npm/jsmind@0.6.3/es6/jsmind.js -> - https://jsd.onmicrosoft.cn/npm/jsmind@0.6.3/es6/jsmind.js +> - https://unpkg.com/jsmind@0.6.4/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.6.4/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.6.4/es6/jsmind.js > Version: the version number appear in the url of CDN. It's strongly recommended that you also specify the version number in your project to avoid the risks that caused by version upgrades. Access the [Release page](https://github.com/hizzgdev/jsmind/releases) to get the latest version number of jsMind. Add script jsmind.draggable-node.js for enabling draggable node feature. ```html - + ``` The second, a div element should be in your HTML as container diff --git a/package-lock.json b/package-lock.json index 8d78417e..e423fd75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jsmind", - "version": "0.6.3", + "version": "0.6.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jsmind", - "version": "0.6.3", + "version": "0.6.4", "license": "BSD-3-Clause", "devDependencies": { "http-server": "^14.1.1", diff --git a/src/jsmind.common.js b/src/jsmind.common.js index e02858bb..cb1006ee 100644 --- a/src/jsmind.common.js +++ b/src/jsmind.common.js @@ -6,7 +6,7 @@ * https://github.com/hizzgdev/jsmind/ */ -export const __version__ = '0.6.3'; +export const __version__ = '0.6.4'; export const __author__ = 'hizzgdev@163.com'; if (typeof String.prototype.startsWith != 'function') { From d9a8d85498f82932c68c5c8508942899a5d2d528 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sat, 1 Jul 2023 17:20:50 +0800 Subject: [PATCH 149/274] update version to 0.6.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a4353dd6..6f4da952 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsmind", - "version": "0.6.3", + "version": "0.6.4", "description": "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.", "main": "es6/jsmind.js", "directories": { From be8a9cce40a2bbc489134c03f0b21e83138a3f6f Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sat, 1 Jul 2023 17:30:49 +0800 Subject: [PATCH 150/274] update docs --- docs/en/2.options.md | 3 +-- docs/zh/2.options.md | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/en/2.options.md b/docs/en/2.options.md index 678be863..87d9e3e7 100644 --- a/docs/en/2.options.md +++ b/docs/en/2.options.md @@ -126,13 +126,12 @@ These options are described in more detail below. **view.line_width** : (number) Thickness of the mindmap line (pixels) **view.line_color** : (string) color of the mindmap line (color representation in HTML). [for ES6 version] If `data.leading-line-color` is set on `node`, this option will be overridden. +> By default, the lines are 2px in thickness and dark gray in color (#555). **view.line_style** : (string) style of the mindmap line. [for ES6 version], the available options are: > * `curved` [default] > * `straight` -> These two parameters determine the style of the lines in the mindmap. By default, the lines are 2px in thickness and dark gray in color (#555). - **view.draggable** : (bool) Do you want whole mind map draggable inside container? > The default value of this parameter is false, as it keep the default behavior with vertical and horizontal scrollbars on the container when mind map is bigger than the container. diff --git a/docs/zh/2.options.md b/docs/zh/2.options.md index 92222a93..c49d4dee 100644 --- a/docs/zh/2.options.md +++ b/docs/zh/2.options.md @@ -125,13 +125,13 @@ options = { **view.line_width** : (number) 思维导图线条的粗细(像素) **view.line_color** : (string) 思维导图线条的颜色(html的颜色表示方法)。[仅在 ES6 版本里支持] 如果一个 `node` 设置了 `data.leading-line-color`,此选项将会被覆盖 +> 默认情况下,线条的粗细是2px,颜色是深灰色(#555)。 + **view.line_style** : (string) 思维导图线条的样式. [仅在 ES6 版本里支持], 可用的选项有: > * `curved` 表示曲线 [默认值] > * `straight` 表示直线 -> 这两个参数决定了思维导图中的线条的样式。默认情况下,线条的粗细是2px,颜色是深灰色(#555)。 - **view.draggable** : (bool) 当容器不能完全容纳思维导图时,是否允许拖动画布代替鼠标滚动 > 当思维导图不能在容器中完全显示时,默认情况下容器内会出现滚动条。开启此选项后,将允许通过拖拽画布的方式查看思维导图的不同部分。此参数默认值为 `false` (不开启此功能) From edf8818b48406968d4e714b44f33bea8dc97bef6 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sun, 2 Jul 2023 16:06:14 +0800 Subject: [PATCH 151/274] update docs of es6 --- es6/README-en.md | 4 ++-- es6/README.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/es6/README-en.md b/es6/README-en.md index 27364cd2..e45c28c1 100644 --- a/es6/README-en.md +++ b/es6/README-en.md @@ -1,6 +1,6 @@ # jsMind ES6 Version -[[中文](README.md) | English] +[[中文](README.md)] | [English] jsMind is now written in ES6 code, the source code is in `/src`, and the dist directory is `/es6`. @@ -27,7 +27,7 @@ E.g. ### Deprecation -The legacy version `/js` will be kept in repo for several months, and then will be removed in a version with a break change alert. +The legacy version `/js` will be kept in repo for several months, and then will be moved into another dir in a version with a break change alert. ### Local build diff --git a/es6/README.md b/es6/README.md index fb8b402d..2b82b904 100644 --- a/es6/README.md +++ b/es6/README.md @@ -1,6 +1,6 @@ # jsMind ES6 Version -[中文 | [English](README-en.md)] +[中文] | [[English](README-en.md)] jsMind 现在已经用 ES6 编写了,源代码位于 `/src`,构建目录为 `/es6`。 @@ -25,10 +25,10 @@ jsMind 现在已经用 ES6 编写了,源代码位于 `/src`,构建目录为 ### 老版本下线 -在未来的几个月,原先的版本仍将会保留在 `/js` 目录里,然后将会在某个带有不兼容警告的版本里移除。 +之前的版本仍将会保留在 `/js` 目录里,我们将会在几个月后发布的新的版本里把这些文件移动到其它目录,并添加上不兼容性警告。 ### 本地构建 -你可以注意到了,在 `es6` 这个目录里没有任何 `js` 或 `es` 文件。是的,构建的文件仅会被包含在 `NPM` 里,但并不会保留在代码库中。 +你可能注意到了,在 `es6` 这个目录里没有任何 `js` 或 `es` 文件。是的,构建的文件仅会被包含在 `NPM` 里,但并不会保留在代码库中。 你可以从 CDN 上下载这些文件,也可以在你本地构建,只需在项目根目录里运行 `npm run build` 即可。更详细的介绍可参考[贡献代码指南](../docs/en/5.development.md)里的相关内容。 From 5153b66b616d7d693101d2a76c120f934e5e5e66 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sun, 2 Jul 2023 16:52:17 +0800 Subject: [PATCH 152/274] update docs of ES6 --- docs/en/1.usage.md | 2 +- docs/en/2.options.md | 4 ++-- docs/en/5.development.md | 2 +- docs/zh/1.usage.md | 14 +++++++------- docs/zh/2.options.md | 4 ++-- es6/README.md | 2 +- js/jsmind.draggable-node.js | 2 +- js/jsmind.js | 2 +- js/jsmind.screenshot.js | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/en/1.usage.md b/docs/en/1.usage.md index a0d31b10..9d66947d 100644 --- a/docs/en/1.usage.md +++ b/docs/en/1.usage.md @@ -199,7 +199,7 @@ In addition to the Themes, there are some styles can be set at node level: * font-style: font style of the topic of a node, e.g.`italic` * background-image: background image url e.g. `http://fakeurl.com/fake-picture.png`, or a data url, e.g. `data:image/png;base64,...` * background-rotation: the rotation of the background image, e.g. `30` -* leading-line-color: the color of the leading line of a node, e.g. `#1abc9c`, `blue` (only works in ES6 version) +* leading-line-color: the color of the leading line of a node, e.g. `#1abc9c`, `blue` How to set: diff --git a/docs/en/2.options.md b/docs/en/2.options.md index 87d9e3e7..b6ac6a4e 100644 --- a/docs/en/2.options.md +++ b/docs/en/2.options.md @@ -125,10 +125,10 @@ These options are described in more detail below. > These two parameters determine how close the mindmap can be to the border of the container. These two parameters are similar to the margin(css) property of the object if you consider the thought map itself as an object. The default value of them are the width and height of the container. **view.line_width** : (number) Thickness of the mindmap line (pixels) -**view.line_color** : (string) color of the mindmap line (color representation in HTML). [for ES6 version] If `data.leading-line-color` is set on `node`, this option will be overridden. +**view.line_color** : (string) color of the mindmap line (color representation in HTML). If `data.leading-line-color` is set on `node`, this option will be overridden. > By default, the lines are 2px in thickness and dark gray in color (#555). -**view.line_style** : (string) style of the mindmap line. [for ES6 version], the available options are: +**view.line_style** : (string) style of the mindmap line. The available options are: > * `curved` [default] > * `straight` diff --git a/docs/en/5.development.md b/docs/en/5.development.md index a349cb80..7a266b84 100644 --- a/docs/en/5.development.md +++ b/docs/en/5.development.md @@ -33,7 +33,7 @@ The basic process of contributing code to jsMind is: 5.3. development === -jsMind is written by ES6, source code is in `/src`. Generally, only the code in it needs to be modified. +jsMind is written in ES6 format, source code is in `/src`. Generally, only the code in it needs to be modified. Please remember to format the code at any time during the development process. Execute the following code on the command line to format the code: diff --git a/docs/zh/1.usage.md b/docs/zh/1.usage.md index 06430b7e..a4dff9a0 100644 --- a/docs/zh/1.usage.md +++ b/docs/zh/1.usage.md @@ -13,22 +13,22 @@ ```html - + - + ``` > CDN:其它可用的 CDN 还有 [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/),以及 jsDelivr 的[国内镜像](https://jsd.onmicrosoft.cn/npm/jsmind/)。文件路径大概像这样: -> - https://unpkg.com/jsmind@0.6.3/es6/jsmind.js -> - https://cdn.jsdelivr.net/npm/jsmind@0.6.3/es6/jsmind.js -> - https://jsd.onmicrosoft.cn/npm/jsmind@0.6.3/es6/jsmind.js +> - https://unpkg.com/jsmind@0.6.4/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.6.4/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.6.4/es6/jsmind.js > 版本:上面的示例url中都有版本号,强烈建议你在项目里也指明版本号,以避免版本升级给你的项目带来风险。访问 [Release 页面](https://github.com/hizzgdev/jsmind/releases) 可以获取 jsmind 的最新版本号。 如果希望能够通过鼠标拖拽的方式移动节点,需要额外引用 jsmind.draggable-node.js 文件 ```html - + ``` 其次,要为 jsMind 准备一个容器,jsMind 将在这个容器里显示思维导图。可自行定义容器的id、大小及样式。 @@ -229,7 +229,7 @@ jmnodes.theme-greensea jmexpander:hover{} /* 鼠 * font-style: 节点的文本样式,如 `italic` * background-image: 节点的背景图片,可使用 url,如 `http://fakeurl.com/fake-picture.png`,或 data url 形式,如 `data:image/png;base64,...` * background-rotation: 节点的背景图片旋转角度,如 `30` -* leading-line-color: 节点的引导线颜色,如 `#1abc9c`, `blue`。仅在 ES6 版本中支持。 +* leading-line-color: 节点的引导线颜色,如 `#1abc9c`, `blue`。 设置方法: diff --git a/docs/zh/2.options.md b/docs/zh/2.options.md index c49d4dee..5f7d8bc8 100644 --- a/docs/zh/2.options.md +++ b/docs/zh/2.options.md @@ -123,11 +123,11 @@ options = { > 这两个参数决定了思维导图与容器的边框能距离多近。把思维导图本身作为一个对象的话,这两个参数就类似该对象的 margin(css) 属性。这两个参数的默认值为 container 的宽和高。 **view.line_width** : (number) 思维导图线条的粗细(像素) -**view.line_color** : (string) 思维导图线条的颜色(html的颜色表示方法)。[仅在 ES6 版本里支持] 如果一个 `node` 设置了 `data.leading-line-color`,此选项将会被覆盖 +**view.line_color** : (string) 思维导图线条的颜色(html的颜色表示方法)。如果一个 `node` 设置了 `data.leading-line-color`,此选项将会被覆盖 > 默认情况下,线条的粗细是2px,颜色是深灰色(#555)。 -**view.line_style** : (string) 思维导图线条的样式. [仅在 ES6 版本里支持], 可用的选项有: +**view.line_style** : (string) 思维导图线条的样式。可用的选项有: > * `curved` 表示曲线 [默认值] > * `straight` 表示直线 diff --git a/es6/README.md b/es6/README.md index 2b82b904..7c18f8de 100644 --- a/es6/README.md +++ b/es6/README.md @@ -2,7 +2,7 @@ [中文] | [[English](README-en.md)] -jsMind 现在已经用 ES6 编写了,源代码位于 `/src`,构建目录为 `/es6`。 +jsMind 使用 ES6 编写,源代码位于 `/src`,构建目录为 `/es6`。 ### 兼容性 diff --git a/js/jsmind.draggable-node.js b/js/jsmind.draggable-node.js index 1f197a9e..63e08812 100644 --- a/js/jsmind.draggable-node.js +++ b/js/jsmind.draggable-node.js @@ -8,7 +8,7 @@ (function ($w) { 'use strict'; - console.warn("The version is outdated. see details: https://hizzgdev.github.io/jsmind/es6/README.md") + console.warn("The version is outdated. see details: https://hizzgdev.github.io/jsmind/es6/") var $d = $w.document; var __name__ = 'jsMind'; var jsMind = $w[__name__]; diff --git a/js/jsmind.js b/js/jsmind.js index ae0b7add..84283d3f 100644 --- a/js/jsmind.js +++ b/js/jsmind.js @@ -8,7 +8,7 @@ ; (function ($w) { 'use strict'; - console.warn("The version is outdated. see details: https://hizzgdev.github.io/jsmind/es6/README.md") + console.warn("The version is outdated. see details: https://hizzgdev.github.io/jsmind/es6/") // set 'jsMind' as the library name. // __name__ should be a const value, Never try to change it easily. var __name__ = 'jsMind'; diff --git a/js/jsmind.screenshot.js b/js/jsmind.screenshot.js index c9d29111..8127e0a1 100644 --- a/js/jsmind.screenshot.js +++ b/js/jsmind.screenshot.js @@ -8,7 +8,7 @@ (function ($w) { 'use strict'; - console.warn("The version is outdated. see details: https://hizzgdev.github.io/jsmind/es6/README.md") + console.warn("The version is outdated. see details: https://hizzgdev.github.io/jsmind/es6/") var __name__ = 'jsMind'; var jsMind = $w[__name__]; if (!jsMind) { return; } From f620a777b5a80b8c62f9910b20bcaa05ce343377 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sun, 2 Jul 2023 16:52:56 +0800 Subject: [PATCH 153/274] add test for line_style option --- tests/unit/jsmind.graph.test.js | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/unit/jsmind.graph.test.js b/tests/unit/jsmind.graph.test.js index a3144a71..24122844 100644 --- a/tests/unit/jsmind.graph.test.js +++ b/tests/unit/jsmind.graph.test.js @@ -10,10 +10,19 @@ const view = { }, }; +const view_straight_line = { + opts: { + line_color: 'color', + line_width: 1, + line_style: 'straight', + }, +}; + describe('graph over canvas', () => { const canvas_ctx = { beginPath: jest.fn(), moveTo: jest.fn(), + lineTo: jest.fn(), bezierCurveTo: jest.fn(), stroke: jest.fn(), clearRect: jest.fn(), @@ -57,6 +66,19 @@ describe('graph over canvas', () => { expect(canvas_ctx.stroke).toBeCalled(); }); + test('graph.draw_straight_line', () => { + let graph2 = init_graph(view_straight_line, 'canvas'); + graph2.draw_line({ x: 1, y: 1 }, { x: 2, y: 2 }, { x: 3, y: 3 }); + expect(canvas_ctx.strokeStyle).toBe(view_straight_line.opts.line_color); + expect(canvas_ctx.lineWidth).toBe(view_straight_line.opts.line_width); + expect(canvas_ctx.lineCap).toBe('round'); + + expect(canvas_ctx.beginPath).toBeCalled(); + expect(canvas_ctx.moveTo).toBeCalledWith(5, 5); + expect(canvas_ctx.lineTo).toBeCalledWith(4, 4); + expect(canvas_ctx.stroke).toBeCalled(); + }); + test('graph.copy_to', () => { const mockDest = { drawImage: jest.fn() }; const callback = jest.fn(); @@ -117,6 +139,24 @@ describe('graph over svg', () => { expect(mockSetAttribute).toHaveBeenNthCalledWith(4, 'd', path); }); + test('graph.draw_straight_line', () => { + let graph2 = init_graph(view_straight_line, 'svg'); + graph2.draw_line({ x: 1, y: 1 }, { x: 2, y: 2 }, { x: 3, y: 3 }); + expect(mockSetAttribute).toHaveBeenNthCalledWith( + 9, + 'stroke', + view_straight_line.opts.line_color + ); + expect(mockSetAttribute).toHaveBeenNthCalledWith( + 10, + 'stroke-width', + view_straight_line.opts.line_width + ); + expect(mockSetAttribute).toHaveBeenNthCalledWith(11, 'fill', 'transparent'); + const path = 'M 5 5 L 4 4'; + expect(mockSetAttribute).toHaveBeenNthCalledWith(12, 'd', path); + }); + test('graph.copy_to', () => { const originXMLSerializer = global.XMLSerializer; const originImage = global.Image; From 356465eb3ff85d6f4c17a5e7f7a4de4b7447a51c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jul 2023 17:33:35 +0800 Subject: [PATCH 154/274] Bump tough-cookie from 4.0.0 to 4.1.3 (#484) Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.0.0 to 4.1.3. - [Release notes](https://github.com/salesforce/tough-cookie/releases) - [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md) - [Commits](https://github.com/salesforce/tough-cookie/compare/v4.0.0...v4.1.3) --- updated-dependencies: - dependency-name: tough-cookie dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 62 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index e423fd75..e6141076 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3687,6 +3687,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -4208,14 +4214,15 @@ } }, "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { "node": ">=6" @@ -4279,9 +4286,9 @@ } }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "engines": { "node": ">= 4.0.0" @@ -4293,6 +4300,16 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/v8-to-istanbul": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", @@ -7336,6 +7353,12 @@ "side-channel": "^1.0.4" } }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -7738,14 +7761,15 @@ } }, "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" } }, "tr46": { @@ -7788,9 +7812,9 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true }, "url-join": { @@ -7799,6 +7823,16 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "v8-to-istanbul": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", From e5c9f6e0e1afb0c26f2da55bbd00e5c785d6ba61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jul 2023 11:38:36 +0800 Subject: [PATCH 155/274] Bump word-wrap from 1.2.3 to 1.2.5 (#486) Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.5. - [Release notes](https://github.com/jonschlinkert/word-wrap/releases) - [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.5) --- updated-dependencies: - dependency-name: word-wrap dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6141076..db92fa37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4413,9 +4413,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7912,9 +7912,9 @@ } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, "wrap-ansi": { From 4567843ac08baaa1352dcd88efb146f602250ce2 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sat, 26 Aug 2023 22:14:18 +0800 Subject: [PATCH 156/274] setup dependencies in plugins (#491) --- .config/rollup.config.js | 12 ++++++++++-- package.json | 5 +++++ src/plugins/jsmind.draggable-node.js | 2 ++ src/plugins/jsmind.screenshot.js | 3 ++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.config/rollup.config.js b/.config/rollup.config.js index db7784b0..80b9a252 100644 --- a/.config/rollup.config.js +++ b/.config/rollup.config.js @@ -26,10 +26,14 @@ export default [ input: 'src/plugins/jsmind.draggable-node.js', output: { file: 'es6/jsmind.draggable-node.js', - format: 'iife', + format: 'umd', banner: '/**\n* @license BSD-3-Clause\n* @copyright 2014-2023 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/', sourcemap: true, + globals: { + jsmind: 'jsMind', + }, }, + external: ['jsmind'], plugins: [ cleanup({ comments: 'none', @@ -45,10 +49,14 @@ export default [ input: 'src/plugins/jsmind.screenshot.js', output: { file: 'es6/jsmind.screenshot.js', - format: 'iife', + format: 'umd', banner: '/**\n* @license BSD-3-Clause\n* @copyright 2014-2023 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/', sourcemap: true, + globals: { + jsmind: 'jsMind', + }, }, + external: ['jsmind'], plugins: [ cleanup({ comments: 'none', diff --git a/package.json b/package.json index 6f4da952..b657a70e 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,11 @@ "version": "0.6.4", "description": "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.", "main": "es6/jsmind.js", + "exports": { + ".": "es6/jsmind.js", + "draggable-node": "./es6/jsmind.draggable-node.js", + "screenshot": "./es6/jsmind.screenshot.js" + }, "directories": { "doc": "docs", "example": "example" diff --git a/src/plugins/jsmind.draggable-node.js b/src/plugins/jsmind.draggable-node.js index 024662fd..b3c5aaad 100644 --- a/src/plugins/jsmind.draggable-node.js +++ b/src/plugins/jsmind.draggable-node.js @@ -6,6 +6,8 @@ * https://github.com/hizzgdev/jsmind/ */ +import jsMind from 'jsmind'; + if (!jsMind) { throw new Error('jsMind is not defined'); } diff --git a/src/plugins/jsmind.screenshot.js b/src/plugins/jsmind.screenshot.js index 5e5862c8..d6d6d2dc 100644 --- a/src/plugins/jsmind.screenshot.js +++ b/src/plugins/jsmind.screenshot.js @@ -6,6 +6,8 @@ * https://github.com/hizzgdev/jsmind/ */ +import jsMind from 'jsmind'; + if (!jsMind) { throw new Error('jsMind is not defined'); } @@ -107,7 +109,6 @@ class screenshot { if (this._inited) { return; } - console.log('init'); var c = $.c('canvas'); var ctx = c.getContext('2d'); From d35e65ea9d538715c6f5c83c9df81af7a371e871 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sat, 26 Aug 2023 22:19:24 +0800 Subject: [PATCH 157/274] update version to 0.6.5-preview (#492) --- package-lock.json | 4 ++-- package.json | 2 +- src/jsmind.common.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index db92fa37..e4e6aa51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jsmind", - "version": "0.6.4", + "version": "0.6.5-preview", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jsmind", - "version": "0.6.4", + "version": "0.6.5-preview", "license": "BSD-3-Clause", "devDependencies": { "http-server": "^14.1.1", diff --git a/package.json b/package.json index b657a70e..7b2cd1f4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsmind", - "version": "0.6.4", + "version": "0.6.5-preview", "description": "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.", "main": "es6/jsmind.js", "exports": { diff --git a/src/jsmind.common.js b/src/jsmind.common.js index cb1006ee..efd663f8 100644 --- a/src/jsmind.common.js +++ b/src/jsmind.common.js @@ -6,7 +6,7 @@ * https://github.com/hizzgdev/jsmind/ */ -export const __version__ = '0.6.4'; +export const __version__ = '0.6.5-preview'; export const __author__ = 'hizzgdev@163.com'; if (typeof String.prototype.startsWith != 'function') { From 73a74b7f6316ad87920fdc8920ceae9537a079fc Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sun, 27 Aug 2023 00:42:13 +0800 Subject: [PATCH 158/274] [Doc] add demo with requirejs, update to v0.6.5 (#493) * add demo for requirejs * format --- README.md | 1 + example/1_basic.html | 9 ++---- example/1_basic_cn.html | 8 ++---- example/3_requirejs.html | 61 ++++++++++++++++++++++++++++++++++++++++ package-lock.json | 4 +-- package.json | 4 +-- src/jsmind.common.js | 2 +- 7 files changed, 72 insertions(+), 17 deletions(-) create mode 100644 example/3_requirejs.html diff --git a/README.md b/README.md index c40a11d7..ff84099f 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,7 @@ The ES6 version of jsMind has been launched. see details from [es6/README-en.md] - Demo : - [显示一个脑图 Render a mindmap](https://hizzgdev.github.io/jsmind/example/1_basic.html) [[国内版](https://hizzgdev.github.io/jsmind/example/1_basic_cn.html)] - [试用所有功能 Features simple](https://hizzgdev.github.io/jsmind/example/2_features.html) [[国内版](https://hizzgdev.github.io/jsmind/example/2_features_cn.html)] + - [requirejs + jsMind](https://hizzgdev.github.io/jsmind/example/3_requirejs.html) ## Donate diff --git a/example/1_basic.html b/example/1_basic.html index 4e51d419..3370133c 100644 --- a/example/1_basic.html +++ b/example/1_basic.html @@ -14,18 +14,15 @@ width: 800px; height: 500px; border: solid 1px #ccc; - /*background:#f4f4f4;*/ background: #f4f4f4; } +
    - - + + - + + + + diff --git a/package-lock.json b/package-lock.json index e4e6aa51..60d1009a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jsmind", - "version": "0.6.5-preview", + "version": "0.6.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jsmind", - "version": "0.6.5-preview", + "version": "0.6.5", "license": "BSD-3-Clause", "devDependencies": { "http-server": "^14.1.1", diff --git a/package.json b/package.json index 7b2cd1f4..346d9d23 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "jsmind", - "version": "0.6.5-preview", + "version": "0.6.5", "description": "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.", "main": "es6/jsmind.js", "exports": { - ".": "es6/jsmind.js", + ".": "./es6/jsmind.js", "draggable-node": "./es6/jsmind.draggable-node.js", "screenshot": "./es6/jsmind.screenshot.js" }, diff --git a/src/jsmind.common.js b/src/jsmind.common.js index efd663f8..18d7d70d 100644 --- a/src/jsmind.common.js +++ b/src/jsmind.common.js @@ -6,7 +6,7 @@ * https://github.com/hizzgdev/jsmind/ */ -export const __version__ = '0.6.5-preview'; +export const __version__ = '0.6.5'; export const __author__ = 'hizzgdev@163.com'; if (typeof String.prototype.startsWith != 'function') { From 780f0094c5561288169105274d682f234933459f Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sat, 2 Sep 2023 23:31:19 +0800 Subject: [PATCH 159/274] [Deprecation][Break Change] move legacy version to js-legacy (#495) * move legacy version to js-legacy * code format --- .config/prettierignore | 2 +- es6/README-en.md | 2 +- es6/README.md | 2 +- {js => js-legacy}/jsmind.draggable-node.js | 0 {js => js-legacy}/jsmind.js | 0 {js => js-legacy}/jsmind.screenshot.js | 0 js/README.md | 7 +++++++ tests/legacy/jsmind.versions.js | 2 +- 8 files changed, 11 insertions(+), 4 deletions(-) rename {js => js-legacy}/jsmind.draggable-node.js (100%) rename {js => js-legacy}/jsmind.js (100%) rename {js => js-legacy}/jsmind.screenshot.js (100%) create mode 100644 js/README.md diff --git a/.config/prettierignore b/.config/prettierignore index 87cb2fa7..4d106a8c 100644 --- a/.config/prettierignore +++ b/.config/prettierignore @@ -3,7 +3,7 @@ .vscode docs es6 -js +js-legacy node_modules screenshots LICENSE diff --git a/es6/README-en.md b/es6/README-en.md index e45c28c1..122a701f 100644 --- a/es6/README-en.md +++ b/es6/README-en.md @@ -27,7 +27,7 @@ E.g. ### Deprecation -The legacy version `/js` will be kept in repo for several months, and then will be moved into another dir in a version with a break change alert. +The legacy version of jsmind and plugins have been moved to `/js-legacy`. we will no longer update them, and will remove them one day in the future. It's recommended that everyone use the latest version to follow continuous feature updates and bug fixes. ### Local build diff --git a/es6/README.md b/es6/README.md index 7c18f8de..55ec4fa2 100644 --- a/es6/README.md +++ b/es6/README.md @@ -25,7 +25,7 @@ jsMind 使用 ES6 编写,源代码位于 `/src`,构建目录为 `/es6`。 ### 老版本下线 -之前的版本仍将会保留在 `/js` 目录里,我们将会在几个月后发布的新的版本里把这些文件移动到其它目录,并添加上不兼容性警告。 +之前的版本被移动到了 `/js-legacy` 目录里,我们将不再升级它,并会在未来的某个时间里删除此版本,建议所有人使用最新版本以获得最新的功能及bug修复。 ### 本地构建 diff --git a/js/jsmind.draggable-node.js b/js-legacy/jsmind.draggable-node.js similarity index 100% rename from js/jsmind.draggable-node.js rename to js-legacy/jsmind.draggable-node.js diff --git a/js/jsmind.js b/js-legacy/jsmind.js similarity index 100% rename from js/jsmind.js rename to js-legacy/jsmind.js diff --git a/js/jsmind.screenshot.js b/js-legacy/jsmind.screenshot.js similarity index 100% rename from js/jsmind.screenshot.js rename to js-legacy/jsmind.screenshot.js diff --git a/js/README.md b/js/README.md new file mode 100644 index 00000000..bce2d4ce --- /dev/null +++ b/js/README.md @@ -0,0 +1,7 @@ +ES6 版本现已发布,详情请查阅 [../es6/README.md](../es6/README.md) 。 + +老版 jsmind 以及对应的插件已移至 `js-legacy` 目录下,其最终版本为 0.5.7 。我们将不再升级它,并会在未来的某个时间里删除它们,建议所有人使用最新版本以获得最新的功能及 bug 修复。 + +The ES6 version of jsMind has been launched. see details from [../es6/README-en.md](../es6/README-en.md). + +Legacy jsmind.js and plugins have been moved to `/js-legacy`. we will no longer update them, and will remove them one day in the future. It's recommended that everyone use the latest version to follow continuous feature updates and bug fixes. diff --git a/tests/legacy/jsmind.versions.js b/tests/legacy/jsmind.versions.js index bf29ba43..03867a03 100644 --- a/tests/legacy/jsmind.versions.js +++ b/tests/legacy/jsmind.versions.js @@ -1 +1 @@ -module.exports = require('../../js/jsmind'); +module.exports = require('../../js-legacy/jsmind'); From 3e3d263bb3edab1643e9da4fe25bbb22e1645eae Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sat, 2 Sep 2023 23:42:54 +0800 Subject: [PATCH 160/274] update version to 0.7.0 (#496) --- README.md | 12 ++++++------ docs/en/1.usage.md | 12 ++++++------ docs/zh/1.usage.md | 12 ++++++------ example/3_requirejs.html | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/jsmind.common.js | 2 +- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index ff84099f..4a8cfe57 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,11 @@ jsMind is mind map library built by javascript, it base on html5 canvas and svg. - [jsMind on Github](https://github.com/hizzgdev/jsmind) - [国内镜像 - Gitee](https://gitee.com/hizzgdev/jsmind) -## ES6 Version Update +## !! BREAK CHANGE - Legacy Version is Deprecated !! -ES6 版本现已发布,详情请查阅 [es6/README.md](es6/README.md) +ES6 版本现已发布,老版本已下线,详情请查阅 [es6/README.md](es6/README.md) -The ES6 version of jsMind has been launched. see details from [es6/README-en.md](es6/README-en.md) +The ES6 version of jsMind has been launched, and legacy version has been deprecated. see details from [es6/README-en.md](es6/README-en.md) ## Get Started @@ -26,15 +26,15 @@ The ES6 version of jsMind has been launched. see details from [es6/README-en.md] diff --git a/docs/en/1.usage.md b/docs/en/1.usage.md index 9d66947d..f1b97a01 100644 --- a/docs/en/1.usage.md +++ b/docs/en/1.usage.md @@ -12,22 +12,22 @@ At first, 2 files (jsmind.css and jsmind.js) are required. Here we link to the resources on the CDN. It is recommended to use the latest version. ```html - + - + ``` > CDN: other available CDNs are [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/), and [the mirror of jsDelivr in China](https://jsd.onmicrosoft.cn/npm/jsmind/). the resource urls would look like: -> - https://unpkg.com/jsmind@0.6.4/es6/jsmind.js -> - https://cdn.jsdelivr.net/npm/jsmind@0.6.4/es6/jsmind.js -> - https://jsd.onmicrosoft.cn/npm/jsmind@0.6.4/es6/jsmind.js +> - https://unpkg.com/jsmind@0.7.0/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.7.0/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.0/es6/jsmind.js > Version: the version number appear in the url of CDN. It's strongly recommended that you also specify the version number in your project to avoid the risks that caused by version upgrades. Access the [Release page](https://github.com/hizzgdev/jsmind/releases) to get the latest version number of jsMind. Add script jsmind.draggable-node.js for enabling draggable node feature. ```html - + ``` The second, a div element should be in your HTML as container diff --git a/docs/zh/1.usage.md b/docs/zh/1.usage.md index a4dff9a0..ff03b31d 100644 --- a/docs/zh/1.usage.md +++ b/docs/zh/1.usage.md @@ -13,22 +13,22 @@ ```html - + - + ``` > CDN:其它可用的 CDN 还有 [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/),以及 jsDelivr 的[国内镜像](https://jsd.onmicrosoft.cn/npm/jsmind/)。文件路径大概像这样: -> - https://unpkg.com/jsmind@0.6.4/es6/jsmind.js -> - https://cdn.jsdelivr.net/npm/jsmind@0.6.4/es6/jsmind.js -> - https://jsd.onmicrosoft.cn/npm/jsmind@0.6.4/es6/jsmind.js +> - https://unpkg.com/jsmind@0.7.0/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.7.0/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.0/es6/jsmind.js > 版本:上面的示例url中都有版本号,强烈建议你在项目里也指明版本号,以避免版本升级给你的项目带来风险。访问 [Release 页面](https://github.com/hizzgdev/jsmind/releases) 可以获取 jsmind 的最新版本号。 如果希望能够通过鼠标拖拽的方式移动节点,需要额外引用 jsmind.draggable-node.js 文件 ```html - + ``` 其次,要为 jsMind 准备一个容器,jsMind 将在这个容器里显示思维导图。可自行定义容器的id、大小及样式。 diff --git a/example/3_requirejs.html b/example/3_requirejs.html index 5eff4235..85dbdbd4 100644 --- a/example/3_requirejs.html +++ b/example/3_requirejs.html @@ -40,7 +40,7 @@ meta: { name: 'jsMind example', author: 'hizzgdev@163.com', - version: '0.6.5', + version: '0.7.0', }, format: 'node_tree', data: { diff --git a/package-lock.json b/package-lock.json index 60d1009a..c0b7b36e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jsmind", - "version": "0.6.5", + "version": "0.7.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jsmind", - "version": "0.6.5", + "version": "0.7.0", "license": "BSD-3-Clause", "devDependencies": { "http-server": "^14.1.1", diff --git a/package.json b/package.json index 346d9d23..71a49fa5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsmind", - "version": "0.6.5", + "version": "0.7.0", "description": "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.", "main": "es6/jsmind.js", "exports": { diff --git a/src/jsmind.common.js b/src/jsmind.common.js index 18d7d70d..e24ed10c 100644 --- a/src/jsmind.common.js +++ b/src/jsmind.common.js @@ -6,7 +6,7 @@ * https://github.com/hizzgdev/jsmind/ */ -export const __version__ = '0.6.5'; +export const __version__ = '0.7.0'; export const __author__ = 'hizzgdev@163.com'; if (typeof String.prototype.startsWith != 'function') { From 090ba6036dc39b956c30a710643d7aa1bb161b66 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Fri, 8 Sep 2023 23:24:32 +0800 Subject: [PATCH 161/274] fix import issue #498, update to version 0.7.1 (#499) --- README.md | 6 +++--- docs/en/1.usage.md | 12 ++++++------ docs/zh/1.usage.md | 12 ++++++------ example/3_requirejs.html | 6 +++--- package-lock.json | 4 ++-- package.json | 7 ++++--- src/jsmind.common.js | 2 +- 7 files changed, 25 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 4a8cfe57..2dc072c1 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,15 @@ The ES6 version of jsMind has been launched, and legacy version has been depreca diff --git a/docs/en/1.usage.md b/docs/en/1.usage.md index f1b97a01..a984861e 100644 --- a/docs/en/1.usage.md +++ b/docs/en/1.usage.md @@ -12,22 +12,22 @@ At first, 2 files (jsmind.css and jsmind.js) are required. Here we link to the resources on the CDN. It is recommended to use the latest version. ```html - + - + ``` > CDN: other available CDNs are [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/), and [the mirror of jsDelivr in China](https://jsd.onmicrosoft.cn/npm/jsmind/). the resource urls would look like: -> - https://unpkg.com/jsmind@0.7.0/es6/jsmind.js -> - https://cdn.jsdelivr.net/npm/jsmind@0.7.0/es6/jsmind.js -> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.0/es6/jsmind.js +> - https://unpkg.com/jsmind@0.7.1/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.7.1/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.1/es6/jsmind.js > Version: the version number appear in the url of CDN. It's strongly recommended that you also specify the version number in your project to avoid the risks that caused by version upgrades. Access the [Release page](https://github.com/hizzgdev/jsmind/releases) to get the latest version number of jsMind. Add script jsmind.draggable-node.js for enabling draggable node feature. ```html - + ``` The second, a div element should be in your HTML as container diff --git a/docs/zh/1.usage.md b/docs/zh/1.usage.md index ff03b31d..b1c0e752 100644 --- a/docs/zh/1.usage.md +++ b/docs/zh/1.usage.md @@ -13,22 +13,22 @@ ```html - + - + ``` > CDN:其它可用的 CDN 还有 [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/),以及 jsDelivr 的[国内镜像](https://jsd.onmicrosoft.cn/npm/jsmind/)。文件路径大概像这样: -> - https://unpkg.com/jsmind@0.7.0/es6/jsmind.js -> - https://cdn.jsdelivr.net/npm/jsmind@0.7.0/es6/jsmind.js -> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.0/es6/jsmind.js +> - https://unpkg.com/jsmind@0.7.1/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.7.1/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.1/es6/jsmind.js > 版本:上面的示例url中都有版本号,强烈建议你在项目里也指明版本号,以避免版本升级给你的项目带来风险。访问 [Release 页面](https://github.com/hizzgdev/jsmind/releases) 可以获取 jsmind 的最新版本号。 如果希望能够通过鼠标拖拽的方式移动节点,需要额外引用 jsmind.draggable-node.js 文件 ```html - + ``` 其次,要为 jsMind 准备一个容器,jsMind 将在这个容器里显示思维导图。可自行定义容器的id、大小及样式。 diff --git a/example/3_requirejs.html b/example/3_requirejs.html index 85dbdbd4..11833339 100644 --- a/example/3_requirejs.html +++ b/example/3_requirejs.html @@ -31,16 +31,16 @@ paths: { // note: replace `latest` with a specific version on production 'jsmind': 'https://unpkg.com/jsmind@latest/es6/jsmind', - 'jsmind/draggable_node': + 'jsmind/draggable-node': 'https://unpkg.com/jsmind@latest/es6/jsmind.draggable-node', }, }); - require(['jsmind', 'jsmind/draggable_node'], function (jsMind, _) { + require(['jsmind', 'jsmind/draggable-node'], function (jsMind, _) { let mind = { meta: { name: 'jsMind example', author: 'hizzgdev@163.com', - version: '0.7.0', + version: '0.7.1', }, format: 'node_tree', data: { diff --git a/package-lock.json b/package-lock.json index c0b7b36e..ba6d2696 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jsmind", - "version": "0.7.0", + "version": "0.7.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jsmind", - "version": "0.7.0", + "version": "0.7.1", "license": "BSD-3-Clause", "devDependencies": { "http-server": "^14.1.1", diff --git a/package.json b/package.json index 71a49fa5..d6587b7c 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,13 @@ { "name": "jsmind", - "version": "0.7.0", + "version": "0.7.1", "description": "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.", "main": "es6/jsmind.js", "exports": { ".": "./es6/jsmind.js", - "draggable-node": "./es6/jsmind.draggable-node.js", - "screenshot": "./es6/jsmind.screenshot.js" + "./draggable-node": "./es6/jsmind.draggable-node.js", + "./screenshot": "./es6/jsmind.screenshot.js", + "./style/jsmind.css": "./style/jsmind.css" }, "directories": { "doc": "docs", diff --git a/src/jsmind.common.js b/src/jsmind.common.js index e24ed10c..c2855121 100644 --- a/src/jsmind.common.js +++ b/src/jsmind.common.js @@ -6,7 +6,7 @@ * https://github.com/hizzgdev/jsmind/ */ -export const __version__ = '0.7.0'; +export const __version__ = '0.7.1'; export const __author__ = 'hizzgdev@163.com'; if (typeof String.prototype.startsWith != 'function') { From 344541ad66d3063ef66da40db80dcde848bb1084 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sat, 9 Sep 2023 11:31:10 +0800 Subject: [PATCH 162/274] add link to jsmind sample --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2dc072c1..01530d8b 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ The ES6 version of jsMind has been launched, and legacy version has been depreca ``` +> More samples : https://github.com/hizzgdev/jsmind-samples > 查阅[文档](docs/zh/1.usage.md)以获取更多关于 CDN 以及版本的知识。 Read the [doc](docs/en/1.usage.md) to learn more knowledge about CDN and version. From db2fba99df5ad0e5e7e6f349af3faf9f2dfc8853 Mon Sep 17 00:00:00 2001 From: hizzgdev Date: Sat, 9 Sep 2023 11:36:52 +0800 Subject: [PATCH 163/274] format --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 01530d8b..a2809503 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ The ES6 version of jsMind has been launched, and legacy version has been depreca ``` + > More samples : https://github.com/hizzgdev/jsmind-samples > 查阅[文档](docs/zh/1.usage.md)以获取更多关于 CDN 以及版本的知识。 Read the [doc](docs/en/1.usage.md) to learn more knowledge about CDN and version. From 54e0ad6e8900ac1a7247b6a4015d87f95ad9cc1b Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Sat, 30 Sep 2023 01:46:47 +0800 Subject: [PATCH 164/274] [Refactor] refactor screenshot (#502) * refactor jsmind screenshot plugin * update demo and code format --- .config/rollup.config.js | 5 +- example/2_features.html | 4 + example/2_features.js | 2 +- example/2_features_cn.html | 4 + src/jsmind.plugin.js | 2 +- src/plugins/jsmind.screenshot.js | 375 +++++++------------------------ 6 files changed, 92 insertions(+), 300 deletions(-) diff --git a/.config/rollup.config.js b/.config/rollup.config.js index 80b9a252..60314836 100644 --- a/.config/rollup.config.js +++ b/.config/rollup.config.js @@ -53,10 +53,11 @@ export default [ banner: '/**\n* @license BSD-3-Clause\n* @copyright 2014-2023 hizzgdev@163.com\n*\n* Project Home:\n* https://github.com/hizzgdev/jsmind/\n*/', sourcemap: true, globals: { - jsmind: 'jsMind', + 'jsmind': 'jsMind', + 'dom-to-image': 'domtoimage', }, }, - external: ['jsmind'], + external: ['jsmind', 'dom-to-image'], plugins: [ cleanup({ comments: 'none', diff --git a/example/2_features.html b/example/2_features.html index 6bd4b0d7..7adda24e 100644 --- a/example/2_features.html +++ b/example/2_features.html @@ -195,6 +195,10 @@ type="text/javascript" src="//cdn.jsdelivr.net/npm/jsmind/es6/jsmind.draggable-node.js" > + + + + + + + + + + + + +``` + +If you use npm, please install `jsmind` and `dom-to-image` + +```bash +npm install jsmind +npm install dom-to-image +``` + +And then use it the same way on the page. + +```html + +``` diff --git a/docs/en/index.md b/docs/en/index.md index 0d6816f1..749f76ec 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -19,8 +19,9 @@ Table of Contents * 3.5 Setting Style * 3.6 Access to Data * 3.7 Other Operations -* [4. Contribution](4.contribution.md) -* [Attached: Development Guide](5.development.md) +* [Experimental Features](experimental-features.md) +* [Contribution](4.contribution.md) +* [Development Guide](5.development.md) copyright notice ====== diff --git a/docs/index.md b/docs/index.md index 94003562..677645a6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,8 +4,9 @@ * [1. 基本用法](zh/1.usage.md) * [2. 选项](zh/2.options.md) * [3. 界面操控](zh/3.operation.md) -* [4. 参与贡献](zh/4.contribution.md) -* [附:贡献代码指南](zh/5.development.md) +* [实验性功能](zh/experimental-features.md) +* [参与贡献](zh/4.contribution.md) +* [贡献代码指南](zh/5.development.md) ## English @@ -13,5 +14,6 @@ * [1. Usage](en/1.usage.md) * [2. Options](en/2.options.md) * [3. API / Operation](en/3.operation.md) -* [4. Contribution](en/4.contribution.md) -* [Attached: Development Guide](en/5.development.md) +* [Experimental Features](en/experimental-features.md) +* [Contribution](en/4.contribution.md) +* [Development Guide](en/5.development.md) diff --git a/docs/zh/1.usage.md b/docs/zh/1.usage.md index b1c0e752..c8a260d2 100644 --- a/docs/zh/1.usage.md +++ b/docs/zh/1.usage.md @@ -1,10 +1,11 @@ [目录](index.md) -1. [基本用法 *](1.usage.md) -2. [选项](2.options.md) -3. [界面操控](3.operation.md) -4. [参与贡献](4.contribution.md) -5. [附:贡献代码指南](5.development.md) +* [1. 基本用法 *](1.usage.md) +* [2. 选项](2.options.md) +* [3. 界面操控](3.operation.md) +* [实验性功能](experimental-features.md) +* [参与贡献](4.contribution.md) +* [贡献代码指南](5.development.md) 1.1. 基本框架 === diff --git a/docs/zh/2.options.md b/docs/zh/2.options.md index 5f7d8bc8..1ce55a9e 100644 --- a/docs/zh/2.options.md +++ b/docs/zh/2.options.md @@ -1,10 +1,11 @@ [目录](index.md) -1. [基本用法](1.usage.md) -2. [选项 *](2.options.md) -3. [界面操控](3.operation.md) -4. [参与贡献](4.contribution.md) -5. [附:贡献代码指南](5.development.md) +* [1. 基本用法](1.usage.md) +* [2. 选项 *](2.options.md) +* [3. 界面操控](3.operation.md) +* [实验性功能](experimental-features.md) +* [参与贡献](4.contribution.md) +* [贡献代码指南](5.development.md) 2.1. 综述 === diff --git a/docs/zh/3.operation.md b/docs/zh/3.operation.md index 3155733a..815b90d8 100644 --- a/docs/zh/3.operation.md +++ b/docs/zh/3.operation.md @@ -1,10 +1,11 @@ [目录](index.md) -1. [基本用法](1.usage.md) -2. [选项](2.options.md) -3. [界面操控 *](3.operation.md) -4. [参与贡献](4.contribution.md) -5. [附:贡献代码指南](5.development.md) +* [1. 基本用法](1.usage.md) +* [2. 选项](2.options.md) +* [3. 界面操控 *](3.operation.md) +* [实验性功能](experimental-features.md) +* [参与贡献](4.contribution.md) +* [贡献代码指南](5.development.md) jsMind 对象 === diff --git a/docs/zh/4.contribution.md b/docs/zh/4.contribution.md index 64503ed8..644d1497 100644 --- a/docs/zh/4.contribution.md +++ b/docs/zh/4.contribution.md @@ -1,12 +1,13 @@ [目录](index.md) -1. [基本用法](1.usage.md) -2. [选项](2.options.md) -3. [界面操控](3.operation.md) -4. [参与贡献 *](4.contribution.md) -5. [附:贡献代码指南](5.development.md) - -4.1. 贡献代码 +* [1. 基本用法](1.usage.md) +* [2. 选项](2.options.md) +* [3. 界面操控](3.operation.md) +* [实验性功能](experimental-features.md) +* [参与贡献 *](4.contribution.md) +* [贡献代码指南](5.development.md) + +贡献代码 === jsMind 还有很多可以完善及优化的地方,欢迎任何人给 jsMind 贡献代码。 @@ -21,14 +22,14 @@ jsMind 还有很多可以完善及优化的地方,欢迎任何人给 jsMind 在提交 pull-request 前,请务必做好测试,并在提交 pull-request 时做出详细的说明,包括功能特性介绍、代码变更说明。 -4.2. 提出问题或贡献想法 +提出问题或贡献想法 === 或者您可以将您遇到的问题或想法通过 issue 的方式提出来供大家讨论,希望有能力和精力的朋友共同参与,一起解决问题。 对于共性的需求,建议实现后回馈到开源项目中,对于非共性的需求,可 fork 出独立仓库进行定制开发。 -4.3. 需要定制开发 +需要定制开发 === jsMind 以 BSD 协议开源,并不限制商业使用。如果需要定制开发,请单独联系作者或您依赖的其他开发者。 diff --git a/docs/zh/5.development.md b/docs/zh/5.development.md index 082e1176..406db2cd 100644 --- a/docs/zh/5.development.md +++ b/docs/zh/5.development.md @@ -1,15 +1,16 @@ [目录](index.md) -1. [基本用法](1.usage.md) -2. [选项](2.options.md) -3. [界面操控](3.operation.md) -4. [参与贡献](4.contribution.md) -5. [附:贡献代码指南 *](5.development.md) +* [1. 基本用法](1.usage.md) +* [2. 选项](2.options.md) +* [3. 界面操控](3.operation.md) +* [实验性功能](experimental-features.md) +* [参与贡献](4.contribution.md) +* [贡献代码指南 *](5.development.md) > 首先向您表示感谢,开源社区因为有您而生机勃勃,jsMind也因您而有了更大的价值。 -5.1. 基本流程 +基本流程 === 向 jsMind 贡献代码的基本流程是: @@ -21,7 +22,7 @@ 5. 等待审查,审查期间可能会请你对您的代码进行修改 6. 合并你的 pull-request 到 jsMind 项目中 -5.2. 开发前的准备 +开发前的准备 === **Pull-Request 及 Fork** : 阅读 github [pull-request 文档](https://docs.github.com/cn/pull-requests), 了解如何通过 fork 及 pull-request 提交你的代码。 @@ -30,7 +31,7 @@ **Visual Studio Code** : 如果您使用的 IDE 是 VS Code, 建议您安装这个插件: `esbenp.prettier-vscode` 。这样你的 VS Code 将能自动按 jsMind 的配置对代码进行格式化 -5.3. 开发 +开发 === jsMind 使用 ES6 编写,代码在 `/src` 目录里,一般情况下只需要改动此目录里的代码。 @@ -40,7 +41,7 @@ jsMind 使用 ES6 编写,代码在 `/src` 目录里,一般情况下只需要 npm run format ``` -5.4. 单元测试 +单元测试 === 单元测试的代码位于 `/tests/unit` 目录,请为新代码的代码补充单元测试,并确保所有的单元测试都能通过。 @@ -50,7 +51,7 @@ npm run format npm run test-es6 ``` -5.5. 打包及压缩 +打包及压缩 === 在命令行中执行以下命令将代码打包为便于在浏览器中执行的js文件: @@ -59,7 +60,7 @@ npm run build ``` 生成的代码位于 `/es6` 目录。 -5.6. 本地预览及调试 +本地预览及调试 === 在命令行中执行以下命令可以在本机启动一个简易的 http server ``` diff --git a/docs/zh/experimental-features.md b/docs/zh/experimental-features.md new file mode 100644 index 00000000..ad323ff1 --- /dev/null +++ b/docs/zh/experimental-features.md @@ -0,0 +1,64 @@ + +[目录](index.md) + +* [1. 基本用法](1.usage.md) +* [2. 选项](2.options.md) +* [3. 界面操控](3.operation.md) +* [实验性功能 *](experimental-features.md) +* [参与贡献](4.contribution.md) +* [贡献代码指南](5.development.md) + +> 特别注意:这些实验性功能并不保证在后续的版本中会一直存在,也不保证其 API 的兼容性,若在项目中使用了实验性功能,后续请谨慎升级。 + +导出图片/截图 +=== +此功能可将思维导图导出为 png 格式的图片。 + +```html + + + + + + + + + + + + + + + + +``` + +如果使用 npm,则需要安装 jsmind 和 dom-to-image + +```bash +npm install jsmind +npm install dom-to-image +``` + +然后在页面里一样的使用 + +```html + +``` diff --git a/docs/zh/index.md b/docs/zh/index.md index 3783134b..4a1e8a6a 100644 --- a/docs/zh/index.md +++ b/docs/zh/index.md @@ -19,8 +19,9 @@ * 3.5. 设置样式 * 3.6. 获取数据 * 3.7. 其它操作 -* [4. 参与贡献](4.contribution.md) -* [附:贡献代码指南](5.development.md) +* [实验性功能](experimental-features.md) +* [参与贡献](4.contribution.md) +* [贡献代码指南](5.development.md) 版权声明 ====== From 2e67a98f0a9851ffb9063dff007ff2f6741f9c40 Mon Sep 17 00:00:00 2001 From: Zhigang Zhang Date: Wed, 11 Oct 2023 00:37:46 +0800 Subject: [PATCH 166/274] update version to 0.7.2 (#508) --- README.md | 6 +++--- docs/en/1.usage.md | 12 ++++++------ docs/en/experimental-features.md | 6 +++--- docs/zh/1.usage.md | 12 ++++++------ docs/zh/experimental-features.md | 6 +++--- example/3_requirejs.html | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/jsmind.common.js | 2 +- 9 files changed, 26 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 983dbd8a..da037a15 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,15 @@ The ES6 version of jsMind has been launched, and legacy version has been depreca diff --git a/docs/en/1.usage.md b/docs/en/1.usage.md index 2c67a039..6b492a06 100644 --- a/docs/en/1.usage.md +++ b/docs/en/1.usage.md @@ -13,22 +13,22 @@ At first, 2 files (jsmind.css and jsmind.js) are required. Here we link to the resources on the CDN. It is recommended to use the latest version. ```html - + - + ``` > CDN: other available CDNs are [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/), and [the mirror of jsDelivr in China](https://jsd.onmicrosoft.cn/npm/jsmind/). the resource urls would look like: -> - https://unpkg.com/jsmind@0.7.1/es6/jsmind.js -> - https://cdn.jsdelivr.net/npm/jsmind@0.7.1/es6/jsmind.js -> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.1/es6/jsmind.js +> - https://unpkg.com/jsmind@0.7.2/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.7.2/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.2/es6/jsmind.js > Version: the version number appear in the url of CDN. It's strongly recommended that you also specify the version number in your project to avoid the risks that caused by version upgrades. Access the [Release page](https://github.com/hizzgdev/jsmind/releases) to get the latest version number of jsMind. Add script jsmind.draggable-node.js for enabling draggable node feature. ```html - + ``` The second, a div element should be in your HTML as container diff --git a/docs/en/experimental-features.md b/docs/en/experimental-features.md index 1fd7026e..7ed2c570 100644 --- a/docs/en/experimental-features.md +++ b/docs/en/experimental-features.md @@ -16,16 +16,16 @@ This feature can support to export mind maps as png images. ```html - + - + - + + ``` > CDN:其它可用的 CDN 还有 [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/),以及 jsDelivr 的[国内镜像](https://jsd.onmicrosoft.cn/npm/jsmind/)。文件路径大概像这样: -> - https://unpkg.com/jsmind@0.7.1/es6/jsmind.js -> - https://cdn.jsdelivr.net/npm/jsmind@0.7.1/es6/jsmind.js -> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.1/es6/jsmind.js +> - https://unpkg.com/jsmind@0.7.2/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.7.2/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.2/es6/jsmind.js > 版本:上面的示例url中都有版本号,强烈建议你在项目里也指明版本号,以避免版本升级给你的项目带来风险。访问 [Release 页面](https://github.com/hizzgdev/jsmind/releases) 可以获取 jsmind 的最新版本号。 如果希望能够通过鼠标拖拽的方式移动节点,需要额外引用 jsmind.draggable-node.js 文件 ```html - + ``` 其次,要为 jsMind 准备一个容器,jsMind 将在这个容器里显示思维导图。可自行定义容器的id、大小及样式。 diff --git a/docs/zh/experimental-features.md b/docs/zh/experimental-features.md index ad323ff1..387aab68 100644 --- a/docs/zh/experimental-features.md +++ b/docs/zh/experimental-features.md @@ -17,16 +17,16 @@ ```html - + - + - + diff --git a/docs/en/1.usage.md b/docs/en/1.usage.md index 6b492a06..da29d4e0 100644 --- a/docs/en/1.usage.md +++ b/docs/en/1.usage.md @@ -13,22 +13,22 @@ At first, 2 files (jsmind.css and jsmind.js) are required. Here we link to the resources on the CDN. It is recommended to use the latest version. ```html - + - + ``` > CDN: other available CDNs are [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/), and [the mirror of jsDelivr in China](https://jsd.onmicrosoft.cn/npm/jsmind/). the resource urls would look like: -> - https://unpkg.com/jsmind@0.7.2/es6/jsmind.js -> - https://cdn.jsdelivr.net/npm/jsmind@0.7.2/es6/jsmind.js -> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.2/es6/jsmind.js +> - https://unpkg.com/jsmind@0.7.3/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.7.3/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.3/es6/jsmind.js > Version: the version number appear in the url of CDN. It's strongly recommended that you also specify the version number in your project to avoid the risks that caused by version upgrades. Access the [Release page](https://github.com/hizzgdev/jsmind/releases) to get the latest version number of jsMind. Add script jsmind.draggable-node.js for enabling draggable node feature. ```html - + ``` The second, a div element should be in your HTML as container diff --git a/docs/en/experimental-features.md b/docs/en/experimental-features.md index 7ed2c570..dd763aa5 100644 --- a/docs/en/experimental-features.md +++ b/docs/en/experimental-features.md @@ -16,16 +16,16 @@ This feature can support to export mind maps as png images. ```html - + - + - + + ``` > CDN:其它可用的 CDN 还有 [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/),以及 jsDelivr 的[国内镜像](https://jsd.onmicrosoft.cn/npm/jsmind/)。文件路径大概像这样: -> - https://unpkg.com/jsmind@0.7.2/es6/jsmind.js -> - https://cdn.jsdelivr.net/npm/jsmind@0.7.2/es6/jsmind.js -> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.2/es6/jsmind.js +> - https://unpkg.com/jsmind@0.7.3/es6/jsmind.js +> - https://cdn.jsdelivr.net/npm/jsmind@0.7.3/es6/jsmind.js +> - https://jsd.onmicrosoft.cn/npm/jsmind@0.7.3/es6/jsmind.js > 版本:上面的示例url中都有版本号,强烈建议你在项目里也指明版本号,以避免版本升级给你的项目带来风险。访问 [Release 页面](https://github.com/hizzgdev/jsmind/releases) 可以获取 jsmind 的最新版本号。 如果希望能够通过鼠标拖拽的方式移动节点,需要额外引用 jsmind.draggable-node.js 文件 ```html - + ``` 其次,要为 jsMind 准备一个容器,jsMind 将在这个容器里显示思维导图。可自行定义容器的id、大小及样式。 diff --git a/docs/zh/experimental-features.md b/docs/zh/experimental-features.md index 387aab68..d1694574 100644 --- a/docs/zh/experimental-features.md +++ b/docs/zh/experimental-features.md @@ -17,16 +17,16 @@ ```html - + - + - + - + + - + + + diff --git a/example/2_features_cn.html b/example/2_features_cn.html index a1238eb3..ed4b9d32 100644 --- a/example/2_features_cn.html +++ b/example/2_features_cn.html @@ -7,7 +7,7 @@