Biến danh sách hoặc cấu trúc dữ liệu thành tài liệu org


15

Tôi đang viết một gói tải xuống danh sách các healines, nội dung và một số thuộc tính khác sẽ được hiển thị cho người dùng. Hiện tại, một org-modebộ đệm có vẻ như là một cách tốt để hiển thị các tiêu đề này.

Dưới đây là một ví dụ về cách danh sách này có thể được cấu trúc. Nó chỉ mang tính minh họa, tôi có thể dễ dàng chuyển đổi nó sang bất kỳ cấu trúc nào khác khi cần thiết.

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

Có một chức năng hoặc gói mà in một danh sách như vậy vào một org-modebộ đệm?

Đây là đầu ra mong muốn.

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

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

Tôi có thể làm điều này bằng tay, tôi chỉ tự hỏi liệu có thể có một cái gì đó ngoài đó.


Oh, điều này sẽ rất hữu ích. +1. Tôi sẽ lưu ý rằng ngay cả Org cũng làm như vậy bằng tay. Xem org-insert-drawer. (Tức là, tôi sẽ tưởng tượng nếu một chuyển đổi như vậy tồn tại, chức năng này sẽ gọi đó là một với nil.)
Sean Allred

Câu trả lời:


17

Đây là công việc của org-element, công việc tuyệt vời (!) Của Nicolas Goaziou . Nếu bạn không biết org-elementvà bạn quan tâm đến sự phát triển tối đa thì đây là điều bạn nên xem xét. Nó không chỉ là một công cụ tuyệt vời để làm việc, nó cũng đang ngày càng tăng sức mạnh org. Đáng chú ý nhất là org-export( ox), nhưng cũng có chức năng trong ví dụ org.el.

Để có được "đại diện không thể thiếu" của một yếu tố theo điểm sử dụng org-element-at-pointhoặc org-element-context. Để có được đại diện của bộ đệm sử dụng org-element-parse-buffer. Trong khi không liên quan trực tiếp ở đây, hãy lưu ý org-element-map.

Để đi từ "đại diện lisp" của một element, secondary stringhoặc parse treetrở lại "Org cú pháp đại diện" sử dụng org-element-interpret-data. Đây là cách (duy nhất) để biến "biểu diễn lisp" thành "biểu diễn cú pháp Org". Bạn có thể sẽ không muốn viết đại diện này bằng tay, mặc dù. Đây là một đại diện khá nhỏ của tiêu đề đầu tiên của bạn

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

Nếu bạn phải thêm cả hai tiêu đề, hãy thêm 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.")))))

Bạn có thể thấy rằng thư viện của Thorsten Jolitzorg-dp sẽ hỗ trợ bạn trong những nỗ lực như vậy ( trên MELPA ).

Thư viện org-dpcó nghĩa là để lập trình ở cấp độ cục bộ, tức là không có bất kỳ thông tin (theo ngữ cảnh) nào ngoại trừ những thông tin về phần tử được phân tích cú pháp tại điểm. Nó được thiết kế để làm cho việc sử dụng khung trình phân tích cú pháp / trình thông dịch Org ở cấp độ địa phương thuận tiện như sử dụng nó ở cấp độ toàn cầu (với một cây phân tích cú pháp hoàn chỉnh được tạo ra org-element-parse-buffer)

Một mô tả đầy đủ hơn của Thorsten có thể được tìm thấy ở đây .

Để làm rõ hơn gmane.emacs.orgmodethực sự là diễn đàn thích hợp.


Đây là một câu trả lời tuyệt vời, nhưng tôi không thể hiểu những gì org-dp mang lại ngoài yếu tố org.
Lyn Headley

org-dplà một giao diện thay thế. AFAIR, nó được viết để tạo tài liệu theo cú pháp / định dạng Org theo quan điểm "nguyên tố". Mục tiêu của Org Element là trở thành một trình phân tích cú pháp và một công việc cho Org. Cá nhân tôi rất ổn org-element, nhưng thật tuyệt khi có giao diện thay thế.
rasmus

2

Tôi đã sắp xếp một cách hữu hình vấn đề này. Hãy xem org-Protocol.el . Nó đi kèm với chế độ org. Cụ thể, chức năng org-Protocol-do-Capture chuyển đổi một danh sách, "các bộ phận" (mà bạn dường như đã có), thành các thuộc tính chế độ org bằng cách sử dụng chức năng org-store-link-props và sau đó gọi org-Capture. Điều này giả định rằng bạn có một mẫu chụp với các phần giữ chỗ, chẳng hạn như%: link. Bạn có thể định nghĩa các thuộc tính là bất cứ điều gì bạn thích.

Tôi đã làm một cái gì đó tương tự như tiêu đề, tác giả, ngày tháng, nguồn, v.v. từ API trang web. Nếu bạn cuối cùng nhìn vào mã này, hãy chắc chắn cũng nhìn vào capt-samples.el.

Nếu bạn đang làm việc với dữ liệu JSON, json.el và / hoặc request.el có thể hữu ích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.