[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/org 244cc7d560 029/101: org-element-org-data-parser: De
From: |
ELPA Syncer |
Subject: |
[elpa] externals/org 244cc7d560 029/101: org-element-org-data-parser: Defer parsing |
Date: |
Sat, 1 Jul 2023 09:59:02 -0400 (EDT) |
branch: externals/org
commit 244cc7d560e3e200c57bfd9e650625cbfc348ac9
Author: Ihor Radchenko <yantar92@posteo.net>
Commit: Ihor Radchenko <yantar92@posteo.net>
org-element-org-data-parser: Defer parsing
* lisp/org-element.el (org-element--get-category): New function
calculating buffer category, excluding top-level property drawer.
(org-element--get-global-node-properties): Set category as well,
calling `org-element--get-category'.
(org-element-org-data-parser): Defer category and top-level drawer
property parsing.
---
lisp/org-element.el | 103 +++++++++++++++++++++++++++++-----------------------
1 file changed, 57 insertions(+), 46 deletions(-)
diff --git a/lisp/org-element.el b/lisp/org-element.el
index b120f4ef9e..ec7851992d 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -1206,16 +1206,51 @@ CONTENTS is the contents of the element."
;;;; org-data
-(defun org-element--get-global-node-properties ()
- "Return node properties associated with the whole Org buffer.
+(defun org-element--get-category ()
+ "Return category in current buffer."
+ (let ((default-category
+ (cond ((null org-category)
+ (when (org-with-base-buffer nil
+ buffer-file-name)
+ (file-name-sans-extension
+ (file-name-nondirectory
+ (org-with-base-buffer nil
+ buffer-file-name)))))
+ ((symbolp org-category) (symbol-name org-category))
+ (t org-category)))
+ category)
+ ;; Search for #+CATEGORY keywords.
+ (org-with-point-at (point-max)
+ (while (and (not category)
+ (re-search-backward "^[ \t]*#\\+CATEGORY:" (point-min) t))
+ (let ((element (org-element-at-point-no-context)))
+ (when (org-element-type-p element 'keyword)
+ (setq category (org-element-property :value element))))))
+ ;; Return.
+ (or category default-category)))
+
+(defun org-element--get-global-node-properties (data)
+ "Set node properties associated with the whole Org buffer.
Upcase property names. It avoids confusion between properties
obtained through property drawer and default properties from the
-parser (e.g. `:end' and :END:). Return value is a plist."
- (org-with-wide-buffer
- (goto-char (point-min))
- (while (and (org-at-comment-p) (bolp)) (forward-line))
- (org-element--get-node-properties t)))
+parser (e.g. `:end' and :END:).
+Alter DATA by side effect."
+ (with-current-buffer (org-element-property :buffer data)
+ (org-with-wide-buffer
+ (goto-char (point-min))
+ (while (and (org-at-comment-p) (bolp)) (forward-line))
+ (let ((props (org-element--get-node-properties t))
+ (has-category? nil))
+ (while props
+ (org-element-put-property data (car props) (cadr props))
+ (when (eq (car props) :CATEGORY) (setq has-category? t))
+ (setq props (cddr props)))
+ ;; CATEGORY not set in top-level property drawer. Go the long way.
+ (unless has-category?
+ (org-element-put-property data :CATEGORY
(org-element--get-category)))))
+ ;; Return nil.
+ nil))
(defvar org-element-org-data-parser--recurse nil)
(defun org-element-org-data-parser (&optional _)
@@ -1247,47 +1282,23 @@ Return a new syntax node of `org-data' type containing
`:begin',
(goto-char (match-end 0))
(skip-chars-backward " \t")
(min robust-end (point))))
- (+ 2 contents-begin))))
- (category (cond ((null org-category)
- (when (org-with-base-buffer nil
- buffer-file-name)
- (file-name-sans-extension
- (file-name-nondirectory
- (org-with-base-buffer nil
- buffer-file-name)))))
- ((symbolp org-category) (symbol-name org-category))
- (t org-category)))
- (category (catch 'buffer-category
- (unless org-element-org-data-parser--recurse
- (org-with-point-at end
- ;; Avoid recursive calls from
- ;; `org-element-at-point-no-context'.
- (let ((org-element-org-data-parser--recurse t))
- (while (re-search-backward "^[ \t]*#\\+CATEGORY:"
(point-min) t)
- (org-element-with-disabled-cache
- (let ((element
(org-element-at-point-no-context)))
- (when (org-element-type-p element 'keyword)
- (throw 'buffer-category
- (org-element-property :value
element)))))))))
- category))
- (properties (org-element--get-global-node-properties)))
- (unless (plist-get properties :CATEGORY)
- (setq properties (plist-put properties :CATEGORY category)))
+ (+ 2 contents-begin)))))
(org-element-create
'org-data
- (nconc
- (list :begin begin
- :contents-begin contents-begin
- :contents-end pos-before-blank
- :end end
- :robust-begin robust-begin
- :robust-end robust-end
- :post-blank (count-lines pos-before-blank end)
- :post-affiliated begin
- :path (buffer-file-name)
- :mode 'org-data
- :buffer (current-buffer))
- properties)))))
+ (list :begin begin
+ :contents-begin contents-begin
+ :contents-end pos-before-blank
+ :end end
+ :robust-begin robust-begin
+ :robust-end robust-end
+ :post-blank (count-lines pos-before-blank end)
+ :post-affiliated begin
+ :path (buffer-file-name)
+ :mode 'org-data
+ :buffer (current-buffer)
+ :deferred
+ (org-element-deferred-create
+ t #'org-element--get-global-node-properties))))))
(defun org-element-org-data-interpreter (_ contents)
"Interpret ORG-DATA element as Org syntax.
- [elpa] externals/org ea401fb1f4 084/101: org-agenda-ignore-properties: Bump :package-version, (continued)
- [elpa] externals/org ea401fb1f4 084/101: org-agenda-ignore-properties: Bump :package-version, ELPA Syncer, 2023/07/01
- [elpa] externals/org 5ed3e1dfc3 081/101: org-refresh-category-properties: Do not check element cache, ELPA Syncer, 2023/07/01
- [elpa] externals/org 81e85bda2b 088/101: Fix Emacs 27 compatibility, ELPA Syncer, 2023/07/01
- [elpa] externals/org e18263fceb 091/101: org-element--substring: Fix when buffer is narrowed, ELPA Syncer, 2023/07/01
- [elpa] externals/org 759676b308 092/101: org-fold-core--isearch-show: Do not fully rely on `point', ELPA Syncer, 2023/07/01
- [elpa] externals/org f2dd1eea41 093/101: org-find-open-clocks: Fix false positives, ELPA Syncer, 2023/07/01
- [elpa] externals/org 37a58cc6ee 094/101: org-agenda-skip: Do not alter match data, ELPA Syncer, 2023/07/01
- [elpa] externals/org 66c8e94732 100/101: lisp/org-element-ast.el: Fix typo in commentary, ELPA Syncer, 2023/07/01
- [elpa] externals/org 948c896448 101/101: Rename `org-element-property-1' to `org-element-property-raw', ELPA Syncer, 2023/07/01
- [elpa] externals/org 932c49c7bb 019/101: org-element-headline-parser: Use deferred properties, ELPA Syncer, 2023/07/01
- [elpa] externals/org 244cc7d560 029/101: org-element-org-data-parser: Defer parsing,
ELPA Syncer <=
- [elpa] externals/org b00c2d0e1d 039/101: org-element--parse-to: Provide deferred :parent when cache is inactive, ELPA Syncer, 2023/07/01
- [elpa] externals/org 81a7e8c836 037/101: org-element-lineage: Allow TYPES to be a symbol, ELPA Syncer, 2023/07/01
- [elpa] externals/org 4d63e571e0 042/101: org-get-tags: Use org-element API, ELPA Syncer, 2023/07/01
- [elpa] externals/org f225e24869 040/101: org-element--current-element: Make defsubst, ELPA Syncer, 2023/07/01
- [elpa] externals/org dfd36d1969 049/101: org-up-heading-safe: Use element API, ELPA Syncer, 2023/07/01
- [elpa] externals/org fefaadc2d5 050/101: org-element: Optimize working with match data and Emacs regexps, ELPA Syncer, 2023/07/01
- [elpa] externals/org 6266197bbd 051/101: org-at-item-p: Use org-element API, ELPA Syncer, 2023/07/01
- [elpa] externals/org 6938857369 052/101: org-goto-first-child: Switch to org-element API, ELPA Syncer, 2023/07/01
- [elpa] externals/org 7c549f4841 060/101: org-babel-tangle-collect-blocks: Switch to org-element API, ELPA Syncer, 2023/07/01
- [elpa] externals/org b2482d9cc4 070/101: * testing/lisp/test-org-element.el: Add new tests, ELPA Syncer, 2023/07/01