Ubah struktur mode-org ke sumber titik

12

Pembuatan grafik yang cepat dari struktur mirip pohon bisa sangat berguna saat membuat catatan dalam mode org yang membutuhkan pembagian dan atau keindahan untuk manusia lain.

Saya tidak dapat menemukan cara untuk melakukan ini selain secara manual membuat blok dot / graphviz dinamis.

Terjemahan dari pohon terstruktur ke grafik berarah sederhana harus cukup mudah.

Saya mencari cara sederhana untuk melintasi pohon mode-org (wilayah yang dipilih) dan menerjemahkan struktur pohon (dan secara opsional beberapa informasi dari isi struktur) ke grafik titik.

Saya tidak mungkin menjadi orang pertama yang menemukan ini. Apakah ini sudah diselesaikan?

memasukkan

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

dan mungkin variabel org-to-dot-preamble

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

output akan terlihat seperti blok dinamis mode-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

Versi yang lebih maju pertama-tama akan mendeklarasikan semua node dan memungkinkan untuk beberapa format.

memasukkan

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

Beberapa variabel pemformatan

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

keluaran

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

tangkapan layar dari buffer mode-org dari hasil mocked-up

Werner
sumber
Pertanyaan yang sangat menarik! Apakah kode konversi akan membuat grafik titik buffer mode-org lain atau buffer itu sendiri? Ide keren!
Melioratus
Ya itu akan berguna, semacam bagaimana TikZ merender dalam dokumen LaTeX.
Pengguna Emacs
@Melioratus: Saya berpikir hanya untuk menggunakan wilayah yang dipilih dan untuk menempatkan kode titik yang dihasilkan di cincin pembunuhan atau hanya memasukkannya di titik.
Werner

Jawaban:

4

Berikut adalah contoh yang berfungsi yang menggunakan org-elementAPI untuk mem-parsing judul 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]]

Ini berfungsi dalam beberapa langkah: pertama blok elisp digunakan org-element-parse-bufferuntuk mendapatkan semua tajuk utama, dan ekstrak daftar judul induk dan judul tajuk.

Kemudian blok sumber lain mengubah daftar ini menjadi sintaksis titik.

Blok sumber titik ketiga berisi pembungkus DOT dan mencakup relasi yang dihasilkan.

Peningkatan kosmetik: saring bagian untuk tes itu sendiri; Anda dapat menambahkan tag ke bagian ini dan memfilter dengan tag di blok pertama.

Juancho
sumber
Fantastis! Ini bagus!
RUserPassingBy
3

Anda mungkin dapat menggunakan kembali beberapa kode dari bagian bawah http://pages.sachachua.com/evil-plans/ . Saya pada dasarnya menggunakan entri-peta-org untuk melihat judul saya. Karena saya memiliki grafik yang diarahkan alih-alih pohon yang ketat, saya menggunakan pencarian ekspresi reguler sederhana untuk mem-parsing struktur tautan dari teks ramah-manusia. Jika Anda hanya bekerja dengan pohon, Anda dapat membuat struktur pohon dari pos secara langsung. Setelah itu, masalah menghasilkan sintaksis graphviz yang sesuai, dan org-babel dapat menangani memproduksi itu dan mengubahnya menjadi PNG atau SVG. Semoga itu bisa membantu!

Sacha Chua
sumber
Itu file org yang bagus, dan beberapa grafik yang bagus.
db48x
3

Ini bukan titik, tetapi jika Anda terburu-buru, mengikuti mungkin membantu.

Kami membutuhkan org-plus-contribdan FreeMind.app untuk menghasilkan mindmap dari dokumen mode-org.

Instal paket mode tambahan org yang dipanggil org-plus-contriboleh M-x package-list-packages.

Mungkin kita perlu menambahkan

(require 'ox-freemind)

untuk .emacs kami.

Kemudian kita bisa mengekspor file org-mode untuk FreeMind * .mm file dengan C-c C-e f f, org-freemind-export-to-freemind.

Sekarang kita buka * .mm dari Freemind.app, dan voila!

org-ke-mm-mouse-over

Arahkan mouse ke atas untuk melihat isi node.

  • hati-hati: Ekspor freemind memiliki informasi lama tentang manual <8.0 manual
RUserPassingBy
sumber
1

PEMBARUAN: 2019

Ada paket yang disebut org-mind-map

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

Ini menciptakan grafik diarahkan graphviz dari file mode org menggunakan bahasa dot.

Setelah menginstal org-mind-map, Anda dapat mengekspor file org C-c C-edan memilih "Buat file grafik & dot"g d

Ini akan membuat file dot dari file org Anda. Ini akan berisi beberapa penyesuaian visual dari paket org-mind-map secara default. Anda dapat mengedit ini atau menyalin bagian yang relevan ke file titik baru.

Uang Tunai Ceamore
sumber