Merge branch 'master' of orgmode.org:org-mode

This commit is contained in:
Eric Schulte 2011-02-10 09:35:05 -07:00
commit 840052b910
11 changed files with 249 additions and 103 deletions

View File

@ -6880,7 +6880,7 @@ the easiest way to maintain it is through the following commands
@cindex files, adding to agenda list
@table @kbd
@orgcmd{C-c [,org-agenda-to-front}
@orgcmd{C-c [,org-agenda-file-to-front}
Add current file to the list of agenda files. The file is added to
the front of the list. If it was already in the list, it is moved to
the front. With a prefix argument, file is added/moved to the end.
@ -7098,14 +7098,15 @@ following to one your your agenda files:
You can then go ahead and define anniversaries for a BBDB record. Basically,
you need to press @kbd{C-o anniversary @key{RET}} with the cursor in a BBDB
record and then add the date in the format @code{YYYY-MM-DD}, followed by a
space and the class of the anniversary (@samp{birthday} or @samp{wedding}, or
a format string). If you omit the class, it will default to @samp{birthday}.
Here are a few examples, the header for the file @file{org-bbdb.el} contains
more detailed information.
record and then add the date in the format @code{YYYY-MM-DD} or @code{MM-DD},
followed by a space and the class of the anniversary (@samp{birthday} or
@samp{wedding}, or a format string). If you omit the class, it will default to
@samp{birthday}. Here are a few examples, the header for the file
@file{org-bbdb.el} contains more detailed information.
@example
1973-06-22
06-22
1955-08-02 wedding
2008-04-14 %s released version 6.01 of org-mode, %d years ago
@end example
@ -7451,12 +7452,14 @@ will still be searched for stuck projects.
@cindex presentation, of agenda items
@vindex org-agenda-prefix-format
Before displaying items in an agenda view, Org-mode visually prepares
the items and sorts them. Each item occupies a single line. The line
starts with a @emph{prefix} that contains the @emph{category}
(@pxref{Categories}) of the item and other important information. You can
customize the prefix using the option @code{org-agenda-prefix-format}.
The prefix is followed by a cleaned-up version of the outline headline
@vindex org-agenda-tags-column
Before displaying items in an agenda view, Org-mode visually prepares the
items and sorts them. Each item occupies a single line. The line starts
with a @emph{prefix} that contains the @emph{category} (@pxref{Categories})
of the item and other important information. You can customize in which
column tags will be displayed through @code{org-agenda-tags-column}. You can
also customize the prefix using the option @code{org-agenda-prefix-format}.
This prefix is followed by a cleaned-up version of the outline headline
associated with the item.
@menu
@ -8685,8 +8688,8 @@ syntax; it is exported verbatim.
@node Horizontal rules, Comment lines, Emphasis and monospace, Structural markup elements
@subheading Horizontal rules
@cindex horizontal rules, markup rules
A line consisting of only dashes, and at least 5 of them, will be
exported as a horizontal line (@samp{<hr/>} in HTML).
A line consisting of only dashes, and at least 5 of them, will be exported as
a horizontal line (@samp{<hr/>} in HTML and @code{\hrule} in @LaTeX{}).
@node Comment lines, , Horizontal rules, Structural markup elements
@subheading Comment lines
@ -10973,9 +10976,13 @@ of links to all files in the project.
(default) or @code{last} to display folders first or last,
respectively. Any other value will mix files and folders.
@item @code{:sitemap-alphabetically}
@tab The site map is normally sorted alphabetically. Set this explicitly to
@code{nil} to turn off sorting.
@item @code{:sitemap-sort-files}
@tab How the files are sorted in the site map. Set this
@code{alphabetically} (default), @code{chronologically} or
@code{anti-chronologically}. @code{chronologically} sorts the files with
older date first while @code{anti-chronologically} sorts the files with newer
date first. @code{alphabetically} sorts the files alphabetically. The date of
a file is retrieved with @code{org-publish-find-date}.
@item @code{:sitemap-ignore-case}
@tab Should sorting be case-sensitive? Default @code{nil}.

View File

@ -222,7 +222,7 @@ options are taken from `org-babel-default-header-args'."
(car (last lob-info)))
'lob))))
(setq end (+ end (- (length replacement) (length (match-string 0)))))
(replace-match replacement t t)))))
(if replacement (replace-match replacement t t))))))
(defun org-babel-exp-do-export (info type)
"Return a string with the exported content of a code block.

View File

@ -2161,6 +2161,7 @@ Pressing `<' twice means to restrict to the current subtree or region
(put 'org-agenda-redo-command 'org-lprops nil)
;; Remember where this call originated
(setq org-agenda-last-dispatch-buffer (current-buffer))
(kill-local-variable 'org-agenda-current-span)
(unless keys
(setq ans (org-agenda-get-restriction-and-command prefix-descriptions)
keys (car ans)
@ -3609,7 +3610,7 @@ given in `org-agenda-start-on-weekday'."
(when (and org-agenda-clockreport-mode clocktable-start)
(let ((org-agenda-files (org-agenda-files nil 'ifmode))
;; the above line is to ensure the restricted range!
(p org-agenda-clockreport-parameter-plist)
(p (copy-sequence org-agenda-clockreport-parameter-plist))
tbl)
(setq p (org-plist-delete p :block))
(setq p (plist-put p :tstart clocktable-start))
@ -3623,7 +3624,6 @@ given in `org-agenda-start-on-weekday'."
""
x))
filter ""))))
(message "%s" (plist-get p :tags)) (sit-for 2)
(setq tbl (apply 'org-get-clocktable p))
(insert tbl)))
(goto-char (point-min))
@ -4489,7 +4489,8 @@ the documentation of `org-diary'."
(while (setq arg (pop args))
(cond
((and (eq arg :todo)
(equal date (calendar-current-date)))
(equal date (calendar-gregorian-from-absolute
(org-today))))
(setq rtn (org-agenda-get-todos))
(setq results (append results rtn)))
((eq arg :timestamp)
@ -5921,7 +5922,7 @@ to switch to narrowing."
(effort-prompt "")
(inhibit-read-only t)
(current org-agenda-filter)
a n tag)
maybe-reftresh a n tag)
(unless char
(message
"%s by tag [%s ], [TAB], %s[/]:off, [+-]:narrow, [>=<?]:effort: "
@ -5967,11 +5968,13 @@ to switch to narrowing."
(if modifier
(push modifier org-agenda-filter))))
(if (not (null org-agenda-filter))
(org-agenda-filter-apply org-agenda-filter))))
(org-agenda-filter-apply org-agenda-filter)))
(setq maybe-reftresh t))
((equal char ?/)
(org-agenda-filter-by-tag-show-all)
(when (get 'org-agenda-filter :preset-filter)
(org-agenda-filter-apply org-agenda-filter)))
(org-agenda-filter-apply org-agenda-filter))
(setq maybe-reftresh t))
((or (equal char ?\ )
(setq a (rassoc char alist))
(and (>= char ?0) (<= char ?9)
@ -5987,8 +5990,12 @@ to switch to narrowing."
(setq org-agenda-filter
(cons (concat (if strip "-" "+") tag)
(if narrow current nil)))
(org-agenda-filter-apply org-agenda-filter))
(t (error "Invalid tag selection character %c" char)))))
(org-agenda-filter-apply org-agenda-filter)
(setq maybe-reftresh t))
(t (error "Invalid tag selection character %c" char)))
(when (and maybe-reftresh
(eq org-agenda-clockreport-mode 'with-filter))
(org-agenda-redo))))
(defun org-agenda-get-represented-tags ()
"Get a list of all tags currently represented in the agenda."

View File

@ -136,12 +136,12 @@
'(("birthday" lambda
(name years suffix)
(concat "Birthday: [[bbdb:" name "][" name " ("
(number-to-string years)
(format "%s" years) ; handles numbers as well as strings
suffix ")]]"))
("wedding" lambda
(name years suffix)
(concat "[[bbdb:" name "][" name "'s "
(number-to-string years)
(format "%s" years)
suffix " wedding anniversary]]")))
"How different types of anniversaries should be formatted.
An alist of elements (STRING . FORMAT) where STRING is the name of an
@ -239,11 +239,16 @@ italicized, in all other cases it is left unchanged."
(defun org-bbdb-anniv-extract-date (time-str)
"Convert YYYY-MM-DD to (month date year).
Argument TIME-STR is the value retrieved from BBDB."
(multiple-value-bind (y m d) (values-list (bbdb-split time-str "-"))
(list (string-to-number m)
(string-to-number d)
(string-to-number y))))
Argument TIME-STR is the value retrieved from BBDB. If YYYY- is omitted
it will be considered unknown."
(multiple-value-bind (a b c) (values-list (bbdb-split time-str "-"))
(if (eq c nil)
(list (string-to-number a)
(string-to-number b)
nil)
(list (string-to-number b)
(string-to-number c)
(string-to-number a)))))
(defun org-bbdb-anniv-split (str)
"Split multiple entries in the BBDB anniversary field.
@ -326,8 +331,12 @@ This is used by Org to re-create the anniversary hash table."
class org-bbdb-anniversary-format-alist t))
class)) ; (as format string)
(name (nth 1 rec))
(years (- y (car rec)))
(suffix (diary-ordinal-suffix years))
(years (if (eq (car rec) nil)
"unknown"
(- y (car rec))))
(suffix (if (eq (car rec) nil)
""
(diary-ordinal-suffix years)))
(tmp (cond
((functionp form)
(funcall form name years suffix))

View File

@ -103,6 +103,15 @@ This setting can also be overridden in the CRYPTKEY property."
(and (boundp 'epa-file-encrypt-to) epa-file-encrypt-to)
(message "No crypt key set, using symmetric encryption."))))
(defun org-encrypt-string (str crypt-key)
"Return STR encrypted with CRYPT-KEY."
;; Text and key have to be identical, otherwise we re-crypt.
(if (and (string= crypt-key (get-text-property 0 'org-crypt-key str))
(string= (sha1 str) (get-text-property 0 'org-crypt-checksum str)))
(get-text-property 0 'org-crypt-text str)
(let ((epg-context (epg-make-context nil t t)))
(epg-encrypt-string epg-context str (epg-list-keys epg-context crypt-key)))))
(defun org-encrypt-entry ()
"Encrypt the content of the current headline."
(interactive)
@ -122,10 +131,7 @@ This setting can also be overridden in the CRYPTKEY property."
(org-back-over-empty-lines)
(setq end (point)
encrypted-text
(epg-encrypt-string
epg-context
(buffer-substring-no-properties beg end)
(epg-list-keys epg-context crypt-key)))
(org-encrypt-string (buffer-substring beg end) crypt-key))
(delete-region beg end)
(insert encrypted-text)
(when folded
@ -152,16 +158,24 @@ This setting can also be overridden in the CRYPTKEY property."
(forward-line)
(point)))
(epg-context (epg-make-context nil t t))
(encrypted-text (buffer-substring-no-properties (point) end))
(decrypted-text
(decode-coding-string
(epg-decrypt-string
epg-context
(buffer-substring-no-properties (point) end))
encrypted-text)
'utf-8)))
;; Delete region starting just before point, because the
;; outline property starts at the \n of the heading.
(delete-region (1- (point)) end)
(insert "\n" decrypted-text)
;; Store a checksum of the decrypted and the encrypted
;; text value. This allow to reuse the same encrypted text
;; if the text does not change, and therefore avoid a
;; re-encryption process.
(insert "\n" (propertize decrypted-text
'org-crypt-checksum (sha1 decrypted-text)
'org-crypt-key (org-crypt-key-for-heading)
'org-crypt-text encrypted-text))
(when heading-was-invisible-p
(goto-char heading-point)
(org-flag-subtree t))

View File

@ -64,7 +64,7 @@ tree can be found."
(goto-char (prog1 (point) (widen))))))
(defun org-datetree-find-year-create (year)
(let ((re "^\\*+[ \t]+\\([12][0-9][0-9][0-9]\\)[ \t\n]")
(let ((re "^\\*+[ \t]+\\([12][0-9][0-9][0-9]\\)[ \t]*$")
match)
(goto-char (point-min))
(while (and (setq match (re-search-forward re nil t))
@ -83,7 +83,7 @@ tree can be found."
(defun org-datetree-find-month-create (year month)
(org-narrow-to-subtree)
(let ((re (format "^\\*+[ \t]+%d-\\([01][0-9]\\)[ \t\n]" year))
(let ((re (format "^\\*+[ \t]+%d-\\([01][0-9]\\)[ \t]*$" year))
match)
(goto-char (point-min))
(while (and (setq match (re-search-forward re nil t))
@ -102,7 +102,7 @@ tree can be found."
(defun org-datetree-find-day-create (year month day)
(org-narrow-to-subtree)
(let ((re (format "^\\*+[ \t]+%d-%02d-\\([0123][0-9]\\)[ \t\n]" year month))
(let ((re (format "^\\*+[ \t]+%d-%02d-\\([0123][0-9]\\)[ \t]*$" year month))
match)
(goto-char (point-min))
(while (and (setq match (re-search-forward re nil t))

View File

@ -388,7 +388,7 @@ Good for general initialization")
"Hook for preprocessing an export buffer.
Pretty much the first thing when exporting is running this hook.
Point will be in a temporary buffer that contains a copy of
the original buffer, or of the section that is being export.
the original buffer, or of the section that is being exported.
All the other hooks in the org-export-preprocess... category
also work in that temporary buffer, already modified by various
stages of the processing.")
@ -963,6 +963,7 @@ value of `org-export-run-in-background'."
(setq r1 (read-char-exclusive)))
(error "No enclosing node with LaTeX_CLASS or EXPORT_FILE_NAME")
)))))
(redisplay)
(and bpos (goto-char bpos))
(setq r2 (if (< r1 27) (+ r1 96) r1))
(unless (setq ass (assq r2 cmds))

View File

@ -186,7 +186,35 @@ If `org-store-link' was called with a prefix arg the meaning of
link (org-gnus-article-link
group newsgroups message-id x-no-archive))
(org-add-link-props :link link :description desc)
link))))
link))
((eq major-mode 'message-mode)
(setq org-store-link-plist nil) ; reset
(save-excursion
(save-restriction
(message-narrow-to-headers)
(and (not (message-fetch-field "Message-ID"))
(message-generate-headers '(Message-ID)))
(goto-char (point-min))
(re-search-forward "^Message-ID: *.*$" nil t)
(put-text-property (match-beginning 0) (match-end 0) 'message-deletable nil)
(let ((gcc (car (last
(message-unquote-tokens
(message-tokenize-header (mail-fetch-field "gcc" nil t) " ,")))))
(id (org-remove-angle-brackets (mail-fetch-field "Message-ID")))
(to (mail-fetch-field "To"))
(from (mail-fetch-field "From"))
(subject (mail-fetch-field "Subject"))
desc link
newsgroup xarchive) ; those are always nil for gcc
(and (not gcc)
(error "Can not create link: No Gcc header found."))
(org-store-link-props :type "gnus" :from from :subject subject
:message-id id :group gcc :to to)
(setq desc (org-email-link-description)
link (org-gnus-article-link
gcc newsgroup id xarchive))
(org-add-link-props :link link :description desc)
link))))))
(defun org-gnus-open-nntp (path)
"Follow the nntp: link specified by PATH."

View File

@ -2270,7 +2270,7 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
;; Convert horizontal rules
(goto-char (point-min))
(while (re-search-forward "^----+.$" nil t)
(while (re-search-forward "^[ \t]*-\\{5,\\}[ \t]*$" nil t)
(org-if-unprotected
(replace-match (org-export-latex-protect-string "\\hrule") t t)))

View File

@ -83,27 +83,28 @@ supported by MH-E."
"Store a link to an MH-E folder or message."
(when (or (equal major-mode 'mh-folder-mode)
(equal major-mode 'mh-show-mode))
(let* ((from (org-mhe-get-header "From:"))
(to (org-mhe-get-header "To:"))
(message-id (org-mhe-get-header "Message-Id:"))
(subject (org-mhe-get-header "Subject:"))
(date (org-mhe-get-header "Date:"))
(date-ts (and date (format-time-string
(org-time-stamp-format t) (date-to-time date))))
(date-ts-ia (and date (format-time-string
(org-time-stamp-format t t)
(date-to-time date))))
link desc)
(org-store-link-props :type "mh" :from from :to to
:subject subject :message-id message-id)
(when date
(org-add-link-props :date date :date-timestamp date-ts
:date-timestamp-inactive date-ts-ia))
(setq desc (org-email-link-description))
(setq link (org-make-link "mhe:" (org-mhe-get-message-real-folder) "#"
(org-remove-angle-brackets message-id)))
(org-add-link-props :link link :description desc)
link)))
(save-window-excursion
(let* ((from (org-mhe-get-header "From:"))
(to (org-mhe-get-header "To:"))
(message-id (org-mhe-get-header "Message-Id:"))
(subject (org-mhe-get-header "Subject:"))
(date (org-mhe-get-header "Date:"))
(date-ts (and date (format-time-string
(org-time-stamp-format t) (date-to-time date))))
(date-ts-ia (and date (format-time-string
(org-time-stamp-format t t)
(date-to-time date))))
link desc)
(org-store-link-props :type "mh" :from from :to to
:subject subject :message-id message-id)
(when date
(org-add-link-props :date date :date-timestamp date-ts
:date-timestamp-inactive date-ts-ia))
(setq desc (org-email-link-description))
(setq link (org-make-link "mhe:" (org-mhe-get-message-real-folder) "#"
(org-remove-angle-brackets message-id)))
(org-add-link-props :link link :description desc)
link))))
(defun org-mhe-open (path)
"Follow an MH-E message link specified by PATH."

View File

@ -186,8 +186,9 @@ sitemap of files or summary page for a given project.
Set this to `first' (default) or `last' to
display folders first or last, respectively.
Any other value will mix files and folders.
:sitemap-alphabetically The site map is normally sorted alphabetically.
Set this explicitly to nil to turn off sorting.
:sitemap-sort-files The site map is normally sorted alphabetically.
You can change this behaviour setting this to
`chronologically', `anti-chronologically' or nil.
:sitemap-ignore-case Should sorting be case-sensitive? Default nil.
The following properties control the creation of a concept index.
@ -233,13 +234,18 @@ Any changes made by this hook will be saved."
:group 'org-publish
:type 'hook)
(defcustom org-publish-sitemap-sort-alphabetically t
"Should sitemaps be sorted alphabetically by default?
(defcustom org-publish-sitemap-sort-files 'alphabetically
"How sitemaps files should be sorted by default?
Possible values are `alphabetically', `chronologically', `anti-chronologically' and nil.
If `alphabetically', files will be sorted alphabetically.
If `chronologically', files will be sorted with older modification time first.
If `anti-chronologically', files will be sorted with newer modification time first.
nil won't sort files.
You can overwrite this default per project in your
`org-publish-project-alist', using `:sitemap-alphabetically'."
`org-publish-project-alist', using `:sitemap-sort-files'."
:group 'org-publish
:type 'boolean)
:type 'symbol)
(defcustom org-publish-sitemap-sort-folders 'first
"A symbol, denoting if folders are sorted first in sitemaps.
@ -261,6 +267,22 @@ You can overwrite this default per project in your
:group 'org-publish
:type 'boolean)
(defcustom org-publish-sitemap-date-format "%Y-%m-%d"
"Format for `format-time-string' which is used to print a date
in the sitemap."
:group 'org-publish
:type 'string)
(defcustom org-publish-sitemap-file-entry-format "%T"
"How a sitemap file entry is formated.
You could use brackets to delimit on what part the link will be.
%T is the title.
%A is the author.
%D is the date formated using `org-publish-sitemap-date-format'."
:group 'org-publish
:type 'string)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Timestamp-related functions
@ -360,30 +382,41 @@ This splices all the components into the list."
(nreverse (org-publish-delete-dups (delq nil rtn)))))
(defvar sitemap-alphabetically)
(defvar sitemap-sort-files)
(defvar sitemap-sort-folders)
(defvar sitemap-ignore-case)
(defvar sitemap-requested)
(defvar sitemap-date-format)
(defvar sitemap-file-entry-format)
(defun org-publish-compare-directory-files (a b)
"Predicate for `sort', that sorts folders-first/last and alphabetically."
"Predicate for `sort', that sorts folders and files for sitemap."
(let ((retval t))
(when (or sitemap-alphabetically sitemap-sort-folders)
;; First we sort alphabetically:
(when sitemap-alphabetically
(let* ((adir (file-directory-p a))
(aorg (and (string-match "\\.org$" a) (not adir)))
(bdir (file-directory-p b))
(borg (and (string-match "\\.org$" b) (not bdir)))
(A (if aorg
(concat (file-name-directory a)
(org-publish-find-title a)) a))
(B (if borg
(concat (file-name-directory b)
(org-publish-find-title b)) b)))
(setq retval (if sitemap-ignore-case
(not (string-lessp (upcase B) (upcase A)))
(not (string-lessp B A))))))
(when (or sitemap-sort-files sitemap-sort-folders)
;; First we sort files:
(when sitemap-sort-files
(cond ((equal sitemap-sort-files 'alphabetically)
(let* ((adir (file-directory-p a))
(aorg (and (string-match "\\.org$" a) (not adir)))
(bdir (file-directory-p b))
(borg (and (string-match "\\.org$" b) (not bdir)))
(A (if aorg
(concat (file-name-directory a)
(org-publish-find-title a)) a))
(B (if borg
(concat (file-name-directory b)
(org-publish-find-title b)) b)))
(setq retval (if sitemap-ignore-case
(not (string-lessp (upcase B) (upcase A)))
(not (string-lessp B A))))))
((or (equal sitemap-sort-files 'chronologically)
(equal sitemap-sort-files 'anti-chronologically))
(let* ((adate (org-publish-find-date a))
(bdate (org-publish-find-date b))
(A (+ (lsh (car adate) 16) (cadr adate)))
(B (+ (lsh (car bdate) 16) (cadr bdate))))
(setq retval (if (equal sitemap-sort-files 'chronologically)
(<= A B)
(>= A B)))))))
;; Directory-wise wins:
(when sitemap-sort-folders
;; a is directory, b not:
@ -441,10 +474,14 @@ matching filenames."
(if (plist-member project-plist :sitemap-sort-folders)
(plist-get project-plist :sitemap-sort-folders)
org-publish-sitemap-sort-folders))
(sitemap-alphabetically
(if (plist-member project-plist :sitemap-alphabetically)
(plist-get project-plist :sitemap-alphabetically)
org-publish-sitemap-sort-alphabetically))
(sitemap-sort-files
(cond ((plist-member project-plist :sitemap-sort-files)
(plist-get project-plist :sitemap-sort-files))
;; For backward compatibility:
((plist-member project-plist :sitemap-alphabetically)
(if (plist-get project-plist :sitemap-alphabetically)
'alphabetically nil))
(t org-publish-sitemap-sort-files)))
(sitemap-ignore-case
(if (plist-member project-plist :sitemap-ignore-case)
(plist-get project-plist :sitemap-ignore-case)
@ -487,10 +524,10 @@ matching filenames."
(e (plist-get (cdr prj) :exclude))
(i (plist-get (cdr prj) :include))
(xm (concat "^" b (if r ".+" "[^/]+") "\\.\\(" x "\\)$")))
(when (or
(when
(or
(and
i
(member filename
i (member filename
(mapcar
(lambda (file) (expand-file-name file b))
i)))
@ -684,6 +721,10 @@ If :makeindex is set, also produce a file theindex.org."
"sitemap.org"))
(sitemap-function (or (plist-get project-plist :sitemap-function)
'org-publish-org-sitemap))
(sitemap-date-format (or (plist-get project-plist :sitemap-date-format)
org-publish-sitemap-date-format))
(sitemap-file-entry-format (or (plist-get project-plist :sitemap-file-entry-format)
org-publish-sitemap-file-entry-format))
(preparation-function (plist-get project-plist :preparation-function))
(completion-function (plist-get project-plist :completion-function))
(files (org-publish-get-base-files project exclude-regexp)) file)
@ -759,12 +800,32 @@ Default for SITEMAP-FILENAME is 'sitemap.org'."
(setq indent-str (make-string
(+ (length indent-str) 2) ?\ )))))))
;; This is common to 'flat and 'tree
(insert (concat indent-str " + [[file:" link "]["
(org-publish-find-title file)
"]]\n")))))
(let ((entry
(org-publish-format-file-entry sitemap-file-entry-format
file project-plist))
(regexp "\\(.*\\)\\[\\([^][]+\\)\\]\\(.*\\)"))
(cond ((string-match-p regexp entry)
(string-match regexp entry)
(insert (concat indent-str " + " (match-string 1 entry)
"[[file:" link "]["
(match-string 2 entry)
"]]" (match-string 3 entry) "\n")))
(t
(insert (concat indent-str " + [[file:" link "]["
entry
"]]\n"))))))))
(save-buffer))
(or visiting (kill-buffer sitemap-buffer))))
(defun org-publish-format-file-entry (fmt file project-plist)
(org-replace-escapes fmt
(list (cons "%T" (org-publish-find-title file))
(cons "%D" (format-time-string
sitemap-date-format
(org-publish-find-date file)))
(cons "%A" (or (plist-get project-plist :author)
user-full-name)))))
(defun org-publish-find-title (file)
"Find the title of FILE in project."
(or
@ -786,6 +847,24 @@ Default for SITEMAP-FILENAME is 'sitemap.org'."
(org-publish-cache-set-file-property file :title title)
title)))
(defun org-publish-find-date (file)
"Find the date of FILE in project.
If FILE provides a #+date keyword use it else use the file
system's modification time.
It returns time in `current-time' format."
(let ((visiting (find-buffer-visiting file)))
(save-excursion
(switch-to-buffer (or visiting (find-file file)))
(let* ((plist (org-infile-export-plist))
(date (plist-get plist :date)))
(unless visiting
(kill-buffer (current-buffer)))
(if date
(org-time-string-to-time date)
(when (file-exists-p file)
(nth 5 (file-attributes file))))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Interactive publishing functions