wisemapping-frontend/packages/mindplot/src/components/persistence/XMLSerializerBeta.js

326 lines
9.1 KiB
JavaScript
Raw Normal View History

2021-12-25 23:39:34 +01:00
/* Copyright [2021] [wisemapping]
2021-07-16 16:41:58 +02:00
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
2021-12-19 17:06:42 +01:00
import {
$defined, $assert, createDocument, innerXML,
} from '@wisemapping/core-js';
import ModelCodeName from './ModelCodeName';
import Mindmap from '../model/Mindmap';
import INodeModel from '../model/INodeModel';
import TopicFeature from '../TopicFeature';
2021-10-05 02:05:34 +02:00
2021-12-23 20:58:50 +01:00
class XMLSerializerBeta {
2021-10-05 02:05:34 +02:00
toXML(mindmap) {
$assert(mindmap, 'Can not save a null mindmap');
2021-12-03 19:58:25 +01:00
const document = createDocument();
2021-10-05 02:05:34 +02:00
// Store map attributes ...
const mapElem = document.createElement('map');
const name = mindmap.getId();
if ($defined(name)) {
mapElem.setAttribute('name', name);
}
document.append(mapElem);
// Create branches ...
const topics = mindmap.getBranches();
for (let i = 0; i < topics.length; i++) {
const topic = topics[i];
const topicDom = this._topicToXML(document, topic);
mapElem.append(topicDom);
}
return document;
2021-12-05 00:39:20 +01:00
}
2021-10-05 02:05:34 +02:00
_topicToXML(document, topic) {
const parentTopic = document.createElement('topic');
// Set topic attributes...
2021-12-03 19:58:25 +01:00
if (topic.getType() === INodeModel.CENTRAL_TOPIC_TYPE) {
2021-10-05 02:05:34 +02:00
parentTopic.setAttribute('central', true);
} else {
const parent = topic.getParent();
2021-12-03 19:58:25 +01:00
if (parent == null || parent.getType() === INodeModel.CENTRAL_TOPIC_TYPE) {
2021-10-05 02:05:34 +02:00
const pos = topic.getPosition();
Squashed commit of the following: commit 81e9041e19344df18d8e91a31edb69ea0bce6bf7 Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sun Dec 5 14:35:11 2021 -0800 Fix serialization bug commit 290223f15aa3902ef3291e0f392a92d04e9ccd0e Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sun Dec 5 09:36:59 2021 -0800 Fix serialization bug commit 3c1a2e37cf7be34780b760eb6f2fd3e3ac577ed1 Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sun Dec 5 09:24:13 2021 -0800 Fix missing references commit 98a7fd3e1659eb32cee43144da4a10b98cfcfed0 Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sun Dec 5 09:08:38 2021 -0800 Fix compile commit 9f5146b353f0fdb34a5b83db6d120bc09a96a073 Merge: 218e074 d3dc44c Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sun Dec 5 09:03:17 2021 -0800 Merge branch 'develop' into feature/mindplot_tests_playground commit 218e074b7330d0a02ac7afee0b644737f3bb6b03 Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sat Dec 4 17:46:22 2021 -0800 Add jquery missing dependency commit c01a748a84a2359dcf1a49d9593369c9fefe1e76 Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sat Dec 4 17:41:47 2021 -0800 Remove undercore commit d680b063b819563f4fae38571055aad4c55180b7 Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sat Dec 4 17:36:58 2021 -0800 Add missing dependencies commit be9aa21245e84c97fa9fe3545299c6bb01772ef1 Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sat Dec 4 17:25:23 2021 -0800 Fix missign dependencies. commit 2472fa453c43b64286552edb7120d4d2c395eba4 Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sat Dec 4 17:08:48 2021 -0800 Fix compilation commit a013d07dc15a3bddda1e42cad373abbdfc525c74 Merge: f2ac8fe a81e984 Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Sat Dec 4 16:57:19 2021 -0800 Merge branch 'develop' into feature/mindplot_tests_playground commit f2ac8fe17de071a09f80a20f49eb42c66b5f2f2b Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Thu Dec 2 18:59:03 2021 -0800 Hack: Add declaration of designer as global variable. commit 432167acbb055fba19f1e8469db4ffe8ad7793b7 Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Thu Dec 2 18:51:13 2021 -0800 Hack the initialization of extended hotkey pluggin. commit 794db35e88f6bd232094b4f104c8fe6a8fab34be Author: Paulo Gustavo Veiga <pveiga@wisemapping.com> Date: Thu Dec 2 17:57:21 2021 -0800 Add keyboard function commit e47a48d51f1af0ebde4ebea07cb467a8e5a7a372 Author: Matias Arriola <matias.arriola@gmail.com> Date: Thu Dec 2 14:50:43 2021 -0300 Fix editor snapshot commit 9bf8baef1216352ed1f9dde4658c479c0044b093 Author: Matias Arriola <matias.arriola@gmail.com> Date: Thu Dec 2 13:14:13 2021 -0300 Add editor test to mindplot playground Add missing imports and fix BootstrapDialog references commit b2dcc3034fc638f58cdb59e96ab7d6e2435f634a Author: Matias Arriola <matias.arriola@gmail.com> Date: Thu Dec 2 11:56:10 2021 -0300 Add embedded test to mindplot playground commit 08b514e1aa7b51c4df56b2b3cb7f28c191adeae7 Author: Matias Arriola <matias.arriola@gmail.com> Date: Thu Dec 2 10:27:31 2021 -0300 Fix mindplot layout test Upgrade raphael to avoid error Load raphael from context-loader
2021-12-06 00:50:37 +01:00
parentTopic.setAttribute('position', `${pos.x},${pos.y}`);
2021-10-05 02:05:34 +02:00
} else {
const order = topic.getOrder();
parentTopic.setAttribute('order', order);
}
}
const text = topic.getText();
if ($defined(text)) {
parentTopic.setAttribute('text', text);
}
const shape = topic.getShapeType();
if ($defined(shape)) {
parentTopic.setAttribute('shape', shape);
}
if (topic.areChildrenShrunken()) {
parentTopic.setAttribute('shrink', true);
}
// Font properties ...
let font = '';
const fontFamily = topic.getFontFamily();
font += `${fontFamily || ''};`;
const fontSize = topic.getFontSize();
font += `${fontSize || ''};`;
const fontColor = topic.getFontColor();
font += `${fontColor || ''};`;
const fontWeight = topic.getFontWeight();
font += `${fontWeight || ''};`;
const fontStyle = topic.getFontStyle();
font += `${fontStyle || ''};`;
if (
$defined(fontFamily)
2021-12-03 19:58:25 +01:00
|| $defined(fontSize)
|| $defined(fontColor)
|| $defined(fontWeight)
|| $defined(fontStyle)
) {
2021-10-05 02:05:34 +02:00
parentTopic.setAttribute('fontStyle', font);
}
const bgColor = topic.getBackgroundColor();
if ($defined(bgColor)) {
parentTopic.setAttribute('bgColor', bgColor);
}
const brColor = topic.getBorderColor();
if ($defined(brColor)) {
parentTopic.setAttribute('brColor', brColor);
}
// ICONS
let i;
const icons = topic.getIcons();
for (i = 0; i < icons.length; i++) {
const icon = icons[i];
const iconDom = this._iconToXML(document, icon);
parentTopic.append(iconDom);
}
// LINKS
const links = topic.getLinks();
for (i = 0; i < links.length; i++) {
const link = links[i];
const linkDom = this._linkToXML(document, link);
parentTopic.append(linkDom);
}
const notes = topic.getNotes();
for (i = 0; i < notes.length; i++) {
const note = notes[i];
const noteDom = this._noteToXML(document, note);
parentTopic.append(noteDom);
}
// CHILDREN TOPICS
const childTopics = topic.getChildren();
for (i = 0; i < childTopics.length; i++) {
const childTopic = childTopics[i];
const childDom = this._topicToXML(document, childTopic);
parentTopic.append(childDom);
}
return parentTopic;
2021-12-05 00:39:20 +01:00
}
2021-10-05 02:05:34 +02:00
_iconToXML(document, icon) {
const iconDom = document.createElement('icon');
iconDom.setAttribute('id', icon.getIconType());
return iconDom;
2021-12-05 00:39:20 +01:00
}
2021-10-05 02:05:34 +02:00
_linkToXML(document, link) {
const linkDom = document.createElement('link');
linkDom.setAttribute('url', link.getUrl());
return linkDom;
2021-12-05 00:39:20 +01:00
}
2021-10-05 02:05:34 +02:00
_noteToXML(document, note) {
const noteDom = document.createElement('note');
noteDom.setAttribute('text', note.getText());
return noteDom;
2021-12-05 00:39:20 +01:00
}
2021-10-05 02:05:34 +02:00
loadFromDom(dom, mapId) {
$assert(dom, 'Dom can not be null');
$assert(mapId, 'mapId can not be null');
// Is a valid object ?
const { documentElement } = dom;
$assert(
2021-12-03 19:58:25 +01:00
documentElement.nodeName !== 'parsererror',
`Error while parsing: '${documentElement.childNodes[0].nodeValue}`,
);
2021-10-05 02:05:34 +02:00
// Is a wisemap?.
$assert(
2021-12-23 20:58:50 +01:00
documentElement.tagName === XMLSerializerBeta.MAP_ROOT_NODE,
2021-12-05 00:39:20 +01:00
`This seem not to be a map document. Root Tag: '${documentElement.tagName}',HTML:${dom.innerHTML
}XML:${innerXML(dom)}`,
);
2021-10-05 02:05:34 +02:00
// Start the loading process ...
let version = documentElement.getAttribute('version');
version = !$defined(version) ? ModelCodeName.BETA : version;
const mindmap = new Mindmap(mapId, version);
const children = documentElement.childNodes;
for (let i = 0; i < children.length; i++) {
const child = children[i];
2021-12-03 19:58:25 +01:00
if (child.nodeType === 1) {
2021-10-05 02:05:34 +02:00
const topic = this._deserializeNode(child, mindmap);
mindmap.addBranch(topic);
}
}
mindmap.setId(mapId);
return mindmap;
2021-12-05 00:39:20 +01:00
}
2021-10-05 02:05:34 +02:00
_deserializeNode(domElem, mindmap) {
const type = domElem.getAttribute('central') != null
? INodeModel.CENTRAL_TOPIC_TYPE
: INodeModel.MAIN_TOPIC_TYPE;
2021-10-05 02:05:34 +02:00
const topic = mindmap.createNode(type);
// Load attributes...
const text = domElem.getAttribute('text');
if ($defined(text)) {
topic.setText(text);
}
const order = domElem.getAttribute('order');
if ($defined(order)) {
2021-12-03 19:58:25 +01:00
topic.setOrder(parseInt(order, 10));
2021-10-05 02:05:34 +02:00
}
const shape = domElem.getAttribute('shape');
if ($defined(shape)) {
topic.setShapeType(shape);
}
const isShrink = domElem.getAttribute('shrink');
if ($defined(isShrink)) {
topic.setChildrenShrunken(isShrink);
}
const fontStyle = domElem.getAttribute('fontStyle');
if ($defined(fontStyle)) {
const font = fontStyle.split(';');
if (font[0]) {
topic.setFontFamily(font[0]);
}
if (font[1]) {
topic.setFontSize(font[1]);
}
if (font[2]) {
topic.setFontColor(font[2]);
}
if (font[3]) {
topic.setFontWeight(font[3]);
}
if (font[4]) {
topic.setFontStyle(font[4]);
}
}
const bgColor = domElem.getAttribute('bgColor');
if ($defined(bgColor)) {
topic.setBackgroundColor(bgColor);
}
const borderColor = domElem.getAttribute('brColor');
if ($defined(borderColor)) {
topic.setBorderColor(borderColor);
}
const position = domElem.getAttribute('position');
if ($defined(position)) {
const pos = position.split(',');
topic.setPosition(pos[0], pos[1]);
}
// Creating icons and children nodes
const children = domElem.childNodes;
for (let i = 0; i < children.length; i++) {
const child = children[i];
2021-12-03 19:58:25 +01:00
if (child.nodeType === 1) {
$assert(
2021-12-03 19:58:25 +01:00
child.tagName === 'topic'
|| child.tagName === 'icon'
|| child.tagName === 'link'
|| child.tagName === 'note',
`Illegal node type:${child.tagName}`,
);
2021-12-03 19:58:25 +01:00
if (child.tagName === 'topic') {
2021-10-05 02:05:34 +02:00
const childTopic = this._deserializeNode(child, mindmap);
childTopic.connectTo(topic);
2021-12-03 19:58:25 +01:00
} else if (child.tagName === 'icon') {
2021-10-05 02:05:34 +02:00
const icon = this._deserializeIcon(child, topic);
topic.addFeature(icon);
2021-12-03 19:58:25 +01:00
} else if (child.tagName === 'link') {
2021-10-05 02:05:34 +02:00
const link = this._deserializeLink(child, topic);
topic.addFeature(link);
2021-12-03 19:58:25 +01:00
} else if (child.tagName === 'note') {
2021-10-05 02:05:34 +02:00
const note = this._deserializeNote(child, topic);
topic.addFeature(note);
2021-07-16 16:41:58 +02:00
}
2021-10-05 02:05:34 +02:00
}
}
return topic;
2021-12-05 00:39:20 +01:00
}
2021-10-05 02:05:34 +02:00
_deserializeIcon(domElem) {
let icon = domElem.getAttribute('id');
icon = icon.replace('images/', 'icons/legacy/');
return TopicFeature.createModel(TopicFeature.Icon.id, { id: icon });
2021-12-05 00:39:20 +01:00
}
2021-10-05 02:05:34 +02:00
_deserializeLink(domElem) {
return TopicFeature.createModel(TopicFeature.Link.id, { url: domElem.getAttribute('url') });
2021-12-05 00:39:20 +01:00
}
2021-10-05 02:05:34 +02:00
_deserializeNote(domElem) {
const text = domElem.getAttribute('text');
return TopicFeature.createModel(TopicFeature.Note.id, { text: text == null ? ' ' : text });
2021-12-05 00:39:20 +01:00
}
}
2021-07-16 16:41:58 +02:00
2021-12-23 20:58:50 +01:00
XMLSerializerBeta.MAP_ROOT_NODE = 'map';
2021-07-16 16:41:58 +02:00
2021-12-19 18:07:01 +01:00
// eslint-disable-next-line camelcase
2021-12-23 20:58:50 +01:00
export default XMLSerializerBeta;