3

我正在尝试以这种方式解析组织模式文本:

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

4

2 回答 2

5

该功能org-element-parse-buffer应该有所帮助。它将整个 org-mode 缓冲区解析为一个 lisp 列表。您将获得比您需要的更多的属性。

http://orgmode.org/worg/exporters/org-element-docstrings.html#sec-10

于 2013-08-30T01:47:57.980 回答
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 "^\\*")))
于 2013-08-30T16:19:19.133 回答