Script para converter .org para .xml

1

Eu quero converter a árvore escrita no arquivo .org em algum código XML para gerar uma árvore gráfica a partir dela (por exemplo, carregando-a para www.draw .io página da Web.

Parafazerisso,euprecisodeumscriptbashqueconvertaoarquivo.orgcontendo:

*tree_root**root_node_1***subnode**root_node_2

paraoarquivo.xmlcontendo:

<mxCellid="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">

No modo de organização, os títulos são indicados por asteriscos ( * - primeiro nível, ** - segundo nível, etc.)

Explicação :

  • Os campos chamados id são nomes exibidos nas caixas.
  • b1, b2, b3 significam "box", nomes enumerados por número de linha em .org file,
  • a1, a2, a3 representam "seta" são os nomes enumerados por números naturais subseqüentes,
  • source é id onde a seta começa, target é id para onde as setas apontam.

Eu preciso de um caso simples, por exemplo 6 níveis de profundidade máxima Eu mesmo estenderei isso, mas preciso de algo para começar.

Como fazer isso?

    
por micholeodon 07.11.2018 / 16:19

1 resposta

1

Talvez isso atenda aos seus requisitos? A idéia básica é ter uma matriz (chamada rótulos) que contém o que é efetivamente o número da linha da última linha, começando com um número específico de estrelas. Ele produzirá o gráfico errado se você aumentar o número de estrelas em mais de um, mas lidar com diminuições de qualquer número corretamente. Claro que não lida com texto sob os títulos.

#!/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
    
por 07.11.2018 / 21:53

Tags