summaryrefslogtreecommitdiff
path: root/lisp/org
diff options
context:
space:
mode:
authorIhor Radchenko <yantar92@gmail.com>2022-06-16 01:01:53 +0800
committerEli Zaretskii <eliz@gnu.org>2022-06-16 10:53:51 +0300
commit979308b4cad2b573606ed71a1689a47a9e7a9e98 (patch)
tree41ad60376d8fb34041512655aa573e375cc51d43 /lisp/org
parent0f7ceb4803cabcb3c406fa7c27ccb7625096058e (diff)
downloademacs-979308b4cad2b573606ed71a1689a47a9e7a9e98.tar.gz
emacs-979308b4cad2b573606ed71a1689a47a9e7a9e98.tar.bz2
emacs-979308b4cad2b573606ed71a1689a47a9e7a9e98.zip
org-export-data: Concatenate strings in temporary buffer for performance
* 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.
Diffstat (limited to 'lisp/org')
-rw-r--r--lisp/org/ox.el50
1 files changed, 28 insertions, 22 deletions
diff --git a/lisp/org/ox.el b/lisp/org/ox.el
index a4512270c90..ae7e41e576b 100644
--- a/lisp/org/ox.el
+++ b/lisp/org/ox.el
@@ -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