Konwertuj strukturę trybu org na źródło kropkowe

12

Szybkie generowanie wykresów ze struktury przypominającej drzewo może być bardzo przydatne podczas robienia notatek w trybie organizacji, które wymagają udostępniania i / lub upiększania innym ludziom.

Nie mogłem znaleźć innego sposobu niż ręczne utworzenie dynamicznego bloku dot / graphviz.

Tłumaczenie z drzewa strukturalnego na prosty ukierunkowany wykres powinno być dość proste.

Szukam prostego sposobu na przejście do drzewa w trybie organizacji (wybrany region) i przetłumaczenie struktury drzewa (i opcjonalnie niektórych informacji z zawartości struktury) na wykres kropkowy.

Nie mogę być pierwszym, który to wymyślił. Czy to zostało rozwiązane?

Wejście

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

i być może zmienna preambuła od org do kropki

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

dane wyjściowe wyglądałyby jak blok dynamiczny w trybie organizacji

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

Bardziej zaawansowana wersja najpierw zadeklaruje wszystkie węzły i pozwoli na pewne formatowanie.

Wejście

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

Niektóre zmienne formatujące

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

wynik

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

zrzut ekranu z bufora trybu org wyśmiewanego wyniku

Werner
źródło
Bardzo interesujące pytanie! Czy kod konwersji utworzyłby wykres kropkowy innego bufora trybu org lub własnego bufora? Fajny pomysł!
Melioratus
Tak, przydałoby się, jak TikZ renderuje w dokumentach LaTeX.
Użytkownik Emacsa,
@Melioratus: Myślałem tylko o użyciu wybranego regionu i albo umieszczeniu wynikowego kodu punktowego w pierścieniu zabijania, albo po prostu wstawieniu go w punkcie.
Werner,

Odpowiedzi:

4

Oto działający przykład, który wykorzystuje org-elementAPI do analizowania nagłówków buforów:

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

Działa to w kilku krokach: najpierw używa bloku elisp, org-element-parse-bufferaby uzyskać wszystkie nagłówki i wyodrębnić listę tytułu rodzica i tytułu nagłówka.

Następnie inny blok źródłowy przekształca tę listę w składnię kropkową.

Trzeci blok źródłowy kropki zawiera zawijanie DOT i zawiera wygenerowane relacje.

Udoskonalenia kosmetyczne: odfiltruj sekcję dotyczącą samego testu; możesz dodać znacznik do tej sekcji i odfiltrować według znacznika w pierwszym bloku.

Juancho
źródło
Fantastyczny! To jest świetne!
RUserPassingBy
3

Możesz ponownie wykorzystać część kodu z dołu strony http://pages.sachachua.com/evil-plans/ . Zasadniczo używam wpisów z mapami organizacji, aby przechodzić przez moje nagłówki. Ponieważ mam ukierunkowany wykres zamiast ścisłego drzewa, używam prostych wyszukiwań wyrażeń regularnych, aby przeanalizować strukturę linków z tekstu przyjaznego dla człowieka. Jeśli pracujesz tylko z drzewem, możesz bezpośrednio utworzyć strukturę drzewa z nagłówków. Następnie jest kwestia wygenerowania odpowiedniej składni graphviz, a org-babel może poradzić sobie z produkcją i konwersją do formatu PNG lub SVG. Mam nadzieję, że to pomaga!

Sacha Chua
źródło
To świetny plik org i kilka fajnych wykresów.
db48x
3

To nie kropka, ale jeśli się spieszysz, pomocne mogą być następujące obserwacje.

Potrzebujemy org-plus-contribi FreeMind.app, aby stworzyć mapę myśli z dokumentów w trybie org.

Zainstaluj dodatkowy pakiet trybu org wywoływany org-plus-contribprzez M-x package-list-packages.

Być może będziemy musieli dodać

(require 'ox-freemind)

do naszych .emacs.

Wtedy możemy eksportować nasz plik org-mode do FreeMind plik * .mm przez C-c C-e f f, org-freemind-export-to-freemind.

Teraz otwieramy * .mm z Freemind.app i voila!

org-to-mm-mouse-over

Najedź myszką, aby zobaczyć zawartość węzłów.

RUserPassingBy
źródło
1

AKTUALIZACJA: 2019

Istnieje pakiet o nazwie org-mind-map

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

Tworzy wykresy kierowane przez graphviz z plików w trybie org przy użyciu języka kropek.

Po zainstalowaniu org-mind-map możesz wyeksportować plik org C-c C-ei wybrać „Utwórz plik wykresu i kropki”g d

Spowoduje to utworzenie pliku kropki z pliku organizacji. Będzie domyślnie zawierał pewne dostosowania wizualne z pakietu org-mind-map. Możesz je edytować lub skopiować odpowiednie części do nowego pliku kropki.

Ceamore Cash
źródło