From 0bd090379b5444be60edbb0399340ea96de44c0e Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Wed, 18 Jan 2012 22:12:36 +0100 Subject: [PATCH] org-element: Fix block parsing * contrib/lisp/org-element.el (org-element-parse-elements): Fix erroneous block parsing introduced by recent speed improvements. Also refactor code a bit. --- contrib/lisp/org-element.el | 49 ++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/contrib/lisp/org-element.el b/contrib/lisp/org-element.el index 128cd6a63..1d2299fb7 100644 --- a/contrib/lisp/org-element.el +++ b/contrib/lisp/org-element.el @@ -3105,7 +3105,9 @@ elements. Elements are accumulated into ACC." (save-excursion - (goto-char beg) + (save-restriction + (narrow-to-region beg end) + (goto-char beg) ;; 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))) @@ -3117,13 +3119,10 @@ Elements are accumulated into ACC." (if (eq special 'item) (let ((element (org-element-item-parser structure))) (goto-char (org-element-get-property :end element)) - (save-restriction - (narrow-to-region - (org-element-get-property :contents-begin element) - (org-element-get-property :contents-end element)) - (org-element-parse-elements - (point-min) (point-max) nil structure granularity visible-only - (reverse element)))) + (org-element-parse-elements + (org-element-get-property :contents-begin element) + (org-element-get-property :contents-end element) + nil structure granularity visible-only (reverse element))) ;; 2. When ITEM is nil, find current element's type and parse ;; it accordingly to its category. (let ((element (org-element-current-element special structure))) @@ -3133,12 +3132,10 @@ Elements are accumulated into ACC." ;; if GRANULARITY allows it. ((and (eq (car element) 'paragraph) (or (not granularity) (eq granularity 'object))) - (save-restriction - (narrow-to-region - (org-element-get-property :contents-begin element) - (org-element-get-property :contents-end element)) - (org-element-parse-objects - (point-min) (point-max) (reverse element) nil))) + (org-element-parse-objects + (org-element-get-property :contents-begin element) + (org-element-get-property :contents-end element) + (reverse element) nil)) ;; Case 2. ELEMENT is recursive: parse it between ;; `contents-begin' and `contents-end'. Make sure ;; GRANULARITY allows the recursion, or ELEMENT is an @@ -3151,22 +3148,18 @@ Elements are accumulated into ACC." (eq (car element) 'headline)) (not (and visible-only (org-element-get-property :hiddenp element)))) - (save-restriction - (narrow-to-region - (org-element-get-property :contents-begin element) - (org-element-get-property :contents-end element)) - (org-element-parse-elements - (point-min) (point-max) - ;; At a plain list, switch to item mode. At an - ;; headline, switch to section mode. Any other - ;; element turns off special modes. - (case (car element) (plain-list 'item) (headline 'section)) - (org-element-get-property :structure element) - granularity visible-only (reverse element)))) + (org-element-parse-elements + (org-element-get-property :contents-begin element) + (org-element-get-property :contents-end element) + ;; At a plain list, switch to item mode. At an + ;; headline, switch to section mode. Any other + ;; element turns off special modes. + (case (car element) (plain-list 'item) (headline 'section)) + (org-element-get-property :structure element) + granularity visible-only (reverse element))) ;; Case 3. Else, just accumulate ELEMENT. (t element)))) - acc) - (org-skip-whitespace)) + acc))) ;; Return result. (nreverse acc)))