将组织模式结构转换为点源


12

从树状结构快速生成图形时,在以组织方式进行笔记时需要其他人共享或美化,这非常有用。

除了手动创建动态点/ graphviz块以外,我找不到其他方法。

从结构树到简单有向图的转换应该相当简单。

我正在寻找一种遍历组织模式树(选定区域)并将树结构(以及可选的一些来自结构内容的信息)转换为点图的简单方法。

我不可能是第一个提出这个建议的人。这个解决了吗

输入

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

也许是可变的组织到点的前同步码

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

来自模拟结果的组织模式缓冲区的屏幕截图


非常有趣的问题!转换代码会创建另一个组织模式缓冲区还是它自己的缓冲区的点图?好主意!
Melioratus

是的,这很有用,类似于TikZ在LaTeX文档中的渲染方式。
Emacs用户

@Melioratus:我当时只是想使用选定的区域,然后将生成的点代码放置在kill环中,或者只是将其插入到该点。
Werner 2015年

Answers:


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包装,并包含生成的关系。

外观增强:过滤掉测试本身的部分;您可以在此部分添加标签,并在第一个块中按标签过滤。


太棒了!这很棒!
RUserPassingBy 2015年

3

您可能可以重用http://pages.sachachua.com/evil-plans/底部的一些代码。我基本上使用org-map-entries来浏览标题。由于我有向图而不是严格树,因此我使用简单的正则表达式搜索来解析人类友好文本的链接结构。如果仅使用树,则可以直接从标题创建树结构。之后,只需生成适当的graphviz语法即可,并且org-babel可以处理该语法并将其转换为PNG或SVG。希望有帮助!


那是一个很棒的组织文件,还有一些漂亮的图表。
db48x 2015年

3

它不是点,但是如果您急忙的话,跟随可能会有所帮助。

我们需要org-plus-contrib和FreeMind.app从组织模式文档中生成思维导图。

安装名为org-plus-contrib的额外组织模式软件包M-x package-list-packages

也许我们可能需要添加

(require 'ox-freemind)

到我们的.emacs。

然后,我们可以在我们的组织模式文件导出到FreeMind的* .mm的文件C-c C-e f forg-freemind-export-to-freemind

现在我们从Freemind.app打开* .mm,瞧!

组织到鼠标悬停

将鼠标悬停在上面可以查看节点的内容。


1

更新:2019年

有一个名为org-mind-map的软件包

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

它使用点语言从组织模式文件创建graphviz定向图。

安装org-mind-map后,您可以导出org文件C-c C-e并选择“创建图形和点文件”g d

这将从您的组织文件中创建一个点文件。默认情况下,它将包含来自org-mind-map包的一些可视化自定义项。您可以编辑这些文件或将相关部分复制到新的点文件中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.