| 
					
				 | 
			
			
				@@ -257,29 +257,19 @@ You can overwrite this default per project in your 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Return path to timestamp file for filename FILENAME." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (setq filename (concat filename "::" (or pub-dir "") "::" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 (format "%s" (or pub-func "")))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (concat (file-name-as-directory org-publish-timestamp-directory) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	  "X" (if (fboundp 'sha1) (sha1 filename) (md5 filename)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (concat "X" (if (fboundp 'sha1) (sha1 filename) (md5 filename)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-publish-needed-p (filename &optional pub-dir pub-func true-pub-dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Return `t' if FILENAME should be published in PUB-DIR using PUB-FUNC. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-TRUE-PUB-DIR is there the file will truely end up.  Currently we are not using 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+TRUE-PUB-DIR is where the file will truely end up.  Currently we are not using 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 this - maybe it can eventually be used to check if the file is present at 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 the target location, and how old it is.  Right ow we cannot do this, because 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 we do not know under what file name the file will be stored - the publishing 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function can still decide about that independently." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (let ((rtn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (if org-publish-use-timestamps-flag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	     (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: %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 pub-dir pub-func))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       (make-directory org-publish-timestamp-directory) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	     (org-publish-cache-file-needs-publishing 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	      filename pub-dir pub-func) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	   ;; don't use timestamps, always return t 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	   t))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (if rtn 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -291,20 +281,9 @@ function can still decide about that independently." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-publish-update-timestamp (filename &optional pub-dir pub-func) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Update publishing timestamp for file FILENAME. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 If there is no timestamp, create one." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (let ((timestamp-file (org-publish-timestamp-filename 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			 filename pub-dir pub-func)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	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 (expand-file-name timestamp-file))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let ((key (org-publish-timestamp-filename filename pub-dir pub-func)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(stamp (org-publish-cache-ctime-of-src filename))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (org-publish-cache-set key stamp))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-publish-remove-all-timestamps () 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Remove all files in the timstamp directory." 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -312,17 +291,12 @@ If there is no timestamp, create one." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	files) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (when (and (file-exists-p dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	       (file-directory-p dir)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      (mapc 'delete-file (directory-files dir 'full "[^.]\\'"))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (mapc 'delete-file (directory-files dir 'full "[^.]\\'")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (org-publish-reset-cache)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;;; Mapping files to project names 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defvar org-publish-files-alist nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Alist of files and their parent projects. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Each element of this alist is of the form: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (file-name . project-name)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defvar org-publish-initial-buffer nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "The buffer `org-publish' has been called from.") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -330,21 +304,10 @@ Each element of this alist is of the form: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Temporary list of files to be published.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; Here, so you find the variable right before it's used the first time: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defvar org-publish-file-title-cache nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "List of absolute filenames and titles.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defvar org-publish-cache nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "This will cache all the timestamps and titles for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+files in publishing projects. Blocks could hash sha1 values here.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(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-file-title-cache nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (setq org-publish-files-alist 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	  (org-publish-get-files org-publish-project-alist)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defun org-publish-validate-link (link &optional directory) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Check if LINK points to a file in the current project." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (assoc (expand-file-name link directory) org-publish-files-alist)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; Compatibility aliases 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -372,23 +335,6 @@ This is a compatibility function for Emacsen without `delete-dups'." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; 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 in PROJECTS-ALIST. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 This splices all the components into the list." 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -456,9 +402,12 @@ matching the regexp SKIP-DIR when recursing through BASE-DIR." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			  (and skip-file (string-match skip-file fnd)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			  (not (file-exists-p (file-truename f))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			  (not (string-match match fnd))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		(pushnew f org-publish-temp-files))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	(sort (directory-files base-dir t (unless recurse match)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      'org-publish-compare-directory-files))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(if sitemap-requested 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    (sort (directory-files base-dir t (unless recurse match)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		  'org-publish-compare-directory-files) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (directory-files base-dir t (unless recurse match))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-publish-get-base-files (project &optional exclude-regexp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Return a list of all files in PROJECT. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -470,20 +419,22 @@ matching filenames." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (include-list (plist-get project-plist :include)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (recurse (plist-get project-plist :recursive)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (extension (or (plist-get project-plist :base-extension) "org")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     ;; sitemap-... variables are dynamically scoped for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     ;; org-publish-compare-directory-files: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     (sitemap-sort-folders 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	   (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-ignore-case 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       (if (plist-member project-plist :sitemap-ignore-case) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           (plist-get project-plist :sitemap-ignore-case) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         org-publish-sitemap-sort-ignore-case)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 ;; sitemap-... variables are dynamically scoped for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 ;; org-publish-compare-directory-files: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (sitemap-requested 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (plist-get project-plist :auto-sitemap)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (sitemap-sort-folders 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (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-ignore-case 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (if (plist-member project-plist :sitemap-ignore-case) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	      (plist-get project-plist :sitemap-ignore-case) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    org-publish-sitemap-sort-ignore-case)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (match (if (eq extension 'any) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     "^[^\\.]" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		  (concat "^[^\\.].*\\.\\(" extension "\\)$")))) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -505,8 +456,26 @@ matching filenames." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-publish-get-project-from-filename (filename &optional up) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Return the project FILENAME belongs." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (let* ((project-name (cdr (assoc (expand-file-name filename) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				   org-publish-files-alist)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let* ((filename (expand-file-name filename)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 project-name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (catch 'p-found 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (dolist (prj org-publish-project-alist) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(unless (plist-get (cdr prj) :components) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  ;; [[info:org:Selecting%20files]] shows how this is supposed to work: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (let* ((r (plist-get (cdr prj) :recursive)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 (b (expand-file-name (plist-get (cdr prj) :base-directory))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 (x (plist-get (cdr prj) :base-extension)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 (e (plist-get (cdr prj) :exclude)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 (i (plist-get (cdr prj) :include)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 (xm (concat "^" b (if r ".+" "[^/]+") "\\.\\(" x "\\)$"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    (when (or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		   (and i (string-match i filename)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		   (and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		    (not (and e (string-match e filename))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		    (string-match xm filename))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	      (setq project-name (car prj)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	      (throw 'p-found project-name)))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (when up 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (dolist (prj org-publish-project-alist) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(if (member project-name (plist-get (cdr prj) :components)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -604,20 +573,17 @@ See `org-publish-org-to' to the list of arguments." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; Publishing files, sets of files, and indices 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defun org-publish-file (filename &optional project) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Publish file FILENAME from PROJECT." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun org-publish-file (filename &optional project no-cache) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Publish file FILENAME from PROJECT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If NO-CACHE is not nil, do not initialize org-publish-cache and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+write it to disk. This is needed, since this function is used to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+publish single files, when entire projects are published. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+See `org-publish-projects'." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (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"))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		  (error "File %s not part of any known project" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 (abbreviate-file-name filename))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (project-plist (cdr project)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (ftname (file-truename filename)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (publishing-function 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -628,6 +594,10 @@ See `org-publish-org-to' to the list of arguments." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (pub-dir (file-name-as-directory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		   (file-truename (plist-get project-plist :publishing-directory)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 tmp-pub-dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (unless no-cache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (org-publish-initialize-cache (car project))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (setq tmp-pub-dir 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	  (file-name-directory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	   (concat pub-dir 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -644,7 +614,8 @@ See `org-publish-org-to' to the list of arguments." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				  tmp-pub-dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(funcall publishing-function project-plist filename tmp-pub-dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(org-publish-update-timestamp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 filename pub-dir publishing-function))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 filename pub-dir publishing-function))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (unless no-cache (org-publish-write-cache-file)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-publish-projects (projects) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Publish all files belonging to the PROJECTS alist. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -652,6 +623,8 @@ If :auto-sitemap is set, publish the sitemap too. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 If :makeindex is set, also produce a file theindex.org." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (mapc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    (lambda (project) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     ;; Each project uses it's own cache file: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     (org-publish-initialize-cache (car project)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      (let* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 ((project-plist (cdr project)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	  (exclude-regexp (plist-get project-plist :exclude)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -666,19 +639,20 @@ If :makeindex is set, also produce a file theindex.org." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        (when preparation-function (run-hooks 'preparation-function)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        (if sitemap-p (funcall sitemap-function project sitemap-filename)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        (while (setq file (pop files)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 (org-publish-file file project)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (org-publish-file file project t)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        (when (plist-get project-plist :makeindex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (org-publish-index-generate-theindex.inc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	  (plist-get project-plist :base-directory)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (org-publish-file (expand-file-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			    "theindex.org" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			    (plist-get project-plist :base-directory)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			   project)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       (when completion-function (run-hooks 'completion-function)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			   project t)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       (when completion-function (run-hooks 'completion-function)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     (org-publish-write-cache-file))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    (org-publish-expand-projects projects))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-publish-org-sitemap (project &optional sitemap-filename) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Create an sitemap of pages in set defined by PROJECT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Create a sitemap of pages in set defined by PROJECT. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Optionally set the filename of the sitemap with SITEMAP-FILENAME. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Default for SITEMAP-FILENAME is 'sitemap.org'." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (let* ((project-plist (cdr project)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -742,9 +716,9 @@ Default for SITEMAP-FILENAME is 'sitemap.org'." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-publish-find-title (file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Find the title of file in project." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (if (member file org-publish-file-title-cache) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      (cadr (member file org-publish-file-title-cache)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (let* ((visiting (find-buffer-visiting file)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   (org-publish-cache-get-file-property file :title nil t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   (let* ((visiting (find-buffer-visiting file)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (buffer (or visiting (find-file-noselect file))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 title) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (with-current-buffer buffer 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -758,8 +732,7 @@ Default for SITEMAP-FILENAME is 'sitemap.org'." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		  (file-name-nondirectory (file-name-sans-extension file)))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (unless visiting 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (kill-buffer buffer)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (setq org-publish-file-title-cache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          (append org-publish-file-title-cache (list file title))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (org-publish-cache-set-file-property file :title title) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     title))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -792,7 +765,7 @@ directory and force publishing all files." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (interactive "P") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (when force 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (org-publish-remove-all-timestamps)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (org-publish-initialize-files-alist force) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ;;  (org-publish-initialize-files-alist force) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (save-window-excursion 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (let ((org-publish-use-timestamps-flag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	   (if force nil org-publish-use-timestamps-flag))) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -804,7 +777,6 @@ directory and force publishing all files." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Publish the current file. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 With prefix argument, force publish the file." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (interactive "P") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (org-publish-initialize-files-alist force) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (save-window-excursion 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (let ((org-publish-use-timestamps-flag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	   (if force nil org-publish-use-timestamps-flag))) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -816,13 +788,13 @@ With prefix argument, force publish the file." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 With a prefix argument, force publishing of all files in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 the project." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (interactive "P") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (org-publish-initialize-files-alist force) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (save-window-excursion 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (let ((project (org-publish-get-project-from-filename (buffer-file-name) 'up)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	  (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))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ;; FIXME: force is not used here? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (org-publish project)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -918,8 +890,138 @@ the project." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	  (save-buffer)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(kill-buffer ibuffer))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(provide 'org-publish) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; Caching functions: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun org-publish-write-cache-file (&optional free-cache) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Write `org-publish-cache' to file. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If FREE-CACHE, empty the cache." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (unless org-publish-cache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (error "%s" "`org-publish-write-cache-file' called, but no cache present")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let ((cache-file (org-publish-cache-get ":cache-file:"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (unless cache-file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (error "%s" "Cannot find cache-file name in `org-publish-write-cache-file'")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (with-temp-file cache-file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (let ((print-level nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (print-length nil)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        (insert 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         "(setq org-publish-cache\n  " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (replace-regexp-in-string "\\([^\\ \t]\"\\) \\([^ \t]\\)" "\\1\n\\2" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				   (format "%S" org-publish-cache)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         ")\n"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (when free-cache (org-publish-reset-cache)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun org-publish-initialize-cache (project-name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Initialize the projects cache if not intialized yet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+and return it." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (unless project-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (error "%s%s" "Cannot initialize `org-publish-cache' without projects name" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	   " in `org-publish-initialize-cache'")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (unless (file-exists-p org-publish-timestamp-directory) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (make-directory org-publish-timestamp-directory)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (if (not (file-directory-p org-publish-timestamp-directory)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (error "Org publish timestamp: %s is not a directory" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	     org-publish-timestamp-directory)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (unless (and org-publish-cache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	       (string= (org-publish-cache-get ":project:") project-name)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (when org-publish-cache (org-publish-reset-cache)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (let* ((cache-file (concat 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			(expand-file-name org-publish-timestamp-directory) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			project-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			".cache")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	   (cexists (file-exists-p cache-file))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (if cexists (load-file cache-file)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (unless org-publish-cache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(setq org-publish-cache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	      #s(hash-table test equal weakness nil size 100 data ())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(org-publish-cache-set ":project:" project-name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(org-publish-cache-set ":cache-file:" cache-file org-publish-cache)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (unless cexists (org-publish-write-cache-file nil)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  org-publish-cache) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun org-publish-reset-cache () 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Empty org-publish-cache and reset it nil." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (message "%s" "Resetting org-publish-cache") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (if (hash-table-p org-publish-cache) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (clrhash org-publish-cache)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (setq org-publish-cache nil)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun org-publish-cache-file-needs-publishing (filename &optional pub-dir pub-func) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Check the timestamp of the last publishing of FILENAME. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Return `t', if the file needs publishing" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (unless org-publish-cache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (error "%s" "`org-publish-cache-file-needs-publishing' called, but no cache present")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let* ((key (org-publish-timestamp-filename filename pub-dir pub-func)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (pstamp (org-publish-cache-get key))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (if (null pstamp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	t 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (let ((ctime (org-publish-cache-ctime-of-src filename))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(< pstamp ctime))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun org-publish-cache-set-file-property (filename property value &optional project-name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Set the VALUE for a PORPERTY of file FILENAME in publishing cache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+to VALUE. Use cache file of PROJECT-NAME. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If the entry does not exist, it will be created. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Return VALUE." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ;; Evtl. load the requested cache file: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (if project-name (org-publish-initialize-cache project-name)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let ((pl (org-publish-cache-get filename))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (if pl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(progn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (plist-put pl property value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (org-publish-cache-get-file-property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       filename property value nil project-name)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun org-publish-cache-get-file-property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (filename property &optional default no-create project-name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Return the value for a PORPERTY of file FILENAME in publishing cache. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Use cache file of PROJECT-NAME. Return the value of that PROPERTY or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+DEFAULT, if the value does not yet exist. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If the entry will be created, unless NO-CREATE is not nil." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ;; Evtl. load the requested cache file: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (if project-name (org-publish-initialize-cache project-name)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let ((pl (org-publish-cache-get filename)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(retval nil)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (if pl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(if (plist-member pl property) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    (setq retval (plist-get pl property)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (setq retval default)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ;; no pl yet: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (unless no-create 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(org-publish-cache-set filename (list property default))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (setq retval default)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    retval)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun org-publish-cache-get (key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Return the value stored in `org-publish-cache' for key KEY. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Returns nil, if no value or nil is found, or the cache does not 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+exist." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (unless org-publish-cache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (error "%s" "`org-publish-cache-get' called, but no cache present")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (gethash key org-publish-cache)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun org-publish-cache-set (key value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Store KEY VLAUE pair in `org-publish-cache'. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Returns value on success, else nil." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (unless org-publish-cache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (error "%s" "`org-publish-cache-set' called, but no cache present")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (puthash key value org-publish-cache)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun org-publish-cache-ctime-of-src (filename) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Get the files ctime as integer." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let ((src-attr (file-attributes filename))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     (lsh (car (nth 5 src-attr)) 16) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     (cadr (nth 5 src-attr))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(provide 'org-publish) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; arch-tag: 72807f3c-8af0-4a6b-8dca-c3376eb25adb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |