| 
					
				 | 
			
			
				@@ -52,11 +52,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (declare-function org-element-at-point "org-element" ()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (declare-function org-element-context "org-element" (&optional element)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(declare-function org-element-map "org-element" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  (data types fun &optional info first-match no-recursion 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			with-affiliated)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(declare-function org-element-parse-buffer "org-element" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  (&optional granularity visible-only)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(declare-function org-element-macro-parser "org-element" ()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (declare-function org-element-property "org-element" (property element)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (declare-function org-element-type "org-element" (element)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (declare-function org-file-contents "org" (file &optional noerror)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -197,55 +193,53 @@ found in the buffer with no definition in TEMPLATES. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Optional argument KEYWORDS, when non-nil is a list of keywords, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 as strings, where macro expansion is allowed." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (org-with-wide-buffer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   (goto-char (point-min)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   (let ((properties-regexp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	  (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-restriction 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		   (narrow-to-region (match-beginning 0) (line-end-position)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		   (org-element-map (org-element-parse-buffer) 'macro 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		     #'identity nil t)))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 (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))))))))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (save-excursion 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (goto-char (point-min)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (let ((properties-regexp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	   (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))))))))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-macro-escape-arguments (&rest args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Build macro's arguments string from ARGS. 
			 |