From be794a2a308483c44968fdd6b09270224d073595 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Wed, 8 May 2013 09:56:26 +0200 Subject: [PATCH] org-element: Fix visible-only parsing * lisp/org-element.el (org-element--parse-elements): Also parse visible headlines within an otherwise compacted headline. * testing/lisp/test-org-element.el: Add test. --- lisp/org-element.el | 13 +++++++++---- testing/lisp/test-org-element.el | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 16a6cf856..04df21b76 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -4199,6 +4199,10 @@ elements. Elements are accumulated into ACC." (save-excursion (goto-char beg) + ;; Visible only: skip invisible parts at the beginning of the + ;; element. + (when (and visible-only (org-invisible-p2)) + (goto-char (min (1+ (org-find-visible)) end))) ;; When parsing only headlines, skip any text before first one. (when (and (eq granularity 'headline) (not (org-at-heading-p))) (org-with-limited-levels (outline-next-heading))) @@ -4211,12 +4215,13 @@ Elements are accumulated into ACC." (type (org-element-type element)) (cbeg (org-element-property :contents-begin element))) (goto-char (org-element-property :end element)) + ;; Visible only: skip invisible parts between siblings. + (when (and visible-only (org-invisible-p2)) + (goto-char (min (1+ (org-find-visible)) end))) ;; Fill ELEMENT contents by side-effect. (cond - ;; If VISIBLE-ONLY is true and element is hidden or if it has - ;; no contents, don't modify it. - ((or (and visible-only (org-element-property :hiddenp element)) - (not cbeg))) + ;; If element has no contents, don't modify it. + ((not cbeg)) ;; Greater element: parse it between `contents-begin' and ;; `contents-end'. Make sure GRANULARITY allows the ;; recursion, or ELEMENT is a headline, in which case going diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index ae2e4b62b..f03f54ac7 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -2612,6 +2612,20 @@ Paragraph \\alpha." (should (stringp (org-element-property :title (org-element-at-point)))))) + +;;; Test Visible Only Parsing + +(ert-deftest test-org-element/parse-buffer-visible () + "Test `org-element-parse-buffer' with visible only argument." + (should + (equal '("H1" "H3" "H5") + (org-test-with-temp-text + "* H1\n** H2\n** H3 :visible:\n** H4\n** H5 :visible:" + (org-occur ":visible:") + (org-element-map (org-element-parse-buffer nil t) 'headline + (lambda (hl) (org-element-property :raw-value hl))))))) + + ;;; Test `:parent' Property