org-export: Fix previous/next element finding in secondary strings
authorNicolas Goaziou <n.goaziou@gmail.com>
Wed, 31 Oct 2012 11:28:21 +0000 (12:28 +0100)
committerNicolas Goaziou <n.goaziou@gmail.com>
Wed, 31 Oct 2012 12:21:16 +0000 (13:21 +0100)
* contrib/lisp/org-export.el (org-export-get-previous-element,
  org-export-get-next-element): Correctly retrieve previous and next
  object, if any, in secondary strings.
* testing/lisp/test-org-export.el: Add tests.

contrib/lisp/org-export.el
testing/lisp/test-org-export.el

index f70aa28..2e28c0d 100644 (file)
@@ -4463,7 +4463,19 @@ object, a string, or nil."
              (cond ((eq obj blob) (throw 'exit prev))
                    ((memq obj (plist-get info :ignore-list)))
                    (t (setq prev obj))))
-           (org-element-contents (org-export-get-parent blob))))))
+           ;; An object can belong to the contents of its parent or
+           ;; to a secondary string.  We check the latter option
+           ;; first.
+           (let ((parent (org-export-get-parent blob)))
+             (or (and (not (memq (org-element-type blob)
+                                 org-element-all-elements))
+                      (let ((sec-value
+                             (org-element-property
+                              (cdr (assq (org-element-type parent)
+                                         org-element-secondary-value-alist))
+                              parent)))
+                        (and (memq blob sec-value) sec-value)))
+                 (org-element-contents parent)))))))
 
 (defun org-export-get-next-element (blob info)
   "Return next element or object.
@@ -4474,7 +4486,18 @@ object, a string, or nil."
     (mapc (lambda (obj)
            (unless (memq obj (plist-get info :ignore-list))
              (throw 'found obj)))
-         (cdr (memq blob (org-element-contents (org-export-get-parent blob)))))
+         ;; An object can belong to the contents of its parent or to
+         ;; a secondary string.  We check the latter option first.
+         (let ((parent (org-export-get-parent blob)))
+           (or (and (not (memq (org-element-type blob)
+                               org-element-all-objects))
+                    (let ((sec-value
+                           (org-element-property
+                            (cdr (assq (org-element-type parent)
+                                       org-element-secondary-value-alist))
+                            parent)))
+                      (cdr (memq blob sec-value))))
+               (cdr (memq blob (org-element-contents parent))))))
     nil))
 
 
index f938dff..719548f 100644 (file)
@@ -1251,7 +1251,34 @@ Another text. (ref:text)
              (org-element-map
               tree 'plain-text
               (lambda (s) (org-export-activate-smart-quotes s :html info))
-              info))))))
+              info)))))
+  ;; Smart quotes in secondary strings.
+  (should
+   (equal '("&ldquo;" "&rdquo;")
+         (let ((org-export-default-language "en"))
+           (org-test-with-parsed-data "* \"$x$\""
+             (org-element-map
+              tree 'plain-text
+              (lambda (s) (org-export-activate-smart-quotes s :html info))
+              info)))))
+  ;; Smart quotes in document keywords.
+  (should
+   (equal '("&ldquo;" "&rdquo;")
+         (let ((org-export-default-language "en"))
+           (org-test-with-parsed-data "#+TITLE: \"$x$\""
+             (org-element-map
+              (plist-get info :title) 'plain-text
+              (lambda (s) (org-export-activate-smart-quotes s :html info))
+              info)))))
+  ;; Smart quotes in parsed affiliated keywords.
+  (should
+   (equal '("&ldquo;" "&rdquo;" "Paragraph")
+         (let ((org-export-default-language "en"))
+           (org-test-with-parsed-data "#+CAPTION: \"$x$\"\nParagraph"
+             (org-element-map
+              tree 'plain-text
+              (lambda (s) (org-export-activate-smart-quotes s :html info))
+              info nil nil t))))))
 
 
 \f
@@ -1817,7 +1844,29 @@ Another text. (ref:text)
    (let ((org-export-with-timestamps nil))
      (org-test-with-parsed-data "\alpha <2012-03-29 Thu>"
        (org-export-get-next-element
-       (org-element-map tree 'entity 'identity info t) info)))))
+       (org-element-map tree 'entity 'identity info t) info))))
+  ;; Find next element in secondary strings.
+  (should
+   (eq 'verbatim
+       (org-test-with-parsed-data "* a =verb="
+        (org-element-type
+         (org-export-get-next-element
+          (org-element-map tree 'plain-text 'identity info t) info)))))
+  ;; Find next element in document keywords.
+  (should
+   (eq 'verbatim
+       (org-test-with-parsed-data "#+TITLE: a =verb="
+        (org-element-type
+         (org-export-get-next-element
+          (org-element-map
+           (plist-get info :title) 'plain-text 'identity info t) info)))))
+  ;; Find next element in parsed affiliated keywords.
+  (should
+   (eq 'verbatim
+       (org-test-with-parsed-data "#+CAPTION: a =verb=\nParagraph"
+        (org-element-type
+         (org-export-get-next-element
+          (org-element-map tree 'plain-text 'identity info t nil t) info))))))
 
 (ert-deftest test-org-export/get-previous-element ()
   "Test `org-export-get-previous-element' specifications."
@@ -1837,7 +1886,29 @@ Another text. (ref:text)
    (let ((org-export-with-timestamps nil))
      (org-test-with-parsed-data "<2012-03-29 Thu> \alpha"
        (org-export-get-previous-element
-       (org-element-map tree 'entity 'identity info t) info)))))
+       (org-element-map tree 'entity 'identity info t) info))))
+  ;; Find previous element in secondary strings.
+  (should
+   (eq 'verbatim
+       (org-test-with-parsed-data "* =verb= a"
+        (org-element-type
+         (org-export-get-previous-element
+          (org-element-map tree 'plain-text 'identity info t) info)))))
+  ;; Find previous element in document keywords.
+  (should
+   (eq 'verbatim
+       (org-test-with-parsed-data "#+TITLE: =verb= a"
+        (org-element-type
+         (org-export-get-previous-element
+          (org-element-map
+           (plist-get info :title) 'plain-text 'identity info t) info)))))
+  ;; Find previous element in parsed affiliated keywords.
+  (should
+   (eq 'verbatim
+       (org-test-with-parsed-data "#+CAPTION: =verb= a\nParagraph"
+        (org-element-type
+         (org-export-get-previous-element
+          (org-element-map tree 'plain-text 'identity info t nil t) info))))))
 
 
 (provide 'test-org-export)