我正在尝试编写一个elisp函数来从org文件中提取文本。具体来说,我希望能够将组织表中的值转换为列表列表,以便我可以在启动时从我的.emacs之外的文件填充org-feeds-alist。
我的功能如下:
(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返回的org元素列表,将这些元素的文本作为字符串提取的正确方法是什么?
提前致谢。
答案 0 :(得分:1)
据我所知,您需要一个org-mode表中的列表列表。
以下是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))
如果仍然缺少某些内容,您可以查看原始函数。