Transformez une liste ou une structure de données en un document d'organisation

15

J'écris un paquet qui télécharge une liste de healines, de contenu et d'autres propriétés qui doivent être affichées pour l'utilisateur. Pour l'instant, un org-modetampon semble être un bon moyen d'afficher ces titres.

Voici un exemple de la façon dont cette liste pourrait être structurée. Il est simplement illustratif, je peux facilement le convertir en toute autre structure si nécessaire.

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

Existe-t-il une fonction ou un package qui imprime une telle liste dans un org-modetampon?

Voici la sortie souhaitée.

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

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

Je pourrais le faire manuellement, je me demande simplement s'il pourrait y avoir quelque chose là-bas.

Malabarba
la source
Oh mon Dieu, ce serait très utile. +1. Je noterais que même Org le fait manuellement. Tu vois org-insert-drawer. (Autrement dit, j'imagine que si un tel convertisseur existait, cette fonction l'appellerait avec nil.)
Sean Allred

Réponses:

17

C'est le travail de org-element, l' excellent (!) Travail de Nicolas Goaziou . Si vous ne savez pas org-elementet que vous vous souciez du développement de l'organisation, c'est quelque chose que vous devriez examiner. Ce n'est pas seulement un excellent outil de travail, il est également de plus en plus puissant org. Plus particulièrement le org-export( ox), mais fonctionne également dans eg org.el.

Pour obtenir la "représentation lisp" d'un élément sous point, utilisez org-element-at-pointou org-element-context. Pour obtenir la représentation du tampon, utilisez org-element-parse-buffer. Bien qu'il ne soit pas directement pertinent ici, sachez-le org-element-map.

Pour aller de la « représentation Lisp » d'un element, secondary stringou parse treerevenir à la « représentation Org syntaxe » utilisation org-element-interpret-data. C'est le (seul) moyen de transformer une "représentation lisp" en une "représentation de syntaxe org". Cependant, vous ne voudrez probablement pas écrire cette représentation manuellement. Voici une assez petite représentation de votre premier titre

(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 vous devez ajouter les deux titres, ajoutez 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.")))))

Vous pouvez constater que la bibliothèque de Thorsten Jolitzorg-dp vous aidera dans ces efforts ( sur MELPA ).

La bibliothèque org-dpest destinée à la programmation au niveau local, c'est-à-dire sans aucune information (contextuelle) à l'exception de celles concernant l'élément analysé au point. Il est conçu pour rendre l'utilisation du framework Org parser / interpreter au niveau local aussi pratique que son utilisation au niveau global (avec un arbre d'analyse complet produit par org-element-parse-bufferavailable)

Une description plus complète par Thorsten peut être trouvée ici .

Pour plus de précisions, gmane.emacs.orgmodec'est vraiment le forum approprié.

rasmus
la source
C'est une excellente réponse, mais je ne comprends pas ce que org-dp apporte au-delà de org-element.
Lyn Headley
org-dpest une interface alternative. AFAIR, il a été écrit pour créer des documents dans la syntaxe / format Org d'un point de vue "élémentaire". Le but d'Org Element est d'être un analyseur et un bourreau de travail pour Org. Je suis personnellement très bien avec org-element, mais c'est génial d'avoir des interfaces alternatives.
rasmus
2

J'ai en quelque sorte examiné cette question de manière tangentielle. Jetez un œil à org-protocol.el . Il est fourni avec le mode org. Plus précisément, la fonction org-protocol-do-capture convertit une liste, "pièces" (que vous semblez déjà avoir), en propriétés de mode org en utilisant la fonction org-store-link-props, puis appelle org-capture. Cela suppose que vous disposez d'un modèle de capture avec des espaces réservés tels que%: link. Vous pouvez définir les propriétés comme vous le souhaitez.

J'ai fait quelque chose de similaire à gratter le titre, l'auteur, la date, la source, etc. à partir des API du site. Si vous finissez par regarder ce code, assurez-vous également de regarder capture-templates.el.

Si vous travaillez avec des données JSON, json.el et / ou request.el peuvent être utiles.

sk8ingdom
la source