Преобразовать структуру в режиме org в точечный источник

12

Быстрая генерация графиков из древовидной структуры может быть очень полезна при создании заметок в режиме org, которые требуют публикации и / или украшения для других людей.

Я не мог найти никакого способа сделать это, кроме как вручную создать динамический блок dot / graphviz.

Перевод из структурированного дерева в простой ориентированный граф должен быть довольно простым.

Я ищу простой способ пройти по дереву в орг-режиме (выделенная область) и перевести древовидную структуру (и, возможно, некоторую информацию из содержимого структуры) в точечный график.

Я не могу быть первым, кто придумал это. Это было решено?

вход

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

и, возможно, переменная преамбула org-to-dot

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

вывод будет выглядеть как динамический блок в режиме орг.

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

Более продвинутая версия сначала объявляет все узлы и допускает некоторое форматирование.

вход

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

Некоторые переменные форматирования

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

выход

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

снимок экрана из буфера в режиме org макета результата

Вернер
источник
Очень интересный вопрос! Будет ли код преобразования создавать точечный график другого буфера в режиме org или его собственного буфера? Классная идея!
Мелиоратус
Да, это было бы полезно, вроде того, как TikZ рендерит в документах LaTeX.
Emacs User
@Melioratus: я думал просто использовать выбранную область и либо поместить полученный код точки в список уничтожений, либо просто вставить его в точку.
Вернер

Ответы:

4

Вот рабочий пример, который использует org-elementAPI для анализа заголовков буфера:

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

Это работает в несколько этапов: сначала блок elisp использует org-element-parse-bufferдля получения всех заголовков и извлечения списка заголовка родителя и заголовка заголовка.

Затем другой исходный блок преобразует этот список в точечный синтаксис.

Третий точечный исходный блок содержит DOT-обертку и содержит сгенерированные отношения.

Косметические улучшения: отфильтруйте раздел для самого теста; Вы можете добавить тег в этот раздел и отфильтровать по тегу в первом блоке.

Juancho
источник
Фантастический! Это здорово!
RUserPassingBy
3

Возможно, вам удастся повторно использовать код из нижней части http://pages.sachachua.com/evil-plans/ . Я в основном использую org-map-entry для прохождения моих заголовков. Поскольку у меня есть строгий граф вместо строгого дерева, я использую простой поиск по регулярному выражению, чтобы проанализировать структуру ссылок из удобного для человека текста. Если вы просто работаете с деревом, вы можете создать свою древовидную структуру непосредственно из заголовков. После этого нужно создать соответствующий синтаксис graphviz, и org-babel может обработать его и преобразовать в PNG или SVG. Надеюсь, это поможет!

Саша Чуа
источник
Это отличный файл org и несколько хороших графиков.
db48x
3

Это не точка, но если вы спешите, может помочь следующее.

Нам нужен org-plus-contribFreeMind.app для создания карты разума из документов в режиме org.

Установка дополнительного орга-режим пакета под названием org-plus-contribпути M-x package-list-packages.

Возможно, нам нужно добавить

(require 'ox-freemind)

к нашим .emacs.

Тогда мы можем экспортировать наш файл орг-режима в Freemind * .mm файл по C-c C-e f f, org-freemind-export-to-freemind.

Теперь мы открываем * .mm из Freemind.app, и вуаля!

орг-к-мм-мыши над

Наведите курсор мыши, чтобы увидеть содержимое узлов.

  • Внимание: экспорт Freemind содержит старую информацию о Org <8.0 руководство
RUserPassingBy
источник
1

ОБНОВЛЕНИЕ: 2019

Существует пакет под названием org-mind-map

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

Он создает граф-ориентированные графы из файлов в режиме org, используя язык точек.

После установки org-mind-map вы можете экспортировать файл org C-c C-eи выбрать «Создать файл графика и точки».g d

Это создаст файл точек из вашего файла org. Он будет содержать некоторые визуальные настройки из пакета org-mind-map по умолчанию. Вы можете отредактировать их или скопировать соответствующие части в новый файл точек.

Кеамор Кэш
источник