|
@@ -225,12 +225,14 @@ Any fields from the feed item can be interpolated into the template with
|
|
|
%name, for example %title, %description, %pubDate etc. In addition, the
|
|
|
following special escapes are valid as well:
|
|
|
|
|
|
-%h the title, or the first line of the description
|
|
|
-%t the date as a stamp, either from <pubDate> (if present), or
|
|
|
- the current date.
|
|
|
-%T date and time
|
|
|
-%u,%U like %t,%T, but inactive time stamps
|
|
|
-%a A link, from <guid> if that is a permalink, else from <link>"
|
|
|
+%h The title, or the first line of the description
|
|
|
+%t The date as a stamp, either from <pubDate> (if present), or
|
|
|
+ the current date
|
|
|
+%T Date and time
|
|
|
+%u,%U Like %t,%T, but inactive time stamps
|
|
|
+%a A link, from <guid> if that is a permalink, else from <link>
|
|
|
+%(sexp) Evaluate elisp `(sexp)' and replace with the result, the simple
|
|
|
+ %-escapes above can be used as arguments, e.g. %(capitalize \\\"%h\\\")"
|
|
|
:group 'org-feed
|
|
|
:type '(string :tag "Template"))
|
|
|
|
|
@@ -506,9 +508,10 @@ This will find DRAWER and extract the alist."
|
|
|
ENTRY is a property list. This function adds a `:formatted-for-org' property
|
|
|
and returns the full property list.
|
|
|
If that property is already present, nothing changes."
|
|
|
+ (require 'org-capture)
|
|
|
(if formatter
|
|
|
(funcall formatter entry)
|
|
|
- (let (dlines fmt tmp indent time name
|
|
|
+ (let (dlines time escape name tmp
|
|
|
v-h v-t v-T v-u v-U v-a)
|
|
|
(setq dlines (org-split-string (or (plist-get entry :description) "???")
|
|
|
"\n")
|
|
@@ -527,20 +530,35 @@ If that property is already present, nothing changes."
|
|
|
""))
|
|
|
(with-temp-buffer
|
|
|
(insert template)
|
|
|
+
|
|
|
+ ;; Simple %-escapes
|
|
|
+ ;; before embedded elisp to support simple %-escapes as
|
|
|
+ ;; arguments for embedded elisp
|
|
|
(goto-char (point-min))
|
|
|
(while (re-search-forward "%\\([a-zA-Z]+\\)" nil t)
|
|
|
- (setq name (match-string 1))
|
|
|
- (cond
|
|
|
- ((member name '("h" "t" "T" "u" "U" "a"))
|
|
|
- (replace-match (symbol-value (intern (concat "v-" name))) t t))
|
|
|
- ((setq tmp (plist-get entry (intern (concat ":" name))))
|
|
|
- (save-excursion
|
|
|
- (save-match-data
|
|
|
- (beginning-of-line 1)
|
|
|
- (when (looking-at (concat "^\\([ \t]*\\)%" name "[ \t]*$"))
|
|
|
- (setq tmp (org-feed-make-indented-block
|
|
|
- tmp (org-get-indentation))))))
|
|
|
- (replace-match tmp t t))))
|
|
|
+ (unless (org-capture-escaped-%)
|
|
|
+ (setq name (match-string 1)
|
|
|
+ escape (org-capture-inside-embedded-elisp-p))
|
|
|
+ (cond
|
|
|
+ ((member name '("h" "t" "T" "u" "U" "a"))
|
|
|
+ (setq tmp (symbol-value (intern (concat "v-" name)))))
|
|
|
+ ((setq tmp (plist-get entry (intern (concat ":" name))))
|
|
|
+ (save-excursion
|
|
|
+ (save-match-data
|
|
|
+ (beginning-of-line 1)
|
|
|
+ (when (looking-at
|
|
|
+ (concat "^\\([ \t]*\\)%" name "[ \t]*$"))
|
|
|
+ (setq tmp (org-feed-make-indented-block
|
|
|
+ tmp (org-get-indentation))))))))
|
|
|
+ (when tmp
|
|
|
+ ;; escape string delimiters `"' when inside %() embedded lisp
|
|
|
+ (when escape
|
|
|
+ (setq tmp (replace-regexp-in-string "\"" "\\\\\"" tmp)))
|
|
|
+ (replace-match tmp t t))))
|
|
|
+
|
|
|
+ ;; %() embedded elisp
|
|
|
+ (org-capture-expand-embedded-elisp)
|
|
|
+
|
|
|
(decode-coding-string
|
|
|
(buffer-string) (detect-coding-region (point-min) (point-max) t))))))
|
|
|
|