.org
後でグラフィックツリーを作成できるように、ファイルに作成されたツリーをいくつかのXMLコードに変換したいです(例:www.draw.ioWebページ)。
これを行うには、次のものが必要です。バッシュスクリプト.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">
組織モードでは、タイトルはアスタリスク(*
- 最初のレベルのタイトル、**
- 2番目のレベルのタイトルなど)として表示されます。
説明する:
- 呼び出されるフィールドは、
id
ボックスに表示される名前です。 .org
b1、b2、b3 は「box」を表し、ファイルの行番号に従って名前がリストされます。- a1、a2、a3は「矢印」を表し、後続の自然数列挙の名前です。
source
id
矢印が始まる場所、矢印が指す場所target
です。id
最大深さが6つのレイヤーなど、いくつかの簡単なケースが必要です。自分で拡張したいのですが、始めるには何かが必要です。
どうすればいいですか?
答え1
たぶんこれはあなたの要件を満たしていますか?基本的なアイデアは、特定の数のアスタリスクで始まる最後の行の行番号を実際に保持する配列(ラベルと呼ばれる)を持つことです。星の数を2つ以上増やしましたが、減少した数が正しく処理されると、誤ったグラフが生成されます。もちろん、タイトルの下のテキストはまったく処理されません。
#!/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