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.
This commit is contained in:
Nicolas Goaziou 2012-05-11 16:07:11 +02:00
parent d71464c0d3
commit 5750f0869c
2 changed files with 59 additions and 2 deletions

View File

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

View File

@ -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."