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, };