.org
나중에 그래픽 트리를 생성할 수 있도록 파일에 작성된 트리를 일부 XML 코드로 변환 하고 싶습니다 (예:www.draw.io웹 페이지).
이 작업을 수행하려면 다음이 필요합니다.배쉬 스크립트.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
상자에 나타나는 이름입니다. .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