リストまたはデータ構造を組織文書に変換する


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。)
ショーン・オールレッド

回答:


17

これはの仕事ですorg-element素晴らしいの(!)仕事ニコラスGoaziou。あなたが知らずorg-element、組織開発に関心があるなら、これはあなたが調査すべきものです。優れたツールであるだけでなく、ますます強力になっていorgます。最も顕著なのはorg-exportox)ですが、などでも機能しorg.elます。

ポイントの下で要素の「lisp表現」を取得するにはorg-element-at-pointまたはを使用しますorg-element-context。バッファの表現を取得するには、を使用しますorg-element-parse-buffer。ここでは直接関係ありませんが、注意してくださいorg-element-map

「Lispの表現」のから行くためにelementsecondary stringまたはparse treeに戻って「組織構文表現」を使用org-element-interpret-data。これは「lisp表現」を「Org構文表現」に変換する(唯一の)方法です。ただし、この表現を手動で記述することはおそらくないでしょう。これが最初の見出しの非常に小さな表現です

(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を超えるものを理解できません。
リンヘッドリー

org-dp代替インターフェースです。AFAIR、それは「基本的な」観点から組織の構文/形式でドキュメントを作成するために書かれました。Org Elementの目標は、Orgのパーサーおよび主力になることです。私は個人的には問題ありorg-elementませんが、代わりのインターフェースを持っているのは素晴らしいことです。
ラスマス

2

私はこの問題を接線的に見てきました。org-protocol.elを見てください。org-modeにバンドルされています。具体的には、org-protocol-do-capture関数は、org-store-link-props関数を使用して、リスト「parts」(既にあるように見える)をorg-modeプロパティに変換し、org-captureを呼び出します。これは、%:linkなどのプレースホルダーを持つキャプチャテンプレートがあることを前提としています。プロパティは任意に定義できます。

サイトAPIからタイトル、作成者、日付、ソースなどを取得するのと同じようなことをしました。このコードを見ることになった場合は、capture-templates.elも確認してください。

JSONデータを使用している場合、json.elまたはrequest.elが役立つ場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.