|
@@ -1103,6 +1103,10 @@ on this string to produce the exported version."
|
|
|
(org-export-handle-include-files-recurse)
|
|
|
(run-hooks 'org-export-preprocess-after-include-files-hook)
|
|
|
|
|
|
+ ;; Change lists ending. Other parts of export may insert blank
|
|
|
+ ;; lines and lists' structure could be altered.
|
|
|
+ (org-export-mark-list-end)
|
|
|
+
|
|
|
;; Process the macros
|
|
|
(org-export-preprocess-apply-macros)
|
|
|
(run-hooks 'org-export-preprocess-after-macros-hook)
|
|
@@ -1121,10 +1125,6 @@ on this string to produce the exported version."
|
|
|
;; Get rid of tasks, depending on configuration
|
|
|
(org-export-remove-tasks (plist-get parameters :tasks))
|
|
|
|
|
|
- ;; Change lists ending. Other parts of export may insert blank
|
|
|
- ;; lines and lists' structure could be altered.
|
|
|
- (org-export-mark-list-end)
|
|
|
-
|
|
|
;; Export code blocks
|
|
|
(org-export-blocks-preprocess)
|
|
|
|
|
@@ -2219,26 +2219,35 @@ TYPE must be a string, any of:
|
|
|
(defun org-export-preprocess-apply-macros ()
|
|
|
"Replace macro references."
|
|
|
(goto-char (point-min))
|
|
|
- (let (sy val key args args2 s n)
|
|
|
+ (let (sy val key args args2 ind-str s n)
|
|
|
(while (re-search-forward
|
|
|
"{{{\\([a-zA-Z][-a-zA-Z0-9_]*\\)\\(([ \t\n]*\\([^\000]*?\\))\\)?}}}"
|
|
|
nil t)
|
|
|
- (unless (save-match-data
|
|
|
- (save-excursion
|
|
|
- (goto-char (point-at-bol))
|
|
|
- (looking-at "[ \t]*#\\+macro")))
|
|
|
+ (unless (save-match-data (save-excursion
|
|
|
+ (goto-char (point-at-bol))
|
|
|
+ (looking-at "[ \t]*#\\+macro")))
|
|
|
+ ;; Get macro name (KEY), arguments (ARGS), and indentation of
|
|
|
+ ;; current line (IND-STR) as strings.
|
|
|
(setq key (downcase (match-string 1))
|
|
|
- args (match-string 3))
|
|
|
+ args (match-string 3)
|
|
|
+ ind-str (save-match-data (save-excursion
|
|
|
+ (beginning-of-line)
|
|
|
+ (looking-at "^\\([ \t]*\\).*")
|
|
|
+ (match-string 1))))
|
|
|
+ ;; When macro is defined, retrieve replacement text in VAL,
|
|
|
+ ;; and proceed with expansion.
|
|
|
(when (setq val (or (plist-get org-export-opt-plist
|
|
|
(intern (concat ":macro-" key)))
|
|
|
(plist-get org-export-opt-plist
|
|
|
(intern (concat ":" key)))))
|
|
|
(save-match-data
|
|
|
+ ;; If arguments are provided, first retreive them properly
|
|
|
+ ;; (in ARGS, as a list), then replace them in VAL.
|
|
|
(when args
|
|
|
(setq args (org-split-string args ",") args2 nil)
|
|
|
(while args
|
|
|
(while (string-match "\\\\\\'" (car args))
|
|
|
- ;; repair bad splits
|
|
|
+ ;; Repair bad splits.
|
|
|
(setcar (cdr args) (concat (substring (car args) 0 -1)
|
|
|
"," (nth 1 args)))
|
|
|
(pop args))
|
|
@@ -2250,13 +2259,22 @@ TYPE must be a string, any of:
|
|
|
n (string-to-number (match-string 1 val)))
|
|
|
(and (>= (length args) n)
|
|
|
(setq val (replace-match (nth (1- n) args) t t val)))))
|
|
|
+ ;; VAL starts with "(eval": it is a sexp, `eval' it.
|
|
|
(when (string-match "\\`(eval\\>" val)
|
|
|
(setq val (eval (read val))))
|
|
|
- (if (and val (not (stringp val)))
|
|
|
- (setq val (format "%s" val))))
|
|
|
- (and (stringp val)
|
|
|
- (prog1 (replace-match val t t)
|
|
|
- (goto-char (match-beginning 0)))))))))
|
|
|
+ ;; Ensure VAL is a string (or nil) and that each new line
|
|
|
+ ;; is indented as the first one.
|
|
|
+ (setq val (and val
|
|
|
+ (mapconcat 'identity
|
|
|
+ (org-split-string
|
|
|
+ (if (stringp val) val (format "%s" val))
|
|
|
+ "\n")
|
|
|
+ (concat "\n" ind-str)))))
|
|
|
+ ;; Eventually do the replacement, if VAL isn't nil. Move
|
|
|
+ ;; point at beginning of macro for recursive expansions.
|
|
|
+ (when val
|
|
|
+ (replace-match val t t)
|
|
|
+ (goto-char (match-beginning 0))))))))
|
|
|
|
|
|
(defun org-export-apply-macros-in-string (s)
|
|
|
"Apply the macros in string S."
|