Converter estrutura do modo organizacional em fonte de pontos


12

A geração rápida de gráficos a partir de uma estrutura semelhante a uma árvore pode ser muito útil ao fazer anotações no modo organizacional que exigem compartilhamento e / ou embelezamento para outros seres humanos.

Não consegui encontrar outra maneira de fazer isso além de criar manualmente um bloco dinâmico de ponto / gráfico.

Uma tradução de uma árvore estruturada para um gráfico direcionado simples deve ser bastante direta.

Estou procurando uma maneira simples de percorrer uma árvore de modo organizacional (uma região selecionada) e traduzir a estrutura da árvore (e opcionalmente algumas informações do conteúdo da estrutura) em um gráfico de pontos.

Não posso ser o primeiro a pensar nisso. Isso foi resolvido?

entrada

* la1
** la2
*** la3
*** la4
** la5

e talvez um preâmbulo variável de ponto a ponto

digraph {
   rankdir=TB;
   splines=true;
   node [shape=box];

a saída pareceria um bloco dinâmico no modo organizacional

#+BEGIN_SRC dot :file out.png :cmdline -Kdot -Tpng
(contents of org-to-dot-preamble)

la1 -> la2
la1 -> la5
la2 -> la3
la2 -> la4
}
#+END_SRC

Uma versão mais avançada declararia primeiro todos os nós e permitiria alguma formatação.

entrada

* la1
  firstline
  secondline
** la2
   firstline
   secondline
*** la3
*** la4
    firstline
** la5

Algumas variáveis ​​de formatação

org-to-dot-shape
org-to-dot-font

resultado

#+BEGIN_SRC dot :file out.png :cmdline -Kdot -Tpng
(contents of org-to-dot-preamble)

la1 [shape=Mrecord, label="{firstline|secondline}", fontname = "helvetica"]
la2 [shape=Mrecord, label="{firstline|secondline}", fontname = "helvetica"]
la3 [shape=Mrecord, label="{firstline|secondline}", fontname = "helvetica"]
la4 [shape=Mrecord, label="{firstline|secondline}", fontname = "helvetica"]
la5 [shape=Mrecord, label="{firstline|secondline}", fontname = "helvetica"]

la1 -> la2
la1 -> la5
la2 -> la3
la2 -> la4
}
#+END_SRC

captura de tela de um buffer de modo organizacional do resultado da simulação


Pergunta muito interessante! O código de conversão criaria um gráfico de pontos de outro buffer de modo organizacional ou seu próprio buffer? Idéia legal!
Melioratus

Sim, seria útil, mais ou menos como o TikZ é processado nos documentos do LaTeX.
Emacs usuário

@ Melioratus: Eu estava pensando apenas em usar a região selecionada e colocar o código de ponto resultante no anel de morte ou apenas inseri-lo no ponto.
Werner

Respostas:


4

Aqui está um exemplo de trabalho que usa a org-elementAPI para analisar os títulos do buffer:

* la1
** la2
*** la3
*** la4
** la5
**  Org element API test

#+name: lista
#+begin_src elisp
  (org-element-map (org-element-parse-buffer 'headline )
      'headline
    (lambda(hl)
      (let ((parent (org-element-property :parent hl )))
        (and (eq (org-element-type parent) 'headline)
             (list (org-element-property :title parent) (org-element-property :title hl))))))

#+end_src

#+RESULTS: lista
| la1 | la2                  |
| la2 | la3                  |
| la2 | la4                  |
| la1 | la5                  |
| la1 | Org element API test |

#+name: make-dot
#+BEGIN_SRC emacs-lisp :var table=lista :results output :exports none
  (mapcar #'(lambda (x)
                (princ (format "\"%s\" -> \"%s\";\n" (first x) (second x))))
          table)
#+END_SRC

#+RESULTS: make-dot
: "la1" -> "la2";
: "la2" -> "la3";
: "la2" -> "la4";
: "la1" -> "la5";
: "la1" -> "Org element API test";

#+BEGIN_SRC dot :file dependencias.pdf :cmdline -Tpdf :var input=make-dot :exports results
digraph {
   rankdir=TB;
   splines=true;
   node [shape=box];
   $input
  }
#+END_SRC

#+CAPTION: Dependency diagram
#+RESULTS:
[[file:dependencias.pdf]]

Isso funciona em várias etapas: primeiro, um bloco elisp usa org-element-parse-bufferpara obter todos os títulos e extrair uma lista do título do pai e do título.

Em seguida, outro bloco de origem transforma essa lista em sintaxe de ponto.

Um terceiro bloco de origem de pontos contém o empacotamento DOT e inclui as relações geradas.

Aprimoramentos cosméticos: filtre a seção do próprio teste; você pode adicionar uma tag a esta seção e filtrar por tag no primeiro bloco.


Fantástico! Isso é ótimo!
RUserPassingBy

3

Você poderá reutilizar parte do código na parte inferior de http://pages.sachachua.com/evil-plans/ . Basicamente, uso entradas do org-map-para passar por meus títulos. Como tenho um gráfico direcionado em vez de uma árvore estrita, utilizo pesquisas simples de expressão regular para analisar a estrutura do link a partir de um texto amigável ao ser humano. Se você estiver apenas trabalhando com uma árvore, poderá criar sua estrutura de árvore diretamente dos títulos. Depois disso, é uma questão de gerar a sintaxe graphviz apropriada, e o org-babel pode lidar com a produção e a conversão em PNG ou SVG. Espero que ajude!


Esse é um ótimo arquivo organizacional e alguns gráficos interessantes.
db48x

3

Não é ponto, mas se você estiver com pressa, os seguintes podem ser úteis.

Precisamos do org-plus-contribFreeMind.app para produzir um mapa mental a partir de documentos no modo organizacional.

Instale o pacote extra do modo organizacional chamado org-plus-contribpor M-x package-list-packages.

Talvez possamos precisar adicionar

(require 'ox-freemind)

aos nossos .emacs.

Então, podemos exportar o nosso arquivo org-mode para Freemind arquivo * .mm por C-c C-e f f, org-freemind-export-to-freemind.

Agora abrimos * .mm do Freemind.app e pronto!

org-para-mm-mouse-over

Passe o mouse sobre para ver o conteúdo dos nós.


1

ATUALIZAÇÃO: 2019

Existe um pacote chamado org-mind-map

https://github.com/theodorewiles/org-mind-map

Ele cria gráficos direcionados ao graphviz a partir de arquivos no modo organizacional, usando a linguagem de pontos.

Depois de instalar o org-mind-map, você pode exportar um arquivo organizacional C-c C-ee selecionar "Criar um arquivo gráfico e de pontos"g d

Isso criará um arquivo de ponto do seu arquivo organizacional. Ele conterá algumas personalizações visuais do pacote org-mind-map por padrão. Você pode editá-las ou copiar as partes relevantes para um novo arquivo de pontos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.