浏览代码

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.
Nicolas Goaziou 13 年之前
父节点
当前提交
4725d00f84
共有 1 个文件被更改,包括 13 次插入8 次删除
  1. 13 8
      contrib/lisp/org-element.el

+ 13 - 8
contrib/lisp/org-element.el

@@ -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))