Forráskód Böngészése

Merge branch 'maint'

Nicolas Goaziou 8 éve
szülő
commit
8e8094b919
3 módosított fájl, 131 hozzáadás és 120 törlés
  1. 44 41
      lisp/org-macro.el
  2. 87 70
      testing/lisp/test-org-macro.el
  3. 0 9
      testing/lisp/test-ox.el

+ 44 - 41
lisp/org-macro.el

@@ -199,47 +199,50 @@ as strings, where macro expansion is allowed."
 	   (format "\\`EXPORT_%s\\+?\\'" (regexp-opt keywords)))
 	  record)
       (while (re-search-forward "{{{[-A-Za-z0-9_]" nil t)
-	(let* ((datum (save-match-data (org-element-context)))
-	       (type (org-element-type datum))
-	       (macro
-		(cond
-		 ((eq type 'macro) datum)
-		 ;; In parsed keywords and associated node properties,
-		 ;; force macro recognition.
-		 ((or (and (eq type 'keyword)
-			   (member (org-element-property :key datum) keywords))
-		      (and (eq type 'node-property)
-			   (string-match-p properties-regexp
-					   (org-element-property :key datum))))
-		  (save-excursion
-		    (goto-char (match-beginning 0))
-		    (org-element-macro-parser))))))
-	  (when macro
-	    (let* ((value (org-macro-expand macro templates))
-		   (begin (org-element-property :begin macro))
-		   (signature (list begin
-				    macro
-				    (org-element-property :args macro))))
-	      ;; Avoid circular dependencies by checking if the same
-	      ;; macro with the same arguments is expanded at the same
-	      ;; position twice.
-	      (cond ((member signature record)
-		     (error "Circular macro expansion: %s"
-			    (org-element-property :key macro)))
-		    (value
-		     (push signature record)
-		     (delete-region
-		      begin
-		      ;; Preserve white spaces after the macro.
-		      (progn (goto-char (org-element-property :end macro))
-			     (skip-chars-backward " \t")
-			     (point)))
-		     ;; Leave point before replacement in case of
-		     ;; recursive expansions.
-		     (save-excursion (insert value)))
-		    (finalize
-		     (error "Undefined Org macro: %s; aborting"
-			    (org-element-property :key macro)))))))))))
+	(unless (save-match-data (org-in-commented-heading-p))
+	  (let* ((datum (save-match-data (org-element-context)))
+		 (type (org-element-type datum))
+		 (macro
+		  (cond
+		   ((eq type 'macro) datum)
+		   ;; In parsed keywords and associated node
+		   ;; properties, force macro recognition.
+		   ((or (and (eq type 'keyword)
+			     (member (org-element-property :key datum)
+				     keywords))
+			(and (eq type 'node-property)
+			     (string-match-p properties-regexp
+					     (org-element-property :key
+								   datum))))
+		    (save-excursion
+		      (goto-char (match-beginning 0))
+		      (org-element-macro-parser))))))
+	    (when macro
+	      (let* ((value (org-macro-expand macro templates))
+		     (begin (org-element-property :begin macro))
+		     (signature (list begin
+				      macro
+				      (org-element-property :args macro))))
+		;; Avoid circular dependencies by checking if the same
+		;; macro with the same arguments is expanded at the
+		;; same position twice.
+		(cond ((member signature record)
+		       (error "Circular macro expansion: %s"
+			      (org-element-property :key macro)))
+		      (value
+		       (push signature record)
+		       (delete-region
+			begin
+			;; Preserve white spaces after the macro.
+			(progn (goto-char (org-element-property :end macro))
+			       (skip-chars-backward " \t")
+			       (point)))
+		       ;; Leave point before replacement in case of
+		       ;; recursive expansions.
+		       (save-excursion (insert value)))
+		      (finalize
+		       (error "Undefined Org macro: %s; aborting"
+			      (org-element-property :key macro))))))))))))
 
 (defun org-macro-escape-arguments (&rest args)
   "Build macro's arguments string from ARGS.

+ 87 - 70
testing/lisp/test-org-macro.el

@@ -30,33 +30,33 @@
     "#+MACRO: A B\n1 B 3"
     (org-test-with-temp-text "#+MACRO: A B\n1 {{{A}}} 3"
       (progn (org-macro-initialize-templates)
-	     (org-macro-replace-all org-macro-templates)
-	     (buffer-string)))))
+             (org-macro-replace-all org-macro-templates)
+             (buffer-string)))))
   ;; Macro with arguments.
   (should
    (equal
     "#+MACRO: macro $1 $2\nsome text"
     (org-test-with-temp-text "#+MACRO: macro $1 $2\n{{{macro(some,text)}}}"
       (progn (org-macro-initialize-templates)
-	     (org-macro-replace-all org-macro-templates)
-	     (buffer-string)))))
+             (org-macro-replace-all org-macro-templates)
+             (buffer-string)))))
   ;; Macro with "eval".
   (should
    (equal
     "#+MACRO: add (eval (+ $1 $2))\n3"
     (org-test-with-temp-text "#+MACRO: add (eval (+ $1 $2))\n{{{add(1,2)}}}"
       (progn (org-macro-initialize-templates)
-	     (org-macro-replace-all org-macro-templates)
-	     (buffer-string)))))
+             (org-macro-replace-all org-macro-templates)
+             (buffer-string)))))
   ;; Nested macros.
   (should
    (equal
     "#+MACRO: in inner\n#+MACRO: out {{{in}}} outer\ninner outer"
     (org-test-with-temp-text
-	"#+MACRO: in inner\n#+MACRO: out {{{in}}} outer\n{{{out}}}"
+        "#+MACRO: in inner\n#+MACRO: out {{{in}}} outer\n{{{out}}}"
       (progn (org-macro-initialize-templates)
-	     (org-macro-replace-all org-macro-templates)
-	     (buffer-string)))))
+             (org-macro-replace-all org-macro-templates)
+             (buffer-string)))))
   ;; Error out when macro expansion is circular.
   (should-error
    (org-test-with-temp-text
@@ -68,10 +68,10 @@
    (string-match
     "success success\\'"
     (org-test-with-temp-text
-	(format "#+MACRO: other-macro success
+        (format "#+MACRO: other-macro success
 #+SETUPFILE: \"%sexamples/macro-templates.org\"
 {{{included-macro}}} {{{other-macro}}}"
-		org-test-dir)
+                org-test-dir)
       (org-macro-initialize-templates)
       (org-macro-replace-all org-macro-templates)
       (buffer-string))))
@@ -80,10 +80,27 @@
    (string-match-p
     "{{{macro}}}"
     (org-test-with-temp-text
-	"#+MACRO: macro expansion\n{{{macro}}}\n<point>Contents"
+        "#+MACRO: macro expansion\n{{{macro}}}\n<point>Contents"
       (narrow-to-region (point) (point-max))
       (org-macro-initialize-templates)
       (org-macro-replace-all org-macro-templates)
+      (org-with-wide-buffer (buffer-string)))))
+  ;; Macros in a commented tree are not expanded.
+  (should
+   (string-match-p
+    "{{{macro}}}"
+    (org-test-with-temp-text
+        "#+MACRO: macro expansion\n* COMMENT H\n<point>{{{macro}}}"
+      (org-macro-initialize-templates)
+      (org-macro-replace-all org-macro-templates)
+      (org-with-wide-buffer (buffer-string)))))
+  (should
+   (string-match-p
+    "{{{macro}}}"
+    (org-test-with-temp-text
+        "#+MACRO: macro expansion\n* COMMENT H1\n** H2\n<point>{{{macro}}}"
+      (org-macro-initialize-templates)
+      (org-macro-replace-all org-macro-templates)
       (org-with-wide-buffer (buffer-string))))))
 
 (ert-deftest test-org-macro/property ()
@@ -93,25 +110,25 @@
   ;; property from another headline.
   (should
    (equal "1"
-	  (org-test-with-temp-text
-	      "* H\n:PROPERTIES:\n:A: 1\n:END:\n{{{property(A)}}}<point>"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position)))))
+          (org-test-with-temp-text
+              "* H\n:PROPERTIES:\n:A: 1\n:END:\n{{{property(A)}}}<point>"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position)))))
   (should
    (equal "1"
-	  (org-test-with-temp-text
-	      "* H\n:PROPERTIES:\n:A: 1\n:END:\n{{{property(A,)}}}<point>"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position)))))
+          (org-test-with-temp-text
+              "* H\n:PROPERTIES:\n:A: 1\n:END:\n{{{property(A,)}}}<point>"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position)))))
   (should
    (equal
     "1"
     (org-test-with-temp-text
-	"* H1\n:PROPERTIES:\n:A: 1\n:END:\n* H2\n{{{property(A,*H1)}}}<point>"
+        "* H1\n:PROPERTIES:\n:A: 1\n:END:\n* H2\n{{{property(A,*H1)}}}<point>"
       (org-macro-initialize-templates)
       (org-macro-replace-all org-macro-templates)
       (buffer-substring-no-properties
@@ -127,73 +144,73 @@
   ;; Standard test with default counter.
   (should
    (equal "1 2"
-	  (org-test-with-temp-text "{{{n}}} {{{n}}}"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position)))))
+          (org-test-with-temp-text "{{{n}}} {{{n}}}"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position)))))
   (should
    (equal "1 2"
-	  (org-test-with-temp-text "{{{n()}}} {{{n}}}"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position)))))
+          (org-test-with-temp-text "{{{n()}}} {{{n}}}"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position)))))
   ;; Test alternative counters.
   (should
    (equal "1 1 1 2"
-	  (org-test-with-temp-text "{{{n}}} {{{n(c1)}}} {{{n(c2)}}} {{{n(c1)}}}"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position)))))
+          (org-test-with-temp-text "{{{n}}} {{{n(c1)}}} {{{n(c2)}}} {{{n(c1)}}}"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position)))))
   ;; Second argument set a counter to a given value.  A non-numeric
   ;; value resets the counter to 1.
   (should
    (equal "9 10"
-	  (org-test-with-temp-text "{{{n(c,9)}}} {{{n(c)}}}"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position)))))
+          (org-test-with-temp-text "{{{n(c,9)}}} {{{n(c)}}}"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position)))))
   (should
    (equal "9 1"
-	  (org-test-with-temp-text "{{{n(c,9)}}} {{{n(c,reset)}}}"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position)))))
+          (org-test-with-temp-text "{{{n(c,9)}}} {{{n(c,reset)}}}"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position)))))
   ;; Tolerate spaces in second argument.
   (should
    (equal "9 10"
-	  (org-test-with-temp-text "{{{n(c, 9)}}} {{{n(c)}}}"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position)))))
+          (org-test-with-temp-text "{{{n(c, 9)}}} {{{n(c)}}}"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position)))))
   (should
    (equal "9 1"
-	  (org-test-with-temp-text "{{{n(c,9)}}} {{{n(c, reset)}}}"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position)))))
+          (org-test-with-temp-text "{{{n(c,9)}}} {{{n(c, reset)}}}"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position)))))
   ;; Second argument also applies to default counter.
   (should
    (equal "9 10 1"
-	  (org-test-with-temp-text "{{{n(,9)}}} {{{n}}} {{{n(,reset)}}}"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position)))))
+          (org-test-with-temp-text "{{{n(,9)}}} {{{n}}} {{{n(,reset)}}}"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position)))))
   ;; An empty second argument is equivalent to no argument.
   (should
    (equal "2 3"
-	  (org-test-with-temp-text "{{{n(c,2)}}} {{{n(c,)}}}"
-	    (org-macro-initialize-templates)
-	    (org-macro-replace-all org-macro-templates)
-	    (buffer-substring-no-properties
-	     (line-beginning-position) (line-end-position))))))
+          (org-test-with-temp-text "{{{n(c,2)}}} {{{n(c,)}}}"
+            (org-macro-initialize-templates)
+            (org-macro-replace-all org-macro-templates)
+            (buffer-substring-no-properties
+             (line-beginning-position) (line-end-position))))))
 
 (ert-deftest test-org-macro/escape-arguments ()
   "Test `org-macro-escape-arguments' specifications."

+ 0 - 9
testing/lisp/test-ox.el

@@ -1399,15 +1399,6 @@ Footnotes[fn:2], foot[fn:test] and [fn:inline:inline footnote]
   ;; Throw an error when a macro definition is missing.
   (should-error
    (org-test-with-temp-text "{{{missing}}}"
-     (org-export-as (org-test-default-backend))))
-  ;; Macros defined in commented subtrees are ignored.
-  (should-error
-   (org-test-with-temp-text
-       "* COMMENT H\n#+MACRO: macro1\n* H2\nvalue\n{{{macro1}}}"
-     (org-export-as (org-test-default-backend))))
-  (should-error
-   (org-test-with-temp-text
-       "* COMMENT H\n** H2\n#+MACRO: macro1\n* H3\nvalue\n{{{macro1}}}"
      (org-export-as (org-test-default-backend)))))
 
 (ert-deftest test-org-export/before-processing-hook ()