Фон
Я пишу режим презентации для Emacs. Я хотел бы, чтобы вводом были файлы org, так как файлы org отлично подходят для данных.
проблема
Я должен преобразовать файл режима org в список «слайдов» структур данных, которые я могу перебирать. Для этого я хотел бы взять что-то вроде следующего файла режима 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
и быть в состоянии идти это. Я пытался (org-element-parse-buffer)
, и это дает мне список элементов, но трудно понять, как идти дальше в них. Например, вызов (org-element-map (org-element-parse-buffer) 'headline #'identity)
дает список из трех элементов; последний представляет «вложенный заголовок». Я хочу, чтобы «вложенный заголовок» был потомком «это второй заголовок с содержимым».
Как избежать проблемы XY
Я, конечно, открыт для других способов преобразования файла режима org в структуру данных Elisp. Я не думаю, что org-export является подходящим инструментом для меня, потому что я не хочу получить новый файл, содержащий результаты, но структуру данных, через которую я могу перебирать. Мой наивный способ - что-то вроде «дать мне все заголовки верхнего уровня, и тогда я смогу получить их свойства и содержащиеся в них элементы (например, простой текст или вложенные списки - будь то дополнительные заголовки или списки тире)».
no-recursion
вorg-element-map
должен делать то , что вы хотите.Ответы:
У меня была похожая проблема, поэтому, возможно, это поможет - я не очень хорошо знаком с экспортом org и внутренностями org, но я не смог найти ничего, что могло бы проанализировать файл org в древовидной структуре. Но учитывая буфер как
это даст вам
и может включать в себя другую информацию из дерева, а также.
Таким образом, учитывая плоский список уровней, нам нужно создать дерево, например (1 1 2 3 1) => (1 1 (2 (3)) 1). Я не мог найти функцию, которая бы делала это, поэтому написал одну после большого количества отрисовок cons-ячеек - я уверен, что есть лучший способ сделать это, но это работает. Функция
unflatten
берет плоский список и несколько функций для извлечения необходимой информации из списка и уровней элементов и создает древовидную структуру.В
org-get-header-list
можно добавить дополнительную информацию вы хотите извлечь из каждого пункта с вызовамиorg-element-property
, а затем вorg-get-header-tree
вас можете включать в себя функцию для извлечения информации из списка.В нынешнем виде это не включает обработку списков тире, но, возможно, его можно адаптировать для обработки этих списков без особых проблем ...
источник