|
@@ -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
|