Ubah daftar atau struktur data menjadi dokumen org

15

Saya sedang menulis paket yang memuat daftar healine, konten, dan beberapa properti lainnya, yang akan ditampilkan kepada pengguna. Untuk saat ini, org-modebuffer sepertinya cara yang baik untuk menampilkan tajuk utama ini.

Di bawah ini adalah contoh bagaimana daftar ini disusun. Ini hanya ilustratif, saya dapat dengan mudah mengubahnya ke struktur lain yang diperlukan.

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

Apakah ada fungsi atau paket yang mencetak daftar seperti itu ke org-modebuffer?

Inilah output yang diinginkan.

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

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

Saya bisa melakukan ini secara manual, saya hanya ingin tahu apakah mungkin ada sesuatu di luar sana.

Malabarba
sumber
Ya ampun, ini akan sangat berguna. +1. Saya akan mencatat bahwa bahkan Org melakukannya secara manual. Lihat org-insert-drawer. (Yaitu, saya akan membayangkan jika konverter seperti itu ada, fungsi ini akan memanggil yang satu dengan nil.)
Sean Allred

Jawaban:

17

Ini adalah pekerjaan dari org-element, yang mengagumkan (!) Karya Nicolas Goaziou . Jika Anda tidak tahu org-elementdan Anda peduli tentang pengembangan org, ini adalah sesuatu yang harus Anda perhatikan. Ini bukan hanya alat yang hebat untuk digunakan, tetapi juga semakin kuat org. Terutama org-export( ox), tetapi juga berfungsi dalam misalnya org.el.

Untuk mendapatkan "representasi lisp" dari elemen di bawah titik gunakan org-element-at-pointatau org-element-context. Untuk mendapatkan representasi dari penggunaan buffer org-element-parse-buffer. Meskipun tidak secara langsung relevan di sini, perlu diperhatikan org-element-map.

Untuk beralih dari "representasi lisp" dari element, secondary stringatau parse treekembali ke "representasi sintaksis Org" gunakan org-element-interpret-data. Ini adalah satu- satunya cara untuk mengubah "representasi pelat" menjadi "Representasi sintaksis organisasi". Anda mungkin tidak ingin menulis representasi ini secara manual. Berikut ini adalah representasi kecil dari tajuk pertama Anda

(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."))))

Jika Anda harus menambahkan kedua tajuk utama, tambahkan a 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.")))))

Anda mungkin menemukan bahwa Thorsten Jolitz 's org-dpperpustakaan akan membantu Anda dalam upaya tersebut ( pada MELPA ).

Perpustakaan org-dpdimaksudkan untuk pemrograman di tingkat lokal, yaitu tanpa informasi (kontekstual) kecuali yang tentang elemen yang diuraikan pada titik. Ini dirancang untuk menjadikan penggunaan kerangka kerja parser / juru bahasa di tingkat lokal senyaman menggunakannya di tingkat global (dengan parse-tree lengkap yang diproduksi oleh org-element-parse-buffertersedia)

Deskripsi yang lebih lengkap oleh Thorsten dapat ditemukan di sini .

Untuk klarifikasi lebih lanjut gmane.emacs.orgmodebenar-benar forum yang tepat.

rasmus
sumber
Ini adalah jawaban yang bagus, tapi saya tidak bisa mengerti apa yang dibawa org-dp melampaui elemen-org.
Lyn Headley
org-dpadalah antarmuka alternatif. AFAIR, ditulis untuk membuat dokumen dalam sintaks / format Org dari sudut pandang "elemen". Tujuan Elemen Org adalah menjadi pengurai dan pekerja keras bagi Org. Saya pribadi baik-baik saja dengan org-element, tetapi itu bagus untuk memiliki antarmuka alternatif.
rasmus
2

Saya sudah agak suka melihat masalah ini. Lihatlah org-protocol.el . Ini dibundel dengan mode-org. Secara khusus, fungsi org-protokol-do-capture mengubah daftar, "bagian" (yang tampaknya sudah Anda miliki), ke properti mode-org menggunakan fungsi org-store-link-props dan kemudian memanggil pengambilan-org. Ini mengasumsikan bahwa Anda memiliki templat pengambilan dengan placeholder seperti tautan%:. Anda dapat mendefinisikan properti menjadi apa pun yang Anda suka.

Saya telah melakukan sesuatu yang mirip dengan mengikis judul, penulis, tanggal, sumber, dll. Dari API situs. Jika Anda akhirnya melihat kode ini, pastikan untuk juga melihat capture-templates.el.

Jika Anda bekerja dengan data JSON, json.el dan / atau request.el mungkin berguna.

sk8ingdom
sumber