From beb024687b08b3285ecc2719c111967d747c0e98 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Sat, 10 Mar 2012 20:25:32 +0100 Subject: [PATCH] org-export: Remove useless INFO argument from `org-export-unravel-code' * contrib/lisp/org-export.el (org-export-unravel-code): Remove INFO argument. Fix a bug preventing code references to be properly recognized. (org-export-format-code-default): Apply signature change. (org-export-resolve-coderef): Fix a bug preventing code references to be properly recognized. * EXPERIMENTAL/org-e-latex.el (org-e-latex-src-block): Apply signature change. * testing/lisp/test-org-export.el: Add tests. --- EXPERIMENTAL/org-e-latex.el | 4 +-- contrib/lisp/org-export.el | 29 +++++++++++----------- testing/lisp/test-org-export.el | 55 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 17 deletions(-) diff --git a/EXPERIMENTAL/org-e-latex.el b/EXPERIMENTAL/org-e-latex.el index ac11c1a35..0f52becac 100644 --- a/EXPERIMENTAL/org-e-latex.el +++ b/EXPERIMENTAL/org-e-latex.el @@ -1720,7 +1720,7 @@ contextual information." ;; Language. (or (cadr (assq (intern lang) org-e-latex-minted-langs)) lang) ;; Source code. - (let* ((code-info (org-export-unravel-code src-block contents)) + (let* ((code-info (org-export-unravel-code src-block)) (max-width (apply 'max (mapcar 'length @@ -1768,7 +1768,7 @@ contextual information." ;; Source code. (format "\\begin{lstlisting}\n%s\\end{lstlisting}" - (let* ((code-info (org-export-unravel-code src-block info)) + (let* ((code-info (org-export-unravel-code src-block)) (max-width (apply 'max (mapcar 'length diff --git a/contrib/lisp/org-export.el b/contrib/lisp/org-export.el index 6d3b02a52..596b8b482 100644 --- a/contrib/lisp/org-export.el +++ b/contrib/lisp/org-export.el @@ -2805,12 +2805,12 @@ depending on src-block or example element's switches." (lambda (el) (with-temp-buffer (insert (org-trim (org-element-property :value el))) - (let* ((label-fmt (or (org-element-property :label-fmt el) - org-coderef-label-format)) + (let* ((label-fmt (regexp-quote + (or (org-element-property :label-fmt el) + org-coderef-label-format))) (ref-re (format "^.*?\\S-.*?\\([ \t]*\\(%s\\)\\)[ \t]*$" - (regexp-quote - (replace-regexp-in-string "%s" ref label-fmt nil t))))) + (replace-regexp-in-string "%s" ref label-fmt nil t)))) ;; Element containing REF is found. Resolve it to either ;; a label or a line number, as needed. (when (re-search-backward ref-re nil t) @@ -2972,19 +2972,18 @@ ELEMENT is excluded from count." ;; Return value. loc)) -(defun org-export-unravel-code (element info) +(defun org-export-unravel-code (element) "Clean source code and extract references out of it. -ELEMENT has either a `src-block' an `example-block' type. INFO -is a plist used as a communication channel. +ELEMENT has either a `src-block' an `example-block' type. Return a cons cell whose CAR is the source code, cleaned from any reference and protective comma and CDR is an alist between relative line number (integer) and name of code reference on that line (string)." (let* ((line 0) refs - ;; Get code and clean it. Remove blank lines at its beginning - ;; and end. Also remove protective commas. + ;; Get code and clean it. Remove blank lines at its + ;; beginning and end. Also remove protective commas. (code (let ((c (replace-regexp-in-string "\\`\\([ \t]*\n\\)+" "" (replace-regexp-in-string @@ -3001,14 +3000,14 @@ line (string)." (replace-regexp-in-string "^\\(,\\)\\(:?\\*\\|[ \t]*#\\+\\)" "" c nil nil 1)))) ;; Get format used for references. - (label-fmt (or (org-element-property :label-fmt element) - org-coderef-label-format)) + (label-fmt (regexp-quote + (or (org-element-property :label-fmt element) + org-coderef-label-format))) ;; Build a regexp matching a loc with a reference. (with-ref-re (format "^.*?\\S-.*?\\([ \t]*\\(%s\\)[ \t]*\\)$" - (regexp-quote - (replace-regexp-in-string - "%s" "\\([-a-zA-Z0-9_ ]+\\)" label-fmt nil t))))) + (replace-regexp-in-string + "%s" "\\([-a-zA-Z0-9_ ]+\\)" label-fmt nil t)))) ;; Return value. (cons ;; Code with references removed. @@ -3066,7 +3065,7 @@ spaces. Code references, on the other hand, appear flushed to the right, separated by six white spaces from the widest line of code." ;; Extract code and references. - (let* ((code-info (org-export-unravel-code element info)) + (let* ((code-info (org-export-unravel-code element)) (code (car code-info)) (code-lines (org-split-string code "\n")) (refs (and (org-element-property :retain-labels element) diff --git a/testing/lisp/test-org-export.el b/testing/lisp/test-org-export.el index a61242fbe..f34cc7b77 100644 --- a/testing/lisp/test-org-export.el +++ b/testing/lisp/test-org-export.el @@ -313,6 +313,10 @@ body\n"))) (org-test-with-temp-text "* Head1\n* Head2 (note)\n" (should (equal (org-export-as 'test) "* Head1\n"))))))) + + +;; Footnotes + (ert-deftest test-org-export/footnotes () "Test footnotes specifications." (let ((org-footnote-section nil)) @@ -380,6 +384,10 @@ body\n"))) (should (= (length (org-export-collect-footnote-definitions tree info)) 4)))))) + + +;;; Links + (ert-deftest test-org-export/fuzzy-links () "Test fuzz link export specifications." ;; 1. Links to invisible (keyword) targets should be ignored. @@ -565,6 +573,53 @@ Another text. (ref:text) "text")))))) + +;;; Src-block and example-block + +(ert-deftest test-org-export/unravel-code () + "Test `org-export-unravel-code' function." + (let ((org-coderef-label-format "(ref:%s)")) + ;; 1. Code without reference. + (org-test-with-temp-text "#+BEGIN_EXAMPLE\n(+ 1 1)\n#+END_EXAMPLE" + (should (equal (org-export-unravel-code (org-element-current-element)) + '("(+ 1 1)\n")))) + ;; 2. Code with reference. + (org-test-with-temp-text + "#+BEGIN_EXAMPLE\n(+ 1 1) (ref:test)\n#+END_EXAMPLE" + (should (equal (org-export-unravel-code (org-element-current-element)) + '("(+ 1 1)\n" (1 . "test"))))) + ;; 3. Code with user-defined reference. + (org-test-with-temp-text + "#+BEGIN_EXAMPLE -l \"[ref:%s]\"\n(+ 1 1) [ref:test]\n#+END_EXAMPLE" + (should (equal (org-export-unravel-code (org-element-current-element)) + '("(+ 1 1)\n" (1 . "test"))))) + ;; 4. Code references keys are relative to the current block. + (org-test-with-temp-text " +#+BEGIN_EXAMPLE -n +\(+ 1 1) +#+END_EXAMPLE +#+BEGIN_EXAMPLE +n +\(+ 2 2) +\(+ 3 3) (ref:one) +#+END_EXAMPLE" + (goto-line 5) + (should (equal (org-export-unravel-code (org-element-current-element)) + '("(+ 2 2)\n(+ 3 3)\n" (2 . "one"))))) + ;; 5. Free up comma-protected lines. + ;; + ;; 5.1. In an Org source block, every line is protected. + (org-test-with-temp-text + "#+BEGIN_SRC org\n,* Test\n,# comment\n,Text\n#+END_SRC" + (should (equal (org-export-unravel-code (org-element-current-element)) + '("* Test\n# comment\nText\n")))) + ;; 5.2. In other blocks, only headlines, comments and keywords are + ;; protected. + (org-test-with-temp-text + "#+BEGIN_EXAMPLE\n,* Headline\n, * Not headline\n,Keep\n#+END_EXAMPLE" + (should (equal (org-export-unravel-code (org-element-current-element)) + '("* Headline\n, * Not headline\n,Keep\n")))))) + + (provide 'test-org-export) ;;; test-org-export.el end here -- 2.11.4.GIT