2013-10-05 32 views
2

我試圖編寫一個elisp函數從組織文件中提取文本。具體而言,我希望能夠將組織表中的值轉換爲列表列表,以便我可以在啓動時從我的.emacs之外的文件填充org-feeds-alist。使用org-element-map獲取組織模式元素的文本

我的功能是這樣的:

(defun·org-config-parse-get-table-rows·(file) 
"Return·table·rows·minus·header" 
(with-temp-buffer 
··(insert-file-contents·file) 
··(cddr·(org-element-map·(org-element-parse-buffer)·'(table-row)·'identity)))) 

(defun·org-config-parse-get-table-cells·(file) 
··(org-element-map·(org-config-parse-get-table-rows·file)·'(table-cell)·'identity)) 

我下面的表格與測試它:

|·Name···········|·Fav·Color·|·Age·|·Sex····| 
|----------------+-----------+-----+--------| 
|·Jim············|·Blue······|··19·|·Male···| 
|·Jane···········|·Green·····|··18·|·Female·| 
|·Ort'hlrothl'gr·|·Unkown····|·-29·|·???····| 

我能夠去檢索單個單元格的文本中最接近表與以下內容:

(car·(last·(car·(org-config-parse-get-table-cells·"test.org")))) 

其計算結果爲:

#("Jim" 0 3 
    (:parent 
    ... 

給出由org-element-parse-buffer返回的組織元素列表,將這些元素的文本作爲字符串提取的正確方法是什麼?

在此先感謝。

回答

1

據我所知,你需要一個組織模式表中的列表清單。 這裏是org-table-export相關位:

(defun orgtbl->lists() 
    (unless (org-at-table-p) (user-error "No table at point")) 
    (org-table-align) 
    (let* ((beg (org-table-begin)) 
    (end (org-table-end)) 
    (txt (buffer-substring-no-properties beg end)) 
     (skip nil) 
     (lines (nthcdr 0 (org-split-string txt "[ \t]*\n[ \t]*"))) 
     (lines (org-table-clean-before-export lines)) 
     (i0 (if org-table-clean-did-remove-column 2 1)) 
     (table (mapcar 
       (lambda (x) 
        (if (string-match org-table-hline-regexp x) 
         'hline 
        (org-remove-by-index 
         (org-split-string (org-trim x) "\\s-*|\\s-*") 
         nil i0))) 
       lines))) 
    table)) 

你可以看一下原來的功能,如果事情是人仍下落不明。