Превратите список или структуру данных в документ организации

15

Я пишу пакет, который загружает список healines, содержимого и некоторых других свойств, которые должны быть отображены пользователю. На данный момент org-modeбуфер кажется хорошим способом отображения этих заголовков.

Ниже приведен пример того, как этот список может быть структурирован. Это просто иллюстративно, я могу легко преобразовать его в любую другую структуру по мере необходимости.

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

Есть ли функция или пакет, который печатает такой список в org-modeбуфер?

Вот желаемый результат.

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

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

Я мог бы сделать это вручную, мне просто интересно, может ли быть что-то там.

Malabarba
источник
О боже, это было бы очень полезно. +1. Я бы отметил, что даже Org делает это вручную. См org-insert-drawer. (То есть, я думаю, что если бы существовал такой преобразователь, эта функция вызывала бы его с nil.)
Шон Оллред

Ответы:

17

Это работа org-element, то огромная (!) Работа Николя Goaziou . Если вы не знаете, org-elementи вам небезразлично развитие организации, вам следует обратить на это внимание. Это не только отличный инструмент для работы, но и все более мощный org. Наиболее заметно org-export( ox), но также функционирует, например, в org.el.

Чтобы получить «представление lisp» элемента под точкой, используйте org-element-at-pointили org-element-context. Чтобы получить представление о буфере используйте org-element-parse-buffer. Хотя это не имеет непосредственного отношения здесь, имейте в виду org-element-map.

Для того, чтобы перейти от «LISP представления» о element, secondary stringили parse treeспиной к «Org синтаксис представления» использования org-element-interpret-data. Это (единственный) способ превратить «LISP представления» в «Org синтаксиса представления». Возможно, вы не захотите писать это представление вручную. Вот довольно небольшое представление вашего первого заголовка

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

Если вы должны добавить оба заголовка, добавьте 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.")))))

Вы можете обнаружить , что Торстен Джолитц «s org-dpбиблиотека поможет вам в таких усилиях ( по MELPA ).

Библиотека org-dpпредназначена для программирования на местном уровне, т.е. без какой-либо (контекстной) информации, кроме информации о проанализированном элементе в точке. Он предназначен для того, чтобы сделать использование синтаксического анализатора / интерпретатора Org на локальном уровне таким же удобным, как и его использование на глобальном уровне (с помощью полного дерева синтаксического анализа, созданного org-element-parse-bufferдоступными).

Более полное описание Торстена можно найти здесь .

Для дальнейших разъяснений gmane.emacs.orgmodeдействительно подходящий форум.

Расмус
источник
Это отличный ответ, но я не могу понять, что org-dp выводит за пределы org-element.
Лин Хедли
org-dpэто альтернативный интерфейс. AFAIR, он был написан для создания документов в синтаксисе / формате Org с "элементарной" точки зрения. Цель Org Element - быть парсером и рабочей лошадкой для Org. Лично у меня все хорошо org-element, но здорово иметь альтернативные интерфейсы.
Расмус
2

Я как бы тангенциально посмотрел на эту проблему. Взгляните на org-protocol.el . В комплекте с орг-режимом. В частности, функция org-protocol-do-capture конвертирует список, «части» (которые, как вам кажется, уже есть), в свойства режима org, используя функцию org-store-link-props, а затем вызывает org-capture. Это предполагает, что у вас есть шаблон захвата с заполнителями, такими как%: ссылка. Вы можете определить свойства, которые вам нравятся.

Я сделал что-то похожее на очистку заголовка, автора, даты, источника и т. Д. Из API сайта. Если вы в конечном итоге посмотрите на этот код, обязательно посмотрите на capture-templates.el.

Если вы работаете с данными JSON, могут быть полезны json.el и / или request.el.

sk8ingdom
источник