Bir listeyi veya veri yapısını kuruluş belgesine dönüştürme


15

Kullanıcıya gösterilecek iyileştirmeler, içerikler ve diğer bazı özelliklerin listesini indiren bir paket yazıyorum. Şimdilik, bir org-modetampon bu başlıkları göstermenin iyi bir yolu gibi görünüyor.

Aşağıda bu listenin nasıl yapılandırılabileceğine bir örnek verilmiştir. Sadece açıklayıcıdır, gerektiğinde kolayca başka bir yapıya dönüştürebilirim.

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

Böyle bir listeyi org-modearabelleğe yazdıran bir işlev veya paket var mı ?

İşte istenen çıktı.

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

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

Bunu manuel olarak yapabilirdim, sadece orada bir şey olup olmadığını merak ediyorum.


Aman tanrım, bu çok faydalı olurdu. +1. Org'un bile manuel olarak yaptığını not ederim. Bkz org-insert-drawer. (Yani, böyle bir dönüştürücünün var olup olmadığını düşünürdüm, bu işlev buna bir tane diyecektir nil.)
Sean Allred

Yanıtlar:


17

Bu işi olduğunu org-element, müthiş bir (!) İş Nicolas Goaziou . Eğer bilmiyorsanız org-elementve kuruluş gelişimini önemsiyorsanız, bu göz önünde bulundurmanız gereken bir şeydir. Sadece çalışmak için harika bir araç değil, aynı zamanda giderek daha fazla güç veriyor org. En önemlisi org-export( ox), fakat aynı zamanda örn org.el.

Nokta altında org-element-at-pointveya altında bir elemanın "lisp temsili" elde etmek için org-element-context. Tampon kullanımının temsilini almak org-element-parse-buffer. Burada doğrudan alakalı olmasa da, farkında olun org-element-map.

"Lisp temsil" bir bölgesinin gitmek için element, secondary stringya parse treehiç arkasına "Org sözdizimi gösterimi" kullanım org-element-interpret-data. Bu bir "Org sözdizimi temsil" içine "lisp temsilini" açmak için (yalnızca) yol. Yine de muhtemelen bu temsili el ile yazmak istemeyeceksiniz. İşte ilk başlığınızın oldukça küçük bir temsili

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

Her iki başlığı da eklemeniz gerekiyorsa 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.")))))

Sen bulabilirsiniz Thorsten Jolitz 'ın org-dpkitaplığı (örneğin çabalarında size yardımcı olacaktır MELPA üzerinde ).

Kütüphane org-dp, yerel düzeyde programlama içindir, yani noktadaki ayrıştırılmış öğeyle ilgili olanlar dışında (bağlamsal) bilgi olmadan. Kuruluş ayrıştırıcı / yorumlayıcı çerçevesini yerel düzeyde kullanmayı, küresel düzeyde kullanmak kadar uygun hale getirmek için tasarlanmıştır ( org-element-parse-buffermevcut tarafından üretilen tam bir ayrıştırma ağacı ile )

Thorsten'in daha eksiksiz bir açıklamasını burada bulabilirsiniz .

Daha fazla açıklama gmane.emacs.orgmodeiçin gerçekten uygun bir forum.


Bu harika bir cevap, ama org-dp'nin org-elementinin ötesine ne getirdiğini anlayamıyorum.
Lyn Headley

org-dpalternatif bir arayüzdür. AFAIR, "elementli" bir bakış açısıyla Org sözdizimi / biçiminde belgeler oluşturmak için yazılmıştır. Org Elementinin amacı, Org için ayrıştırıcı ve işgücü olmaktır. Ben şahsen iyiyim org-element, ama alternatif arayüzlere sahip olmak harika.
rasmus

2

Bu konuya biraz teğet olarak baktım. Kuruluş protokolüne bir göz atın . El. Kuruluş modu ile birlikte gelir. Özellikle, org-protokolü-do-yakalama işlevi, bir "parça" (zaten var gibi görünen) bir listeyi org-store-link-props işlevini kullanarak org-mode özelliklerine dönüştürür ve sonra org-capture'ı çağırır. Bu,%: link gibi yer tutucular içeren bir yakalama şablonunuz olduğunu varsayar. Özellikleri istediğiniz gibi tanımlayabilirsiniz.

Site API'larından başlık, yazar, tarih, kaynak vb. Sıyırmaya benzer bir şey yaptım . Bu koda bakacak olursanız, capture-templates.el dosyasına da bakmayı unutmayın.

JSON verileriyle çalışıyorsanız, json.el ve / veya request.el yararlı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.