Browse Source

org-element: Preserve visibility when moving elements

* contrib/lisp/org-element.el (org-element-swap-A-B): Preserve
  visibility when moving elements.
* testing/lisp/test-org-element.el: Add tests.
Nicolas Goaziou 13 years ago
parent
commit
5750f0869c
2 changed files with 59 additions and 2 deletions
  1. 23 0
      contrib/lisp/org-element.el
  2. 36 2
      testing/lisp/test-org-element.el

+ 23 - 0
contrib/lisp/org-element.el

@@ -3938,6 +3938,16 @@ end of ELEM-A."
 		    (goto-char (org-element-property :end elem-B))
 		    (skip-chars-backward " \r\t\n")
 		    (point-at-eol)))
+	   ;; Store overlays responsible for visibility status.  We
+	   ;; also need to store their boundaries as they will be
+	   ;; removed from buffer.
+	   (overlays
+	    (cons
+	     (mapcar (lambda (ov) (list ov (overlay-start ov) (overlay-end ov)))
+		     (overlays-in beg-A end-A))
+	     (mapcar (lambda (ov) (list ov (overlay-start ov) (overlay-end ov)))
+		     (overlays-in beg-B end-B))))
+	   ;; Get contents.
 	   (body-A (buffer-substring beg-A end-A))
 	   (body-B (delete-and-extract-region beg-B end-B)))
       (goto-char beg-B)
@@ -3945,9 +3955,22 @@ end of ELEM-A."
 	(setq body-B (replace-regexp-in-string "\\`[ \t]*" "" body-B))
 	(org-indent-to-column ind-B))
       (insert body-A)
+      ;; Restore ex ELEM-A overlays.
+      (mapc (lambda (ov)
+	      (move-overlay
+	       (car ov)
+	       (+ (nth 1 ov) (- beg-B beg-A))
+	       (+ (nth 2 ov) (- beg-B beg-A))))
+	    (car overlays))
       (goto-char beg-A)
       (delete-region beg-A end-A)
       (insert body-B)
+      ;; Restore ex ELEM-B overlays.
+      (mapc (lambda (ov)
+	      (move-overlay (car ov)
+			    (+ (nth 1 ov) (- beg-A beg-B))
+			    (+ (nth 2 ov) (- beg-A beg-B))))
+	    (cdr overlays))
       (goto-char (org-element-property :end elem-B)))))
 
 (defun org-element-forward ()

+ 36 - 2
testing/lisp/test-org-element.el

@@ -2292,7 +2292,24 @@ Outside."
     (search-forward "graph")
     (org-element-drag-backward)
     (should (equal (buffer-string) "Paragraph 2\n\n\nPara1\n\nPara3"))
-    (should (looking-at " 2"))))
+    (should (looking-at " 2")))
+  ;; 5. Preserve visibility of elements and their contents.
+  (org-test-with-temp-text "
+#+BEGIN_CENTER
+Text.
+#+END_CENTER
+- item 1
+  #+BEGIN_QUOTE
+  Text.
+  #+END_QUOTE"
+    (while (search-forward "BEGIN_" nil t) (org-cycle))
+    (search-backward "- item 1")
+    (org-element-drag-backward)
+    (should
+     (equal
+      '((63 . 82) (26 . 48))
+      (mapcar (lambda (ov) (cons (overlay-start ov) (overlay-end ov)))
+	      (overlays-in (point-min) (point-max)))))))
 
 (ert-deftest test-org-element/drag-forward ()
   "Test `org-element-drag-forward' specifications."
@@ -2314,7 +2331,24 @@ Outside."
     (search-forward "graph")
     (org-element-drag-forward)
     (should (equal (buffer-string) "Para2\n\n\nParagraph 1\n\nPara3"))
-    (should (looking-at " 1"))))
+    (should (looking-at " 1")))
+  ;; 5. Preserve visibility of elements and their contents.
+  (org-test-with-temp-text "
+#+BEGIN_CENTER
+Text.
+#+END_CENTER
+- item 1
+  #+BEGIN_QUOTE
+  Text.
+  #+END_QUOTE"
+    (while (search-forward "BEGIN_" nil t) (org-cycle))
+    (search-backward "#+BEGIN_CENTER")
+    (org-element-drag-forward)
+    (should
+     (equal
+      '((63 . 82) (26 . 48))
+      (mapcar (lambda (ov) (cons (overlay-start ov) (overlay-end ov)))
+	      (overlays-in (point-min) (point-max)))))))
 
 (ert-deftest test-org-element/fill-paragraph ()
   "Test `org-element-fill-paragraph' specifications."