我想将.org
文件中写入的树转换为一些 XML 代码,以便稍后从中生成图形树(例如将其加载到www.draw.io网页)。
为了做到这一点,我需要一个bash脚本这将转换.org
包含以下内容的文件:
* tree_root
** root_node_1
*** subnode
** root_node_2
包含以下.xml
内容的文件:
<mxCell id="b1" value="tree_root" > </mxCell>
<mxCell id="b2" value="root_node_1" ></mxCell>
<mxCell id="a1" source="b2" target="b1">
<mxCell id="b3" value="subnode" ></mxCell>
<mxCell id="a2" source="b3" target="b2">
<mxCell id="b4" value="root_node_2" ></mxCell>
<mxCell id="a3" source="b4" target="b1">
在组织模式中,标题用星号表示(*
- 一级标题,**
- 二级标题等)
解释:
- 调用的字段
id
是显示在框中的名称。 - b1、b2、b3 代表“box”,名称按
.org
文件中的行号枚举, - a1、a2、a3代表“箭头”,是后续自然数枚举的名称,
source
是id
箭头开始的地方,target
是id
箭头指向的地方。
我需要一些简单的情况,例如最大深度为 6 层。我自己会扩展它,但我需要一些东西来开始。
这个怎么做?
答案1
也许这能满足您的要求?基本思想是有一个数组(称为标签),它实际上保存以特定数量的星星开头的最后一行的行号。如果您将星星数量增加超过一颗,但会正确处理任意数量的减少,它将生成错误的图表。当然,它根本不处理标题下的文本。
#!/bin/bash
typeset -a labels
typeset -i node=1
while read -r stars rest
do
level=${#stars}
labels[level]=$node
printf '<mxCell id="b%d" value="%q" ></mxCell>\n' $node "$rest"
case $level in
(1) ;;
(*) printf ' <mxCell id="a%d" source="b%d" target="b%d">\n' $((node-1)) $node ${labels[level-1]} ;;
esac
: $((node++))
done