Перетворіть список або структуру даних у документ org


15

Я пишу пакунок, який завантажує список списків, вмісту та деяких інших властивостей, які мають відображатися користувачеві. На даний момент 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.

Я міг би це зробити вручну, мені просто цікаво, чи може там щось бути.


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

Відповіді:


17

Це робота org-element, дивовижна (!) Робота Ніколя Гоазіу . Якщо ви не знаєте, 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-елемента.
Лін Хедлі

org-dpє альтернативним інтерфейсом. AFAIR, було написано для створення документів у синтаксисі / форматі Org з точки зору "елемента". Мета елемента Org - бути аналізатором та робочим конем для Org. Я особисто добре з цим org-element, але чудово мати альтернативні інтерфейси.
rasmus

2

Я якось дотично розглядав це питання. Погляньте на org-Protocol.el . Він в комплекті з org-режимом. Зокрема, функція org-протокол-захоплення перетворює список "частин" (які, здається, у вас вже є), у властивості режиму org, використовуючи функцію org-store-link-props, а потім викликає org-capture. Це передбачає, що у вас є шаблон захоплення із заповнювачами, такими як%: link. Ви можете визначити властивості будь-якими, що вам подобаються.

Я зробив щось подібне до того, щоб викреслити назву, автора, дату, джерело тощо з API сайтів. Якщо ви в кінцевому підсумку перегляньте цей код, обов’язково подивіться на capture-templates.el.

Якщо ви працюєте з даними JSON, json.el та / або request.el може бути корисним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.