Convierta la estructura del modo org al origen de puntos


12

La generación rápida de gráficos a partir de una estructura similar a un árbol puede ser muy útil al hacer notas en modo org que requieren compartir y / o embellecer a otros humanos.

No pude encontrar otra manera de hacer esto que no sea crear manualmente un bloque dinámico dot / graphviz.

Una traducción de un árbol estructurado a un gráfico dirigido simple debería ser bastante sencilla.

Estoy buscando una manera simple de atravesar un árbol de modo org (una región seleccionada) y traducir la estructura de árbol (y opcionalmente alguna información del contenido de la estructura) a un gráfico de puntos.

No puedo ser el primero en pensar en esto. ¿Se ha resuelto esto?

entrada

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

y tal vez una variable org-to-dot-preamble

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

la salida se vería como un bloque dinámico del modo org

#+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

Una versión más avanzada primero declararía todos los nodos y permitiría algún formato.

entrada

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

Algunas variables de formato

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

salida

#+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 pantalla de un búfer en modo org del resultado simulado


Pregunta muy interesante! ¿El código de conversión crearía un gráfico de puntos de otro búfer de modo org o su propio búfer? ¡Buena idea!
Melioratus

Sí, sería útil, algo así como TikZ representa en los documentos de LaTeX.
Usuario de Emacs el

@Melioratus: Estaba pensando en usar la región seleccionada y colocar el código de punto resultante en el anillo de eliminación o simplemente insertarlo en el punto.
Werner

Respuestas:


4

Aquí hay un ejemplo de trabajo que usa org-elementAPI para analizar los encabezados del búfer:

* 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]]

Esto funciona en varios pasos: primero, un bloque elisp se usa org-element-parse-bufferpara obtener todos los titulares y extraer una lista del título de los padres y el título del título.

Luego, otro bloque fuente transforma esta lista en sintaxis de puntos.

Un tercer bloque fuente de puntos contiene el ajuste DOT e incluye las relaciones generadas.

Mejoras cosméticas: filtre la sección para la prueba en sí; puede agregar una etiqueta a esta sección y filtrar por etiqueta en el primer bloque.


¡Fantástico! ¡Esto es genial!
RUserPassingPor

3

Es posible que pueda reutilizar parte del código desde la parte inferior de http://pages.sachachua.com/evil-plans/ . Básicamente uso org-map-entry para revisar mis encabezados. Como tengo un gráfico dirigido en lugar de un árbol estricto, utilizo búsquedas simples de expresiones regulares para analizar la estructura de enlaces a partir de texto amigable para los humanos. Si solo está trabajando con un árbol, puede crear su estructura de árbol a partir de los encabezados directamente. Después de eso, se trata de generar la sintaxis adecuada de graphviz, y org-babel puede encargarse de producir eso y convertirlo en PNG o SVG. ¡Espero que ayude!


Ese es un gran archivo de organización, y algunos buenos gráficos.
db48x

3

No es un punto, pero si tienes prisa, los siguientes pueden ser útiles.

Necesitamos org-plus-contriby FreeMind.app para producir un mapa mental a partir de documentos en modo org.

Instale un paquete de modo org adicional llamado org-plus-contribpor M-x package-list-packages.

Quizás debamos agregar

(require 'ox-freemind)

a nuestros .emacs.

Entonces podemos exportar nuestro archivo org-mode para Freemind archivo * .mm por C-c C-e f f, org-freemind-export-to-freemind.

Ahora abrimos * .mm desde Freemind.app, ¡y listo!

org-to-mm-mouse-over

Pase el mouse para ver el contenido de los nodos.


1

ACTUALIZACIÓN: 2019

Hay un paquete llamado org-mind-map

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

Crea gráficos dirigidos por graphviz a partir de archivos de modo org utilizando el lenguaje de puntos.

Después de instalar org-mind-map, puede exportar un archivo de organización C-c C-ey seleccionar "Crear un archivo de gráfico y punto"g d

Esto creará un archivo de puntos a partir de su archivo de organización. Contendrá algunas personalizaciones visuales del paquete org-mind-map de forma predeterminada. Puede editarlos o copiar las partes relevantes a un nuevo archivo de puntos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.