Hintergrund
Ich schreibe einen Präsentationsmodus für Emacs. Ich möchte, dass die Eingabe Organisationsdateien sind, da Organisationsdateien sich hervorragend für Daten eignen.
Problem
Ich muss die Organisationsmodusdatei in eine Liste von "Folien" -Datenstrukturen konvertieren, die ich durchlaufen kann. Dazu möchte ich so etwas wie die folgende Org-Modus-Datei nehmen:
* this is the first headline, with a title property and no contents
* this is the second headline, with contents
- dash list nested under the second headline
- further nested
** nested headline
und in der Lage sein, es zu gehen. Ich habe es versucht (org-element-parse-buffer)
, und das gibt mir eine Liste von Elementen, aber es ist schwer herauszufinden, wie ich weiter darin gehen kann. Wenn Sie beispielsweise aufrufen, erhalten Sie (org-element-map (org-element-parse-buffer) 'headline #'identity)
eine Liste mit drei Elementen. Die letzte steht für die "verschachtelte Überschrift". Ich möchte, dass "verschachtelte Überschrift" ein Kind von "Dies ist die zweite Überschrift mit Inhalt" ist.
Vermeiden des XY-Problems
Ich bin auf jeden Fall offen für andere Möglichkeiten, eine Org-Modus-Datei in eine Elisp-Datenstruktur zu konvertieren. Ich denke nicht, dass org-export das richtige Werkzeug für mich ist, da ich nicht mit einer neuen Datei enden möchte, die die Ergebnisse enthält, sondern mit einer Datenstruktur, die ich durchlaufen kann. Mein naiver Weg ist so etwas wie "Gib mir alle Überschriften der obersten Ebene, und dann kann ich ihre Eigenschaften und enthaltenen Elemente (z. B. Klartext oder verschachtelte Listen - ob weitere Überschriften oder Strichlisten) abrufen".
no-recursion
vonorg-element-map
sollte tun, was Sie wollen.Antworten:
Ich hatte ein ähnliches Problem, daher hilft dies möglicherweise - ich bin nicht sehr vertraut mit dem Export von Organisationen oder den Interna von Organisationen, aber ich konnte nichts finden, das eine Organisationsdatei in eine Baumstruktur analysieren könnte. Aber gegeben ein Puffer wie
es wird dir geben
und kann auch andere Informationen aus dem Baum enthalten.
Bei einer flachen Liste von Ebenen müssen wir also einen Baum erzeugen, z. B. (1 1 2 3 1) => (1 1 (2 (3)) 1). Ich konnte auch keine Funktion finden, die dies tun würde, also schrieb ich eine, nachdem ich viele Nachteile gezeichnet hatte - ich bin sicher, es gibt einen besseren Weg, dies zu tun, aber es funktioniert. Die Funktion verwendet
unflatten
eine flache Liste und einige Funktionen, um die gewünschten Informationen aus der Liste und den Elementebenen zu extrahieren und eine Baumstruktur zu erstellen.In
org-get-header-list
Sie weitere Informationen hinzufügen können Sie mit Anrufen von jedem Elemente extrahierenorg-element-property
und dann inorg-get-header-tree
Funktionen , die Sie könnten die Informationen aus der Liste zu extrahieren.So wie es aussieht, beinhaltet dies keine Behandlung für Dash-Listen, aber vielleicht könnte es angepasst werden, um diese auch ohne allzu große Probleme zu behandeln ...
quelle