diff --git a/README.md b/README.md
index 2f25228b..d05518c2 100644
--- a/README.md
+++ b/README.md
@@ -90,7 +90,7 @@ npm run build
# 安装
-> 当然仓库版本:0.2.7,当前npm版本:0.2.7
+> 当然仓库版本:0.2.8,当前npm版本:0.2.7
```bash
npm i simple-mind-map
@@ -151,6 +151,14 @@ console.log(MindMap.xmind)
`content`:`.xmind`压缩包内的`content.json`文件内容
+#### transformOldXmind(content)
+
+v0.2.8+
+
+针对`xmind8`版本的数据解析,因为该版本的`.xmind`文件内没有`content.json`,对应的是`content.xml`。
+
+`content`:`.xmind`压缩包内的`content.xml`文件内容
+
### 实例化选项:
| 字段名称 | 类型 | 默认值 | 描述 | 是否必填 |
diff --git a/index.html b/index.html
index 44afd746..c8567a18 100644
--- a/index.html
+++ b/index.html
@@ -1 +1 @@
-
一个简单的web思维导图实现
\ No newline at end of file
+一个简单的web思维导图实现
\ No newline at end of file
diff --git a/simple-mind-map/package.json b/simple-mind-map/package.json
index e06b407d..4fa34939 100644
--- a/simple-mind-map/package.json
+++ b/simple-mind-map/package.json
@@ -1,6 +1,6 @@
{
"name": "simple-mind-map",
- "version": "0.2.7",
+ "version": "0.2.8",
"description": "一个简单的web在线思维导图",
"authors": [
{
@@ -26,7 +26,8 @@
"deepmerge": "^1.5.2",
"eventemitter3": "^4.0.7",
"jspdf": "^2.5.1",
- "jszip": "^3.10.1"
+ "jszip": "^3.10.1",
+ "xml-js": "^1.6.11"
},
"keywords": [
"javascript",
diff --git a/simple-mind-map/src/parse/xmind.js b/simple-mind-map/src/parse/xmind.js
index 5bbcc482..b6a18240 100644
--- a/simple-mind-map/src/parse/xmind.js
+++ b/simple-mind-map/src/parse/xmind.js
@@ -1,4 +1,5 @@
import JSZip from "jszip";
+import xmlConvert from "xml-js";
/**
* javascript comment
@@ -11,9 +12,20 @@ const parseXmindFile = (file) => {
JSZip.loadAsync(file).then(
async (zip) => {
try {
- let content = await zip.files["content.json"].async("string");
- let res = transformXmind(content);
- resolve(res);
+ let content = "";
+ if (zip.files["content.json"]) {
+ let json = await zip.files["content.json"].async("string");
+ content = transformXmind(json);
+ } else if (zip.files["content.xml"]) {
+ let xml = await zip.files["content.xml"].async("string");
+ let json = xmlConvert.xml2json(xml);
+ content = transformOldXmind(json);
+ }
+ if (content) {
+ resolve(content);
+ } else {
+ reject(new Error("解析失败"));
+ }
} catch (error) {
reject(error);
}
@@ -70,7 +82,92 @@ const transformXmind = (content) => {
return newTree;
};
+/**
+ * javascript comment
+ * @Author: 王林25
+ * @Date: 2022-09-23 15:51:51
+ * @Desc: 转换旧版xmind数据,xmind8
+ */
+const transformOldXmind = (content) => {
+ let data = JSON.parse(content);
+ let elements = data.elements;
+ let root = null;
+ let getRoot = (arr) => {
+ for (let i = 0; i < arr.length; i++) {
+ if (!root && arr[i].name === "topic") {
+ root = arr[i];
+ return;
+ }
+ }
+ arr.forEach((item) => {
+ getRoot(item.elements);
+ });
+ };
+ getRoot(elements);
+ let newTree = {};
+ let getItemByName = (arr, name) => {
+ return arr.find((item) => {
+ return item.name === name;
+ });
+ };
+ let walk = (node, newNode) => {
+ let nodeElements = node.elements;
+ newNode.data = {
+ // 节点内容
+ text: getItemByName(nodeElements, "title").elements[0].text,
+ };
+ try {
+ // 节点备注
+ let notesElement = getItemByName(nodeElements, "notes");
+ if (notesElement) {
+ newNode.data.note =
+ notesElement.elements[0].elements[0].elements[0].text;
+ }
+ } catch (error) {}
+ try {
+ // 超链接
+ if (
+ node.attributes &&
+ node.attributes["xlink:href"] &&
+ /^https?:\/\//.test(node.attributes["xlink:href"])
+ ) {
+ newNode.data.hyperlink = node.attributes["xlink:href"];
+ }
+ } catch (error) {}
+ try {
+ // 标签
+ let labelsElement = getItemByName(nodeElements, "labels");
+ if (labelsElement) {
+ newNode.data.tag = labelsElement.elements.map((item) => {
+ return item.elements[0].text;
+ });
+ }
+ } catch (error) {}
+ // 子节点
+ newNode.children = [];
+ let _children = getItemByName(nodeElements, "children");
+ if (_children && _children.elements && _children.elements.length > 0) {
+ _children.elements.forEach((item) => {
+ if (item.name === "topics") {
+ item.elements.forEach((item2) => {
+ let newChild = {};
+ newNode.children.push(newChild);
+ walk(item2, newChild);
+ });
+ } else {
+ let newChild = {};
+ newNode.children.push(newChild);
+ walk(item, newChild);
+ }
+ });
+ }
+ };
+ walk(root, newTree);
+ return newTree;
+};
+
export default {
parseXmindFile,
transformXmind,
+ transformOldXmind,
};