Trasforma un elenco o una struttura di dati in un documento organizzativo


15

Sto scrivendo un pacchetto che scarica un elenco di healines, contenuti e alcune altre proprietà, che devono essere mostrate all'utente. Per il momento, un org-modebuffer sembra un buon modo per visualizzare questi titoli.

Di seguito è riportato un esempio di come potrebbe essere strutturato questo elenco. È puramente illustrativo, posso facilmente convertirlo in qualsiasi altra struttura, se necessario.

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

Esiste una funzione o un pacchetto che stampa tale elenco in un org-modebuffer?

Ecco l'output desiderato.

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

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

Potrei farlo manualmente, mi chiedo solo se potrebbe esserci qualcosa là fuori.


Oh mio Dio, questo sarebbe molto utile. +1. Vorrei notare che anche Org lo fa manualmente. Vedere org-insert-drawer. (Cioè, immagino che se esistesse un tale convertitore, questa funzione chiamerebbe quella con nil.)
Sean Allred

Risposte:


17

Questo è il lavoro di org-element, il fantastico (!) Lavoro di Nicolas Goaziou . Se non lo sai org-elemente ti interessa lo sviluppo dell'org questo è qualcosa che dovresti esaminare. Non è solo un ottimo strumento con cui lavorare, ma è anche sempre più potente org. In particolare il org-export( ox), ma funziona anche in eg org.el.

Per ottenere la "rappresentazione lisp" di un elemento sotto punto usare org-element-at-pointo org-element-context. Per ottenere la rappresentazione del buffer utilizzare org-element-parse-buffer. Sebbene non sia direttamente pertinente qui, tieni presente org-element-map.

Per passare dalla "rappresentazione lisp" di un element, secondary stringo parse treetornare alla "rappresentazione della sintassi dell'organizzazione" usare org-element-interpret-data. Questo è il (solo) modo per trasformare una "rappresentazione Lisp" in un "Org sintassi di rappresentanza". Tuttavia, probabilmente non vorrai scrivere questa rappresentazione manualmente. Ecco una rappresentazione piuttosto piccola del tuo primo titolo

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

Se devi aggiungere entrambi i titoli aggiungi 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.")))))

Potresti scoprire che la biblioteca di Thorsten Jolitzorg-dp ti aiuterà in tali sforzi ( su MELPA ).

La libreria org-dpè pensata per la programmazione a livello locale, cioè senza alcuna informazione (contestuale) eccetto quelle sull'elemento analizzato al punto. È progettato per rendere l'utilizzo del framework parser / interprete Org a livello locale conveniente come usarlo a livello globale (con un albero di analisi completo prodotto da org-element-parse-bufferdisponibile)

Una descrizione più completa di Thorsten può essere trovata qui .

Per ulteriori chiarimenti gmane.emacs.orgmodeè davvero il forum appropriato.


Questa è un'ottima risposta, ma non riesco a capire cosa org-dp porti oltre org-element.
Lyn Headley,

org-dpè un'interfaccia alternativa. AFAIR, è stato scritto per creare documenti nella sintassi / formato dell'organizzazione da un punto di vista "elementare". L'obiettivo di Org Element è quello di essere un parser e un cavallo di battaglia per Org. Personalmente sto bene org-element, ma è bello avere interfacce alternative.
rasmus

2

Ho esaminato tangenzialmente questo problema. Dai un'occhiata a org-protocol.el . È in bundle con la modalità org. In particolare, la funzione org-protocol-do-capture converte un elenco, "parti" (che sembra già avere), in proprietà della modalità org usando la funzione org-store-link-props e quindi chiama org-capture. Ciò presuppone che tu abbia un modello di acquisizione con segnaposto come%: link. Puoi definire le proprietà come preferisci.

Ho fatto qualcosa di simile a raschiare titolo, autore, data, fonte, ecc. Dalle API del sito. Se finisci per guardare questo codice, assicurati di guardare anche capture-templates.el.

Se lavori con dati JSON, json.el e / o request.el potrebbero essere utili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.