我正试图以这种方式解析组织模式:
* head
** sub-head
- word :: description
** sub-head
- word :: description
- some notes
* head2
** sub-head2
- some more notes
我试图以这样的方式捕获数据(例如“word :: description”和“some notes”),使得每个数据保留其父标题以及父母的父母是什么,等等。设想在elisp中以这种形式出现的数据:
(
("head"
("sub-head" ("word :: definition"))
("sub-head" ("word :: description" "some notes"))
)
("head2"
("sub-head2" ("some more notes"))
)
)
我猜测使用递归有一个优雅的解决方案。如果有更好的方法,我可以采用不同的方式在elisp中构建数据。
答案 0 :(得分:5)
函数org-element-parse-buffer
应该有所帮助。它将整个org-mode缓冲区解析为lisp列表。您将获得比您需要的更多属性。
http://orgmode.org/worg/exporters/org-element-docstrings.html#sec-10
答案 1 :(得分:1)
这是一个递归解决方案:
(defun org-splitter (str lvl)
(let* ((lst (split-string
str
(concat lvl " ")))
(out (unless (= (length (car lst))
(length str))
(mapcar
(lambda (s)
(and
(string-match "\\([^\n]+\\)\n\\(.*\\)" s)
(list (match-string 1 s)
(org-splitter
(substring-no-properties
s (match-beginning 2))
(concat lvl "\\*")))))
(cdr lst)))))
(if (string= (car lst) "")
out
(cons (car lst) out))))
(defun org-recurse-all ()
(let ((str (buffer-substring-no-properties
(point-min) (point-max))))
(org-splitter str "^\\*")))