org-list: Fix infloop when inserting an item
authorNicolas Goaziou <n.goaziou@gmail.com>
Tue, 13 Nov 2012 14:45:09 +0000 (15:45 +0100)
committerNicolas Goaziou <n.goaziou@gmail.com>
Tue, 13 Nov 2012 14:45:09 +0000 (15:45 +0100)
* lisp/org-list.el (org-list-separating-blank-lines-number): When
  computing number of blank lines separating items, also count those
  in unparsed blocks, like example blocks.
* testing/lisp/test-org-list.el: Add tests.

In the following situation, with `org-blank-before-new-entry' set to
`auto' for `plain-list-item, a blank line should be inserted when
inserting the following item:

- item1
  #+BEGIN_EXAMPLE

  contents

  #+END_EXAMPLE

lisp/org-list.el
testing/lisp/test-org-list.el

index 10f5e6e..993272a 100644 (file)
@@ -1230,7 +1230,9 @@ some heuristics to guess the result."
             ;; Are there blank lines inside the list so far?
             ((save-excursion
                (goto-char (org-list-get-top-point struct))
-               (org-list-search-forward
+               ;; Do not use `org-list-search-forward' so blank lines
+               ;; in blocks can be counted in.
+               (re-search-forward
                 "^[ \t]*$" (org-list-get-item-end-before-blank item struct) t))
              1)
             ;; Default choice: no blank line.
index d57ebc9..5e9cab0 100644 (file)
     (search-forward "Text1")
     (should (org-invisible-p2))))
 
+(ert-deftest test-org-list/insert-item ()
+  "Test item insertion."
+  ;; Blank lines specifications.
+  ;;
+  ;; Non-nil `org-blank-before-new-entry': insert a blank line, unless
+  ;; `org-empty-line-terminates-plain-lists' is non-nil.
+  (should
+   (org-test-with-temp-text "- a"
+     (let ((org-empty-line-terminates-plain-lists nil)
+          (org-blank-before-new-entry '((plain-list-item . t))))
+       (end-of-line)
+       (org-insert-item)
+       (forward-line -1)
+       (looking-at "$"))))
+  (should-not
+   (org-test-with-temp-text "- a"
+     (let ((org-empty-line-terminates-plain-lists t)
+          (org-blank-before-new-entry '((plain-list-item . t))))
+       (end-of-line)
+       (org-insert-item)
+       (forward-line -1)
+       (looking-at "$"))))
+  ;; Nil `org-blank-before-new-entry': do not insert a blank line.
+  (should-not
+   (org-test-with-temp-text "- a"
+     (let ((org-empty-line-terminates-plain-lists nil)
+          (org-blank-before-new-entry '((plain-list-item . nil))))
+       (end-of-line)
+       (org-insert-item)
+       (forward-line -1)
+       (looking-at "$"))))
+  ;; `org-blank-before-new-entry' set to auto: if there's no blank
+  ;; line already in the sole item, do not insert one.
+  (should-not
+   (org-test-with-temp-text "- a"
+     (let ((org-empty-line-terminates-plain-lists nil)
+          (org-blank-before-new-entry '((plain-list-item . auto))))
+       (end-of-line)
+       (org-insert-item)
+       (forward-line -1)
+       (looking-at "$"))))
+  ;; `org-blank-before-new-entry' set to `auto': if there's a blank
+  ;; line in the sole item, insert another one.
+  (should
+   (org-test-with-temp-text "- a\n\n  b"
+     (let ((org-empty-line-terminates-plain-lists nil)
+          (org-blank-before-new-entry '((plain-list-item . auto))))
+       (goto-char (point-max))
+       (org-insert-item)
+       (forward-line -1)
+       (looking-at "$"))))
+  ;; `org-blank-before-new-entry' set to `auto': if the user specified
+  ;; a blank line, preserve it.
+  (should
+   (org-test-with-temp-text "- a\n\n"
+     (let ((org-empty-line-terminates-plain-lists nil)
+          (org-blank-before-new-entry '((plain-list-item . auto))))
+       (goto-char (point-max))
+       (org-insert-item)
+       (forward-line -1)
+       (looking-at "$"))))
+  ;; `org-blank-before-new-entry' set to `auto': if some items in list
+  ;; are already separated by blank lines, insert one.
+  (should
+   (org-test-with-temp-text "- a\n\n- b"
+     (let ((org-empty-line-terminates-plain-lists nil)
+          (org-blank-before-new-entry '((plain-list-item . auto))))
+       (goto-char (point-max))
+       (org-insert-item)
+       (forward-line -1)
+       (looking-at "$"))))
+  (should
+   (org-test-with-temp-text "- a\n\n- b"
+     (let ((org-empty-line-terminates-plain-lists nil)
+          (org-blank-before-new-entry '((plain-list-item . auto))))
+       (org-insert-item)
+       (forward-line)
+       (looking-at "$"))))
+  (should
+   (org-test-with-temp-text "- a\n  #+BEGIN_EXAMPLE\n\n  x\n  #+END_EXAMPLE"
+     (let ((org-empty-line-terminates-plain-lists nil)
+          (org-blank-before-new-entry '((plain-list-item . auto))))
+       (goto-char (point-max))
+       (org-insert-item)
+       (forward-line -1)
+       (looking-at "$")))))
+
 
 (provide 'test-org-list)
 ;;; test-org-list.el ends here