Antecedentes
Estoy escribiendo un modo de presentación para Emacs. Me gustaría que la entrada sea archivos de organización, ya que los archivos de organización son excelentes para los datos.
Problema
Tengo que convertir el archivo de modo de organización en una lista de estructuras de datos "deslizantes" a través de las cuales puedo iterar. Para hacer esto, me gustaría tomar algo como el siguiente archivo de modo 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
y poder caminarlo. Lo he intentado (org-element-parse-buffer)
, y eso me da una lista de elementos, pero es difícil descubrir cómo avanzar más en ellos. Por ejemplo, llamar (org-element-map (org-element-parse-buffer) 'headline #'identity)
proporciona una lista de tres elementos; el último representa el "título anidado". Quiero que "título anidado" sea hijo de "este es el segundo título, con contenido".
Evitar el problema XY
Ciertamente estoy abierto a otras formas de convertir un archivo de modo org en una estructura de datos de Elisp. No creo que org-export sea la herramienta adecuada para mí, porque no quiero terminar con un nuevo archivo que contenga los resultados, sino una estructura de datos a través de la cual pueda iterar. Mi manera ingenua es algo así como "darme todos los titulares de nivel superior, y luego puedo obtener sus propiedades y elementos contenidos (por ejemplo, texto plano o listas anidadas, ya sean titulares o listas de guiones)".
no-recursion
deorg-element-map
debería hacer lo que quieras.Respuestas:
Tuve un problema similar, por lo que tal vez esto ayude: no estoy muy familiarizado con la exportación de org o los componentes internos de la organización, pero no pude encontrar nada que analizara un archivo de organización en una estructura de árbol. Pero dado un búfer como
te dará
y puede incluir otra información del árbol también.
Entonces, dada una lista plana de niveles, necesitamos producir un árbol, por ejemplo (1 1 2 3 1) => (1 1 (2 (3)) 1). No pude encontrar una función que hiciera esto, así que escribí una después de dibujar muchas celdas en contra. Estoy seguro de que hay una mejor manera de hacerlo, pero funciona. La función
unflatten
toma una lista plana y un par de funciones para extraer la información que desea de la lista y los niveles de elementos y produce una estructura de árbol.En
org-get-header-list
podría agregar más información que desea extraer de cada elemento con llamadasorg-element-property
, y luegoorg-get-header-tree
podría incluir funciones para extraer la información de la lista.Tal como está, esto no incluye el manejo de listas de guiones, pero tal vez podría adaptarse para manejarlas también sin demasiados problemas ...
fuente