用于将 .org 转换为 .xml 的脚本

用于将 .org 转换为 .xml 的脚本

我想将.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代表“箭头”,是后续自然数枚举的名称,
  • sourceid箭头开始的地方,targetid箭头指向的地方。

我需要一些简单的情况,例如最大深度为 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

相关内容