fundo
Estou escrevendo um modo de apresentação para o Emacs. Eu gostaria que a entrada fosse arquivos organizacionais, pois eles são ótimos para dados.
Problema
Eu tenho que converter o arquivo de modo organizacional em uma lista de estruturas de dados "slide" pelas quais posso iterar. Para fazer isso, gostaria de usar algo como o seguinte arquivo de modo organizacional:
* 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
e ser capaz de caminhar. Eu tentei (org-element-parse-buffer)
, e isso me dá uma lista de elementos, mas é difícil descobrir como caminhar mais neles. Por exemplo, chamar (org-element-map (org-element-parse-buffer) 'headline #'identity)
fornece uma lista de três elementos; o último representa o "título aninhado". Quero que "título aninhado" seja filho de "este é o segundo título, com conteúdo".
Evitando o problema XY
Certamente, estou aberto a outras maneiras de converter um arquivo de modo organizacional em uma estrutura de dados Elisp. Não acho que a exportação orgânica seja a ferramenta certa para mim, porque não quero terminar com um novo arquivo que contenha os resultados, mas com uma estrutura de dados que eu possa percorrer. Meu jeito ingênuo é algo como "me dê todas as manchetes de nível superior, e então eu posso obter suas propriedades e elementos contidos (por exemplo, texto simples ou listas aninhadas - sejam manchetes adicionais ou listas de traços)".
no-recursion
deorg-element-map
faça o que você deseja.Respostas:
Eu tive um problema semelhante, então talvez isso ajude - não estou muito familiarizado com a exportação organizacional ou com a organização interna, mas não consegui encontrar nada que analise um arquivo organizacional em uma estrutura de árvore. Mas dado um buffer como
vai te dar
e pode incluir outras informações da árvore também.
Portanto, dada uma lista plana de níveis, precisamos produzir uma árvore, por exemplo (1 1 2 3 1) => (1 1 (2 (3)) 1). Eu não consegui encontrar uma função que faria isso, então escrevi uma após muito desenho das células contras - tenho certeza de que há uma maneira melhor de fazer isso, mas funciona. A função
unflatten
utiliza uma lista simples e algumas funções para extrair as informações desejadas da lista e dos níveis do item e produz uma estrutura em árvore.Em
org-get-header-list
você pode adicionar mais informações você deseja extrair de cada artigo com chamadas paraorg-element-property
, em seguida, emorg-get-header-tree
que você pode incluir funções para extrair as informações da lista.Tal como está, isso não inclui a manipulação de listas de traços, mas talvez possa ser adaptado para lidar com aquelas também sem muitos problemas ...
fonte