org-element: Untabify strings without semantics during parsing

* contrib/lisp/org-element.el (org-element-parse-objects): Untabify
  strings between objects to avoid any `tab-width' mismatch.
* contrib/lisp/org-element.el (org-element-normalize-contents): No
  longer need to handle tabs.
This commit is contained in:
Nicolas Goaziou 2012-01-11 15:56:09 +01:00
parent 3fc0afb5ee
commit 4725d00f84
1 changed files with 13 additions and 8 deletions

View File

@ -3201,10 +3201,13 @@ allowed in the current object."
(while (setq candidates (org-element-get-next-object-candidates
end restriction candidates))
(setq next-object (funcall get-next-object candidates))
;; 1. Text before any object.
;; 1. Text before any object. Untabify it.
(let ((obj-beg (org-element-get-property :begin next-object)))
(unless (= (point) obj-beg)
(push (buffer-substring-no-properties (point) obj-beg) acc)))
(push (replace-regexp-in-string
"\t" (make-string tab-width ? )
(buffer-substring-no-properties (point) obj-beg))
acc)))
;; 2. Object...
(let ((obj-end (org-element-get-property :end next-object))
(cont-beg (org-element-get-property :contents-begin next-object)))
@ -3233,9 +3236,12 @@ allowed in the current object."
next-object)
acc)
(goto-char obj-end)))
;; 3. Text after last object.
;; 3. Text after last object. Untabify it.
(unless (= (point) end)
(push (buffer-substring-no-properties (point) end) acc))
(push (replace-regexp-in-string
"\t" (make-string tab-width ? )
(buffer-substring-no-properties (point) end))
acc))
;; Result.
(nreverse acc))))
@ -3445,16 +3451,15 @@ Return the normalized element."
(let ((contents (org-element-get-contents element)))
(if (not (or ignore-first (stringp (car contents)))) contents
(catch 'exit
;; 1. Remove tabs from each string in CONTENTS. Get maximal
;; common indentation (MCI) along the way.
;; 1. Get maximal common indentation (MCI) among each string
;; in CONTENTS.
(let* ((ind-list (unless ignore-first
(list (org-get-string-indentation (car contents)))))
(contents
(mapcar
(lambda (object)
(if (not (stringp object)) object
(let ((start 0)
(object (org-remove-tabs object)))
(let ((start 0))
(while (string-match "\n\\( *\\)" object start)
(setq start (match-end 0))
(push (length (match-string 1 object)) ind-list))