tło
Piszę tryb prezentacji dla Emacsa. Chciałbym, aby dane wejściowe były plikami org, ponieważ pliki org świetnie nadają się do przechowywania danych.
Problem
Muszę przekonwertować plik trybu org na listę „slajdów” struktur danych, które mogę iterować. Aby to zrobić, chciałbym wziąć coś takiego jak następujący plik trybu org:
* 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
i być w stanie chodzić. Próbowałem (org-element-parse-buffer)
, a to daje mi listę elementów, ale trudno jest wymyślić, jak iść dalej w nich. Na przykład wywołanie (org-element-map (org-element-parse-buffer) 'headline #'identity)
daje listę trzech elementów; ostatni reprezentuje „zagnieżdżony nagłówek”. Chcę, aby „zagnieżdżony nagłówek” był dzieckiem „to drugi nagłówek z zawartością”.
Unikanie problemu XY
Z pewnością jestem otwarty na inne sposoby konwertowania pliku w trybie org na strukturę danych Elisp. Nie sądzę, że org-export jest dla mnie właściwym narzędziem, ponieważ nie chcę skończyć z nowym plikiem zawierającym wyniki, ale strukturą danych, którą mogę iterować. Mój naiwny sposób polega na tym, że „podaj mi wszystkie nagłówki najwyższego poziomu, a następnie mogę uzyskać ich właściwości i zawarte elementy (np. Zwykły tekst lub listy zagnieżdżone - niezależnie od tego, czy będą to kolejne nagłówki czy listy myślników)”.
no-recursion
odorg-element-map
powinni robić, co chcesz.Odpowiedzi:
Miałem podobny problem, więc może to pomoże - nie znam się dobrze na eksportowaniu org lub wewnętrznych org, ale nie mogłem znaleźć niczego, co analizowałoby plik org na strukturę drzewa. Ale biorąc pod uwagę bufor
da ci to
i może zawierać także inne informacje z drzewa.
Biorąc pod uwagę płaską listę poziomów, musimy stworzyć drzewo, np. (1 1 2 3 1) => (1 1 (2 (3)) 1). Nie mogłem znaleźć funkcji, która by to zrobiła, więc napisałem ją po wielu rysunkach komórek przeciwnych - jestem pewien, że jest lepszy sposób, ale to działa. Funkcja
unflatten
pobiera płaską listę i kilka funkcji w celu wyodrębnienia żądanych informacji z listy i poziomów pozycji i tworzy strukturę drzewa.W
org-get-header-list
możesz dodać więcej informacji, które chcesz wyodrębnić z każdego elementu z połączeniami doorg-element-property
, a następnieorg-get-header-tree
możesz włączyć funkcje wyodrębnienia informacji z listy.W obecnej formie nie obejmuje to obsługi list kontrolnych, ale być może można je dostosować do obsługi również bez większych problemów ...
źródło