递归解析组织模式层次结构

时间:2013-08-29 22:59:41

标签: parsing emacs recursion elisp org-mode

我正试图以这种方式解析组织模式:

* 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中构建数据。

2 个答案:

答案 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 "^\\*")))