เปลี่ยนรายการหรือโครงสร้างข้อมูลเป็นเอกสารองค์กร


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.

ฉันสามารถทำสิ่งนี้ได้ด้วยตนเองฉันแค่สงสัยว่าอาจมีบางอย่างที่นั่น


โอ้ฉันจะมีประโยชน์มาก +1 ฉันจะทราบว่าองค์กรถึงแม้จะทำด้วยตนเอง org-insert-drawerดู (นั่นคือฉันจะจินตนาการว่ามีตัวแปลงอยู่หรือไม่ฟังก์ชันนี้จะเรียกสิ่งนั้นด้วยnil)
Sean Allred

คำตอบ:


17

นี่คืองานของorg-elementที่น่ากลัว (!) การทำงานของนิโคลัส Goaziou หากคุณไม่ทราบorg-elementและคุณสนใจการพัฒนาองค์กรนี่คือสิ่งที่คุณควรพิจารณา orgมันไม่ได้เป็นเพียงเครื่องมือที่ดีในการทำงานร่วมกับมันก็มากขึ้นการเปิดเครื่อง ส่วนใหญ่สะดุดตาorg-export( ox) org.elแต่ยังฟังก์ชั่นในเช่น

จะได้รับ "เป็นตัวแทนเสียงกระเพื่อม" ขององค์ประกอบภายใต้การใช้จุดหรือorg-element-at-point ที่จะได้รับการเป็นตัวแทนในการใช้บัฟเฟอร์org-element-context ในขณะที่ไม่เกี่ยวข้องโดยตรงที่นี่ให้ตระหนักถึงorg-element-parse-bufferorg-element-map

ที่จะไปจาก "เสียงกระเพื่อมเป็นตัวแทน" ของelement, secondary stringหรือparse treeกลับไปที่"องค์กรไวยากรณ์การแสดง"org-element-interpret-dataการใช้งาน นี่เป็นวิธี (เท่านั้น) เพื่อเปลี่ยน "การแทนเสียงกระเพื่อม" เป็น "การแทนไวยากรณ์ของ 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.")))))

คุณอาจพบว่าห้องสมุดของThorsten Jolitzorg-dpจะช่วยเหลือคุณในความพยายามดังกล่าว ( ใน MELPA )

ห้องสมุดorg-dpมีไว้สำหรับการเขียนโปรแกรมในระดับท้องถิ่นเช่นไม่มีข้อมูลใด ๆ (บริบท) ยกเว้นที่เกี่ยวกับองค์ประกอบที่แยกวิเคราะห์ที่จุด มันถูกออกแบบมาเพื่อให้ใช้กรอบ parser ล่าม / องค์กรในระดับท้องถิ่นเป็นความสะดวกที่ใช้มันในระดับโลก (มีที่สมบูรณ์แยกต้นไม้ผลิตโดย org-element-parse-bufferมี)

คำอธิบายที่สมบูรณ์มากขึ้นโดย Thorsten สามารถพบได้ที่นี่

สำหรับการชี้แจงเพิ่มเติมgmane.emacs.orgmodeเป็นฟอรั่มที่เหมาะสมจริงๆ


นี่เป็นคำตอบที่ดี แต่ฉันไม่สามารถเข้าใจสิ่งที่องค์กร org นำมานอกเหนือจากองค์ประกอบองค์กร
Lyn Headley

org-dpเป็นอินเตอร์เฟสทดแทน AFAIR มันถูกเขียนขึ้นเพื่อสร้างเอกสารในไวยากรณ์ / รูปแบบองค์กรจากมุมมอง "องค์ประกอบ" เป้าหมายขององค์ประกอบของ Org คือการแยกวิเคราะห์และเป็นเทียมสำหรับ Org ฉันเป็นคนดีorg-elementแต่ก็ดีที่มีอินเทอร์เฟซทางเลือก
rasmus

2

ฉันเคยดูเรื่องนี้มาแล้วหลายครั้ง ลองดูที่ที่org-protocol.el มันมาพร้อมกับโหมดองค์กร ฟังก์ชั่น org-protocol-do-capture จะแปลงรายการ "ชิ้นส่วน" (ซึ่งคุณดูเหมือนจะมีอยู่แล้ว) ไปเป็นคุณสมบัติโหมดองค์กรโดยใช้ฟังก์ชั่น org-store-link-props จากนั้นเรียก org-capture สิ่งนี้จะถือว่าคุณมีเทมเพลตการจับภาพพร้อมตัวยึดตำแหน่งเช่นลิงก์%: คุณสามารถกำหนดคุณสมบัติให้เป็นสิ่งที่คุณต้องการ

ฉันได้ทำสิ่งที่คล้ายกับการขูดชื่อผู้แต่งวันที่แหล่งที่มาและอื่น ๆ จากไซต์ API หากคุณมองไปที่รหัสนี้โปรดดูที่ capture-templates.el ด้วย

หากคุณกำลังทำงานกับข้อมูล JSON json.el และ / หรือ request.el อาจมีประโยชน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.