Convertir una lista o estructura de datos en un documento de organización

15

Estoy escribiendo un paquete que descarga una lista de líneas, contenidos y algunas otras propiedades, que se mostrarán al usuario. Por el momento, un org-modebúfer parece una buena forma de mostrar estos titulares.

A continuación se muestra un ejemplo de cómo podría estructurarse esta lista. Es meramente ilustrativo, puedo convertirlo fácilmente a cualquier otra estructura según sea necesario.

'(("One headline" "Some much longer content."
   (property1 . value)
   (property2 . value))
  ("Second headline" "More much longer content."
   (property1 . value)
   (property2 . value)))

¿Existe una función o paquete que imprima dicha lista en un org-modebúfer?

Aquí está la salida deseada.

* One headline
  :PROPERTIES:
  :property1: value
  :property2: value
  :END:
Some much longer content.

* Second headline
  :PROPERTIES:
  :property1: value
  :property2: value
  :END:
More much longer content.

Podría hacer esto manualmente, me pregunto si podría haber algo por ahí.

Malabarba
fuente
Oh, esto sería muy útil. +1. Me gustaría señalar que incluso Org lo hace manualmente. Ver org-insert-drawer. (Es decir, me imagino que si existiera un convertidor de este tipo, esta función llamaría a ese con nil).
Sean Allred

Respuestas:

17

Este es el trabajo de org-elementla impresionante (!) Obra de Nicolás Goaziou . Si no sabe org-elementy le importa el desarrollo de la organización, esto es algo que debe considerar. No solo es una gran herramienta para trabajar, también es cada vez más potente org. Lo más notable es el org-export( ox), pero también funciona en, por ejemplo org.el.

Para obtener la "representación lisp" de un elemento bajo punto, use org-element-at-pointo org-element-context. Para obtener la representación del uso del búfer org-element-parse-buffer. Si bien no es directamente relevante aquí, tenga en cuenta org-element-map.

Para ir desde la "representación lisp" de un element, secondary stringo parse treevolver a la "representación de sintaxis Org", use org-element-interpret-data. Esta es la (única) forma de convertir una "representación lisp" en una "representación de sintaxis Org". Sin embargo, es probable que no desee escribir esta representación manualmente. Aquí hay una pequeña representación de tu primer titular

(org-element-interpret-data
 '(headline (:title "One headline" :level 1)
            (property-drawer nil ((node-property (:key "property1" :value "value1"))
                                  (node-property (:key "property2" :value "value2"))))
            (#("Some much longer content."))))

Si debe agregar ambos titulares, agregue un parse tree

(org-element-interpret-data
 '(org-data nil (headline (:title "One headline" :level 1)
                          (property-drawer nil ((node-property (:key "property1" :value "value1"))
                                                (node-property (:key "property2" :value "value2"))))
                          (#("Some much longer content.")))
            (headline (:title "Second headline" :level 1)
                          (property-drawer nil ((node-property (:key "property1" :value "value1"))
                                                (node-property (:key "property2" :value "value2"))))
                          (#("More much longer content.")))))

Puede encontrar que la biblioteca de Thorsten Jolitzorg-dp lo ayudará en tales esfuerzos ( en MELPA ).

La biblioteca org-dpestá destinada a la programación a nivel local, es decir, sin ninguna información (contextual), excepto aquellas sobre el elemento analizado en el punto. Está diseñado para hacer que el uso del marco de análisis / interpretación de Org a nivel local sea tan conveniente como usarlo a nivel global (con un árbol de análisis completo producido por org-element-parse-bufferdisponible)

Una descripción más completa de Thorsten se puede encontrar aquí .

Para más aclaraciones gmane.emacs.orgmodees realmente el foro apropiado.

rasmus
fuente
Esta es una gran respuesta, pero no puedo entender qué org-dp aporta más allá de org-element.
Lyn Headley
org-dpEs una interfaz alternativa. AFAIR, fue escrito para crear documentos en la sintaxis / formato Org desde un punto de vista "elementy". El objetivo de Org Element es ser un analizador y un caballo de batalla para Org. Personalmente estoy de acuerdo org-element, pero es genial tener interfaces alternativas.
rasmus
2

He visto este problema de forma tangencial. Echa un vistazo a org-protocol.el . Se incluye con el modo org. Específicamente, la función org-protocol-do-capture convierte una lista, "partes" (que parece que ya tiene), en propiedades de modo org mediante la función org-store-link-props y luego llama a org-capture. Esto supone que tiene una plantilla de captura con marcadores de posición como%: enlace. Puede definir las propiedades para que sean lo que quiera.

He hecho algo similar al título de raspado, autor, fecha, fuente, etc. de las API del sitio. Si termina mirando este código, asegúrese de mirar también capture-templates.el.

Si está trabajando con datos JSON, json.el y / o request.el pueden ser útiles.

sk8ingdom
fuente