Zamień listę lub strukturę danych w dokument organizacji

15

Piszę pakiet, który pobiera listę healin, zawartości i niektórych innych właściwości, które mają zostać wyświetlone użytkownikowi. Na razie org-modebufor wydaje się dobrym sposobem na wyświetlanie tych nagłówków.

Poniżej znajduje się przykład struktury tej listy. Jest to jedynie przykładowe, w razie potrzeby mogę łatwo przekonwertować go na dowolną inną strukturę.

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

Czy istnieje funkcja lub pakiet, który drukuje taką listę w org-modebuforze?

Oto pożądany wynik.

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

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

Mógłbym to zrobić ręcznie, po prostu zastanawiam się, czy coś może tam być.

Malabarba
źródło
Ojej, byłoby to bardzo przydatne. +1. Chciałbym zauważyć, że nawet Org robi to ręcznie. Zobaczyć org-insert-drawer. (To znaczy, wyobrażam sobie, że gdyby taki konwerter istniał, ta funkcja nazwałaby go tym nil.)
Sean Allred

Odpowiedzi:

17

To jest zadanie org-element, niesamowite (!) Dzieło Nicolasa Goaziou . Jeśli nie wiesz org-elementi zależy ci na rozwoju organizacji, powinieneś przyjrzeć się temu. Jest to nie tylko świetne narzędzie do pracy, ale także coraz silniejsze org. Przede wszystkim org-export( ox), ale działa również np org.el.

Aby uzyskać „reprezentację seplenienia” elementu w punkcie, użyj org-element-at-pointlub org-element-context. Aby uzyskać reprezentację bufora, użyj org-element-parse-buffer. Chociaż nie ma to bezpośredniego znaczenia tutaj, należy pamiętać org-element-map.

Aby przejść z „lisp reprezentacji” w stosunku do element, secondary stringlub parse treez powrotem do „Org składnia reprezentacji” użytku org-element-interpret-data. Jest (tylko) sposób, aby włączyć „lisp reprezentacji” w „Org składni reprezentacji”. Prawdopodobnie nie będziesz jednak chciał pisać tej reprezentacji ręcznie. Oto dość mała reprezentacja pierwszego nagłówka

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

Jeśli musisz dodać oba nagłówki, dodaj 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.")))))

Może się okazać, że Thorsten Jolitz „s org-dpbiblioteka pomoże Ci w takich działań ( na MELPA ).

Biblioteka org-dpjest przeznaczona do programowania na poziomie lokalnym, tj. Bez żadnych (kontekstowych) informacji, z wyjątkiem informacji o analizowanym elemencie w punkcie. Został zaprojektowany tak, aby korzystanie z frameworka parsera / interpretera Org na poziomie lokalnym było tak wygodne, jak korzystanie z niego na poziomie globalnym (z pełnym drzewem parsowania produkowanym przez org-element-parse-bufferdostępne)

Pełniejszy opis Thorstena można znaleźć tutaj .

Dalsze wyjaśnienia gmane.emacs.orgmodeto naprawdę odpowiednie forum.

rasmus
źródło
To świetna odpowiedź, ale nie rozumiem, co org-dp przynosi poza element org.
Lyn Headley,
org-dpjest alternatywnym interfejsem. AFAIR, został napisany do tworzenia dokumentów w składni / formacie Org z punktu widzenia „elementów”. Celem Org Element jest bycie parserem i koniem roboczym dla Org. Jestem osobiście w porządku org-element, ale wspaniale jest mieć alternatywne interfejsy.
rasmus
2

W pewnym sensie spojrzałem na ten problem. Spójrz na protokół-org.el . Jest dołączony do trybu org. W szczególności funkcja org-protocol-do-capture konwertuje listę „części” (które wydaje się, że już masz) na właściwości trybu org za pomocą funkcji org-store-link-props, a następnie wywołuje org-capture. Zakłada się, że masz szablon przechwytywania z symbolami zastępczymi, takimi jak%: link. Możesz zdefiniować właściwości, które chcesz.

Zrobiłem coś podobnego do zeskrobywania tytułu, autora, daty, źródła itp. Z interfejsów API witryny. Jeśli skończysz na tym kodzie, koniecznie spójrz również na capture-templates.el.

Jeśli pracujesz z danymi JSON, json.el i / lub request.el mogą być przydatne.

sk8ingdom
źródło