emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/textmodes/org-publish.el,v


From: Carsten Dominik
Subject: [Emacs-diffs] Changes to emacs/lisp/textmodes/org-publish.el,v
Date: Thu, 13 Mar 2008 08:59:01 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     <uid#66880>     08/03/13 08:59:01

Index: org-publish.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/textmodes/org-publish.el,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- org-publish.el      14 Feb 2008 01:00:23 -0000      1.23
+++ org-publish.el      13 Mar 2008 08:59:01 -0000      1.24
@@ -3,8 +3,9 @@
 ;; Copyright (C) 2006, 2007, 2008  Free Software Foundation, Inc.
 
 ;; Author: David O'Toole <address@hidden>
-;; Keywords: hypermedia, outlines
-;; Version: 1.80b
+;; Maintainer: Bastien Guerry <bzg AT altern DOT org>
+;; Keywords: hypermedia, outlines, wp
+;; Version: 5.23a
 
 ;; This file is part of GNU Emacs.
 ;;
@@ -26,24 +27,17 @@
 ;;; Commentary:
 
 ;; Requires at least version 4.27 of org.el
-;;
-;; The official org-mode website:
-;; http://staff.science.uva.nl/~dominik/Tools/org/
-;;
-;; Home page for org-publish.el:
-;; http://dto.freeshell.org/notebook/OrgMode.html
 
-;; This program extends the HTML publishing support of Emacs Org-mode
-;; to allow configurable publishing of related sets of files as a
-;; complete website.
+;; This program allow configurable publishing of related sets of
+;; Org-mode files as a complete website.
 ;;
 ;; org-publish.el can do the following:
 ;;
-;; + Publish all one's org-files to html
-;; + Upload html, images, attachments and other files to a web server
+;; + Publish all one's org-files to HTML or LaTeX
+;; + Upload HTML, images, attachments and other files to a web server
 ;; + Exclude selected private pages from publishing
 ;; + Publish a clickable index of pages
-;; + Manage local timestamps, for publishing only changed files
+;; + Manage local timestamps for publishing only changed files
 ;; + Accept plugin functions to extend range of publishable content
 ;;
 ;; Special thanks to the org-mode maintainer Carsten Dominik for his
@@ -85,6 +79,7 @@
 ;;                  :publishing-directory "~/public_html"
 ;;                   :with-section-numbers nil
 ;;                  :table-of-contents nil
+;;                   :recursive t
 ;;                  :style "<link rel=stylesheet href=\"../other/mystyle.css\" 
type=\"text/css\">")))
 
 ;;;; More complex example configuration:
@@ -116,12 +111,10 @@
 ;;                    :style "<link rel=stylesheet 
href=\"../other/mystyle.css\" type=\"text/css\">"
 ;;                    :auto-preamble t
 ;;                    :auto-postamble nil)
-;;
 ;;         ("images" :base-directory "~/images/"
 ;;                  :base-extension "jpg\\|gif\\|png"
 ;;                  :publishing-directory "/ssh:address@hidden:~/html/images/"
 ;;                  :publishing-function org-publish-attachment)
-;;
 ;;         ("other"  :base-directory "~/other/"
 ;;                  :base-extension "css"
 ;;                  :publishing-directory "/ssh:address@hidden:~/html/other/"
@@ -135,7 +128,6 @@
 ;; within emacs. You can always just publish to local folders, and
 ;; then use the synchronization/upload tool of your choice.
 
-
 ;;; List of user-visible changes since version 1.27
 
 ;; 1.78: Allow list-valued :publishing-function
@@ -158,17 +150,16 @@
 
 ;;; Code:
 
-
 (eval-when-compile
   (require 'cl))
 
+(require 'dired-aux)
 
 (defgroup org-publish nil
        "Options for publishing a set of Org-mode and related files."
    :tag "Org Publishing"
    :group 'org)
 
-
 (defcustom org-publish-project-alist nil
   "Association list to control publishing behavior.
 Each element of the alist is a publishing 'project.'  The CAR of
@@ -269,12 +260,10 @@
     :index-function        Plugin function to use for generation of index.
                            Defaults to 'org-publish-org-index', which
                            generates a plain list of links to all files
-                           in the project.
-"
+                         in the project."
   :group 'org-publish
   :type 'alist)
 
-
 (defcustom org-publish-use-timestamps-flag t
   "When non-nil, use timestamp checking to publish only changed files.
 When nil, do no timestamp checking and always publish all
@@ -282,327 +271,385 @@
   :group 'org-publish
   :type 'boolean)
 
-
 (defcustom org-publish-timestamp-directory "~/.org-timestamps/"
   "Name of directory in which to store publishing timestamps."
   :group 'org-publish
-  :type 'string)
+  :type 'directory)
 
+(defcustom org-publish-before-export-hook nil
+  "Hook run before export on the Org file.
+If the functions in this hook modify the original Org buffer, the
+modified buffer will be used for export, but the buffer will be
+restored and saved back to its initial state after export."
+  :group 'org-publish
+  :type 'hook)
 
-;;;; Timestamp-related functions
+(defcustom org-publish-after-export-hook nil
+  "Hook run after export on the exported buffer.
+If functions in this hook modify the buffer, it will be saved."
+  :group 'org-publish
+  :type 'hook)
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Timestamp-related functions
 
 (defun org-publish-timestamp-filename (filename)
   "Return path to timestamp file for filename FILENAME."
-  (while (string-match "~\\|/\\|:/" filename)
+  (while (string-match
+         (if (eq system-type 'windows-nt) "~\\|/\\|:" "~\\|/") filename)
     (setq filename (replace-match "_" nil t filename)))
   (concat org-publish-timestamp-directory filename ".timestamp"))
 
-
 (defun org-publish-needed-p (filename)
-  "Check whether file should be published.
-If org-publish-use-timestamps-flag is set to nil, this function always
-returns t. Otherwise, check the timestamps folder to determine
-whether file should be published."
+  "Return `t' if FILENAME should be published."
   (if org-publish-use-timestamps-flag
-      (progn
-       ;;
-       ;; create folder if needed
-       (if (not (file-exists-p org-publish-timestamp-directory))
-           (make-directory org-publish-timestamp-directory)
+      (if (file-exists-p org-publish-timestamp-directory)
+         ;; first handle possible wrong timestamp directory
          (if (not (file-directory-p org-publish-timestamp-directory))
-             (error "org-publish-timestamp-directory must be a directory.")))
-       ;;
-       ;; check timestamp. ok if timestamp file doesn't exist
-       (let* ((timestamp (org-publish-timestamp-filename filename))
-              (rtn (file-newer-than-file-p filename timestamp)))
-         (if rtn
-             ;; handle new timestamps
-             (if (not (file-exists-p timestamp))
-                 ;; create file
-                 (with-temp-buffer
-                   (make-directory (file-name-directory timestamp) :parents)
-                   (write-file timestamp)
-                   (kill-buffer (current-buffer)))))
-         rtn))
+             (error "Org publish timestamp: %s is not a directory"
+                    org-publish-timestamp-directory)
+           ;; there is a timestamp, check if FILENAME is newer
+           (file-newer-than-file-p
+            filename (org-publish-timestamp-filename filename))))
+    ;; don't use timestamps, always return t
     t))
 
-
 (defun org-publish-update-timestamp (filename)
-  "Update publishing timestamp for file FILENAME."
-  (let ((timestamp (org-publish-timestamp-filename filename)))
-    ;; Emacs 21 doesn't have set-file-times
-    (if (fboundp 'set-file-times)
-        (set-file-times timestamp)
-      (call-process "touch" nil 0 nil timestamp))))
-
-
-;;;; A hash mapping files to project names
-
-
-(defvar org-publish-files (make-hash-table :test 'equal) "Hash
-table mapping file names to project names.")
-
-
-;;;; Checking filenames against this hash
-
-
-(defun org-publish-validate-link (link &optional directory)
-  (gethash (file-truename (expand-file-name link directory))
-          org-publish-files))
-
-
-;;;; Getting project information out of org-publish-project-alist
-
-
-(defun org-publish-get-plists (&optional project-name)
- "Return a list of property lists for project PROJECT-NAME.
-When argument is not given, return all property lists for all projects."
- (let ((alist (if project-name
-                  (list (assoc project-name org-publish-project-alist))
-                org-publish-project-alist))
-       (project nil)
-       (plists nil)
-       (single nil)
-       (components nil))
-
-   ;;
-   ;;
-   (while (setq project (pop alist))
-     ;; what kind of project is it?
-     (if (setq components (plist-get (cdr project) :components))
-         ;; meta project. annotate each plist with name of enclosing project
-         (setq single
-               (apply 'append
-                      (mapcar 'org-publish-get-plists components)))
-       ;; normal project
-       (setq single (list (cdr project))))
-     ;;
-     (setq plists (append plists single))
-     (dolist (p single)
-       (let* ((exclude (plist-get p :exclude))
-              (files (org-publish-get-base-files p exclude)))
-         (dolist (f files)
-           (puthash (file-truename f) (car project) org-publish-files)))))
-   plists))
-
-
+  "Update publishing timestamp for file FILENAME.
+If there is no timestamp, create one."
+  (let ((timestamp-file (org-publish-timestamp-filename filename))
+       newly-created-timestamp)
+    (if (not (file-exists-p timestamp-file))
+       ;; create timestamp file if needed
+       (with-temp-buffer
+         (make-directory (file-name-directory timestamp-file) t)
+         (write-file timestamp-file)
+         (setq newly-created-timestamp t)))
+    ;; Emacs 21 doesn't have `set-file-times'
+    (if (and (fboundp 'set-file-times)
+            (not newly-created-timestamp))
+        (set-file-times timestamp-file)
+      (call-process "touch" nil 0 nil timestamp-file))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Mapping files to project names
+
+(defvar org-publish-files-alist nil
+  "Alist of files and their parent project.
+Each element of this alist is of the form:
+
+  (file-name . project-name)")
+
+(defun org-publish-initialize-files-alist (&optional refresh)
+  "Set `org-publish-files-alist' if it is not set.
+Also set it if the optional argument REFRESH is non-nil."
+  (interactive "P")
+  (when (or refresh (not org-publish-files-alist))
+    (setq org-publish-files-alist
+         (org-publish-get-files org-publish-project-alist))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Compatibility aliases
+
+;; Delete-dups is not in Emacs <22
+(if (fboundp 'delete-dups)
+    (defalias 'org-publish-delete-dups 'delete-dups)
+  (defun org-publish-delete-dups (list)
+    "Destructively remove `equal' duplicates from LIST.
+Store the result in LIST and return it.  LIST must be a proper list.
+Of several `equal' occurrences of an element in LIST, the first
+one is kept.
+
+This is a compatibility function for Emacsen without `delete-dups'."
+    ;; Code from `subr.el' in Emacs 22:
+    (let ((tail list))
+      (while tail
+       (setcdr tail (delete (car tail) (cdr tail)))
+       (setq tail (cdr tail))))
+    list))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Getting project information out of org-publish-project-alist
+
+(defun org-publish-get-files (projects-alist &optional no-exclusion)
+  "Return the list of all publishable files for PROJECTS-ALIST.
+If NO-EXCLUSION is non-nil, don't exclude files."
+  (let (all-files)
+    ;; add all projects
+    (mapc
+     (lambda(p)
+       (let* ((exclude (plist-get (cdr p) :exclude))
+             (files (and p (org-publish-get-base-files p exclude))))
+        ;; add all files from this project
+        (mapc (lambda(f)
+                (add-to-list 'all-files
+                             (cons (expand-file-name f) (car p))))
+              files)))
+     (org-publish-expand-projects projects-alist))
+    all-files))
+
+(defun org-publish-expand-projects (projects-alist)
+  "Expand projects contained in PROJECTS-ALIST."
+  (let (without-component with-component)
+    (mapc (lambda(p)
+           (add-to-list
+            (if (plist-get (cdr p) :components)
+                'with-component 'without-component) p))
+         projects-alist)
+    (org-publish-delete-dups
+     (append without-component
+            (car (mapcar (lambda(p) (org-publish-expand-components p))
+                         with-component))))))
+
+(defun org-publish-expand-components (project)
+  "Expand PROJECT into an alist of its components."
+  (let* ((components (plist-get (cdr project) :components)))
+    (org-publish-delete-dups
+     (delq nil (mapcar (lambda(c) (assoc c org-publish-project-alist))
+                      components)))))
 
-(defun org-publish-get-base-files (plist &optional exclude-regexp)
-  "Return a list of all files in project defined by PLIST.
+(defun org-publish-get-base-files (project &optional exclude-regexp)
+  "Return a list of all files in PROJECT.
 If EXCLUDE-REGEXP is set, this will be used to filter out
 matching filenames."
-  (let* ((dir (file-name-as-directory (plist-get plist :base-directory)))
-        (include-list (plist-get plist :include))
-        (extension (or (plist-get plist :base-extension) "org"))
+  (let* ((project-plist (cdr project))
+        (base-dir (file-name-as-directory
+                   (plist-get project-plist :base-directory)))
+        (include-list (plist-get project-plist :include))
+        (recursive-p (plist-get project-plist :recursive))
+        (extension (or (plist-get project-plist :base-extension) "org"))
         (regexp (concat "^[^\\.].*\\.\\(" extension "\\)$"))
-        (allfiles (directory-files dir t regexp)))
-    ;;
-    ;; exclude files
-    (setq allfiles
+        alldirs allfiles files dir)
+    ;; Get all files and directories in base-directory
+    (setq files (dired-files-attributes base-dir))
+    ;; Get all subdirectories if recursive-p
+    (setq alldirs
+         (if recursive-p
+             (delq nil (mapcar (lambda(f) (if (caaddr f) (cadr f))) files))
+           (list base-dir)))
+    (while (setq dir (pop alldirs))
+      (setq files (directory-files dir t regexp))
+      ;; Exclude files
+      (setq files
          (if (not exclude-regexp)
-             allfiles
+               files
            (delq nil
                  (mapcar (lambda (x)
                            (if (string-match exclude-regexp x) nil x))
-                         allfiles))))
-    ;;
-    ;; include extra files
-    (let ((inc nil))
+                           files))))
+      ;; Include extra files
+      (let (inc)
       (while (setq inc (pop include-list))
-       (setq allfiles (cons (expand-file-name inc dir) allfiles))))
-
+         (setq files (cons (expand-file-name inc dir) files))))
+      (setq allfiles (append allfiles files)))
     allfiles))
 
-
 (defun org-publish-get-project-from-filename (filename)
-  "Figure out which project a given FILENAME belongs to, if any.
-Filename should contain full path. Returns name of project, or
-nil if not found."
-  (org-publish-get-plists)
-  (gethash (file-truename filename) org-publish-files))
-
-
-(defun org-publish-get-plist-from-filename (filename)
-  "Return publishing configuration plist for file FILENAME."
-  (let ((found nil))
-    (mapc
-     (lambda (plist)
-       (let ((files (org-publish-get-base-files plist)))
-        (if (member (expand-file-name filename) files)
-            (setq found plist))))
-     (org-publish-get-plists))
-    found))
+  "Return the project FILENAME belongs."
+  (let* ((project-name (cdr (assoc (expand-file-name filename)
+                                  org-publish-files-alist))))
+    (assoc project-name org-publish-project-alist)))
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Pluggable publishing back-end functions
 
-
-;;;; Pluggable publishing back-end functions
-
-(defun org-publish-org-to-latex (plist filename)
-  "Publish an org file to LaTeX."
-  (org-publish-org-to "latex" plist filename))
-
-(defun org-publish-org-to-html (plist filename)
-  "Publish an org file to HTML."
-  (org-publish-org-to "html" plist filename))
-
-(defun org-publish-org-to (format plist filename)
+(defun org-publish-org-to (format plist filename pub-dir)
   "Publish an org file to FORMAT.
 PLIST is the property list for the given project.
-FILENAME is the filename of the org file to be published."
+FILENAME is the filename of the org file to be published.
+PUB-DIR is the publishing directory."
   (require 'org)
-  (let* ((arg (plist-get plist :headline-levels)))
-    (progn
+  (unless (file-exists-p pub-dir)
+    (make-directory pub-dir t))
       (find-file filename)
+  (let ((init-buf (current-buffer))
+       (init-point (point))
+       (init-buf-string (buffer-string)) export-buf)
+    ;; run hooks before exporting
+    (run-hooks 'org-publish-before-export-hook)
+    ;; export the possibly modified buffer
+    (setq export-buf
       (funcall (intern (concat "org-export-as-" format))
-              arg nil plist)
-      (kill-buffer (current-buffer)))))
+                  (plist-get plist :headline-levels)
+                  nil plist nil nil pub-dir))
+    (set-buffer export-buf)
+    ;; run hooks after export and save export
+    (and (run-hooks 'org-publish-after-export-hook)
+        (if (buffer-modified-p) (save-buffer)))
+    ;; maybe restore buffer's content
+    (set-buffer init-buf)
+    (when (buffer-modified-p init-buf)
+      (erase-buffer)
+      (insert init-buf-string)
+      (save-buffer)
+      (goto-char init-point))))
+
+(defun org-publish-org-to-latex (plist filename pub-dir)
+  "Publish an org file to LaTeX.
+See `org-publish-org-to' to the list of arguments."
+  (org-publish-org-to "latex" plist filename pub-dir))
+
+(defun org-publish-org-to-html (plist filename pub-dir)
+  "Publish an org file to HTML.
+See `org-publish-org-to' to the list of arguments."
+  (org-publish-org-to "html" plist filename pub-dir))
 
-
-(defun org-publish-attachment (plist filename)
+(defun org-publish-attachment (plist filename pub-dir)
   "Publish a file with no transformation of any kind.
-PLIST is the property list for the given project.
-FILENAME is the filename of the file to be published."
+See `org-publish-org-to' to the list of arguments."
   ;; make sure eshell/cp code is loaded
   (eval-and-compile 
     (require 'eshell)
     (require 'esh-maint)
     (require 'em-unix))
-  (let ((destination (file-name-as-directory (plist-get plist 
:publishing-directory))))
-    (eshell/cp filename destination)))
-
+  (eshell/cp filename pub-dir))
 
-;;;; Publishing files, sets of files, and indices
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Publishing files, sets of files, and indices
 
-
-(defun org-publish-file (filename)
-  "Publish file FILENAME."
-  (let* ((project-name (org-publish-get-project-from-filename filename))
-        (plist (org-publish-get-plist-from-filename filename))
-        (publishing-function (or (plist-get plist :publishing-function) 
'org-publish-org-to-html)))
-    (if (not project-name)
-       (error "File %s is not part of any known project." filename))
+(defun org-publish-file (filename &optional project)
+  "Publish file FILENAME from PROJECT."
     (when (org-publish-needed-p filename)
+    (let* ((project
+           (or project
+               (or (org-publish-get-project-from-filename filename)
+                   (if (y-or-n-p
+                        (format "%s is not in a project.  Re-read the list of 
projects files? "
+                                (abbreviate-file-name filename)))
+                       ;; If requested, re-initialize the list of projects 
files
+                       (progn (org-publish-initialize-files-alist t)
+                              (or (org-publish-get-project-from-filename 
filename)
+                                  (error "File %s not part of any known 
project"
+                                         (abbreviate-file-name filename))))
+                     (error "Can't publish file outside of a project")))))
+          (project-plist (cdr project))
+          (publishing-function 
+           (or (plist-get project-plist :publishing-function)
+               'org-publish-org-to-html))
+          (base-dir (file-name-as-directory
+                     (file-truename (plist-get project-plist 
:base-directory))))
+          (pub-dir (file-name-as-directory
+                    (file-truename (plist-get project-plist 
:publishing-directory))))
+          tmp-pub-dir)
+      (setq tmp-pub-dir
+           (file-name-directory
+            (concat pub-dir
+                    (and (string-match (regexp-quote base-dir) filename)
+                         (substring filename (match-end 0))))))
       (if (listp publishing-function)
          ;; allow chain of publishing functions
          (mapc (lambda (f)
-                 (funcall f plist filename)) 
+                 (funcall f project-plist filename tmp-pub-dir))
                publishing-function)
-       (funcall publishing-function plist filename))
-      (org-publish-update-timestamp filename))))
-
+       (funcall publishing-function project-plist filename tmp-pub-dir)))
+    (org-publish-update-timestamp filename)))
 
-(defun org-publish-plist (plist)
-  "Publish all files in set defined by PLIST.
- If :auto-index is set, publish the index too."
-  (let* ((exclude-regexp (plist-get plist :exclude))
-        (publishing-function (or (plist-get plist :publishing-function) 
'org-publish-org-to-html))
-        (index-p (plist-get plist :auto-index))
-         (index-filename (or (plist-get plist :index-filename) "index.org"))
-        (index-function (or (plist-get plist :index-function) 
'org-publish-org-index))
-        (preparation-function (plist-get plist :preparation-function))
-        (f nil))
-    ;;
-    (when preparation-function
-      (funcall preparation-function))
-    (if index-p
-       (funcall index-function plist index-filename))
-    (let ((files (org-publish-get-base-files plist exclude-regexp)))
-      (while (setq f (pop files))
-       ;; check timestamps
-       (when (org-publish-needed-p f)
-         (if (listp publishing-function)
-             ;; allow chain of publishing functions
-             (mapc (lambda (func)
-                     (funcall func plist f)) 
-                   publishing-function)
-           (funcall publishing-function plist f))
-         (org-publish-update-timestamp f))))))
-
-
-(defun org-publish-org-index (plist &optional index-filename)
-  "Create an index of pages in set defined by PLIST.
-Optionally set the filename of the index with INDEX-FILENAME;
-default is 'index.org'."
-  (let* ((dir (file-name-as-directory (plist-get plist :base-directory)))
-        (exclude-regexp (plist-get plist :exclude))
-        (files (org-publish-get-base-files plist exclude-regexp))
+(defun org-publish-projects (projects)
+  "Publish all files belonging to the PROJECTS alist.
+If :auto-index is set, publish the index too."
+  (mapc
+   (lambda (project)
+     (let* ((project-plist (cdr project))
+           (exclude-regexp (plist-get project-plist :exclude))
+           (index-p (plist-get project-plist :auto-index))
+           (index-filename (or (plist-get project-plist :index-filename)
+                               "index.org"))
+           (index-function (or (plist-get project-plist :index-function)
+                               'org-publish-org-index))
+           (preparation-function (plist-get project-plist 
:preparation-function))
+           (files (org-publish-get-base-files project exclude-regexp)) file)
+       (when preparation-function (funcall preparation-function))
+       (if index-p (funcall index-function project index-filename))
+       (while (setq file (pop files))
+        (org-publish-file file project))))
+   (org-publish-expand-projects projects)))
+
+(defun org-publish-org-index (project &optional index-filename)
+  "Create an index of pages in set defined by PROJECT.
+Optionally set the filename of the index with INDEX-FILENAME.
+Default for INDEX-FILENAME is 'index.org'."
+  (let* ((project-plist (cdr project))
+        (dir (file-name-as-directory
+              (plist-get project-plist :base-directory)))
+        (exclude-regexp (plist-get project-plist :exclude))
+        (files (org-publish-get-base-files project exclude-regexp))
         (index-filename (concat dir (or index-filename "index.org")))
         (index-buffer (find-buffer-visiting index-filename))
         (ifn (file-name-nondirectory index-filename))
-        (f nil))
-    ;;
+        file)
     ;; if buffer is already open, kill it to prevent error message
     (if index-buffer
        (kill-buffer index-buffer))
     (with-temp-buffer
-      (while (setq f (pop files))
-       (let ((fn (file-name-nondirectory f)))
-         (unless (string= fn ifn) ;; index shouldn't index itself
+      (while (setq file (pop files))
+       (let ((fn (file-name-nondirectory file)))
+         ;; index shouldn't index itself
+         (unless (string= fn ifn)
            (insert (concat " + [[file:" fn "]["
                            (file-name-sans-extension fn)
                            "]]\n")))))
       (write-file index-filename)
       (kill-buffer (current-buffer)))))
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Interactive publishing functions
 
-;(defun org-publish-meta-index (meta-plist &optional index-filename)
-;  "Create an index for a metaproject."
-;  (let* ((plists (
-
-
-;;;; Interactive publishing functions
-
+(defalias 'org-publish-project 'org-publish "Publish project.")
 
 ;;;###autoload
-(defun org-publish (project-name &optional force)
-  "Publish the project PROJECT-NAME."
-  (interactive (list (completing-read "Project name: " 
org-publish-project-alist
-                                     nil t)
-                    current-prefix-arg))
+(defun org-publish (project &optional force)
+  "Publish PROJECT."
+  (interactive "P")
   (save-window-excursion
-    (let ((org-publish-use-timestamps-flag (if force nil t))
-         (plists (org-publish-get-plists project-name)))
-      (mapcar 'org-publish-plist plists))))
-
+    (let* ((force current-prefix-arg)
+          (org-publish-use-timestamps-flag
+           (if force nil org-publish-use-timestamps-flag)))
+      (org-publish-projects
+       (list (or project
+                (assoc (completing-read
+                        "Publish project: "
+                        org-publish-project-alist nil t)
+                       org-publish-project-alist)))))))
 
 ;;;###autoload
-(defun org-publish-current-project (&optional force)
-  "Publish the project associated with the current file.
-With prefix argument, force publishing all files in project."
+(defun org-publish-all (&optional force)
+  "Publish all projects.
+With prefix argument, force publish all files."
   (interactive "P")
+  (org-publish-initialize-files-alist)
   (save-window-excursion
-    (let* ((project-name (org-publish-get-project-from-filename 
(buffer-file-name))))
-      (if (not project-name)
-         (error "File %s is not part of any known project." 
(buffer-file-name)))
-      (org-publish project-name (if force nil t)))))
-
+    (let ((org-publish-use-timestamps-flag
+          (if force nil org-publish-use-timestamps-flag)))
+      (org-publish-projects org-publish-project-alist))))
 
 ;;;###autoload
 (defun org-publish-current-file (&optional force)
   "Publish the current file.
 With prefix argument, force publish the file."
   (interactive "P")
+  (org-publish-initialize-files-alist)
   (save-window-excursion
     (let ((org-publish-use-timestamps-flag
-          (if force nil t)))
+          (if force nil org-publish-use-timestamps-flag)))
       (org-publish-file (buffer-file-name)))))
 
-
 ;;;###autoload
-(defun org-publish-all (&optional force)
-  "Publish all projects.
-With prefix argument, force publish all files."
+(defun org-publish-current-project (&optional force)
+  "Publish the project associated with the current file.
+With a prefix argument, force publishing of all files in
+the project."
   (interactive "P")
+  (org-publish-initialize-files-alist)
   (save-window-excursion
-    (let ((org-publish-use-timestamps-flag
-          (if force nil t))
-         (plists (org-publish-get-plists)))
-      (mapcar 'org-publish-plist plists))))
-
-
+    (let ((project (org-publish-get-project-from-filename (buffer-file-name)))
+         (org-publish-use-timestamps-flag
+          (if force nil org-publish-use-timestamps-flag)))
+      (if (not project)
+         (error "File %s is not part of any known project" (buffer-file-name)))
+      (org-publish project))))
 
 (provide 'org-publish)
 
+
 ;; arch-tag: 72807f3c-8af0-4a6b-8dca-c3376eb25adb
 ;;; org-publish.el ends here




reply via email to

[Prev in Thread] Current Thread [Next in Thread]