Verwandeln Sie eine Liste oder Datenstruktur in ein Organisationsdokument

15

Ich schreibe ein Paket, das eine Liste von Healines, Inhalten und einigen anderen Eigenschaften herunterlädt, die dem Benutzer angezeigt werden sollen. Momentan org-modescheint ein Puffer eine gute Möglichkeit zu sein, diese Überschriften anzuzeigen.

Unten sehen Sie ein Beispiel, wie diese Liste aufgebaut sein könnte. Es ist nur zur Veranschaulichung, ich kann es bei Bedarf leicht in eine andere Struktur umwandeln.

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

Gibt es eine Funktion oder ein Paket, das eine solche Liste in einen org-modePuffer druckt ?

Hier ist die gewünschte Ausgabe.

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

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

Ich könnte das manuell machen, ich frage mich nur, ob es da draußen etwas geben könnte.

Malabarba
quelle
Oh mein Gott, das wäre sehr nützlich. +1. Ich würde bemerken, dass sogar Org dies manuell tut. Sehen org-insert-drawer. (Das heißt, ich würde mir vorstellen, wenn ein solcher Konverter existiert, würde diese Funktion diesen mit aufrufen nil.)
Sean Allred

Antworten:

17

Dies ist die Aufgabe von org-elementder super (!) Arbeit von Nicolas Goaziou . Wenn Sie es nicht wissen org-elementund sich für die Entwicklung von Organisationen interessieren, sollten Sie sich das genauer ansehen. Es ist nicht nur ein großartiges Werkzeug, mit dem man arbeiten kann, es wird auch immer leistungsfähiger org. Vor allem die org-export( ox), aber auch Funktionen in z org.el.

Um die "Lispendarstellung" eines Elements unter Punkt zu erhalten, verwenden Sie org-element-at-pointoder org-element-context. Um die Darstellung des Puffers zu erhalten, verwenden Sie org-element-parse-buffer. Seien Sie sich bewusst, obwohl dies hier nicht direkt relevant ist org-element-map.

Um von der „Lispeln Darstellung“ eines element, secondary stringoder parse treezurück in die „Org Syntaxdarstellung“ Verwendung org-element-interpret-data. Dies ist die (einzige) Möglichkeit, eine "Lisp-Repräsentation" in eine "Org-Syntax-Repräsentation" umzuwandeln. Sie werden diese Darstellung wahrscheinlich nicht manuell schreiben wollen. Hier ist eine ziemlich kleine Darstellung Ihrer ersten Überschrift

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

Wenn Sie beide Überschriften hinzufügen müssen, fügen Sie a hinzu 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.")))))

Sie können feststellen , dass Thorsten Jolitz ‚s org-dpBibliothek , die Sie bei diesen Bemühungen unterstützen wird ( auf Melpa ).

Die Bibliothek org-dpist für die Programmierung auf lokaler Ebene gedacht, dh ohne (kontextbezogene) Informationen, mit Ausnahme der Informationen zum analysierten Element am Punkt. Es wurde entwickelt, um die Verwendung des Org-Parser / Interpreter-Frameworks auf lokaler Ebene so komfortabel wie die Verwendung auf globaler Ebene zu gestalten (mit einem vollständigen Analysebaum, der von org-element-parse-bufferavailable erstellt wird).

Eine ausführlichere Beschreibung von Thorsten finden Sie hier .

Für weitere Abklärungen gmane.emacs.orgmodeist wirklich das passende Forum.

Rasmus
quelle
Dies ist eine großartige Antwort, aber ich kann nicht verstehen, was org-dp jenseits von org-element bringt.
Lyn Headley
org-dpist eine alternative Schnittstelle. AFAIR, es wurde geschrieben, um Dokumente in der Org-Syntax / -Format aus einer "elementaren" Sicht zu erstellen. Das Ziel von Org Element ist es, ein Parser und ein Arbeitstier für Org zu sein. Mir persönlich geht es gut org-element, aber es ist großartig, alternative Schnittstellen zu haben.
Rasmus
2

Ich habe mir dieses Thema tangential angeschaut. Schauen Sie sich das org-protocol.el an . Es ist mit Org-Modus gebündelt. Insbesondere konvertiert die org-protocol-do-capture-Funktion eine Liste, "Teile" (die Sie anscheinend bereits haben), mit der org-store-link-props-Funktion in org-mode-Eigenschaften und ruft dann org-capture auf. Dies setzt voraus, dass Sie über eine Erfassungsvorlage mit Platzhaltern wie%: link verfügen. Sie können die Eigenschaften so definieren, wie Sie möchten.

Ich habe etwas Ähnliches getan , um Titel, Autor, Datum, Quelle usw. von Site-APIs zu entfernen. Wenn Sie sich diesen Code ansehen, lesen Sie auch capture-templates.el.

Wenn Sie mit JSON-Daten arbeiten, können die Dateien json.el und / oder request.el hilfreich sein.

sk8ingdom
quelle