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

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

[elpa] externals/org 14848726a0 1/2: org-export-data: Handle trailing sp


From: ELPA Syncer
Subject: [elpa] externals/org 14848726a0 1/2: org-export-data: Handle trailing spaces when transcoder returns nil
Date: Sun, 19 May 2024 06:58:29 -0400 (EDT)

branch: externals/org
commit 14848726a04158dbd91cc6d5043ee593797a18ac
Author: Ihor Radchenko <yantar92@posteo.net>
Commit: Ihor Radchenko <yantar92@posteo.net>

    org-export-data: Handle trailing spaces when transcoder returns nil
    
    * lisp/ox.el (org-export--keep-spaces): New helper function containing
    logic about keeping spaces in place of removed object from
    `org-export--prune-tree'.  The logic is modified to keep spaces in the
    case when previous plain-string object ends with a whitespace, but not
    " " or "\t".  This can happen, for example, when there is a trailing
    zero-width space.  We do want to keep spaces in such scenario.
    (org-export-data): When transcoder returns nil, handle
    trailing spaces after an object the same way `org-export--prune-tree'
    does.  Remove special handling of export snippets that unconditionally
    keep their trailing spaces.
    (org-export--prune-tree): Use the helper function.
    * testing/lisp/test-ox.el (test-org-export/export-snippet): Adjust test.
    
    Link: https://orgmode.org/list/87h6fwmgkm.fsf@localhost
---
 lisp/ox.el              | 67 +++++++++++++++++++++++++++++++------------------
 testing/lisp/test-ox.el |  4 +--
 2 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/lisp/ox.el b/lisp/ox.el
index 217b6d6675..6b75adb5e2 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -1880,6 +1880,38 @@ INFO is a plist containing export directives."
       (let ((transcoder (cdr (assq type (plist-get info :translate-alist)))))
        (and (functionp transcoder) transcoder)))))
 
+(defun org-export--keep-spaces (data info)
+  "Non-nil, when post-blank spaces after removing DATA should be preserved.
+INFO is the info channel.
+
+This function returns nil, when previous exported element already has
+trailing spaces or when DATA does not have non-zero non-nil
+`:post-blank' property.
+
+When the return value is non-nil, it is a string containing the trailing
+spaces."
+  ;; When DATA is an object, interpret this as if DATA should be
+  ;; ignored (see `org-export--prune-tree').  Keep spaces in place of
+  ;; removed element, if necessary.  Example: "Foo.[10%] Bar" would
+  ;; become "Foo.Bar" if we do not keep spaces.  Another example: "A
+  ;; space@@ascii:*@@ character."  should become "A space character"
+  ;; in non-ASCII export.
+  (let ((post-blank (org-element-post-blank data)))
+    (unless (or (not post-blank)
+                (zerop post-blank)
+                (eq 'element (org-element-class data)))
+      (let ((previous (org-export-get-previous-element data info)))
+       (unless (or (not previous)
+                   (pcase (org-element-type previous)
+                     (`plain-text
+                      (string-match-p
+                       (rx (any " \t\r\n") eos) previous))
+                     (_ (org-element-post-blank previous))))
+          ;; When previous element does not have
+          ;; trailing spaces, keep the trailing
+          ;; spaces from DATA.
+         (make-string post-blank ?\s))))))
+
 ;;;###autoload
 (defun org-export-data (data info)
   "Convert DATA into current backend format.
@@ -1930,15 +1962,11 @@ Return a string."
                           (eq (plist-get info :with-archived-trees) 'headline)
                           (org-element-property :archivedp data)))
                  (let ((transcoder (org-export-transcoder data info)))
-                   (or (and (functionp transcoder)
-                             (if (eq type 'link)
-                                (broken-link-handler
-                                 (funcall transcoder data nil info))
-                               (funcall transcoder data nil info)))
-                       ;; Export snippets never return a nil value so
-                       ;; that white spaces following them are never
-                       ;; ignored.
-                       (and (eq type 'export-snippet) ""))))
+                   (and (functionp transcoder)
+                         (if (eq type 'link)
+                            (broken-link-handler
+                             (funcall transcoder data nil info))
+                           (funcall transcoder data nil info)))))
                 ;; Element/Object with contents.
                 (t
                  (let ((transcoder (org-export-transcoder data info)))
@@ -1979,8 +2007,8 @@ Return a string."
          (puthash
           data
           (cond
-           ((not results) "")
-           ((memq type '(nil org-data plain-text raw)) results)
+           ((not results) (or (org-export--keep-spaces data info) ""))
+            ((memq type '(nil org-data plain-text raw)) results)
            ;; Append the same white space between elements or objects
            ;; as in the original buffer, and call appropriate filters.
            (t
@@ -2641,24 +2669,13 @@ from tree."
                (let ((type (org-element-type data)))
                  (if (org-export--skip-p data info selected excluded)
                      (if (memq type '(table-cell table-row)) (push data ignore)
-                       (let ((post-blank (org-element-post-blank data)))
-                         (if (or (not post-blank) (zerop post-blank)
-                                 (eq 'element (org-element-class data)))
-                             (org-element-extract data)
+                        (if-let ((keep-spaces (org-export--keep-spaces data 
info)))
                            ;; Keep spaces in place of removed
                            ;; element, if necessary.
                            ;; Example: "Foo.[10%] Bar" would become
                            ;; "Foo.Bar" if we do not keep spaces.
-                           (let ((previous (org-export-get-previous-element 
data info)))
-                             (if (or (not previous)
-                                     (pcase (org-element-type previous)
-                                       (`plain-text
-                                        (string-match-p
-                                         (rx  whitespace eos) previous))
-                                       (_ (org-element-post-blank previous))))
-                                 ;; Previous object ends with whitespace 
already.
-                                 (org-element-extract data)
-                               (org-element-set data (make-string post-blank 
?\s)))))))
+                            (org-element-set data keep-spaces)
+                         (org-element-extract data)))
                    (if (and (eq type 'headline)
                             (eq (plist-get info :with-archived-trees)
                                 'headline)
diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el
index cc14b4fe8f..9b1b900ca4 100644
--- a/testing/lisp/test-ox.el
+++ b/testing/lisp/test-ox.el
@@ -2261,8 +2261,8 @@ Para2"
        (should (equal (org-export-as backend) "AB\n")))))
   ;; Ignored export snippets do not remove any blank.
   (should
-   (equal "begin  end\n"
-         (org-test-with-parsed-data "begin @@test:A@@ end"
+   (equal "begin end\n"
+         (org-test-with-parsed-data "begin@@test:A@@ end"
            (org-export-data-with-backend
             tree
             (org-export-create-backend



reply via email to

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