记录一下小工具制作过程。
缘起
虽然之前做过一个百度脑图转markdown的工具,但在工作中,xmind软件使用居多。而xmind如果想要将思维导图导出为markdown。那是需要钱钱的。。。
所以有了自己写一个将xmind文件转为markdown文件的想法。当然markdown这是一个中转格式,当xmind转为markdown后,可以使用pandoc(pandoc地址)软件将markdown转为work,pdf等格式。
废话不多说,开始正题。
xmind文件格式
使用二进制查看器,查看xmind格式文件内容
发现文件以50 4B 03 04开头,这表示文件xmind文件是一个压缩文件。
试探性的使用压缩软件打开xmind文件,发现可以被解压。
且目录结构如下:
xmind中思维导图的主要文本数据存放在content.json中。所以我们主要解析content.json就可以了。
解析content.json
这块的解析无非就是json类型的树状结构,然后将其映射到markdown对于的格式上,没啥好说的,直接上代码。
/**
* 递归遍历节点
*/
function traverse(context, node, level) {
if (!node) {
return
}
if (node.title) {
let prefix = signMultiplication('#', level)
let title = `${prefix} ${node.title}\n\n`
console.log(title)
myWrite(context, title)
}
if (node.notes && node.notes.plain.content) {
let content = `${node.notes.plain.content}\n\n`
console.log(content)
myWrite(context, content)
}
if (node.image) {
let src = node.image.src.slice(4)
let imageTitle = node.title || "default"
let imageDir = `${context.name}.attachment`
let imageName = src.slice(src.lastIndexOf("/") + 1)
let newImageSrc = `${imageDir}/${imageName}`
if (!fs.existsSync(imageDir)) {
fs.mkdirSync(imageDir, { recursive: true })
}
let realSrc = path.join(context.baseDir, src)
if (!fs.existsSync(newImageSrc)) {
fs.copyFileSync(realSrc, newImageSrc)
}
let content = `![${imageTitle}](${newImageSrc})`
console.log(content)
myWrite(context, content)
}
if (node.children && node.children.attached && node.children.attached.length > 0) {
let children = node.children.attached
for (let child of children) {
traverse(context, child, level + 1)
}
}
}
/**
* 符号乘法
*/
function signMultiplication(sign, n) {
let result = ''
for (let i = 0; i < n; i++) {
result += sign
}
return result
}
程序结果
使用该脚本转换xmind的效果:
原xmind图:
转换后的markdown文档
后续会将脑图转markdown和xmind转markdown的源码放致github上