将列表或数据结构转换为组织文档


15

我正在编写一个程序包,其中下载了将显示给用户的healines,内容和其他一些属性的列表。目前,org-mode缓冲区似乎是显示这些标题的好方法。

以下是此列表的结构示例。这仅仅是说明性的,我可以根据需要轻松地将其转换为任何其他结构。

'(("One headline" "Some much longer content."
   (property1 . value)
   (property2 . value))
  ("Second headline" "More much longer content."
   (property1 . value)
   (property2 . value)))

是否存在将此类列表打印到org-mode缓冲区的函数或程序包?

这是所需的输出。

* One headline
  :PROPERTIES:
  :property1: value
  :property2: value
  :END:
Some much longer content.

* Second headline
  :PROPERTIES:
  :property1: value
  :property2: value
  :END:
More much longer content.

我可以手动执行此操作,我只是想知道那里是否有东西。


哦,我的,这将非常有用。+1。我会注意到,甚至Org都是手动完成的。请参阅org-insert-drawer。(也就是说,我想如果存在这样的转换器,则此函数将用来调用该转换器nil。)
Sean Allred

Answers:


17

这是工作org-element真棒的(!)工作萨科Goaziou。如果您不了解org-element并且关心组织开发,那么您应该研究一下。它不仅是一个很好的工具,而且功能越来越强大org。最值得注意的是org-exportox),但也可以在例如中使用org.el

要获得点使用org-element-at-point或的元素的“ lisp表示形式” org-element-context。要获取缓冲区的表示形式,请使用org-element-parse-buffer。虽然在这里不直接相关,但是请注意org-element-map

要从“口齿不清代表性”的走elementsecondary string还是parse tree回到“组织语法表示”使用org-element-interpret-data。这是 “ lisp表示”转换为“组织语法表示” (唯一)方法。但是,您可能不希望手动编写此表示形式。这是您的第一个标题的很小一部分

(org-element-interpret-data
 '(headline (:title "One headline" :level 1)
            (property-drawer nil ((node-property (:key "property1" :value "value1"))
                                  (node-property (:key "property2" :value "value2"))))
            (#("Some much longer content."))))

如果您必须同时添加两个标题,请添加 parse tree

(org-element-interpret-data
 '(org-data nil (headline (:title "One headline" :level 1)
                          (property-drawer nil ((node-property (:key "property1" :value "value1"))
                                                (node-property (:key "property2" :value "value2"))))
                          (#("Some much longer content.")))
            (headline (:title "Second headline" :level 1)
                          (property-drawer nil ((node-property (:key "property1" :value "value1"))
                                                (node-property (:key "property2" :value "value2"))))
                          (#("More much longer content.")))))

您可能会发现Thorsten Jolitzorg-dp库将帮助您进行此类工作(基于MELPA)。

该库org-dp用于在本地级别进行编程,即,除了关于点解析元素的信息外,没有任何(上下文)信息。它旨在使在本地级别使用Org解析器/解释器框架与在全局级别使用它一样方便(具有可用的完整解析树 org-element-parse-buffer

这里可以找到Thorsten的更完整的描述。

为了进一步澄清gmane.emacs.orgmode,确实是合适的论坛。


这是一个很好的答案,但是我无法理解org-dp带来的超越org-element的功能。
Lyn Headley

org-dp是替代界面。AFAIR,从“元素”的角度来看,它是按照Org语法/格式创建文档的。Org Element的目标是成为Org的解析器和主力军。我个人对很好org-element,但是拥有其他接口也很棒。
拉斯莫斯18'Apr

2

我已经切切地研究了这个问题。看一下org-protocol.el。它与组织模式捆绑在一起。具体来说,org-protocol-do-capture函数使用org-store-link-props函数将列表(“部分”(您似乎已经拥有))转换为org-mode属性,然后调用org-capture。假设您有一个带有占位符(例如%:link)的捕获模板。您可以将属性定义为任何您喜欢的属性。

我做了一些类似于从站点API刮取标题,作者,日期,来源等的操作。如果最终查看此代码,请确保还查看capture-templates.el。

如果您正在使用JSON数据,则json.el和/或request.el可能会有用。

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.