diff options
author | Manuel Giraud <manuel.giraud@univ-nantes.fr> | 2011-02-09 17:23:54 +0000 |
---|---|---|
committer | Bastien Guerry <bzg@altern.org> | 2011-02-09 17:12:18 +0100 |
commit | 641144ef2622841e328fe877427e91a12b951ede (patch) | |
tree | 161f68f2094be12b7071cfbf78aac8fc259bf532 | |
parent | c56d295b9b96cb081e6e8263197816a7c6768773 (diff) | |
download | org-mode-641144ef2622841e328fe877427e91a12b951ede.tar.gz |
org-publish.el: allow formatting of sitemap entries.
* org-publish.el (org-publish-sitemap-date-format)
(org-publish-sitemap-file-entry-format): new custom variables.
(org-publish-projects): use these variables to format the
sitemap entries.
-rw-r--r-- | lisp/org-publish.el | 63 |
1 files changed, 54 insertions, 9 deletions
diff --git a/lisp/org-publish.el b/lisp/org-publish.el index 47b80db..98e09f3 100644 --- a/lisp/org-publish.el +++ b/lisp/org-publish.el @@ -267,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 @@ -370,6 +386,8 @@ This splices all the components into the list." (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 and files for sitemap." (let ((retval t)) @@ -392,8 +410,10 @@ This splices all the components into the list." (not (string-lessp B A)))))) ((or (equal sitemap-sort-files 'chronologically) (equal sitemap-sort-files 'anti-chronologically)) - (let ((A (org-publish-find-date a)) - (B (org-publish-find-date b))) + (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))))))) @@ -701,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) @@ -776,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 @@ -806,7 +850,9 @@ Default for SITEMAP-FILENAME is 'sitemap.org'." (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." +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))) @@ -815,10 +861,9 @@ system's modification time." (unless visiting (kill-buffer (current-buffer))) (if date - (let ((dt (org-time-string-to-time date))) - (+ (lsh (car dt) 16) (cadr dt))) + (org-time-string-to-time date) (when (file-exists-p file) - (org-publish-cache-ctime-of-src file))))))) + (nth 5 (file-attributes file)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Interactive publishing functions |