Converti la struttura in modalità org in sorgente punti


12

La rapida generazione di grafici da una struttura ad albero può essere molto utile quando si prendono appunti in modalità org che richiedono condivisione e / o abbellimento per altri umani.

Non sono riuscito a trovare un modo per farlo se non quello di creare manualmente un blocco dot / graphviz dinamico.

Una traduzione da un albero strutturato in un semplice grafico diretto dovrebbe essere abbastanza semplice.

Sto cercando un modo semplice per attraversare un albero in modalità org (una regione selezionata) e tradurre la struttura ad albero (e facoltativamente alcune informazioni dal contenuto della struttura) in un grafico a punti.

Non posso essere il primo ad aver escogitato questo. Questo è stato risolto?

ingresso

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

e forse un preambolo variabile da org a punto

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

l'output sembrerebbe un blocco dinamico in modalità 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 versione più avanzata dichiarerebbe innanzitutto tutti i nodi e consentirebbe una formattazione.

ingresso

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

Alcune variabili di formattazione

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

produzione

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

screenshot da un buffer in modalità org del risultato simulato


Domanda molto interessante! Il codice di conversione creerebbe un grafico a punti di un altro buffer in modalità org o è il proprio buffer? Bella idea!
Melioratus,

Sì, sarebbe utile, una specie di rendering di TikZ nei documenti LaTeX.
Utente Emacs

@Melioratus: stavo pensando solo di usare la regione selezionata e di posizionare il codice punto risultante nel kill ring o semplicemente inserirlo nel punto.
Werner,

Risposte:


4

Ecco un esempio funzionante che utilizza l' org-elementAPI per analizzare le intestazioni del 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]]

Funziona in diversi passaggi: in primo luogo un blocco elisp utilizza org-element-parse-bufferper ottenere tutti i titoli ed estrarre un elenco del titolo principale e del titolo.

Quindi un altro blocco sorgente trasforma questo elenco in sintassi punto.

Un terzo blocco sorgente di punti contiene il wrapping DOT e include le relazioni generate.

Miglioramenti cosmetici: filtrare la sezione per il test stesso; puoi aggiungere un tag a questa sezione e filtrare per tag nel primo blocco.


Fantastico! Questo è fantastico!
RUserPassing dal

3

Potresti riuscire a riutilizzare parte del codice dalla parte inferiore di http://pages.sachachua.com/evil-plans/ . Fondamentalmente uso le voci org-map per consultare le mie intestazioni. Dato che ho un grafico diretto anziché un albero rigoroso, utilizzo semplici ricerche di espressioni regolari per analizzare la struttura dei collegamenti da un testo a misura d'uomo. Se stai solo lavorando con un albero, puoi creare direttamente la struttura dell'albero dalle intestazioni. Dopodiché, si tratta di generare la sintassi graphviz appropriata e org-babel può gestire la sua produzione e la sua conversione in PNG o SVG. Spero possa aiutare!


È un ottimo file organizzativo e alcuni bei grafici.
db48x,

3

Non è un punto, ma se sei di fretta, i seguenti potrebbero essere utili.

Abbiamo bisogno org-plus-contribe FreeMind.app per produrre una mappa mentale da documenti in modalità org.

Installa il pacchetto extra della modalità org chiamato org-plus-contribda M-x package-list-packages.

Forse potremmo aver bisogno di aggiungere

(require 'ox-freemind)

ai nostri .emacs.

Poi possiamo esportare il nostro file org-mode per Freemind file * .mm da C-c C-e f f, org-freemind-export-to-freemind.

Ora apriamo * .mm da Freemind.app e voilà!

org-to-mm-topo-over

Passa il mouse sopra per vedere il contenuto dei nodi.


1

AGGIORNAMENTO: 2019

C'è un pacchetto chiamato org-mind-map

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

Crea grafici diretti da graphviz da file in modalità org usando il linguaggio dot.

Dopo aver installato org-mind-map puoi esportare un file org C-c C-ee selezionare "Crea un file grafico e dot"g d

Questo creerà un file dot dal tuo file org. Conterrà alcune personalizzazioni visive dal pacchetto org-mind-map per impostazione predefinita. È possibile modificarli o copiare le parti pertinenti in un nuovo file dot.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.