]> git.eshelyaron.com Git - emacs.git/commitdiff
org-export-data: Concatenate strings in temporary buffer for performance
authorIhor Radchenko <yantar92@gmail.com>
Wed, 15 Jun 2022 17:01:53 +0000 (01:01 +0800)
committerEli Zaretskii <eliz@gnu.org>
Thu, 16 Jun 2022 07:53:51 +0000 (10:53 +0300)
* lisp/org/ox.el (org-export-data): Use temporary buffer to collect export
data instead of `mapconcat'.  Using buffer puts less load on garbage
collector.

lisp/org/ox.el

index a4512270c90195062f7e35b3d2e3496b0a26800a..ae7e41e576bd527dfaca7f1207b8ab4fe034e5bf 100644 (file)
@@ -1923,28 +1923,34 @@ Return a string."
                              (and (not greaterp)
                                   (memq type org-element-recursive-objects)))
                             (contents
-                             (mapconcat
-                              (lambda (element) (org-export-data element info))
-                              (org-element-contents
-                               (if (or greaterp objectp) data
-                                 ;; Elements directly containing
-                                 ;; objects must have their indentation
-                                 ;; normalized first.
-                                 (org-element-normalize-contents
-                                  data
-                                  ;; When normalizing first paragraph
-                                  ;; of an item or
-                                  ;; a footnote-definition, ignore
-                                  ;; first line's indentation.
-                                  (and
-                                   (eq type 'paragraph)
-                                   (memq (org-element-type parent)
-                                         '(footnote-definition item))
-                                   (eq (car (org-element-contents parent))
-                                       data)
-                                   (eq (org-element-property :pre-blank parent)
-                                       0)))))
-                              "")))
+                              (let ((export-buffer (current-buffer)))
+                                (with-temp-buffer
+                                  (dolist (element (org-element-contents
+                                                   (if (or greaterp objectp) data
+                                                     ;; Elements directly containing
+                                                     ;; objects must have their indentation
+                                                     ;; normalized first.
+                                                     (org-element-normalize-contents
+                                                      data
+                                                      ;; When normalizing first paragraph
+                                                      ;; of an item or
+                                                      ;; a footnote-definition, ignore
+                                                      ;; first line's indentation.
+                                                      (and
+                                                       (eq type 'paragraph)
+                                                       (memq (org-element-type parent)
+                                                             '(footnote-definition item))
+                                                       (eq (car (org-element-contents parent))
+                                                           data)
+                                                       (eq (org-element-property :pre-blank parent)
+                                                           0))))))
+                                    (insert
+                                     ;; Use right local variable
+                                     ;; environment if there are, for
+                                     ;; example, #+BIND variables.
+                                     (with-current-buffer export-buffer
+                                       (org-export-data element info))))
+                                  (buffer-string)))))
                        (broken-link-handler
                         (funcall transcoder data
                                  (if (not greaterp) contents