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


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.


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!


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.