diff --git a/lisp/org-publish.el b/lisp/org-publish.el index 54d489c..2c3ff7b 100644 --- a/lisp/org-publish.el +++ b/lisp/org-publish.el @@ -583,8 +583,10 @@ Default for INDEX-FILENAME is 'index.org'." (let* ((project-plist (cdr project)) (dir (file-name-as-directory (plist-get project-plist :base-directory))) + (localdir (file-name-directory dir)) + (indent-str (make-string 2 ? )) (exclude-regexp (plist-get project-plist :exclude)) - (files (org-publish-get-base-files project exclude-regexp)) + (files (nreverse (org-publish-get-base-files project exclude-regexp))) (index-filename (concat dir (or index-filename "index.org"))) (index-title (or (plist-get project-plist :index-title) (concat "Index for project " (car project)))) @@ -597,15 +599,34 @@ Default for INDEX-FILENAME is 'index.org'." (with-temp-buffer (insert (concat index-title "\n\n")) (while (setq file (pop files)) - (let ((fn (file-name-nondirectory file))) + (let ((fn (file-name-nondirectory file)) + (link (file-relative-name file dir)) + (oldlocal localdir)) ;; index shouldn't index itself - (unless (string= fn ifn) - (insert (concat " + [[file:" fn "][" + (unless (string= fn ifn) + (setq localdir (concat (file-name-as-directory dir) (file-name-directory link))) + (unless (string= localdir oldlocal) + (if (string= localdir dir) + (setq indent-str (make-string 2 ? )) + (let ((subdirs + (split-string + (directory-file-name + (file-name-directory + (file-relative-name localdir dir))) "/")) + (subdir "")) + (setq indent-str (make-string 2 ? )) + (dolist (d subdirs) + (setq subdir (concat subdir d "/")) + (insert (concat indent-str " + [[file:" subdir "][" d "/]]\n")) + (setq indent-str (make-string (+ (length indent-str) 2) ? )))))) + (insert (concat indent-str " + [[file:" link "][" (file-name-sans-extension fn) "]]\n"))))) (write-file index-filename) (kill-buffer (current-buffer))))) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Interactive publishing functions