emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org 5ba90e161b: org-bibtex-import-from-file: Improve pe


From: ELPA Syncer
Subject: [elpa] externals/org 5ba90e161b: org-bibtex-import-from-file: Improve performance
Date: Sat, 27 Aug 2022 00:57:50 -0400 (EDT)

branch: externals/org
commit 5ba90e161bdeeaac2ff39d08a433ea848f0179bb
Author: Ihor Radchenko <yantar92@gmail.com>
Commit: Ihor Radchenko <yantar92@gmail.com>

    org-bibtex-import-from-file: Improve performance
    
    * lisp/ol-bibtex.el (org-bibtex-put): Add new optional argument to
    insert node property at point directly, without leveraging
    `org-set-property'.  Add docstring.
    (org-bibtex-write): Insert headline properties directly.  Add new
    optional argument to suppress indentation.  Do not use `length' to
    check if `org-bibtex-entries' list empty---`length' is too slow on
    large lists.
    (org-bibtex-import-from-file): Postpone indentation after all the
    entries are imported.
    * lisp/org.el (org-indent-region): Use cache.
---
 lisp/ol-bibtex.el | 59 +++++++++++++++++++++++++++++++++++--------------------
 lisp/org.el       |  2 +-
 2 files changed, 39 insertions(+), 22 deletions(-)

diff --git a/lisp/ol-bibtex.el b/lisp/ol-bibtex.el
index 5b683469ce..0f0b675af0 100644
--- a/lisp/ol-bibtex.el
+++ b/lisp/ol-bibtex.el
@@ -344,14 +344,20 @@ and `org-tags-exclude-from-inheritance'."
                                               (upcase property)))))))
     (when it (org-trim it))))
 
-(defun org-bibtex-put (property value)
-  (let ((prop (upcase (if (keywordp property)
-                          (substring (symbol-name property) 1)
-                        property))))
-    (org-set-property
-     (concat (unless (string= org-bibtex-key-property prop) org-bibtex-prefix)
-            prop)
-     value)))
+(defun org-bibtex-put (property value &optional insert-raw)
+  "Set PROPERTY of headline at point to VALUE.
+The PROPERTY will be prefixed with `org-bibtex-prefix' when necessary.
+With non-nil optional argument INSERT-RAW, insert node property string
+at point."
+  (let* ((prop (upcase (if (keywordp property)
+                           (substring (symbol-name property) 1)
+                         property)))
+         (prop (concat (unless (string= org-bibtex-key-property prop)
+                         org-bibtex-prefix)
+                      prop)))
+    (if insert-raw
+        (insert (format ":%s: %s\n" prop value))
+      (org-set-property prop value))))
 
 (defun org-bibtex-headline ()
   "Return a bibtex entry of the given headline as a string."
@@ -703,10 +709,12 @@ Return the number of saved entries."
   (interactive "fFile: ")
   (org-bibtex-read-buffer (find-file-noselect file 'nowarn 'rawfile)))
 
-(defun org-bibtex-write ()
-  "Insert a heading built from the first element of `org-bibtex-entries'."
+(defun org-bibtex-write (&optional noindent)
+  "Insert a heading built from the first element of `org-bibtex-entries'.
+When optional argument NOINDENT is non-nil, do not indent the properties
+drawer."
   (interactive)
-  (when (= (length org-bibtex-entries) 0)
+  (unless org-bibtex-entries
     (error "No entries in `org-bibtex-entries'"))
   (let* ((entry (pop org-bibtex-entries))
         (org-special-properties nil) ; avoids errors with `org-entry-put'
@@ -714,14 +722,16 @@ Return the number of saved entries."
         (togtag (lambda (tag) (org-toggle-tag tag 'on))))
     (org-insert-heading)
     (insert (funcall org-bibtex-headline-format-function entry))
-    (org-bibtex-put "TITLE" (funcall val :title))
+    (insert "\n:PROPERTIES:\n")
+    (org-bibtex-put "TITLE" (funcall val :title) 'insert)
     (org-bibtex-put org-bibtex-type-property-name
-                   (downcase (funcall val :type)))
+                   (downcase (funcall val :type))
+                    'insert)
     (dolist (pair entry)
       (pcase (car pair)
        (:title    nil)
        (:type     nil)
-       (:key      (org-bibtex-put org-bibtex-key-property (cdr pair)))
+       (:key      (org-bibtex-put org-bibtex-key-property (cdr pair) 'insert))
        (:keywords (if org-bibtex-tags-are-keywords
                       (dolist (kw (split-string (cdr pair) ", *"))
                         (funcall
@@ -729,9 +739,14 @@ Return the number of saved entries."
                          (replace-regexp-in-string
                           "[^[:alnum:]_@#%]" ""
                           (replace-regexp-in-string "[ \t]+" "_" kw))))
-                    (org-bibtex-put (car pair) (cdr pair))))
-       (_ (org-bibtex-put (car pair) (cdr pair)))))
-    (mapc togtag org-bibtex-tags)))
+                    (org-bibtex-put (car pair) (cdr pair) 'insert)))
+       (_ (org-bibtex-put (car pair) (cdr pair) 'insert))))
+    (insert ":END:\n")
+    (mapc togtag org-bibtex-tags)
+    (unless noindent
+      (org-indent-region
+       (save-excursion (org-back-to-heading t) (point))
+       (point)))))
 
 (defun org-bibtex-yank ()
   "If kill ring holds a bibtex entry yank it as an Org headline."
@@ -745,10 +760,12 @@ Return the number of saved entries."
 (defun org-bibtex-import-from-file (file)
   "Read bibtex entries from FILE and insert as Org headlines after point."
   (interactive "fFile: ")
-  (dotimes (_ (org-bibtex-read-file file))
-    (save-excursion (org-bibtex-write))
-    (re-search-forward org-property-end-re)
-    (open-line 1) (forward-char 1)))
+  (let ((pos (point)))
+    (dotimes (i (org-bibtex-read-file file))
+      (save-excursion (org-bibtex-write 'noindent))
+      (re-search-forward org-property-end-re)
+      (insert "\n"))
+    (org-indent-region pos (point))))
 
 (defun org-bibtex-export-to-kill-ring ()
   "Export current headline to kill ring as bibtex entry."
diff --git a/lisp/org.el b/lisp/org.el
index e9de348472..858123e67a 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -18734,7 +18734,7 @@ assumed to be significant there."
          (end (copy-marker end)))
       (while (< (point) end)
        (if (or (looking-at-p " \r\t\n") (org-at-heading-p)) (forward-line)
-         (let* ((element (org-element-at-point-no-context))
+         (let* ((element (org-element-at-point))
                 (type (org-element-type element))
                 (element-end (copy-marker (org-element-property :end element)))
                 (ind (org--get-expected-indentation element nil)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]