Transformar uma lista ou estrutura de dados em um documento organizacional


15

Estou escrevendo um pacote que carrega uma lista de curandeiros, conteúdos e algumas outras propriedades, que devem ser exibidas ao usuário. No momento, um org-modebuffer parece ser uma boa maneira de exibir essas manchetes.

Abaixo está um exemplo de como essa lista pode ser estruturada. É meramente ilustrativo, posso convertê-lo facilmente para qualquer outra estrutura, conforme necessário.

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

Existe uma função ou pacote que imprime essa lista em um org-modebuffer?

Aqui está a saída desejada.

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

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

Eu poderia fazer isso manualmente, só estou me perguntando se pode haver algo lá fora.


Oh meu Deus, isso seria muito útil. +1. Eu observaria que mesmo o Org faz isso manualmente. Veja org-insert-drawer. (Ou seja, eu imagino se tal conversor existia, esta função chamaria que um com nil.)
Sean Allred

Respostas:


17

Este é o trabalho de org-element, o incrível (!) Trabalho de Nicolas Goaziou . Se você não conhece org-elemente se preocupa com o desenvolvimento organizacional, isso é algo que você deve analisar. Não é apenas uma ótima ferramenta para se trabalhar, mas também é cada vez mais poderosa org. Mais notavelmente o org-export( ox), mas também funciona em por exemplo org.el.

Para obter a "representação lisp" de um elemento em point use org-element-at-pointou org-element-context. Para obter a representação do buffer, use org-element-parse-buffer. Embora não seja diretamente relevante aqui, esteja ciente org-element-map.

Para ir da "representação lisp" de um element, secondary stringou parse treede volta para a "Org sintaxe representação" uso org-element-interpret-data. Essa é a (única) maneira de transformar uma "representação de lisp" em uma "representação de sintaxe da organização". Você provavelmente não desejará escrever essa representação manualmente, no entanto. Aqui está uma representação bem pequena do seu primeiro título

(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."))))

Se você precisar adicionar os dois títulos, adicione um 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.")))))

Você pode achar que a biblioteca de Thorsten Jolitz o org-dpajudará em tais esforços ( no MELPA ).

A biblioteca org-dpé destinada à programação em nível local, ou seja, sem nenhuma informação (contextual), exceto aquelas sobre o elemento analisado no momento. Ele foi projetado para tornar o uso da estrutura de analisador / intérprete de organização no nível local o mais conveniente possível no nível global (com uma árvore de análise completa produzida por org-element-parse-bufferdisponível)

Uma descrição mais completa de Thorsten pode ser encontrada aqui .

Para mais esclarecimentos gmane.emacs.orgmodeé realmente o fórum apropriado.


Essa é uma ótima resposta, mas não consigo entender o que o org-dp traz além do elemento org.
quer

org-dpé uma interface alternativa. AFAIR, foi escrito para criar documentos no formato / sintaxe da Org a partir de um ponto de vista "básico". O objetivo do elemento organizacional é ser um analisador e um cavalo de batalha para a organização. Pessoalmente, estou bem org-element, mas é ótimo ter interfaces alternativas.
21818

2

Eu meio que olhei tangencialmente para esse problema. Dê uma olhada no org-protocol.el . É fornecido com o modo organizacional. Especificamente, a função org-protocol-do-capture converte uma lista, "partes" (que você parece já ter), em propriedades do modo org usando a função org-store-link-props e depois chama a captura org. Isso pressupõe que você tenha um modelo de captura com espaços reservados, como%: link. Você pode definir as propriedades para o que quiser.

Fiz algo semelhante a raspar título, autor, data, fonte etc. das APIs do site. Se você acabar vendo esse código, verifique também o capture-templates.el.

Se você estiver trabalhando com dados JSON, o json.el e / ou request.el pode ser útil.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.